From b0424765d72db7fddf5e1d3af4e871c7e9bcfeef Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 3 Sep 2025 12:28:19 +0200 Subject: [PATCH 001/112] some comments on random lookup benchmark --- tools/perf.hpp | 234 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 156 insertions(+), 78 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index 9062b60..932ef52 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -22,12 +22,13 @@ void perf_test_lookup_access(dictionary const& dict) { constexpr uint64_t num_queries = 1000000; constexpr uint64_t runs = 5; essentials::uniform_int_rng distr(0, dict.size() - 1, essentials::get_random_seed()); - uint64_t k = dict.k(); + const uint64_t k = dict.k(); std::string kmer(k, 0); std::string kmer_rc(k, 0); + std::string kmers; { - // perf test positive lookup + // perf test positive lookup, using a std::vector std::vector lookup_queries; lookup_queries.reserve(num_queries); for (uint64_t i = 0; i != num_queries; ++i) { @@ -51,93 +52,170 @@ void perf_test_lookup_access(dictionary const& dict) { } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - } - { - // perf test negative lookup - std::vector lookup_queries; - lookup_queries.reserve(num_queries); - for (uint64_t i = 0; i != num_queries; ++i) { - random_kmer(kmer.data(), k); - lookup_queries.push_back(kmer); - } - essentials::timer t; - t.start(); - for (uint64_t r = 0; r != runs; ++r) { - for (auto const& string : lookup_queries) { - auto id = dict.lookup(string.c_str()); - essentials::do_not_optimize_away(id); - } - } - t.stop(); - double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; - } - { - // perf test positive lookup_advanced - std::vector lookup_queries; - lookup_queries.reserve(num_queries); - for (uint64_t i = 0; i != num_queries; ++i) { - uint64_t id = distr.gen(); - dict.access(id, kmer.data()); - if ((i & 1) == 0) { - /* transform 50% of the kmers into their reverse complements */ - kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); - lookup_queries.push_back(kmer_rc); - } else { - lookup_queries.push_back(kmer); - } - } - essentials::timer t; - t.start(); - for (uint64_t r = 0; r != runs; ++r) { - for (auto const& string : lookup_queries) { - auto res = dict.lookup_advanced(string.c_str()); - essentials::do_not_optimize_away(res.kmer_id); - } - } - t.stop(); - double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_positive_lookup_advanced " << nanosec_per_lookup << std::endl; - } - { - // perf test negative lookup_advanced - std::vector lookup_queries; - lookup_queries.reserve(num_queries); - for (uint64_t i = 0; i != num_queries; ++i) { - random_kmer(kmer.data(), k); - lookup_queries.push_back(kmer); - } - essentials::timer t; - t.start(); - for (uint64_t r = 0; r != runs; ++r) { - for (auto const& string : lookup_queries) { - auto res = dict.lookup_advanced(string.c_str()); - essentials::do_not_optimize_away(res.kmer_id); - } + std::cout << "1. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + + kmers.resize(num_queries * k); + uint64_t pos = 0; + for (auto const& string : lookup_queries) { + kmers.replace(pos, k, string); + pos += k; } - t.stop(); - double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_negative_lookup_advanced " << nanosec_per_lookup << std::endl; } { - // perf test access - std::vector access_queries; - access_queries.reserve(num_queries); + // perf test positive lookup, using a single std::string with all kmers contatenated + /* + ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t 8 -g + 16 --verbose -o human.index -d tmp_dir + ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 -g + 16 --canonical --verbose -o human.canon.index - d tmp_dir + + ./sshash bench -i human.index + 1. avg_nanosec_per_positive_lookup 1379.05 + 2. avg_nanosec_per_positive_lookup 1298.91 - for (uint64_t i = 0; i != num_queries; ++i) access_queries.push_back(distr.gen()); + ./sshash bench -i human.canon.index + 1. avg_nanosec_per_positive_lookup 1136.06 + 2. avg_nanosec_per_positive_lookup 840.417 + + So, it looks like the version with also loop-unrolling is a lot + beneficial for canonical indexes, indicating a better pipelining + for canonical indexes. + */ essentials::timer t; t.start(); + uint64_t pos = 0; for (uint64_t r = 0; r != runs; ++r) { - for (auto id : access_queries) { - dict.access(id, kmer.data()); - essentials::do_not_optimize_away(kmer[0]); + // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { + // auto id = dict.lookup(kmers.data() + pos); + // essentials::do_not_optimize_away(id); + // } + // pos = 0; + + /* + loop-unrolling + */ + for (uint64_t i = 0; i < num_queries; i += 8) { + auto id0 = dict.lookup(kmers.data() + pos + 8 * 0); + essentials::do_not_optimize_away(id0); + + auto id1 = dict.lookup(kmers.data() + pos + 8 * 1); + essentials::do_not_optimize_away(id1); + + auto id2 = dict.lookup(kmers.data() + pos + 8 * 2); + essentials::do_not_optimize_away(id2); + + auto id3 = dict.lookup(kmers.data() + pos + 8 * 3); + essentials::do_not_optimize_away(id3); + + auto id4 = dict.lookup(kmers.data() + pos + 8 * 4); + essentials::do_not_optimize_away(id4); + + auto id5 = dict.lookup(kmers.data() + pos + 8 * 5); + essentials::do_not_optimize_away(id5); + + auto id6 = dict.lookup(kmers.data() + pos + 8 * 6); + essentials::do_not_optimize_away(id6); + + auto id7 = dict.lookup(kmers.data() + pos + 8 * 7); + essentials::do_not_optimize_away(id7); + + pos += 8 * 8; } + pos = 0; } t.stop(); - double nanosec_per_access = t.elapsed() / static_cast(runs * access_queries.size()); - std::cout << "avg_nanosec_per_access " << nanosec_per_access << std::endl; + double nanosec_per_lookup = t.elapsed() / (runs * num_queries); + std::cout << "2. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; } + + // { + // // perf test negative lookup + // std::vector lookup_queries; + // lookup_queries.reserve(num_queries); + // for (uint64_t i = 0; i != num_queries; ++i) { + // random_kmer(kmer.data(), k); + // lookup_queries.push_back(kmer); + // } + // essentials::timer t; + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto const& string : lookup_queries) { + // auto id = dict.lookup(string.c_str()); + // essentials::do_not_optimize_away(id); + // } + // } + // t.stop(); + // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; + // } + // { + // // perf test positive lookup_advanced + // std::vector lookup_queries; + // lookup_queries.reserve(num_queries); + // for (uint64_t i = 0; i != num_queries; ++i) { + // uint64_t id = distr.gen(); + // dict.access(id, kmer.data()); + // if ((i & 1) == 0) { + // /* transform 50% of the kmers into their reverse complements */ + // kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); + // lookup_queries.push_back(kmer_rc); + // } else { + // lookup_queries.push_back(kmer); + // } + // } + // essentials::timer t; + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto const& string : lookup_queries) { + // auto res = dict.lookup_advanced(string.c_str()); + // essentials::do_not_optimize_away(res.kmer_id); + // } + // } + // t.stop(); + // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "avg_nanosec_per_positive_lookup_advanced " << nanosec_per_lookup << + // std::endl; + // } + // { + // // perf test negative lookup_advanced + // std::vector lookup_queries; + // lookup_queries.reserve(num_queries); + // for (uint64_t i = 0; i != num_queries; ++i) { + // random_kmer(kmer.data(), k); + // lookup_queries.push_back(kmer); + // } + // essentials::timer t; + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto const& string : lookup_queries) { + // auto res = dict.lookup_advanced(string.c_str()); + // essentials::do_not_optimize_away(res.kmer_id); + // } + // } + // t.stop(); + // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "avg_nanosec_per_negative_lookup_advanced " << nanosec_per_lookup << + // std::endl; + // } + // { + // // perf test access + // std::vector access_queries; + // access_queries.reserve(num_queries); + + // for (uint64_t i = 0; i != num_queries; ++i) access_queries.push_back(distr.gen()); + // essentials::timer t; + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto id : access_queries) { + // dict.access(id, kmer.data()); + // essentials::do_not_optimize_away(kmer[0]); + // } + // } + // t.stop(); + // double nanosec_per_access = t.elapsed() / static_cast(runs * + // access_queries.size()); std::cout << "avg_nanosec_per_access " << nanosec_per_access << + // std::endl; + // } } template From 5a47677e96723144dfb671fa46b859a0af60ba0a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 3 Sep 2025 12:44:23 +0200 Subject: [PATCH 002/112] another comment on random lookup benchmark --- tools/perf.hpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index 932ef52..01e5c6e 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -34,13 +34,13 @@ void perf_test_lookup_access(dictionary const& dict) { for (uint64_t i = 0; i != num_queries; ++i) { uint64_t id = distr.gen(); dict.access(id, kmer.data()); - if ((i & 1) == 0) { - /* transform 50% of the kmers into their reverse complements */ - kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); - lookup_queries.push_back(kmer_rc); - } else { - lookup_queries.push_back(kmer); - } + // if ((i & 1) == 0) { + // /* transform 50% of the kmers into their reverse complements */ + // kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); + // lookup_queries.push_back(kmer_rc); + // } else { + lookup_queries.push_back(kmer); + // } } essentials::timer t; t.start(); @@ -80,6 +80,12 @@ void perf_test_lookup_access(dictionary const& dict) { So, it looks like the version with also loop-unrolling is a lot beneficial for canonical indexes, indicating a better pipelining for canonical indexes. + + Clearly, if we do NOT transform kmers into their reverse complements, + regular indexes are faster, e.g.: + 1. avg_nanosec_per_positive_lookup 982.258 + wherease performance does not change for canonical indexes because + one bucket is inspected anyway. */ essentials::timer t; t.start(); From 41071fe6702c8ac88dd6962adc9c838de1888022 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 4 Sep 2025 09:35:42 +0200 Subject: [PATCH 003/112] some results on random lookup benchmark --- tools/perf.hpp | 173 ++++++++++++++++++++++++++++++------------------- 1 file changed, 107 insertions(+), 66 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index 01e5c6e..158b050 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -23,12 +23,14 @@ void perf_test_lookup_access(dictionary const& dict) { constexpr uint64_t runs = 5; essentials::uniform_int_rng distr(0, dict.size() - 1, essentials::get_random_seed()); const uint64_t k = dict.k(); + // const uint64_t m = dict.m(); std::string kmer(k, 0); std::string kmer_rc(k, 0); std::string kmers; { // perf test positive lookup, using a std::vector + std::vector lookup_queries; lookup_queries.reserve(num_queries); for (uint64_t i = 0; i != num_queries; ++i) { @@ -42,6 +44,7 @@ void perf_test_lookup_access(dictionary const& dict) { lookup_queries.push_back(kmer); // } } + essentials::timer t; t.start(); for (uint64_t r = 0; r != runs; ++r) { @@ -52,87 +55,125 @@ void perf_test_lookup_access(dictionary const& dict) { } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "1. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + std::cout << "lookup: avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - kmers.resize(num_queries * k); - uint64_t pos = 0; - for (auto const& string : lookup_queries) { - kmers.replace(pos, k, string); - pos += k; - } + // std::vector lookup_queries_uint; + // lookup_queries_uint.reserve(num_queries); + // for (auto const& kmer : lookup_queries) { + // kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); + // lookup_queries_uint.push_back(uint_kmer); + // } + // t.reset(); + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto uint_kmer : lookup_queries_uint) { + // auto id = dict.lookup_uint(uint_kmer); + // essentials::do_not_optimize_away(id); + // } + // } + // t.stop(); + // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup + // << std::endl; + + // std::vector> lookup_queries_uint_minimizer; + // lookup_queries_uint_minimizer.reserve(num_queries); + // for (auto uint_kmer : lookup_queries_uint) { + // lookup_queries_uint_minimizer.push_back( + // {uint_kmer, util::compute_minimizer(uint_kmer, k, m, dict.hasher())}); + // } + // t.reset(); + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto [uint_kmer, mini_info] : lookup_queries_uint_minimizer) { + // auto res = dict.lookup_uint_regular(uint_kmer, mini_info); + // essentials::do_not_optimize_away(res.kmer_id); + // } + // } + // t.stop(); + // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "lookup_uint no-minimizer: avg_nanosec_per_positive_lookup " + // << nanosec_per_lookup << std::endl; + + // kmers.resize(num_queries * k); + // uint64_t pos = 0; + // for (auto const& string : lookup_queries) { + // kmers.replace(pos, k, string); + // pos += k; + // } } - { - // perf test positive lookup, using a single std::string with all kmers contatenated - /* - ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t 8 -g - 16 --verbose -o human.index -d tmp_dir - ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 -g - 16 --canonical --verbose -o human.canon.index - d tmp_dir + // { + // // perf test positive lookup, using a single std::string with all kmers contatenated + // /* + // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t 8 + // -g 16 --verbose -o human.index -d tmp_dir + // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 + // -g 16 --canonical --verbose -o human.canon.index - d tmp_dir - ./sshash bench -i human.index - 1. avg_nanosec_per_positive_lookup 1379.05 - 2. avg_nanosec_per_positive_lookup 1298.91 + // ./sshash bench -i human.index + // 1. avg_nanosec_per_positive_lookup 1379.05 + // 2. avg_nanosec_per_positive_lookup 1298.91 - ./sshash bench -i human.canon.index - 1. avg_nanosec_per_positive_lookup 1136.06 - 2. avg_nanosec_per_positive_lookup 840.417 + // ./sshash bench -i human.canon.index + // 1. avg_nanosec_per_positive_lookup 1136.06 + // 2. avg_nanosec_per_positive_lookup 840.417 - So, it looks like the version with also loop-unrolling is a lot - beneficial for canonical indexes, indicating a better pipelining - for canonical indexes. + // So, it looks like the version with also loop-unrolling is a lot + // beneficial for canonical indexes, indicating a better pipelining + // for canonical indexes. - Clearly, if we do NOT transform kmers into their reverse complements, - regular indexes are faster, e.g.: - 1. avg_nanosec_per_positive_lookup 982.258 - wherease performance does not change for canonical indexes because - one bucket is inspected anyway. - */ - essentials::timer t; - t.start(); - uint64_t pos = 0; - for (uint64_t r = 0; r != runs; ++r) { - // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { - // auto id = dict.lookup(kmers.data() + pos); - // essentials::do_not_optimize_away(id); - // } - // pos = 0; + // Clearly, if we do NOT transform kmers into their reverse complements, + // regular indexes are faster, e.g.: + // 1. avg_nanosec_per_positive_lookup 982.258 + // wherease performance does not change for canonical indexes because + // one bucket is inspected anyway. + // */ + // essentials::timer t; + // t.start(); + // uint64_t pos = 0; + // for (uint64_t r = 0; r != runs; ++r) { + // // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { + // // auto id = dict.lookup(kmers.data() + pos); + // // essentials::do_not_optimize_away(id); + // // } + // // pos = 0; - /* - loop-unrolling - */ - for (uint64_t i = 0; i < num_queries; i += 8) { - auto id0 = dict.lookup(kmers.data() + pos + 8 * 0); - essentials::do_not_optimize_away(id0); + // /* + // loop-unrolling + // */ + // for (uint64_t i = 0; i < num_queries; i += 8) { + // auto id0 = dict.lookup(kmers.data() + pos + 8 * 0); + // essentials::do_not_optimize_away(id0); - auto id1 = dict.lookup(kmers.data() + pos + 8 * 1); - essentials::do_not_optimize_away(id1); + // auto id1 = dict.lookup(kmers.data() + pos + 8 * 1); + // essentials::do_not_optimize_away(id1); - auto id2 = dict.lookup(kmers.data() + pos + 8 * 2); - essentials::do_not_optimize_away(id2); + // auto id2 = dict.lookup(kmers.data() + pos + 8 * 2); + // essentials::do_not_optimize_away(id2); - auto id3 = dict.lookup(kmers.data() + pos + 8 * 3); - essentials::do_not_optimize_away(id3); + // auto id3 = dict.lookup(kmers.data() + pos + 8 * 3); + // essentials::do_not_optimize_away(id3); - auto id4 = dict.lookup(kmers.data() + pos + 8 * 4); - essentials::do_not_optimize_away(id4); + // auto id4 = dict.lookup(kmers.data() + pos + 8 * 4); + // essentials::do_not_optimize_away(id4); - auto id5 = dict.lookup(kmers.data() + pos + 8 * 5); - essentials::do_not_optimize_away(id5); + // auto id5 = dict.lookup(kmers.data() + pos + 8 * 5); + // essentials::do_not_optimize_away(id5); - auto id6 = dict.lookup(kmers.data() + pos + 8 * 6); - essentials::do_not_optimize_away(id6); + // auto id6 = dict.lookup(kmers.data() + pos + 8 * 6); + // essentials::do_not_optimize_away(id6); - auto id7 = dict.lookup(kmers.data() + pos + 8 * 7); - essentials::do_not_optimize_away(id7); + // auto id7 = dict.lookup(kmers.data() + pos + 8 * 7); + // essentials::do_not_optimize_away(id7); - pos += 8 * 8; - } - pos = 0; - } - t.stop(); - double nanosec_per_lookup = t.elapsed() / (runs * num_queries); - std::cout << "2. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - } + // pos += 8 * 8; + // } + // pos = 0; + // } + // t.stop(); + // double nanosec_per_lookup = t.elapsed() / (runs * num_queries); + // std::cout << "2. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + // } // { // // perf test negative lookup From e8940455fe7ca5a5f18f50ad8b95d2bc7dcf81df Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 8 Sep 2025 17:29:32 +0200 Subject: [PATCH 004/112] updated pthash; simplified hash utils --- benchmarks/README.md | 4 +- external/pthash | 2 +- include/builder/build_skew_index.hpp | 4 -- include/builder/util.hpp | 4 -- include/hash_util.hpp | 82 +++++----------------------- include/kmer.hpp | 4 +- src/build.cpp | 5 ++ 7 files changed, 27 insertions(+), 78 deletions(-) diff --git a/benchmarks/README.md b/benchmarks/README.md index 277af03..0150e26 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -29,6 +29,8 @@ bash ../script/streaming-query-low-hit.sh [prefix] where `[prefix]` should be replaced by a suitable basename, e.g., the current date. -These are the results obtained on 22/08/25 (see logs [here](results-22-08-25)). +These are the results obtained on 22/08/25 (see logs [here](results-22-08-25)) +on a machine equipped with an Intel Xeon W-2245 CPU @ 3.90GHz, and running Ubuntu 18.04.6. +The code was compiled with `gcc` 9.4. ![](results-22-08-25/results.png) diff --git a/external/pthash b/external/pthash index cc4c9c9..dfe4832 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit cc4c9c9c7366f7ebe238b4b6493372e774608cbf +Subproject commit dfe4832113f416520ff2253d09f2efde6fc7501d diff --git a/include/builder/build_skew_index.hpp b/include/builder/build_skew_index.hpp index a2fefdf..be67a90 100644 --- a/include/builder/build_skew_index.hpp +++ b/include/builder/build_skew_index.hpp @@ -229,10 +229,6 @@ void build_skew_index(skew_index& m_skew_index, // } assert(partition_id == num_partitions - 1); } - - std::cout << "num_bits_for_skew_index " << m_skew_index.num_bits() << "(" - << static_cast(m_skew_index.num_bits()) / buckets_stats.num_kmers() - << " [bits/kmer])" << std::endl; } } // namespace sshash \ No newline at end of file diff --git a/include/builder/util.hpp b/include/builder/util.hpp index d40d40f..3a6f2cb 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -302,10 +302,6 @@ struct minimizers_tuples { out.close(); fm_iterator.close(); - std::cout << "num_minimizers = " << m_num_minimizers << std::endl; - std::cout << "num_minimizer_positions = " << m_num_minimizer_positions << std::endl; - std::cout << "num_super_kmers = " << m_num_super_kmers << std::endl; - /* remove tmp files */ for (uint64_t i = 0; i != m_num_files_to_merge; ++i) { auto tmp_output_filename = get_tmp_output_filename(i); diff --git a/include/hash_util.hpp b/include/hash_util.hpp index 6611c37..d79d02c 100644 --- a/include/hash_util.hpp +++ b/include/hash_util.hpp @@ -5,21 +5,16 @@ namespace sshash { -template -struct kmers_pthash_hasher_64 { - typedef pthash::hash64 hash_type; +using minimizers_base_hasher_type = pthash::xxhash_128; - /* specialization for kmer_t */ - static inline pthash::hash64 hash(kmer_t x, uint64_t seed) { - uint64_t hash = 0; - for (int i = 0; i < kmer_t::uint_kmer_bits; i += 64) { - uint64_t block = x.pop64(); - hash ^= pthash::MurmurHash2_64(reinterpret_cast(&block), sizeof(block), - seed + i); - } - return hash; - } -}; +using minimizers_pthash_type = + pthash::partitioned_phf; // minimal output template struct kmers_pthash_hasher_128 { @@ -27,71 +22,24 @@ struct kmers_pthash_hasher_128 { /* specialization for kmer_t */ static inline pthash::hash128 hash(kmer_t x, uint64_t seed) { - uint64_t hash_first = 0; - uint64_t hash_second = 0; - for (int i = 0; i < kmer_t::uint_kmer_bits; i += 64) { - uint64_t block = x.pop64(); - hash_first ^= pthash::MurmurHash2_64(reinterpret_cast(&block), - sizeof(block), seed + i); - hash_second ^= pthash::MurmurHash2_64(reinterpret_cast(&block), - sizeof(block), ~seed + i); - } - return {hash_first, hash_second}; + return pthash::xxhash_128::hash(x.begin(), x.end(), seed); } }; -using minimizers_base_hasher_type = pthash::murmurhash2_128; - -using minimizers_pthash_type = - pthash::partitioned_phf; // search type - template using kmers_base_hasher_type = kmers_pthash_hasher_128; template -using kmers_pthash_type = - pthash::partitioned_phf, // base hasher - pthash::skew_bucketer, // bucketer type - pthash::dictionary_dictionary, // encoder type - true, // minimal output - pthash::pthash_search_type::xor_displacement>; // search type - -struct murmurhash2_64 { - murmurhash2_64() { seed(0); } - murmurhash2_64(const uint64_t seed) { this->seed(seed); } - - void seed(const uint64_t seed) { m_seed = seed; } - - /* specialization for uint64_t */ - inline uint64_t hash(uint64_t x) const { - return pthash::MurmurHash2_64(reinterpret_cast(&x), sizeof(x), m_seed); - } - - template - void visit(Visitor& visitor) const { - visitor.visit(m_seed); - } - - template - void visit(Visitor& visitor) { - visitor.visit(m_seed); - } - -private: - uint64_t m_seed; -}; +using kmers_pthash_type = pthash::partitioned_phf, // base hasher + pthash::skew_bucketer, // bucketer type + pthash::dictionary_dictionary, // encoder type + true>; // minimal output struct mixer_64 { mixer_64() { seed(0); } mixer_64(const uint64_t seed) { this->seed(seed); } - void seed(const uint64_t seed) { - m_magic = pthash::MurmurHash2_64(reinterpret_cast(&seed), sizeof(seed), 0); - } + void seed(const uint64_t seed) { m_magic = pthash::xxhash_64::hash(seed, 0).first(); } /* specialization for uint64_t */ inline uint64_t hash(uint64_t x) const { return (x * 0x517cc1b727220a95) ^ m_magic; } diff --git a/include/kmer.hpp b/include/kmer.hpp index 25edd42..6f12600 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -20,6 +20,9 @@ struct uint_kmer_t { uint_kmer_t() {} uint_kmer_t(uint64_t kmer) : kmer(kmer) {} + uint8_t const* begin() const { return reinterpret_cast(&kmer); } + uint8_t const* end() const { return begin() + sizeof(kmer); } + virtual ~uint_kmer_t() = default; explicit operator uint64_t() const { @@ -30,7 +33,6 @@ struct uint_kmer_t { } } - // TODO: change to <=> when switching to C++20 bool operator==(uint_kmer_t const& t) const { return kmer == t.kmer; } bool operator!=(uint_kmer_t const& t) const { return kmer != t.kmer; } bool operator<(uint_kmer_t const& t) const { return kmer < t.kmer; } diff --git a/src/build.cpp b/src/build.cpp index 759326b..27ebf86 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -75,6 +75,11 @@ void dictionary::build(std::string const& filename, timings.push_back(timer.elapsed()); print_time(timings.back(), data.num_kmers, "step 2.1: 'merging_minimizers_tuples'"); + std::cout << "num_minimizers = " << data.minimizers.num_minimizers() << std::endl; + std::cout << "num_minimizer_positions = " << data.minimizers.num_minimizer_positions() + << std::endl; + std::cout << "num_super_kmers = " << data.minimizers.num_super_kmers() << std::endl; + timer.reset(); timer.start(); From 21c2e8536698ab6458ad2fee1aa29af88288c9e0 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 8 Sep 2025 18:28:07 +0200 Subject: [PATCH 005/112] updated hash utils --- include/hash_util.hpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/include/hash_util.hpp b/include/hash_util.hpp index d79d02c..688af49 100644 --- a/include/hash_util.hpp +++ b/include/hash_util.hpp @@ -6,15 +6,13 @@ namespace sshash { using minimizers_base_hasher_type = pthash::xxhash_128; - -using minimizers_pthash_type = - pthash::partitioned_phf; // minimal output +using minimizers_pthash_type = // + pthash::partitioned_phf< // + minimizers_base_hasher_type, // base hasher + pthash::opt_bucketer, // bucketer type + pthash::compact, // encoder type + true // minimal output + >; // template struct kmers_pthash_hasher_128 { @@ -28,12 +26,14 @@ struct kmers_pthash_hasher_128 { template using kmers_base_hasher_type = kmers_pthash_hasher_128; - template -using kmers_pthash_type = pthash::partitioned_phf, // base hasher - pthash::skew_bucketer, // bucketer type - pthash::dictionary_dictionary, // encoder type - true>; // minimal output +using kmers_pthash_type = // + pthash::partitioned_phf< // + kmers_base_hasher_type, // base hasher + pthash::opt_bucketer, // bucketer type + pthash::compact, // encoder type + true // minimal output + >; // struct mixer_64 { mixer_64() { seed(0); } From d0e39db4c08744eb37187234f4e6bcf753f0ec8a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 12 Sep 2025 15:39:15 +0200 Subject: [PATCH 006/112] tripartition of offsets --- include/buckets.hpp | 62 ++++-- include/builder/build_skew_index.hpp | 1 - include/builder/build_sparse_index.hpp | 256 ++++++++++++++++++++----- include/skew_index.hpp | 22 ++- src/dictionary.cpp | 41 ++-- src/info.cpp | 19 +- src/statistics.cpp | 6 +- tools/perf.hpp | 47 +++-- 8 files changed, 342 insertions(+), 112 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index f00ba4a..79b95cc 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -59,18 +59,19 @@ struct buckets // kmer_t::bits_per_char * (contig_end - k + 1)); } - std::pair locate_bucket(const uint64_t bucket_id) const { - uint64_t begin = bucket_sizes.access(bucket_id) + bucket_id; - uint64_t end = bucket_sizes.access(bucket_id + 1) + bucket_id + 1; - assert(begin < end); - return {begin, end}; - } + // std::pair locate_bucket(const uint64_t bucket_id) const { + // uint64_t begin = bucket_sizes.access(bucket_id) + bucket_id; + // uint64_t end = bucket_sizes.access(bucket_id + 1) + bucket_id + 1; + // assert(begin < end); + // return {begin, end}; + // } lookup_result lookup(uint64_t begin, uint64_t end, kmer_t kmer, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // { { /* check minimizer first */ - uint64_t pos_in_seq = offsets.access(begin); + // uint64_t pos_in_seq = offsets.access(begin); + uint64_t pos_in_seq = offsets2.access(begin); uint64_t read_mmer = uint64_t( util::read_kmer_at(strings, m, kmer_t::bits_per_char * pos_in_seq)); if (read_mmer != mini_info.minimizer) { @@ -95,7 +96,35 @@ struct buckets // const uint64_t m) const // { (void)m; - uint64_t pos_in_seq = offsets.access(i); + // uint64_t pos_in_seq = offsets.access(i); + uint64_t pos_in_seq = offsets2.access(i); + if (pos_in_seq >= mini_info.pos_in_kmer) { + uint64_t offset = pos_in_seq - mini_info.pos_in_kmer; + auto res = offset_to_id(offset, k); + if (offset + k - 1 < res.contig_end(k)) { + auto read_kmer = + util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); + if (read_kmer == kmer) { + assert(is_valid(res)); + return res; + } + } + } + return lookup_result(); + } + + lookup_result lookup_at_offset(uint64_t pos_in_seq, kmer_t kmer, minimizer_info mini_info, + const uint64_t k, const uint64_t m) const // + { + { /* check minimizer first */ + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, kmer_t::bits_per_char * pos_in_seq)); + if (read_mmer != mini_info.minimizer) { + auto res = lookup_result(); + res.minimizer_found = false; + return res; + } + } if (pos_in_seq >= mini_info.pos_in_kmer) { uint64_t offset = pos_in_seq - mini_info.pos_in_kmer; auto res = offset_to_id(offset, k); @@ -278,7 +307,9 @@ struct buckets // } uint64_t num_bits() const { - return 8 * (pieces.num_bytes() + bucket_sizes.num_bytes() + offsets.num_bytes() + + return 8 * (pieces.num_bytes() + + essentials::vec_bytes(start_lists_of_size) + // bucket_sizes.num_bytes() + // + offsets.num_bytes() + offsets2.num_bytes() + offsets3.num_bytes() + // strings.num_bytes()); } @@ -293,16 +324,25 @@ struct buckets // } bits::elias_fano pieces; - bits::elias_fano bucket_sizes; + // bits::elias_fano bucket_sizes; + + std::vector start_lists_of_size; bits::compact_vector offsets; + bits::compact_vector offsets2; + bits::compact_vector offsets3; + bits::bit_vector strings; private: template static void visit_impl(Visitor& visitor, T&& t) { visitor.visit(t.pieces); - visitor.visit(t.bucket_sizes); + // visitor.visit(t.bucket_sizes); + + visitor.visit(t.start_lists_of_size); visitor.visit(t.offsets); + visitor.visit(t.offsets2); + visitor.visit(t.offsets3); visitor.visit(t.strings); } diff --git a/include/builder/build_skew_index.hpp b/include/builder/build_skew_index.hpp index be67a90..6faa723 100644 --- a/include/builder/build_skew_index.hpp +++ b/include/builder/build_skew_index.hpp @@ -15,7 +15,6 @@ void build_skew_index(skew_index& m_skew_index, // const uint64_t max_log2_size = m_skew_index.max_log2; const uint64_t min_size = 1ULL << min_log2_size; const uint64_t k = build_config.k; - assert(build_config.k > 0 and build_config.m <= build_config.k); m_skew_index.log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); diff --git a/include/builder/build_sparse_index.hpp b/include/builder/build_sparse_index.hpp index 5db9084..c5eb1fc 100644 --- a/include/builder/build_sparse_index.hpp +++ b/include/builder/build_sparse_index.hpp @@ -4,28 +4,6 @@ namespace sshash { -struct bucket_size_iterator { - using iterator_category = std::forward_iterator_tag; - - bucket_size_iterator(minimizer_tuple const* begin, minimizer_tuple const* end) - : m_val(0) // first returned value is always 0 - , m_it(begin, end) {} - - uint64_t operator*() const { return m_val; } - - void operator++() { - if (!m_it.has_next()) return; - uint64_t size = m_it.bucket().size(); - assert(size > 0); - m_val += size - 1; // directly compute the cumulative sum - m_it.next(); - } - -private: - uint64_t m_val; - minimizers_tuples_iterator m_it; -}; - template buckets_statistics build_sparse_index(parse_data& data, buckets& m_buckets, build_configuration const& build_config) // @@ -33,37 +11,26 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& const uint64_t num_kmers = data.num_kmers; const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); - const uint64_t num_buckets = data.minimizers.num_minimizers(); + const uint64_t num_minimizers = data.minimizers.num_minimizers(); const uint64_t num_threads = build_config.num_threads; + const uint64_t num_bits_per_offset = + std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); bits::compact_vector::builder offsets_builder; - offsets_builder.resize(num_minimizer_positions, - std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char))); + offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); - std::cout << "bits_per_offset = ceil(log2(" << data.strings.num_bits() / kmer_t::bits_per_char - << ")) = " << std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)) + std::cout << "num_bits_per_offset = ceil(log2(" + << data.strings.num_bits() / kmer_t::bits_per_char << ")) = " << num_bits_per_offset << std::endl; - std::cout << "reading from '" << data.minimizers.get_minimizers_filename() << "'..." - << std::endl; mm::file_source input(data.minimizers.get_minimizers_filename(), mm::advice::sequential); minimizer_tuple const* begin = input.data(); minimizer_tuple const* end = input.data() + input.size(); essentials::timer_type timer; - timer.start(); - { - bucket_size_iterator iterator(begin, end); - m_buckets.bucket_sizes.encode(iterator, num_buckets + 1, - num_minimizer_positions - num_buckets); - } - timer.stop(); - std::cout << "encoding bucket sizes: " << timer.elapsed() / 1000000 << " [sec]" << std::endl; - timer.reset(); - - buckets_statistics buckets_stats(num_buckets, num_kmers, num_minimizer_positions); + buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); timer.start(); const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; @@ -96,29 +63,35 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& it.next()) // { const uint64_t bucket_id = it.minimizer(); - const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - assert(end > begin); - const uint64_t bucket_size = end - begin; - assert(bucket_size == it.bucket().size()); - tbs.add_bucket_size(bucket_size); - uint64_t pos = 0; + assert(bucket_id < num_minimizers); + // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + // assert(end > begin); + // const uint64_t bucket_size = end - begin; + // assert(bucket_size == it.bucket().size()); auto bucket = it.bucket(); + const uint64_t bucket_size = bucket.size(); + tbs.add_bucket_size(bucket_size); uint64_t prev_pos_in_seq = constants::invalid_uint64; for (auto mt : bucket) { - if (mt.pos_in_seq != prev_pos_in_seq) { - offsets_builder.set(begin + pos++, mt.pos_in_seq); + if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { + /* + For minimizers occurring once, store a (log(N)+1)-bit + code, as follows: |offset|0|, i.e., the last bit is 0. + */ + uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(bucket_id, code); prev_pos_in_seq = mt.pos_in_seq; } tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); } - assert(pos == bucket_size); } }; std::vector threads(num_threads); for (uint64_t thread_id = 0; thread_id != num_threads; ++thread_id) { threads_buckets_stats[thread_id] = - buckets_statistics(num_buckets, num_kmers, num_minimizer_positions); + buckets_statistics(num_minimizers, num_kmers, num_minimizer_positions); threads[thread_id] = std::thread(exe, thread_id); } for (auto& t : threads) { @@ -135,12 +108,193 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& timer.start(); m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); - offsets_builder.build(m_buckets.offsets); m_buckets.strings.swap(data.strings); timer.stop(); std::cout << "encoding string boundaries and building offsets: " << timer.elapsed() / 1000000 << " [sec]" << std::endl; + /*******/ + { + assert(buckets_stats.num_buckets() == num_minimizers); + + const uint64_t min_log2_size = constants::min_l; // m_skew_index.min_log2; + const uint64_t max_log2_size = constants::max_l; // m_skew_index.max_log2; + const uint64_t min_size = 1ULL << min_log2_size; + const uint64_t log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); + + std::cout << "min_log2_size = " << min_log2_size << std::endl; + std::cout << "min_size = " << min_size << std::endl; + + std::cout << "max_bucket_size " << buckets_stats.max_bucket_size() << std::endl; + std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; + + mm::file_source input(data.minimizers.get_minimizers_filename(), + mm::advice::sequential); + + uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; + uint64_t num_buckets_in_skew_index = 0; + uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; + + uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; + uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; + + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); + it.has_next(); it.next()) // + { + auto bucket = it.bucket(); + const uint64_t bucket_size = bucket.size(); + if (bucket_size > 1) { + if (bucket_size <= min_size) { + ++num_buckets_larger_than_1_not_in_skew_index; + num_minimizer_positions_of_buckets_larger_than_1 += bucket_size; + } else { + ++num_buckets_in_skew_index; + num_minimizer_positions_of_buckets_in_skew_index += bucket_size; + } + num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); + } + } + + std::cout << "num_buckets_larger_than_1_not_in_skew_index " + << num_buckets_larger_than_1_not_in_skew_index << "/" + << buckets_stats.num_buckets() << " (" + << (num_buckets_larger_than_1_not_in_skew_index * 100.0) / + buckets_stats.num_buckets() + << "%)" << std::endl; + std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" + << buckets_stats.num_buckets() << " (" + << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" + << std::endl; + + // if (num_buckets_in_skew_index == 0) { + // input.close(); + // return; + // } + + std::vector buckets; + buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); + std::vector tuples; // backed memory + tuples.reserve(num_super_kmers_in_buckets_larger_than_1); + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); + it.has_next(); it.next()) // + { + auto bucket = it.bucket(); + if (bucket.size() > 1) { + minimizer_tuple const* begin = tuples.data() + tuples.size(); + std::copy(bucket.begin_ptr(), bucket.end_ptr(), std::back_inserter(tuples)); + minimizer_tuple const* end = tuples.data() + tuples.size(); + buckets.push_back(bucket_type(begin, end)); + } + } + assert(buckets.size() == + num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); + input.close(); + + std::sort(buckets.begin(), buckets.end(), + [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); + + uint64_t num_partitions = max_log2_size - min_log2_size + 1; + if (buckets_stats.max_bucket_size() < (1ULL << max_log2_size)) { + num_partitions = log2_max_bucket_size - min_log2_size; + } + std::cout << "skew index num_partitions " << num_partitions << std::endl; + assert(num_partitions <= 8); // so that we need 3 bits to encode a partition_id + + std::cout << "num_minimizer_positions_of_buckets_larger_than_1 " + << num_minimizer_positions_of_buckets_larger_than_1 << "/" + << num_minimizer_positions << " (" + << (num_minimizer_positions_of_buckets_larger_than_1 * 100.0) / + num_minimizer_positions + << "%)" << std::endl; + std::cout << "num_minimizer_positions_of_buckets_in_skew_index " + << num_minimizer_positions_of_buckets_in_skew_index << "/" + << num_minimizer_positions << " (" + << (num_minimizer_positions_of_buckets_in_skew_index * 100.0) / + num_minimizer_positions + << "%)" << std::endl; + + bits::compact_vector::builder offsets2_builder; + bits::compact_vector::builder offsets3_builder; + offsets2_builder.resize(num_minimizer_positions_of_buckets_larger_than_1, + num_bits_per_offset); + offsets3_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, + num_bits_per_offset); + + uint64_t curr_bucket_size = 2; + uint64_t list_id = 0; + + m_buckets.start_lists_of_size.resize(min_size + 1, 0); + uint64_t offsets2_curr_size = 0; + uint64_t offsets3_curr_size = 0; + + uint64_t partition_id = 0; + uint64_t lower = min_size; + uint64_t upper = 2 * lower; + + for (auto bucket : buckets) { + const uint64_t bucket_size = bucket.size(); + assert(bucket_size >= 2); + + if (bucket_size > curr_bucket_size) { + while (bucket_size > curr_bucket_size) ++curr_bucket_size; + if (curr_bucket_size <= min_size) { + m_buckets.start_lists_of_size[curr_bucket_size] = offsets2_curr_size; + } else { + while (curr_bucket_size > upper) { + lower = upper; + upper = 2 * lower; + partition_id += 1; + } + } + list_id = 0; + } + + if (curr_bucket_size <= min_size) { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + uint64_t p = (list_id << min_log2_size) | (curr_bucket_size - 2); + uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + offsets2_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + offsets2_curr_size += 1; + } + } + ++list_id; + } else { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + assert(partition_id < 8); + uint64_t p = (offsets3_curr_size << 3) | partition_id; + uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + offsets3_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + offsets3_curr_size += 1; + } + } + } + } + + offsets2_builder.build(m_buckets.offsets2); + offsets3_builder.build(m_buckets.offsets3); + } + + offsets_builder.build(m_buckets.offsets); + + for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { + std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] + << std::endl; + } + return buckets_stats; } diff --git a/include/skew_index.hpp b/include/skew_index.hpp index 4690456..2c1fe7d 100644 --- a/include/skew_index.hpp +++ b/include/skew_index.hpp @@ -34,13 +34,21 @@ struct skew_index { bool empty() const { return mphfs.empty(); } - uint64_t lookup(kmer_t uint_kmer, uint64_t log2_bucket_size) const { - assert(log2_bucket_size >= uint64_t(min_log2 + 1)); - assert(log2_bucket_size <= log2_max_bucket_size); - uint64_t partition_id = log2_bucket_size - (min_log2 + 1); - if (log2_bucket_size == log2_max_bucket_size or log2_bucket_size > max_log2) { - partition_id = mphfs.size() - 1; - } + // uint64_t lookup(kmer_t uint_kmer, uint64_t log2_bucket_size) const { + // assert(log2_bucket_size >= uint64_t(min_log2 + 1)); + // assert(log2_bucket_size <= log2_max_bucket_size); + // uint64_t partition_id = log2_bucket_size - (min_log2 + 1); + // if (log2_bucket_size == log2_max_bucket_size or log2_bucket_size > max_log2) { + // partition_id = mphfs.size() - 1; + // } + // assert(partition_id < mphfs.size()); + // auto const& f = mphfs[partition_id]; + // auto const& p = positions[partition_id]; + // uint64_t position = p.access(f(uint_kmer)); + // return position; + // } + + uint64_t lookup(kmer_t uint_kmer, uint64_t partition_id) const { assert(partition_id < mphfs.size()); auto const& f = mphfs[partition_id]; auto const& p = positions[partition_id]; diff --git a/src/dictionary.cpp b/src/dictionary.cpp index f2cb996..8e463ed 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -16,24 +16,33 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher)); const uint64_t bucket_id = m_minimizers.lookup(mini_info.minimizer); - const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - if (m_skew_index.empty()) { - return m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); + uint64_t code = m_buckets.offsets.access(bucket_id); + uint64_t status = code & 1; + if (status == 0) { // minimizer occurs once + uint64_t offset = code >> 1; + return m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); } - const uint64_t bucket_size = end - begin; - const uint64_t log2_bucket_size = bits::util::ceil_log2_uint32(bucket_size); - if (log2_bucket_size > m_skew_index.min_log2) { - uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer, log2_bucket_size); - /* It must hold pos_in_bucket < bucket_size for the kmer to exist. */ - if (pos_in_bucket < bucket_size) { - return m_buckets.lookup(begin + pos_in_bucket, uint_kmer, mini_info, m_k, m_m); - } - return lookup_result(); + status = code & 3; + code >>= 2; + if (status == 1) { // minimizer occurs more than once, but is not part of the skew index + constexpr uint64_t mask = (uint64_t(1) << constants::min_l) - 1; + uint64_t list_size = (code & mask) + 2; + uint64_t list_id = code >> constants::min_l; + assert(list_size < m_buckets.start_lists_of_size.size()); + uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; + uint64_t end = begin + list_size; + return m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); } - return m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); + // minimizer is part of the skew index + assert(status == 3); + uint64_t partition_id = code & 7; + uint64_t begin = code >> 3; + uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer, partition_id); + uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); + return m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); } template @@ -65,7 +74,11 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher).minimizer)); const uint64_t bucket_id = m_minimizers.lookup(mini_info.minimizer); - const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + + // TODO: fix + uint64_t begin = 0; + uint64_t end = 0; if (m_skew_index.empty()) { return m_buckets.lookup_canonical(begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m); diff --git a/src/info.cpp b/src/info.cpp index 95d73d0..904639a 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -49,11 +49,24 @@ void dictionary::print_space_breakdown() const { << " [bits/key]) -- " << perc(m_minimizers.num_bits(), num_bits()) << "%\n"; std::cout << " pieces: " << (8.0 * m_buckets.pieces.num_bytes()) / size() << " [bits/kmer] -- " << perc(m_buckets.pieces.num_bytes() * 8, num_bits()) << "%\n"; - std::cout << " sizes: " << (m_buckets.bucket_sizes.num_bytes() * 8.0) / size() - << " [bits/kmer] -- " << perc(m_buckets.bucket_sizes.num_bytes() * 8, num_bits()) - << "%\n"; + // std::cout << " sizes: " << (m_buckets.bucket_sizes.num_bytes() * 8.0) / size() + // << " [bits/kmer] -- " << perc(m_buckets.bucket_sizes.num_bytes() * 8, num_bits()) + // << "%\n"; + std::cout << " offsets: " << (8.0 * m_buckets.offsets.num_bytes()) / size() << " [bits/kmer] -- " << perc(8 * m_buckets.offsets.num_bytes(), num_bits()) << "%\n"; + std::cout << " offsets2: " << (8.0 * m_buckets.offsets2.num_bytes()) / size() + << " [bits/kmer] -- " << perc(8 * m_buckets.offsets2.num_bytes(), num_bits()) + << "%\n"; + std::cout << " offsets3: " << (8.0 * m_buckets.offsets3.num_bytes()) / size() + << " [bits/kmer] -- " << perc(8 * m_buckets.offsets3.num_bytes(), num_bits()) + << "%\n"; + std::cout << " start_lists_of_size: " + << (8.0 * essentials::vec_bytes(m_buckets.start_lists_of_size)) / size() + << " [bits/kmer] -- " + << perc(8 * essentials::vec_bytes(m_buckets.start_lists_of_size), num_bits()) + << "%\n"; + std::cout << " strings: " << (8.0 * m_buckets.strings.num_bytes()) / size() << " [bits/kmer] -- " << perc(8 * m_buckets.strings.num_bytes(), num_bits()) << "%\n"; std::cout << " skew_index: " << static_cast(m_skew_index.num_bits()) / size() diff --git a/src/statistics.cpp b/src/statistics.cpp index 8ebc945..dc8c518 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -17,7 +17,11 @@ void dictionary::compute_statistics() const // minimizer_iterator minimizer_it(m_k, m_m, m_hasher); for (uint64_t bucket_id = 0; bucket_id != num_minimizers; ++bucket_id) { - const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + + // TODO: fixme + uint64_t begin = 0; + uint64_t end = 0; const uint64_t bucket_size = end - begin; buckets_stats.add_bucket_size(bucket_size); for (uint64_t i = begin; i != end; ++i) { diff --git a/tools/perf.hpp b/tools/perf.hpp index 158b050..9573a01 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -27,22 +27,21 @@ void perf_test_lookup_access(dictionary const& dict) { std::string kmer(k, 0); std::string kmer_rc(k, 0); - std::string kmers; + // std::string kmers; { // perf test positive lookup, using a std::vector - std::vector lookup_queries; lookup_queries.reserve(num_queries); for (uint64_t i = 0; i != num_queries; ++i) { uint64_t id = distr.gen(); dict.access(id, kmer.data()); - // if ((i & 1) == 0) { - // /* transform 50% of the kmers into their reverse complements */ - // kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); - // lookup_queries.push_back(kmer_rc); - // } else { - lookup_queries.push_back(kmer); - // } + if ((i & 1) == 0) { + /* transform 50% of the kmers into their reverse complements */ + kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); + lookup_queries.push_back(kmer_rc); + } else { + lookup_queries.push_back(kmer); + } } essentials::timer t; @@ -103,12 +102,12 @@ void perf_test_lookup_access(dictionary const& dict) { // } } // { - // // perf test positive lookup, using a single std::string with all kmers contatenated + // perf test positive lookup, using a single std::string with all kmers contatenated // /* - // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t 8 - // -g 16 --verbose -o human.index -d tmp_dir - // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 - // -g 16 --canonical --verbose -o human.canon.index - d tmp_dir + // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t + // 8 -g 16 --verbose -o human.index -d tmp_dir + // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t + // 8 -g 16 --canonical --verbose -o human.canon.index - d tmp_dir // ./sshash bench -i human.index // 1. avg_nanosec_per_positive_lookup 1379.05 @@ -128,15 +127,15 @@ void perf_test_lookup_access(dictionary const& dict) { // wherease performance does not change for canonical indexes because // one bucket is inspected anyway. // */ - // essentials::timer t; - // t.start(); - // uint64_t pos = 0; - // for (uint64_t r = 0; r != runs; ++r) { - // // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { - // // auto id = dict.lookup(kmers.data() + pos); - // // essentials::do_not_optimize_away(id); - // // } - // // pos = 0; + // essentials::timer t; + // t.start(); + // uint64_t pos = 0; + // for (uint64_t r = 0; r != runs; ++r) { + // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { + // auto id = dict.lookup(kmers.data() + pos); + // essentials::do_not_optimize_away(id); + // } + // pos = 0; // /* // loop-unrolling @@ -263,7 +262,7 @@ void perf_test_lookup_access(dictionary const& dict) { // access_queries.size()); std::cout << "avg_nanosec_per_access " << nanosec_per_access << // std::endl; // } -} +} // namespace sshash template void perf_test_lookup_weight(dictionary const& dict) { From 550dbd914e73df80e15f7d6b21cdee5aec6a444e Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 12 Sep 2025 16:40:30 +0200 Subject: [PATCH 007/112] fix --- include/builder/build_sparse_index.hpp | 12 +++--------- include/skew_index.hpp | 14 -------------- 2 files changed, 3 insertions(+), 23 deletions(-) diff --git a/include/builder/build_sparse_index.hpp b/include/builder/build_sparse_index.hpp index c5eb1fc..14fb726 100644 --- a/include/builder/build_sparse_index.hpp +++ b/include/builder/build_sparse_index.hpp @@ -64,10 +64,6 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& { const uint64_t bucket_id = it.minimizer(); assert(bucket_id < num_minimizers); - // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - // assert(end > begin); - // const uint64_t bucket_size = end - begin; - // assert(bucket_size == it.bucket().size()); auto bucket = it.bucket(); const uint64_t bucket_size = bucket.size(); tbs.add_bucket_size(bucket_size); @@ -166,11 +162,6 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; - // if (num_buckets_in_skew_index == 0) { - // input.close(); - // return; - // } - std::vector buckets; buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); std::vector tuples; // backed memory @@ -244,6 +235,9 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& lower = upper; upper = 2 * lower; partition_id += 1; + if (partition_id == num_partitions - 1) { + upper = buckets_stats.max_bucket_size(); + } } } list_id = 0; diff --git a/include/skew_index.hpp b/include/skew_index.hpp index 2c1fe7d..4afad89 100644 --- a/include/skew_index.hpp +++ b/include/skew_index.hpp @@ -34,20 +34,6 @@ struct skew_index { bool empty() const { return mphfs.empty(); } - // uint64_t lookup(kmer_t uint_kmer, uint64_t log2_bucket_size) const { - // assert(log2_bucket_size >= uint64_t(min_log2 + 1)); - // assert(log2_bucket_size <= log2_max_bucket_size); - // uint64_t partition_id = log2_bucket_size - (min_log2 + 1); - // if (log2_bucket_size == log2_max_bucket_size or log2_bucket_size > max_log2) { - // partition_id = mphfs.size() - 1; - // } - // assert(partition_id < mphfs.size()); - // auto const& f = mphfs[partition_id]; - // auto const& p = positions[partition_id]; - // uint64_t position = p.access(f(uint_kmer)); - // return position; - // } - uint64_t lookup(kmer_t uint_kmer, uint64_t partition_id) const { assert(partition_id < mphfs.size()); auto const& f = mphfs[partition_id]; From 80c9d00581699f886ea9b3cb270a1f1ca8405b75 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 12 Sep 2025 17:26:18 +0200 Subject: [PATCH 008/112] using 32-bit words for buckets.start_lists_of_size --- include/buckets.hpp | 13 +-------- tools/perf.hpp | 64 ++++++++++++++------------------------------- 2 files changed, 21 insertions(+), 56 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 79b95cc..20b34af 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -59,13 +59,6 @@ struct buckets // kmer_t::bits_per_char * (contig_end - k + 1)); } - // std::pair locate_bucket(const uint64_t bucket_id) const { - // uint64_t begin = bucket_sizes.access(bucket_id) + bucket_id; - // uint64_t end = bucket_sizes.access(bucket_id + 1) + bucket_id + 1; - // assert(begin < end); - // return {begin, end}; - // } - lookup_result lookup(uint64_t begin, uint64_t end, kmer_t kmer, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // { @@ -324,9 +317,7 @@ struct buckets // } bits::elias_fano pieces; - // bits::elias_fano bucket_sizes; - - std::vector start_lists_of_size; + std::vector start_lists_of_size; bits::compact_vector offsets; bits::compact_vector offsets2; bits::compact_vector offsets3; @@ -337,8 +328,6 @@ struct buckets // template static void visit_impl(Visitor& visitor, T&& t) { visitor.visit(t.pieces); - // visitor.visit(t.bucket_sizes); - visitor.visit(t.start_lists_of_size); visitor.visit(t.offsets); visitor.visit(t.offsets2); diff --git a/tools/perf.hpp b/tools/perf.hpp index 9573a01..842f87f 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -103,30 +103,6 @@ void perf_test_lookup_access(dictionary const& dict) { } // { // perf test positive lookup, using a single std::string with all kmers contatenated - // /* - // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t - // 8 -g 16 --verbose -o human.index -d tmp_dir - // ./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t - // 8 -g 16 --canonical --verbose -o human.canon.index - d tmp_dir - - // ./sshash bench -i human.index - // 1. avg_nanosec_per_positive_lookup 1379.05 - // 2. avg_nanosec_per_positive_lookup 1298.91 - - // ./sshash bench -i human.canon.index - // 1. avg_nanosec_per_positive_lookup 1136.06 - // 2. avg_nanosec_per_positive_lookup 840.417 - - // So, it looks like the version with also loop-unrolling is a lot - // beneficial for canonical indexes, indicating a better pipelining - // for canonical indexes. - - // Clearly, if we do NOT transform kmers into their reverse complements, - // regular indexes are faster, e.g.: - // 1. avg_nanosec_per_positive_lookup 982.258 - // wherease performance does not change for canonical indexes because - // one bucket is inspected anyway. - // */ // essentials::timer t; // t.start(); // uint64_t pos = 0; @@ -174,26 +150,26 @@ void perf_test_lookup_access(dictionary const& dict) { // std::cout << "2. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; // } - // { - // // perf test negative lookup - // std::vector lookup_queries; - // lookup_queries.reserve(num_queries); - // for (uint64_t i = 0; i != num_queries; ++i) { - // random_kmer(kmer.data(), k); - // lookup_queries.push_back(kmer); - // } - // essentials::timer t; - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto const& string : lookup_queries) { - // auto id = dict.lookup(string.c_str()); - // essentials::do_not_optimize_away(id); - // } - // } - // t.stop(); - // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; - // } + { + // perf test negative lookup + std::vector lookup_queries; + lookup_queries.reserve(num_queries); + for (uint64_t i = 0; i != num_queries; ++i) { + random_kmer(kmer.data(), k); + lookup_queries.push_back(kmer); + } + essentials::timer t; + t.start(); + for (uint64_t r = 0; r != runs; ++r) { + for (auto const& string : lookup_queries) { + auto id = dict.lookup(string.c_str()); + essentials::do_not_optimize_away(id); + } + } + t.stop(); + double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; + } // { // // perf test positive lookup_advanced // std::vector lookup_queries; From a0140aa06193b64a0b6f3b5b18674292a1654dee Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 13 Sep 2025 01:06:42 +0200 Subject: [PATCH 009/112] lookup for canonical indexes --- include/buckets.hpp | 106 ++++++++++++------------- include/builder/build_sparse_index.hpp | 8 +- include/util.hpp | 4 +- src/dictionary.cpp | 48 ++++++----- 4 files changed, 86 insertions(+), 80 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 20b34af..a005fd0 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -63,34 +63,25 @@ struct buckets // const uint64_t k, const uint64_t m) const // { { /* check minimizer first */ - // uint64_t pos_in_seq = offsets.access(begin); - uint64_t pos_in_seq = offsets2.access(begin); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * pos_in_seq)); - if (read_mmer != mini_info.minimizer) { - auto res = lookup_result(); - res.minimizer_found = false; - return res; - } + uint64_t bit_offset = kmer_t::bits_per_char * offsets2.access(begin); + uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); + if (read_mmer != mini_info.minimizer) return lookup_result(false); } - for (uint64_t i = begin; i != end; ++i) { - auto res = lookup(i, kmer, mini_info, k, m); + uint64_t pos_in_seq = offsets2.access(i); + auto res = lookup_at_offset_no_check_minimizer(pos_in_seq, kmer, mini_info, k); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; } } - return lookup_result(); } - lookup_result lookup(uint64_t i, kmer_t kmer, minimizer_info mini_info, const uint64_t k, - const uint64_t m) const // + lookup_result lookup_at_offset_no_check_minimizer(uint64_t pos_in_seq, kmer_t kmer, + minimizer_info mini_info, + const uint64_t k) const // { - (void)m; - // uint64_t pos_in_seq = offsets.access(i); - uint64_t pos_in_seq = offsets2.access(i); if (pos_in_seq >= mini_info.pos_in_kmer) { uint64_t offset = pos_in_seq - mini_info.pos_in_kmer; auto res = offset_to_id(offset, k); @@ -110,27 +101,11 @@ struct buckets // const uint64_t k, const uint64_t m) const // { { /* check minimizer first */ - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * pos_in_seq)); - if (read_mmer != mini_info.minimizer) { - auto res = lookup_result(); - res.minimizer_found = false; - return res; - } - } - if (pos_in_seq >= mini_info.pos_in_kmer) { - uint64_t offset = pos_in_seq - mini_info.pos_in_kmer; - auto res = offset_to_id(offset, k); - if (offset + k - 1 < res.contig_end(k)) { - auto read_kmer = - util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - if (read_kmer == kmer) { - assert(is_valid(res)); - return res; - } - } + uint64_t bit_offset = kmer_t::bits_per_char * pos_in_seq; + uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); + if (read_mmer != mini_info.minimizer) return lookup_result(false); } - return lookup_result(); + return lookup_at_offset_no_check_minimizer(pos_in_seq, kmer, mini_info, k); } lookup_result lookup_canonical(uint64_t begin, uint64_t end, kmer_t kmer, kmer_t kmer_rc, @@ -138,48 +113,69 @@ struct buckets // const uint64_t m) const // { { /* check minimizer first */ - uint64_t pos_in_seq = offsets.access(begin); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * pos_in_seq)); + uint64_t bit_offset = kmer_t::bits_per_char * offsets2.access(begin); + uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); auto tmp = kmer_t(mini_info.minimizer); tmp.reverse_complement_inplace(m); uint64_t minimizer_rc = uint64_t(tmp); if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { - auto res = lookup_result(); - res.minimizer_found = false; - return res; + return lookup_result(false); } } - for (uint64_t i = begin; i != end; ++i) { - auto res = lookup_canonical(i, kmer, kmer_rc, mini_info, k, m); + uint64_t pos_in_seq = offsets2.access(i); + auto res = lookup_canonical_at_offset_no_check_minimizer( // + pos_in_seq, kmer, kmer_rc, mini_info, k, m); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; } } - return lookup_result(); } - lookup_result lookup_canonical(uint64_t i, kmer_t kmer, kmer_t kmer_rc, - minimizer_info mini_info, const uint64_t k, - const uint64_t m) const // + lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t pos_in_seq, // + const kmer_t kmer, + const kmer_t kmer_rc, // + const minimizer_info mini_info, // + const uint64_t k, + const uint64_t m) const // { - const uint64_t pos_in_seq = offsets.access(i); uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_position(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); + auto res = check_offset(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; } pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_position(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); + return check_offset(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); + } + + lookup_result lookup_canonical_at_offset(const uint64_t pos_in_seq, // + const kmer_t kmer, + const kmer_t kmer_rc, // + const minimizer_info mini_info, // + const uint64_t k, + const uint64_t m) const // + { + { /* check minimizer first */ + uint64_t bit_offset = kmer_t::bits_per_char * pos_in_seq; + uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); + auto tmp = kmer_t(mini_info.minimizer); + tmp.reverse_complement_inplace(m); + uint64_t minimizer_rc = uint64_t(tmp); + if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { + return lookup_result(false); + } + } + return lookup_canonical_at_offset_no_check_minimizer( // + pos_in_seq, kmer, kmer_rc, mini_info, k, m // + ); } - lookup_result check_position(const uint64_t pos_in_seq, const uint64_t pos_in_kmer, // - const kmer_t kmer, const kmer_t kmer_rc, // - const uint64_t k) const // + lookup_result check_offset(const uint64_t pos_in_seq, const uint64_t pos_in_kmer, // + const kmer_t kmer, const kmer_t kmer_rc, // + const uint64_t k) const // { if (pos_in_seq >= pos_in_kmer) { uint64_t offset = pos_in_seq - pos_in_kmer; diff --git a/include/builder/build_sparse_index.hpp b/include/builder/build_sparse_index.hpp index 14fb726..f247a9d 100644 --- a/include/builder/build_sparse_index.hpp +++ b/include/builder/build_sparse_index.hpp @@ -284,10 +284,10 @@ buckets_statistics build_sparse_index(parse_data& data, buckets& offsets_builder.build(m_buckets.offsets); - for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { - std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] - << std::endl; - } + // for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { + // std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] + // << std::endl; + // } return buckets_stats; } diff --git a/include/util.hpp b/include/util.hpp index 3cb1247..a009ea5 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -30,13 +30,13 @@ struct streaming_query_report { }; struct lookup_result { - lookup_result() + lookup_result(bool mf = true) : kmer_id(constants::invalid_uint64) , kmer_id_in_contig(constants::invalid_uint64) , kmer_orientation(constants::forward_orientation) , contig_id(constants::invalid_uint64) , contig_size(constants::invalid_uint64) - , minimizer_found(true) {} + , minimizer_found(mf) {} uint64_t kmer_id; // "absolute" kmer-id uint64_t kmer_id_in_contig; // "relative" kmer-id: 0 <= kmer_id_in_contig < contig_size diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 8e463ed..bf65a07 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -74,30 +74,40 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher).minimizer)); const uint64_t bucket_id = m_minimizers.lookup(mini_info.minimizer); - // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - // TODO: fix - uint64_t begin = 0; - uint64_t end = 0; - - if (m_skew_index.empty()) { - return m_buckets.lookup_canonical(begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m); + uint64_t code = m_buckets.offsets.access(bucket_id); + uint64_t status = code & 1; + if (status == 0) { // minimizer occurs once + uint64_t offset = code >> 1; + return m_buckets.lookup_canonical_at_offset( // + offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // + ); } - const uint64_t bucket_size = end - begin; - const uint64_t log2_bucket_size = bits::util::ceil_log2_uint32(bucket_size); - if (log2_bucket_size > m_skew_index.min_log2) { - auto uint_kmer_canon = std::min(uint_kmer, uint_kmer_rc); - uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer_canon, log2_bucket_size); - if (pos_in_bucket < bucket_size) { - auto res = m_buckets.lookup_canonical(begin + pos_in_bucket, uint_kmer, uint_kmer_rc, - mini_info, m_k, m_m); - if (res.kmer_id != constants::invalid_uint64) return res; - } - return lookup_result(); + status = code & 3; + code >>= 2; + if (status == 1) { // minimizer occurs more than once, but is not part of the skew index + constexpr uint64_t mask = (uint64_t(1) << constants::min_l) - 1; + uint64_t list_size = (code & mask) + 2; + uint64_t list_id = code >> constants::min_l; + assert(list_size < m_buckets.start_lists_of_size.size()); + uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; + uint64_t end = begin + list_size; + return m_buckets.lookup_canonical( // + begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // + ); } - return m_buckets.lookup_canonical(begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m); + // minimizer is part of the skew index + assert(status == 3); + uint64_t partition_id = code & 7; + uint64_t begin = code >> 3; + const auto uint_kmer_canon = std::min(uint_kmer, uint_kmer_rc); + uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer_canon, partition_id); + uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); + return m_buckets.lookup_canonical_at_offset( // + offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // + ); } template From 34af717af035af06b11adaac5a816b08e8e5440c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 13 Sep 2025 22:13:23 +0200 Subject: [PATCH 010/112] a note on presence of minimizers when lookup is resolved via the skew index --- include/buckets.hpp | 5 ++--- include/util.hpp | 1 + src/dictionary.cpp | 26 ++++++++++++++++++++------ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index a005fd0..22520bb 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -296,10 +296,9 @@ struct buckets // } uint64_t num_bits() const { - return 8 * (pieces.num_bytes() + - essentials::vec_bytes(start_lists_of_size) + // bucket_sizes.num_bytes() + // + return 8 * (pieces.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // offsets.num_bytes() + offsets2.num_bytes() + offsets3.num_bytes() + // - strings.num_bytes()); + strings.num_bytes()); // } template diff --git a/include/util.hpp b/include/util.hpp index a009ea5..2cc6dbb 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -60,6 +60,7 @@ inline std::ostream& operator<<(std::ostream& os, lookup_result const& res) { os << " == kmer_orientation = " << res.kmer_orientation << '\n'; os << " == contig_id = " << res.contig_id << '\n'; os << " == contig_size = " << res.contig_size << '\n'; + os << " == minimizer_found = " << (res.minimizer_found ? "true" : "false") << '\n'; return os; } diff --git a/src/dictionary.cpp b/src/dictionary.cpp index bf65a07..d6d3e62 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -15,9 +15,9 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, assert(minimizer_info(mini_info.minimizer, mini_info.pos_in_kmer) == util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher)); - const uint64_t bucket_id = m_minimizers.lookup(mini_info.minimizer); + const uint64_t minimizer_id = m_minimizers.lookup(mini_info.minimizer); - uint64_t code = m_buckets.offsets.access(bucket_id); + uint64_t code = m_buckets.offsets.access(minimizer_id); uint64_t status = code & 1; if (status == 0) { // minimizer occurs once uint64_t offset = code >> 1; @@ -42,7 +42,19 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, uint64_t begin = code >> 3; uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer, partition_id); uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); - return m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); + auto res = m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); + /* + The function `lookup_at_offset` determines if the minimizer is found at the given + `offset`, not whether the minimizer does not appear at all. + It can happen that the `mini_info.minimizer` appears somewhere but not at the + computed `offset` because `pos_in_bucket` might be larger than the size of + the bucket (which we do not know for minimizers in the skew index). + Since for streaming queries we keep track of the presence + of minimizers, only in this special case we set `res.minimizer_found` to true + to indicate that we do not know whether the minimizer appears in the index or not. + */ + res.minimizer_found = true; + return res; } template @@ -73,9 +85,9 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t std::min(util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher).minimizer, util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher).minimizer)); - const uint64_t bucket_id = m_minimizers.lookup(mini_info.minimizer); + const uint64_t minimizer_id = m_minimizers.lookup(mini_info.minimizer); - uint64_t code = m_buckets.offsets.access(bucket_id); + uint64_t code = m_buckets.offsets.access(minimizer_id); uint64_t status = code & 1; if (status == 0) { // minimizer occurs once uint64_t offset = code >> 1; @@ -105,9 +117,11 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t const auto uint_kmer_canon = std::min(uint_kmer, uint_kmer_rc); uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer_canon, partition_id); uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); - return m_buckets.lookup_canonical_at_offset( // + auto res = m_buckets.lookup_canonical_at_offset( // offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // ); + res.minimizer_found = true; // see note above in the function `lookup_uint_regular` + return res; } template From 42c3d1d238e7b95fe45568316cec561d9ccc769a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 14 Sep 2025 17:04:49 +0200 Subject: [PATCH 011/112] fixed constants for skew index; merge parse and skew index construction --- include/builder/build_skew_index.hpp | 233 --------- .../builder/build_sparse_and_skew_index.hpp | 457 ++++++++++++++++++ include/builder/build_sparse_index.hpp | 295 ----------- include/builder/parse_file.hpp | 8 +- include/constants.hpp | 5 +- include/minimizers.hpp | 7 +- include/skew_index.hpp | 19 +- include/util.hpp | 15 +- src/build.cpp | 36 +- tools/build.cpp | 9 +- 10 files changed, 487 insertions(+), 597 deletions(-) delete mode 100644 include/builder/build_skew_index.hpp create mode 100644 include/builder/build_sparse_and_skew_index.hpp delete mode 100644 include/builder/build_sparse_index.hpp diff --git a/include/builder/build_skew_index.hpp b/include/builder/build_skew_index.hpp deleted file mode 100644 index 6faa723..0000000 --- a/include/builder/build_skew_index.hpp +++ /dev/null @@ -1,233 +0,0 @@ -#pragma once - -#include "external/pthash/include/pthash.hpp" - -namespace sshash { - -template -void build_skew_index(skew_index& m_skew_index, // - parse_data& data, // - buckets const& m_buckets, // - build_configuration const& build_config, // - buckets_statistics const& buckets_stats) // -{ - const uint64_t min_log2_size = m_skew_index.min_log2; - const uint64_t max_log2_size = m_skew_index.max_log2; - const uint64_t min_size = 1ULL << min_log2_size; - const uint64_t k = build_config.k; - - m_skew_index.log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); - - std::cout << "max_bucket_size " << buckets_stats.max_bucket_size() << std::endl; - std::cout << "log2_max_bucket_size " << m_skew_index.log2_max_bucket_size << std::endl; - - mm::file_source input(data.minimizers.get_minimizers_filename(), - mm::advice::sequential); - - uint64_t num_buckets_in_skew_index = 0; - uint64_t num_super_kmers_in_skew_index = 0; - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); - it.next()) // - { - auto bucket = it.bucket(); - if (bucket.size() > min_size) { - num_super_kmers_in_skew_index += bucket.num_super_kmers(); - ++num_buckets_in_skew_index; - } - } - std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" - << buckets_stats.num_buckets() << " (" - << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" - << std::endl; - - if (num_buckets_in_skew_index == 0) { - input.close(); - return; - } - - std::vector buckets; - buckets.reserve(num_buckets_in_skew_index); - std::vector tuples; // backed memory - tuples.reserve(num_super_kmers_in_skew_index); - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); - it.next()) // - { - auto bucket = it.bucket(); - if (bucket.size() > min_size) { - minimizer_tuple const* begin = tuples.data() + tuples.size(); - std::copy(bucket.begin_ptr(), bucket.end_ptr(), std::back_inserter(tuples)); - minimizer_tuple const* end = tuples.data() + tuples.size(); - buckets.push_back(bucket_type(begin, end)); - } - } - assert(buckets.size() == num_buckets_in_skew_index); - input.close(); - - std::sort(buckets.begin(), buckets.end(), - [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); - - uint64_t num_partitions = max_log2_size - min_log2_size + 1; - if (buckets_stats.max_bucket_size() < (1ULL << max_log2_size)) { - num_partitions = m_skew_index.log2_max_bucket_size - min_log2_size; - } - std::cout << "num_partitions " << num_partitions << std::endl; - - std::vector num_kmers(num_partitions, 0); - m_skew_index.mphfs.resize(num_partitions); - m_skew_index.positions.resize(num_partitions); - - { - std::cout << "computing sizes of partitions..." << std::endl; - - uint64_t partition_id = 0; - uint64_t lower = min_size; - uint64_t upper = 2 * lower; - uint64_t num_kmers_in_skew_index = 0; - for (uint64_t i = 0; i <= buckets.size(); ++i) { - while (i == buckets.size() or buckets[i].size() > upper) { - std::cout << " partition_id = " << partition_id - << ": num_kmers belonging to buckets of size > " << lower - << " and <= " << upper << ": " << num_kmers[partition_id] << std::endl; - num_kmers_in_skew_index += num_kmers[partition_id]; - - if (i == buckets.size()) break; - - lower = upper; - upper = 2 * lower; - partition_id += 1; - if (partition_id == num_partitions - 1) { upper = buckets_stats.max_bucket_size(); } - } - - if (i == buckets.size()) break; - - assert(buckets[i].size() > lower and buckets[i].size() <= upper); - for (auto mt : buckets[i]) { num_kmers[partition_id] += mt.num_kmers_in_super_kmer; } - } - assert(partition_id == num_partitions - 1); - std::cout << "num_kmers_in_skew_index " << num_kmers_in_skew_index << " (" - << (num_kmers_in_skew_index * 100.0) / buckets_stats.num_kmers() << "%)" - << std::endl; - assert(num_kmers_in_skew_index == - std::accumulate(num_kmers.begin(), num_kmers.end(), uint64_t(0))); - } - - { - std::cout << "building partitions..." << std::endl; - - pthash::build_configuration mphf_build_config; - mphf_build_config.lambda = build_config.lambda; - mphf_build_config.alpha = 0.94; - mphf_build_config.seed = util::get_seed_for_hash_function(build_config); - mphf_build_config.verbose = false; - mphf_build_config.num_threads = build_config.num_threads; - mphf_build_config.avg_partition_size = constants::avg_partition_size; - - uint64_t partition_id = 0; - uint64_t lower = min_size; - uint64_t upper = 2 * lower; - uint64_t num_bits_per_pos = min_log2_size + 1; - - /* Temporary storage for kmers and positions within a partition. */ - std::vector kmers; - std::vector positions_in_bucket; - bits::compact_vector::builder cvb_positions; - kmers.reserve(num_kmers[partition_id]); - positions_in_bucket.reserve(num_kmers[partition_id]); - cvb_positions.resize(num_kmers[partition_id], num_bits_per_pos); - - for (uint64_t i = 0; i <= buckets.size(); ++i) { - while (i == buckets.size() or buckets[i].size() > upper) { - std::cout << " lower = " << lower << "; upper = " << upper - << "; num_bits_per_pos = " << num_bits_per_pos - << "; num_kmers_in_partition = " << kmers.size() << std::endl; - assert(num_kmers[partition_id] == kmers.size()); - assert(num_kmers[partition_id] == positions_in_bucket.size()); - - if (num_kmers[partition_id] > 0) // - { - if (build_config.verbose) { - const uint64_t avg_partition_size = - pthash::compute_avg_partition_size(kmers.size(), mphf_build_config); - const uint64_t num_partitions = - pthash::compute_num_partitions(kmers.size(), avg_partition_size); - assert(num_partitions > 0); - std::cout << " building MPHF with " << mphf_build_config.num_threads - << " threads and " << num_partitions - << " partitions (avg. partition size = " << avg_partition_size - << ")..." << std::endl; - } - - auto& mphf = m_skew_index.mphfs[partition_id]; - mphf.build_in_internal_memory(kmers.begin(), kmers.size(), mphf_build_config); - - std::cout << " built mphs[" << partition_id << "] for " << kmers.size() - << " kmers; bits/key = " - << static_cast(mphf.num_bits()) / mphf.num_keys() - << std::endl; - - for (uint64_t i = 0; i != kmers.size(); ++i) { - kmer_t kmer = kmers[i]; - uint64_t pos = mphf(kmer); - uint32_t pos_in_bucket = positions_in_bucket[i]; - cvb_positions.set(pos, pos_in_bucket); - } - auto& positions = m_skew_index.positions[partition_id]; - cvb_positions.build(positions); - - std::cout << " built positions[" << partition_id << "] for " - << positions.size() << " kmers; bits/key = " - << (positions.num_bytes() * 8.0) / positions.size() << std::endl; - } - - if (i == buckets.size()) break; - - lower = upper; - upper = 2 * lower; - num_bits_per_pos += 1; - partition_id += 1; - if (partition_id == num_partitions - 1) { - upper = buckets_stats.max_bucket_size(); - num_bits_per_pos = m_skew_index.log2_max_bucket_size; - } - - kmers.clear(); - positions_in_bucket.clear(); - kmers.reserve(num_kmers[partition_id]); - positions_in_bucket.reserve(num_kmers[partition_id]); - cvb_positions.resize(num_kmers[partition_id], num_bits_per_pos); - } - - if (i == buckets.size()) break; - - assert(buckets[i].size() > lower and buckets[i].size() <= upper); - uint64_t pos_in_bucket = -1; - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : buckets[i]) // - { - if (mt.pos_in_seq != prev_pos_in_seq) { - prev_pos_in_seq = mt.pos_in_seq; - ++pos_in_bucket; - } - assert(mt.pos_in_seq >= mt.pos_in_kmer); - const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; - kmer_iterator it(m_buckets.strings, k, - kmer_t::bits_per_char * starting_pos_of_super_kmer); - for (uint64_t i = 0; i != mt.num_kmers_in_super_kmer; ++i) { - auto kmer = it.get(); - if (build_config.canonical) { /* take the canonical kmer */ - auto kmer_rc = kmer; - kmer_rc.reverse_complement_inplace(k); - kmer = std::min(kmer, kmer_rc); - } - kmers.push_back(kmer); - positions_in_bucket.push_back(pos_in_bucket); - it.next(); - } - assert(pos_in_bucket < (1ULL << cvb_positions.width())); - } - } - assert(partition_id == num_partitions - 1); - } -} - -} // namespace sshash \ No newline at end of file diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp new file mode 100644 index 0000000..019c0eb --- /dev/null +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -0,0 +1,457 @@ +#pragma once + +#include "include/buckets_statistics.hpp" + +namespace sshash { + +template +buckets_statistics build_sparse_and_skew_index(parse_data& data, // + buckets& m_buckets, // + skew_index& m_skew_index, // + build_configuration const& build_config) // +{ + const uint64_t num_kmers = data.num_kmers; + const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); + const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); + const uint64_t num_minimizers = data.minimizers.num_minimizers(); + const uint64_t num_threads = build_config.num_threads; + + const uint64_t num_bits_per_offset = + std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); + bits::compact_vector::builder offsets_builder; + offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); + + std::cout << "num_bits_per_offset = ceil(log2(" + << data.strings.num_bits() / kmer_t::bits_per_char << ")) = " << num_bits_per_offset + << std::endl; + + mm::file_source input(data.minimizers.get_minimizers_filename(), + mm::advice::sequential); + minimizer_tuple const* begin = input.data(); + minimizer_tuple const* end = input.data() + input.size(); + + essentials::timer_type timer; + + buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); + + timer.start(); + const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; + std::vector offsets; + offsets.reserve(num_threads + 1); + for (uint64_t offset = -1; offset != num_super_kmers;) { + offsets.push_back(offset + 1); + offset = std::min((offset + 1) + block_size, num_super_kmers); + minimizer_tuple const* b = begin + offset; + uint64_t curr_minimizer = (*b).minimizer; + while (b + 1 < end) { // adjust offset + uint64_t next_minimizer = (*(b + 1)).minimizer; + if (curr_minimizer != next_minimizer) break; + b += 1; + offset += 1; + } + } + offsets.push_back(num_super_kmers); + assert(offsets.size() == num_threads + 1); + + std::vector threads_buckets_stats(num_threads); + + auto exe = [&](const uint64_t thread_id) { + assert(thread_id + 1 < offsets.size()); + const uint64_t offset_begin = offsets[thread_id]; + const uint64_t offset_end = offsets[thread_id + 1]; + auto& tbs = threads_buckets_stats[thread_id]; + for (minimizers_tuples_iterator it(begin + offset_begin, begin + offset_end); // + it.has_next(); // + it.next()) // + { + const uint64_t bucket_id = it.minimizer(); + assert(bucket_id < num_minimizers); + auto bucket = it.bucket(); + const uint64_t bucket_size = bucket.size(); + tbs.add_bucket_size(bucket_size); + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { + /* + For minimizers occurring once, store a (log(N)+1)-bit + code, as follows: |offset|0|, i.e., the LSB is 0. + */ + uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(bucket_id, code); + prev_pos_in_seq = mt.pos_in_seq; + } + tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); + } + } + }; + + std::vector threads(num_threads); + for (uint64_t thread_id = 0; thread_id != num_threads; ++thread_id) { + threads_buckets_stats[thread_id] = + buckets_statistics(num_minimizers, num_kmers, num_minimizer_positions); + threads[thread_id] = std::thread(exe, thread_id); + } + for (auto& t : threads) { + if (t.joinable()) t.join(); + } + for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; + + m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); + m_buckets.strings.swap(data.strings); + + /* compute offsets2 and offsets3 */ + assert(buckets_stats.num_buckets() == num_minimizers); + + const uint64_t min_size = 1ULL << constants::min_l; + const uint64_t log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); + + std::cout << "constants::min_l = " << constants::min_l << std::endl; + std::cout << "min_size = " << min_size << std::endl; + + std::cout << "max_bucket_size " << buckets_stats.max_bucket_size() << std::endl; + std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; + + uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; + uint64_t num_buckets_in_skew_index = 0; + uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; + + uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; + uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; + + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); + it.next()) // + { + auto bucket = it.bucket(); + const uint64_t bucket_size = bucket.size(); + if (bucket_size > 1) { + if (bucket_size <= min_size) { + ++num_buckets_larger_than_1_not_in_skew_index; + num_minimizer_positions_of_buckets_larger_than_1 += bucket_size; + } else { + ++num_buckets_in_skew_index; + num_minimizer_positions_of_buckets_in_skew_index += bucket_size; + } + num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); + } + } + + std::cout << "num_buckets_larger_than_1_not_in_skew_index " + << num_buckets_larger_than_1_not_in_skew_index << "/" << buckets_stats.num_buckets() + << " (" + << (num_buckets_larger_than_1_not_in_skew_index * 100.0) / buckets_stats.num_buckets() + << "%)" << std::endl; + std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" + << buckets_stats.num_buckets() << " (" + << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" + << std::endl; + + std::vector buckets; + buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); + std::vector tuples; // backed memory + tuples.reserve(num_super_kmers_in_buckets_larger_than_1); + + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); + it.next()) // + { + auto bucket = it.bucket(); + if (bucket.size() > 1) { + minimizer_tuple const* begin = tuples.data() + tuples.size(); + std::copy(bucket.begin_ptr(), bucket.end_ptr(), std::back_inserter(tuples)); + minimizer_tuple const* end = tuples.data() + tuples.size(); + buckets.push_back(bucket_type(begin, end)); + } + } + assert(buckets.size() == + num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); + + input.close(); + + std::sort(buckets.begin(), buckets.end(), + [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); + + uint64_t num_partitions = constants::max_l - constants::min_l + 1; + if (buckets_stats.max_bucket_size() < (1ULL << constants::max_l)) { + num_partitions = log2_max_bucket_size - constants::min_l; + } + std::cout << "skew index num_partitions " << num_partitions << std::endl; + assert(num_partitions <= 8); // so that we need 3 bits to encode a partition_id + + std::cout << "num_minimizer_positions_of_buckets_larger_than_1 " + << num_minimizer_positions_of_buckets_larger_than_1 << "/" << num_minimizer_positions + << " (" + << (num_minimizer_positions_of_buckets_larger_than_1 * 100.0) / + num_minimizer_positions + << "%)" << std::endl; + std::cout << "num_minimizer_positions_of_buckets_in_skew_index " + << num_minimizer_positions_of_buckets_in_skew_index << "/" << num_minimizer_positions + << " (" + << (num_minimizer_positions_of_buckets_in_skew_index * 100.0) / + num_minimizer_positions + << "%)" << std::endl; + + bits::compact_vector::builder offsets2_builder; + bits::compact_vector::builder offsets3_builder; + offsets2_builder.resize(num_minimizer_positions_of_buckets_larger_than_1, num_bits_per_offset); + offsets3_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, num_bits_per_offset); + + uint64_t curr_bucket_size = 2; + uint64_t list_id = 0; + + m_buckets.start_lists_of_size.resize(min_size + 1, 0); + uint64_t offsets2_curr_size = 0; + uint64_t offsets3_curr_size = 0; + + uint64_t partition_id = 0; + uint64_t lower = min_size; + uint64_t upper = 2 * lower; + + for (auto bucket : buckets) { + const uint64_t bucket_size = bucket.size(); + assert(bucket_size >= 2); + + if (bucket_size > curr_bucket_size) { + while (bucket_size > curr_bucket_size) ++curr_bucket_size; + if (curr_bucket_size <= min_size) { + m_buckets.start_lists_of_size[curr_bucket_size] = offsets2_curr_size; + } else { + while (curr_bucket_size > upper) { + lower = upper; + upper = 2 * lower; + partition_id += 1; + if (partition_id == num_partitions - 1) { + upper = buckets_stats.max_bucket_size(); + } + } + } + list_id = 0; + } + + if (curr_bucket_size <= min_size) { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + uint64_t p = (list_id << constants::min_l) | (curr_bucket_size - 2); + uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + offsets2_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + offsets2_curr_size += 1; + } + } + ++list_id; + } else { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + assert(partition_id < 8); + uint64_t p = (offsets3_curr_size << 3) | partition_id; + uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + offsets3_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + offsets3_curr_size += 1; + } + } + } + } + + offsets_builder.build(m_buckets.offsets); + offsets2_builder.build(m_buckets.offsets2); + offsets3_builder.build(m_buckets.offsets3); + + timer.stop(); + std::cout << "computing minimizers offsets: " << timer.elapsed() / 1000000 << " [sec]" + << std::endl; + + // for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { + // std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] + // << std::endl; + // } + + timer.reset(); + + if (num_buckets_in_skew_index == 0) return buckets_stats; + + /* build skew index */ + timer.start(); + std::vector num_kmers_in_partition(num_partitions, 0); + m_skew_index.mphfs.resize(num_partitions); + m_skew_index.positions.resize(num_partitions); + + { + std::cout << "computing sizes of partitions..." << std::endl; + + uint64_t partition_id = 0; + uint64_t lower = min_size; + uint64_t upper = 2 * lower; + uint64_t num_kmers_in_skew_index = 0; + for (uint64_t i = buckets.size() - num_buckets_in_skew_index; i <= buckets.size(); ++i) // + { + while (i == buckets.size() or buckets[i].size() > upper) { + std::cout << " partition_id = " << partition_id + << ": num_kmers belonging to buckets of size > " << lower + << " and <= " << upper << ": " << num_kmers_in_partition[partition_id] + << std::endl; + num_kmers_in_skew_index += num_kmers_in_partition[partition_id]; + + if (i == buckets.size()) break; + + lower = upper; + upper = 2 * lower; + partition_id += 1; + if (partition_id == num_partitions - 1) upper = buckets_stats.max_bucket_size(); + } + + if (i == buckets.size()) break; + + assert(buckets[i].size() > lower and buckets[i].size() <= upper); + for (auto mt : buckets[i]) { + num_kmers_in_partition[partition_id] += mt.num_kmers_in_super_kmer; + } + } + assert(partition_id == num_partitions - 1); + std::cout << "num_kmers_in_skew_index " << num_kmers_in_skew_index << " (" + << (num_kmers_in_skew_index * 100.0) / buckets_stats.num_kmers() << "%)" + << std::endl; + assert(num_kmers_in_skew_index == std::accumulate(num_kmers_in_partition.begin(), + num_kmers_in_partition.end(), + uint64_t(0))); + } + + { + std::cout << "building partitions..." << std::endl; + + pthash::build_configuration mphf_build_config; + mphf_build_config.lambda = + build_config.lambda + 2.0; /* Use higher lambda here since we have less keys. */ + mphf_build_config.alpha = 0.94; + mphf_build_config.seed = util::get_seed_for_hash_function(build_config); + mphf_build_config.verbose = false; + mphf_build_config.num_threads = build_config.num_threads; + mphf_build_config.avg_partition_size = constants::avg_partition_size; + + uint64_t partition_id = 0; + uint64_t lower = min_size; + uint64_t upper = 2 * lower; + uint64_t num_bits_per_pos = constants::min_l + 1; + + /* Temporary storage for kmers and positions within a partition. */ + std::vector kmers; + std::vector positions_in_bucket; + bits::compact_vector::builder cvb_positions; + kmers.reserve(num_kmers_in_partition[partition_id]); + positions_in_bucket.reserve(num_kmers_in_partition[partition_id]); + cvb_positions.resize(num_kmers_in_partition[partition_id], num_bits_per_pos); + + const uint64_t k = build_config.k; + + for (uint64_t i = buckets.size() - num_buckets_in_skew_index; i <= buckets.size(); ++i) // + { + while (i == buckets.size() or buckets[i].size() > upper) { + std::cout << " lower = " << lower << "; upper = " << upper + << "; num_bits_per_pos = " << num_bits_per_pos + << "; num_kmers_in_partition = " << kmers.size() << std::endl; + assert(num_kmers_in_partition[partition_id] == kmers.size()); + assert(num_kmers_in_partition[partition_id] == positions_in_bucket.size()); + + if (num_kmers_in_partition[partition_id] > 0) // + { + if (build_config.verbose) { + const uint64_t avg_partition_size = + pthash::compute_avg_partition_size(kmers.size(), mphf_build_config); + const uint64_t num_partitions = + pthash::compute_num_partitions(kmers.size(), avg_partition_size); + assert(num_partitions > 0); + std::cout << " building MPHF with " << mphf_build_config.num_threads + << " threads and " << num_partitions + << " partitions (avg. partition size = " << avg_partition_size + << ")..." << std::endl; + } + + auto& mphf = m_skew_index.mphfs[partition_id]; + mphf.build_in_internal_memory(kmers.begin(), kmers.size(), mphf_build_config); + + std::cout << " built mphs[" << partition_id << "] for " << kmers.size() + << " kmers; bits/key = " + << static_cast(mphf.num_bits()) / mphf.num_keys() + << std::endl; + + for (uint64_t i = 0; i != kmers.size(); ++i) { + kmer_t kmer = kmers[i]; + uint64_t pos = mphf(kmer); + uint32_t pos_in_bucket = positions_in_bucket[i]; + cvb_positions.set(pos, pos_in_bucket); + } + auto& positions = m_skew_index.positions[partition_id]; + cvb_positions.build(positions); + + std::cout << " built positions[" << partition_id << "] for " + << positions.size() << " kmers; bits/key = " + << (positions.num_bytes() * 8.0) / positions.size() << std::endl; + } + + if (i == buckets.size()) break; + + lower = upper; + upper = 2 * lower; + num_bits_per_pos += 1; + partition_id += 1; + if (partition_id == num_partitions - 1) { + upper = buckets_stats.max_bucket_size(); + num_bits_per_pos = log2_max_bucket_size; + } + + kmers.clear(); + positions_in_bucket.clear(); + kmers.reserve(num_kmers_in_partition[partition_id]); + positions_in_bucket.reserve(num_kmers_in_partition[partition_id]); + cvb_positions.resize(num_kmers_in_partition[partition_id], num_bits_per_pos); + } + + if (i == buckets.size()) break; + + assert(buckets[i].size() > lower and buckets[i].size() <= upper); + uint64_t pos_in_bucket = -1; + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : buckets[i]) // + { + if (mt.pos_in_seq != prev_pos_in_seq) { + prev_pos_in_seq = mt.pos_in_seq; + ++pos_in_bucket; + } + assert(mt.pos_in_seq >= mt.pos_in_kmer); + const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; + kmer_iterator it(m_buckets.strings, k, + kmer_t::bits_per_char * starting_pos_of_super_kmer); + for (uint64_t i = 0; i != mt.num_kmers_in_super_kmer; ++i) { + auto kmer = it.get(); + if (build_config.canonical) { /* take the canonical kmer */ + auto kmer_rc = kmer; + kmer_rc.reverse_complement_inplace(k); + kmer = std::min(kmer, kmer_rc); + } + kmers.push_back(kmer); + positions_in_bucket.push_back(pos_in_bucket); + it.next(); + } + assert(pos_in_bucket < (1ULL << cvb_positions.width())); + } + } + assert(partition_id == num_partitions - 1); + } + + timer.stop(); + std::cout << "computing skew index took: " << timer.elapsed() / 1000000 << " [sec]" + << std::endl; + + return buckets_stats; +} + +} // namespace sshash \ No newline at end of file diff --git a/include/builder/build_sparse_index.hpp b/include/builder/build_sparse_index.hpp deleted file mode 100644 index f247a9d..0000000 --- a/include/builder/build_sparse_index.hpp +++ /dev/null @@ -1,295 +0,0 @@ -#pragma once - -#include "include/buckets_statistics.hpp" - -namespace sshash { - -template -buckets_statistics build_sparse_index(parse_data& data, buckets& m_buckets, - build_configuration const& build_config) // -{ - const uint64_t num_kmers = data.num_kmers; - const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); - const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); - const uint64_t num_minimizers = data.minimizers.num_minimizers(); - const uint64_t num_threads = build_config.num_threads; - - const uint64_t num_bits_per_offset = - std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); - bits::compact_vector::builder offsets_builder; - offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); - - std::cout << "num_bits_per_offset = ceil(log2(" - << data.strings.num_bits() / kmer_t::bits_per_char << ")) = " << num_bits_per_offset - << std::endl; - - mm::file_source input(data.minimizers.get_minimizers_filename(), - mm::advice::sequential); - minimizer_tuple const* begin = input.data(); - minimizer_tuple const* end = input.data() + input.size(); - - essentials::timer_type timer; - - buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); - - timer.start(); - const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; - std::vector offsets; - offsets.reserve(num_threads + 1); - for (uint64_t offset = -1; offset != num_super_kmers;) { - offsets.push_back(offset + 1); - offset = std::min((offset + 1) + block_size, num_super_kmers); - minimizer_tuple const* b = begin + offset; - uint64_t curr_minimizer = (*b).minimizer; - while (b + 1 < end) { // adjust offset - uint64_t next_minimizer = (*(b + 1)).minimizer; - if (curr_minimizer != next_minimizer) break; - b += 1; - offset += 1; - } - } - offsets.push_back(num_super_kmers); - assert(offsets.size() == num_threads + 1); - - std::vector threads_buckets_stats(num_threads); - - auto exe = [&](const uint64_t thread_id) { - assert(thread_id + 1 < offsets.size()); - const uint64_t offset_begin = offsets[thread_id]; - const uint64_t offset_end = offsets[thread_id + 1]; - auto& tbs = threads_buckets_stats[thread_id]; - for (minimizers_tuples_iterator it(begin + offset_begin, begin + offset_end); // - it.has_next(); // - it.next()) // - { - const uint64_t bucket_id = it.minimizer(); - assert(bucket_id < num_minimizers); - auto bucket = it.bucket(); - const uint64_t bucket_size = bucket.size(); - tbs.add_bucket_size(bucket_size); - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { - /* - For minimizers occurring once, store a (log(N)+1)-bit - code, as follows: |offset|0|, i.e., the last bit is 0. - */ - uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(bucket_id, code); - prev_pos_in_seq = mt.pos_in_seq; - } - tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); - } - } - }; - - std::vector threads(num_threads); - for (uint64_t thread_id = 0; thread_id != num_threads; ++thread_id) { - threads_buckets_stats[thread_id] = - buckets_statistics(num_minimizers, num_kmers, num_minimizer_positions); - threads[thread_id] = std::thread(exe, thread_id); - } - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - - input.close(); - timer.stop(); - std::cout << "computing minimizers offsets: " << timer.elapsed() / 1000000 << " [sec]" - << std::endl; - - timer.reset(); - - timer.start(); - m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); - m_buckets.strings.swap(data.strings); - timer.stop(); - std::cout << "encoding string boundaries and building offsets: " << timer.elapsed() / 1000000 - << " [sec]" << std::endl; - - /*******/ - { - assert(buckets_stats.num_buckets() == num_minimizers); - - const uint64_t min_log2_size = constants::min_l; // m_skew_index.min_log2; - const uint64_t max_log2_size = constants::max_l; // m_skew_index.max_log2; - const uint64_t min_size = 1ULL << min_log2_size; - const uint64_t log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); - - std::cout << "min_log2_size = " << min_log2_size << std::endl; - std::cout << "min_size = " << min_size << std::endl; - - std::cout << "max_bucket_size " << buckets_stats.max_bucket_size() << std::endl; - std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; - - mm::file_source input(data.minimizers.get_minimizers_filename(), - mm::advice::sequential); - - uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; - uint64_t num_buckets_in_skew_index = 0; - uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; - - uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; - uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; - - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); - it.has_next(); it.next()) // - { - auto bucket = it.bucket(); - const uint64_t bucket_size = bucket.size(); - if (bucket_size > 1) { - if (bucket_size <= min_size) { - ++num_buckets_larger_than_1_not_in_skew_index; - num_minimizer_positions_of_buckets_larger_than_1 += bucket_size; - } else { - ++num_buckets_in_skew_index; - num_minimizer_positions_of_buckets_in_skew_index += bucket_size; - } - num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); - } - } - - std::cout << "num_buckets_larger_than_1_not_in_skew_index " - << num_buckets_larger_than_1_not_in_skew_index << "/" - << buckets_stats.num_buckets() << " (" - << (num_buckets_larger_than_1_not_in_skew_index * 100.0) / - buckets_stats.num_buckets() - << "%)" << std::endl; - std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" - << buckets_stats.num_buckets() << " (" - << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" - << std::endl; - - std::vector buckets; - buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); - std::vector tuples; // backed memory - tuples.reserve(num_super_kmers_in_buckets_larger_than_1); - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); - it.has_next(); it.next()) // - { - auto bucket = it.bucket(); - if (bucket.size() > 1) { - minimizer_tuple const* begin = tuples.data() + tuples.size(); - std::copy(bucket.begin_ptr(), bucket.end_ptr(), std::back_inserter(tuples)); - minimizer_tuple const* end = tuples.data() + tuples.size(); - buckets.push_back(bucket_type(begin, end)); - } - } - assert(buckets.size() == - num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); - input.close(); - - std::sort(buckets.begin(), buckets.end(), - [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); - - uint64_t num_partitions = max_log2_size - min_log2_size + 1; - if (buckets_stats.max_bucket_size() < (1ULL << max_log2_size)) { - num_partitions = log2_max_bucket_size - min_log2_size; - } - std::cout << "skew index num_partitions " << num_partitions << std::endl; - assert(num_partitions <= 8); // so that we need 3 bits to encode a partition_id - - std::cout << "num_minimizer_positions_of_buckets_larger_than_1 " - << num_minimizer_positions_of_buckets_larger_than_1 << "/" - << num_minimizer_positions << " (" - << (num_minimizer_positions_of_buckets_larger_than_1 * 100.0) / - num_minimizer_positions - << "%)" << std::endl; - std::cout << "num_minimizer_positions_of_buckets_in_skew_index " - << num_minimizer_positions_of_buckets_in_skew_index << "/" - << num_minimizer_positions << " (" - << (num_minimizer_positions_of_buckets_in_skew_index * 100.0) / - num_minimizer_positions - << "%)" << std::endl; - - bits::compact_vector::builder offsets2_builder; - bits::compact_vector::builder offsets3_builder; - offsets2_builder.resize(num_minimizer_positions_of_buckets_larger_than_1, - num_bits_per_offset); - offsets3_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, - num_bits_per_offset); - - uint64_t curr_bucket_size = 2; - uint64_t list_id = 0; - - m_buckets.start_lists_of_size.resize(min_size + 1, 0); - uint64_t offsets2_curr_size = 0; - uint64_t offsets3_curr_size = 0; - - uint64_t partition_id = 0; - uint64_t lower = min_size; - uint64_t upper = 2 * lower; - - for (auto bucket : buckets) { - const uint64_t bucket_size = bucket.size(); - assert(bucket_size >= 2); - - if (bucket_size > curr_bucket_size) { - while (bucket_size > curr_bucket_size) ++curr_bucket_size; - if (curr_bucket_size <= min_size) { - m_buckets.start_lists_of_size[curr_bucket_size] = offsets2_curr_size; - } else { - while (curr_bucket_size > upper) { - lower = upper; - upper = 2 * lower; - partition_id += 1; - if (partition_id == num_partitions - 1) { - upper = buckets_stats.max_bucket_size(); - } - } - } - list_id = 0; - } - - if (curr_bucket_size <= min_size) { - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (prev_pos_in_seq == constants::invalid_uint64) { // only once - uint64_t p = (list_id << min_log2_size) | (curr_bucket_size - 2); - uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(mt.minimizer, code); - } - if (mt.pos_in_seq != prev_pos_in_seq) { - offsets2_builder.push_back(mt.pos_in_seq); - prev_pos_in_seq = mt.pos_in_seq; - offsets2_curr_size += 1; - } - } - ++list_id; - } else { - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (prev_pos_in_seq == constants::invalid_uint64) { // only once - assert(partition_id < 8); - uint64_t p = (offsets3_curr_size << 3) | partition_id; - uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(mt.minimizer, code); - } - if (mt.pos_in_seq != prev_pos_in_seq) { - offsets3_builder.push_back(mt.pos_in_seq); - prev_pos_in_seq = mt.pos_in_seq; - offsets3_curr_size += 1; - } - } - } - } - - offsets2_builder.build(m_buckets.offsets2); - offsets3_builder.build(m_buckets.offsets3); - } - - offsets_builder.build(m_buckets.offsets); - - // for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { - // std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] - // << std::endl; - // } - - return buckets_stats; -} - -} // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index 0a74583..6f1c30e 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -11,7 +11,6 @@ struct parse_data { uint64_t num_kmers; minimizers_tuples minimizers; - // compact_string_pool strings; std::vector pieces; bits::bit_vector strings; weights::builder weights_builder; @@ -51,7 +50,6 @@ void parse_file(std::istream& is, parse_data& data, minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); uint64_t seq_len = 0; - uint64_t sum_of_weights = 0; data.weights_builder.init(); /* intervals of weights */ @@ -104,7 +102,6 @@ void parse_file(std::istream& is, parse_data& data, uint64_t weight = std::strtoull(sequence.data() + i, nullptr, 10); i = sequence.find_first_of(' ', i) + 1; data.weights_builder.eat(weight); - sum_of_weights += weight; if (weight == weight_value) { weight_length += 1; } else { @@ -181,7 +178,7 @@ void parse_file(std::istream& is, parse_data& data, assert(data.pieces.size() == num_sequences + 1); timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding_input'"); + print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding input'"); std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " << data.num_kmers << " kmers" << std::endl; @@ -311,10 +308,9 @@ void parse_file(std::istream& is, parse_data& data, } timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.2: 'computing_minimizers_tuples'"); + print_time(timer.elapsed(), data.num_kmers, "step 1.2: 'computing minimizers tuples'"); if (build_config.weighted) { - std::cout << "sum_of_weights " << sum_of_weights << std::endl; data.weights_builder.push_weight_interval(weight_value, weight_length); data.weights_builder.finalize(data.num_kmers); } diff --git a/include/constants.hpp b/include/constants.hpp index abc10fe..3ba35b8 100644 --- a/include/constants.hpp +++ b/include/constants.hpp @@ -9,12 +9,13 @@ constexpr uint64_t default_ram_limit_in_GiB = 8; constexpr uint64_t seed = 1; /* for PTHash */ -constexpr double lambda = 7.0; +constexpr double lambda = 5.0; constexpr uint64_t avg_partition_size = 3000000; constexpr uint64_t min_l = 6; -constexpr uint64_t max_l = 12; +constexpr uint64_t max_l = 13; static_assert(min_l < max_l); +static_assert(max_l - min_l + 1 <= 8); static const std::string default_tmp_dirname("."); constexpr int forward_orientation = 1; diff --git a/include/minimizers.hpp b/include/minimizers.hpp index f9ecf24..657f2a4 100644 --- a/include/minimizers.hpp +++ b/include/minimizers.hpp @@ -9,7 +9,7 @@ struct minimizers { void build(ForwardIterator begin, uint64_t size, build_configuration const& build_config) // { pthash::build_configuration mphf_build_config; - mphf_build_config.lambda = 5.0; + mphf_build_config.lambda = build_config.lambda; mphf_build_config.alpha = 0.94; mphf_build_config.seed = util::get_seed_for_hash_function(build_config); mphf_build_config.verbose = false; @@ -33,10 +33,7 @@ struct minimizers { m_mphf.build_in_external_memory(begin, size, mphf_build_config); } - uint64_t lookup(uint64_t uint64_minimizer) const { - uint64_t bucket_id = m_mphf(uint64_minimizer); - return bucket_id; - } + uint64_t lookup(uint64_t uint64_minimizer) const { return m_mphf(uint64_minimizer); } uint64_t size() const { return m_mphf.num_keys(); } uint64_t num_bits() const { return m_mphf.num_bits(); } diff --git a/include/skew_index.hpp b/include/skew_index.hpp index 4afad89..23d2434 100644 --- a/include/skew_index.hpp +++ b/include/skew_index.hpp @@ -6,7 +6,7 @@ namespace sshash { template struct skew_index { - skew_index() : min_log2(constants::min_l), max_log2(constants::max_l), log2_max_bucket_size(0) { + skew_index() { mphfs.resize(0); positions.resize(0); } @@ -14,7 +14,7 @@ struct skew_index { /* Returns the number of kmers in the index. */ uint64_t print_info() const { uint64_t num_partitions = mphfs.size(); - uint64_t lower = 1ULL << min_log2; + uint64_t lower = 1ULL << constants::min_l; uint64_t upper = 2 * lower; uint64_t num_kmers_in_skew_index = 0; for (uint64_t partition_id = 0; partition_id != num_partitions; ++partition_id) { @@ -32,20 +32,15 @@ struct skew_index { return num_kmers_in_skew_index; } - bool empty() const { return mphfs.empty(); } - uint64_t lookup(kmer_t uint_kmer, uint64_t partition_id) const { assert(partition_id < mphfs.size()); auto const& f = mphfs[partition_id]; auto const& p = positions[partition_id]; - uint64_t position = p.access(f(uint_kmer)); - return position; + return p.access(f(uint_kmer)); } uint64_t num_bits() const { - uint64_t n = (sizeof(min_log2) + sizeof(max_log2) + sizeof(log2_max_bucket_size) + - 2 * sizeof(size_t) /* for std::vector::size */) * - 8; + uint64_t n = (2 * sizeof(size_t)) * 8; /* for std::vector::size */ for (uint64_t partition_id = 0; partition_id != mphfs.size(); ++partition_id) { auto const& f = mphfs[partition_id]; auto const& p = positions[partition_id]; @@ -64,18 +59,12 @@ struct skew_index { visit_impl(visitor, *this); } - uint16_t min_log2; - uint16_t max_log2; - uint32_t log2_max_bucket_size; std::vector> mphfs; std::vector positions; private: template static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.min_log2); - visitor.visit(t.max_log2); - visitor.visit(t.log2_max_bucket_size); visitor.visit(t.mphfs); visitor.visit(t.positions); } diff --git a/include/util.hpp b/include/util.hpp index 2cc6dbb..e55104f 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -128,12 +128,11 @@ struct minimizer_info { struct build_configuration { build_configuration() : k(31) - , m(17) + , m(20) , seed(constants::seed) , num_threads(1) , ram_limit_in_GiB(constants::default_ram_limit_in_GiB) - , l(constants::min_l) , lambda(constants::lambda) , canonical(false) @@ -144,13 +143,12 @@ struct build_configuration { {} - uint64_t k; // kmer size - uint64_t m; // minimizer size + uint64_t k; // kmer length + uint64_t m; // minimizer length uint64_t seed; uint64_t num_threads; uint64_t ram_limit_in_GiB; - uint64_t l; // drive dictionary trade-off double lambda; // drive PTHash trade-off bool canonical; @@ -162,10 +160,11 @@ struct build_configuration { void print() const { std::cout << "k = " << k << ", m = " << m << ", seed = " << seed << ", num_threads = " << num_threads - << ", ram_limit_in_GiB = " << ram_limit_in_GiB << ", l = " << l - << ", lambda = " << lambda << ", canonical = " << (canonical ? "true" : "false") + << ", ram_limit_in_GiB = " << ram_limit_in_GiB << ", lambda = " << lambda + << ", canonical = " << (canonical ? "true" : "false") << ", weighted = " << (weighted ? "true" : "false") - << ", verbose = " << (verbose ? "true" : "false") << std::endl; + << ", verbose = " << (verbose ? "true" : "false") << ", tmp_dirname = '" + << tmp_dirname << "'" << std::endl; } }; diff --git a/src/build.cpp b/src/build.cpp index 27ebf86..ecf5123 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -3,8 +3,7 @@ #include "include/builder/util.hpp" #include "include/builder/parse_file.hpp" -#include "include/builder/build_sparse_index.hpp" -#include "include/builder/build_skew_index.hpp" +#include "include/builder/build_sparse_and_skew_index.hpp" #include // for std::accumulate @@ -25,9 +24,6 @@ void dictionary::build(std::string const& filename, " but got m = " + std::to_string(build_config.m)); } if (build_config.m > build_config.k) throw std::runtime_error("m must be <= k"); - if (build_config.l >= constants::max_l) { - throw std::runtime_error("l must be < " + std::to_string(constants::max_l)); - } if ((build_config.num_threads & (build_config.num_threads - 1)) != 0) { throw std::runtime_error("number of threads must be a power of 2"); } @@ -35,11 +31,10 @@ void dictionary::build(std::string const& filename, m_k = build_config.k; m_m = build_config.m; m_canonical = build_config.canonical; - m_skew_index.min_log2 = build_config.l; m_hasher.seed(build_config.seed); std::vector timings; - timings.reserve(7); + timings.reserve(6); essentials::timer_type timer; /* step 1: parse the input file, encode sequences (1.1), and compute minimizer tuples (1.2) ***/ @@ -52,7 +47,7 @@ void dictionary::build(std::string const& filename, timer.start(); data.weights_builder.build(m_weights); timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.3: 'build_weights'"); + print_time(timer.elapsed(), data.num_kmers, "step 1.3: 'build weights'"); if (build_config.verbose) { double entropy_weights = data.weights_builder.print_info(data.num_kmers); double avg_bits_per_weight = static_cast(m_weights.num_bits()) / data.num_kmers; @@ -63,7 +58,7 @@ void dictionary::build(std::string const& filename, } timer.stop(); timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 1: 'parse_file'"); + print_time(timings.back(), data.num_kmers, "step 1: 'parse file'"); timer.reset(); /******/ @@ -73,7 +68,7 @@ void dictionary::build(std::string const& filename, data.minimizers.merge(); timer.stop(); timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.1: 'merging_minimizers_tuples'"); + print_time(timings.back(), data.num_kmers, "step 2.1: 'merging minimizers tuples'"); std::cout << "num_minimizers = " << data.minimizers.num_minimizers() << std::endl; std::cout << "num_minimizer_positions = " << data.minimizers.num_minimizer_positions() @@ -92,7 +87,7 @@ void dictionary::build(std::string const& filename, assert(m_minimizers.size() == num_minimizers); timer.stop(); timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.2: 'build_minimizers_mphf'"); + print_time(timings.back(), data.num_kmers, "step 2.2: 'build minimizers mphf'"); timer.reset(); } @@ -159,30 +154,21 @@ void dictionary::build(std::string const& filename, input.close(); timer.stop(); timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.4: 'merging_minimizers_tuples '"); + print_time(timings.back(), data.num_kmers, "step 2.4: 'merging minimizers tuples '"); timer.reset(); } /******/ - /* step 3: build sparse index ***/ - timer.start(); - auto buckets_stats = build_sparse_index(data, m_buckets, build_config); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 3: 'build_sparse_index'"); - timer.reset(); - /******/ - - /* step 4: build skew index ***/ + /* step 3: build sparse and skew index ***/ timer.start(); - build_skew_index(m_skew_index, data, m_buckets, build_config, buckets_stats); + auto buckets_stats = build_sparse_and_skew_index(data, m_buckets, m_skew_index, build_config); timer.stop(); timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 4: 'build_skew_index'"); + print_time(timings.back(), data.num_kmers, "step 3: 'build sparse and skew index'"); timer.reset(); /******/ - assert(timings.size() == 7); + assert(timings.size() == 6); double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); print_time(total_time, data.num_kmers, "total_time"); diff --git a/tools/build.cpp b/tools/build.cpp index cb38f14..56aa2d4 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -22,12 +22,6 @@ int build(int argc, char** argv) { "Seed for construction (default is " + std::to_string(constants::seed) + ").", "-s", false); parser.add("t", "Number of threads (default is 1). Must be a power of 2.", "-t", false); - parser.add("l", - "A (integer) constant that controls the space/time trade-off of the dictionary. " - "A reasonable values lies in [2.." + - std::to_string(constants::max_l) + "). The default value is " + - std::to_string(constants::min_l) + ".", - "-l", false); parser.add("lambda", "A (floating point) constant that trades construction speed for space effectiveness " "of minimal perfect hashing. " @@ -51,7 +45,7 @@ int build(int argc, char** argv) { parser.add("weighted", "Also store the weights in compressed format.", "--weighted", false, true); parser.add("check", "Check correctness after construction.", "--check", false, true); - parser.add("bench", "Run benchmark after construction.", "--bench", false, true); + parser.add("bench", "Run performance benchmark after construction.", "--bench", false, true); parser.add("verbose", "Verbose output during construction.", "--verbose", false, true); if (!parser.parse()) return 0; @@ -67,7 +61,6 @@ int build(int argc, char** argv) { build_config.m = m; if (parser.parsed("seed")) build_config.seed = parser.get("seed"); - if (parser.parsed("l")) build_config.l = parser.get("l"); if (parser.parsed("lambda")) build_config.lambda = parser.get("lambda"); build_config.canonical = parser.get("canonical"); build_config.weighted = parser.get("weighted"); From c49df8206eeb94e3598714954a6f136f1cc60a2d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 14 Sep 2025 18:41:03 +0200 Subject: [PATCH 012/112] new results taken on 14/09/25: slightly faster construction, faster queries (for a tiny space increase) --- .../k31/14-09-25.canon.bench_log | 9 + .../k31/14-09-25.canon.build_log | 536 ++++++++++++++++++ ...4-09-25.canon.high-hit.streaming_query_log | 30 + ...14-09-25.canon.low-hit.streaming_query_log | 30 + .../k31/14-09-25.regular.bench_log | 9 + .../k31/14-09-25.regular.build_log | 516 +++++++++++++++++ ...09-25.regular.high-hit.streaming_query_log | 30 + ...-09-25.regular.low-hit.streaming_query_log | 30 + .../k63/14-09-25.canon.bench_log | 9 + .../k63/14-09-25.canon.build_log | 389 +++++++++++++ ...4-09-25.canon.high-hit.streaming_query_log | 30 + ...14-09-25.canon.low-hit.streaming_query_log | 30 + .../k63/14-09-25.regular.bench_log | 9 + .../k63/14-09-25.regular.build_log | 378 ++++++++++++ ...09-25.regular.high-hit.streaming_query_log | 30 + ...-09-25.regular.low-hit.streaming_query_log | 30 + 16 files changed, 2095 insertions(+) create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.build_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.build_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.build_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.build_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log create mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log new file mode 100644 index 0000000..0357d14 --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log @@ -0,0 +1,9 @@ +lookup: avg_nanosec_per_positive_lookup 653.172 +avg_nanosec_per_negative_lookup 374.88 +iterator: avg_nanosec_per_kmer 20.843 +lookup: avg_nanosec_per_positive_lookup 598.942 +avg_nanosec_per_negative_lookup 407.974 +iterator: avg_nanosec_per_kmer 20.694 +lookup: avg_nanosec_per_positive_lookup 868.734 +avg_nanosec_per_negative_lookup 433.989 +iterator: avg_nanosec_per_kmer 20.9212 diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log new file mode 100644 index 0000000..4c370fe --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log @@ -0,0 +1,536 @@ +k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 27657185 bases, 24657215 kmers +read 200000 sequences, 54659411 bases, 48659441 kmers +read 300000 sequences, 82042065 bases, 73042095 kmers +read 400000 sequences, 109137740 bases, 97137770 kmers +read 500000 sequences, 135591611 bases, 120591641 kmers +read 600000 sequences, 162605989 bases, 144606019 kmers +read 700000 sequences, 189421730 bases, 168421760 kmers +read 800000 sequences, 214809276 bases, 190809306 kmers +read 900000 sequences, 240465564 bases, 213465594 kmers +read 1000000 sequences, 265968295 bases, 235968325 kmers +read 1100000 sequences, 291953235 bases, 258953265 kmers +read 1200000 sequences, 316684260 bases, 280684290 kmers +read 1300000 sequences, 341304215 bases, 302304245 kmers +read 1400000 sequences, 365519325 bases, 323519355 kmers +read 1500000 sequences, 388985606 bases, 343985636 kmers +read 1600000 sequences, 411705914 bases, 363705944 kmers +read 1700000 sequences, 434632801 bases, 383632831 kmers +read 1800000 sequences, 456140575 bases, 402140605 kmers +read 1900000 sequences, 477396896 bases, 420396926 kmers +read 2000000 sequences, 498761432 bases, 438761462 kmers +read 2100000 sequences, 518417062 bases, 455417092 kmers +read 2200000 sequences, 537930862 bases, 471930892 kmers +read 2300000 sequences, 556305688 bases, 487305718 kmers +read 2400000 sequences, 573938040 bases, 501938070 kmers +=== step 1.1: 'encoding input' 2.30442 [sec] (4.58623 [ns/kmer]) +read 2406269 sequences, 574653270 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.287336 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 2.07889 [sec] (4.13738 [ns/kmer]) +=== step 1: 'parse file' 4.38347 [sec] (8.72392 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 4.30239 [sec] (8.56257 [ns/kmer]) +num_minimizers = 79426371 +num_minimizer_positions = 88821250 +num_super_kmers = 92441796 +building minimizers MPHF with 8 threads and 27 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.36126 [sec] (10.6699 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75247 [sec] (7.46813 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.59288 [sec] (5.16032 [ns/kmer]) +num_bits_per_offset = ceil(log2(574653302)) = 30 +constants::min_l = 6 +min_size = 64 +max_bucket_size 155775 +log2_max_bucket_size 18 +num_buckets_larger_than_1_not_in_skew_index 3198593/79426371 (4.02712%) +num_buckets_in_skew_index 7428/79426371 (0.00935206%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 10916988/88821250 (12.291%) +num_minimizer_positions_of_buckets_in_skew_index 1683912/88821250 (1.89584%) +computing minimizers offsets: 1.26063 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2268785 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1392132 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1162932 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 935073 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 655983 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 438277 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 431217 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 155775: 832367 +num_kmers_in_skew_index 8116766 (1.61539%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2268785 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2268785)... + built mphs[0] for 2268785 kmers; bits/key = 2.56 + built positions[0] for 2268785 kmers; bits/key = 7.00016 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1392132 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1392132)... + built mphs[1] for 1392132 kmers; bits/key = 2.5606 + built positions[1] for 1392132 kmers; bits/key = 8.00025 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1162932 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1162932)... + built mphs[2] for 1162932 kmers; bits/key = 2.56092 + built positions[2] for 1162932 kmers; bits/key = 9.00031 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 935073 + building MPHF with 8 threads and 1 partitions (avg. partition size = 935073)... + built mphs[3] for 935073 kmers; bits/key = 2.4185 + built positions[3] for 935073 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 655983 + building MPHF with 8 threads and 1 partitions (avg. partition size = 655983)... + built mphs[4] for 655983 kmers; bits/key = 2.56224 + built positions[4] for 655983 kmers; bits/key = 11.0006 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 438277 + building MPHF with 8 threads and 1 partitions (avg. partition size = 438277)... + built mphs[5] for 438277 kmers; bits/key = 2.56404 + built positions[5] for 438277 kmers; bits/key = 12.0007 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 431217 + building MPHF with 8 threads and 1 partitions (avg. partition size = 431217)... + built mphs[6] for 431217 kmers; bits/key = 2.42117 + built positions[6] for 431217 kmers; bits/key = 13.0007 + lower = 8192; upper = 155775; num_bits_per_pos = 18; num_kmers_in_partition = 832367 + building MPHF with 8 threads and 1 partitions (avg. partition size = 832367)... + built mphs[7] for 832367 kmers; bits/key = 2.41872 + built positions[7] for 832367 kmers; bits/key = 18.0004 +computing skew index took: 6.00298 [sec] +=== step 3: 'build sparse and skew index' 7.33897 [sec] (14.6059 [ns/kmer]) +=== total_time 27.7314 [sec] (55.1908 [ns/kmer]) +total index size: 543132456 [B] -- 543.132 [MB] +SPACE BREAKDOWN: + minimizers: 0.452782 [bits/kmer] (2.86438 [bits/key]) -- 5.236% + pieces: 0.0549683 [bits/kmer] -- 0.635657% + offsets: 4.90028 [bits/kmer] -- 56.6671% + offsets2: 0.651806 [bits/kmer] -- 7.53753% + offsets3: 0.10054 [bits/kmer] -- 1.16265% + start_lists_of_size: 4.26696e-06 [bits/kmer] -- 4.93434e-05% + strings: 2.28734 [bits/kmer] -- 26.4509% + skew_index: 0.199768 [bits/kmer] -- 2.31013% + weights: 2.92956e-06 [bits/kmer] -- 3.38776e-05% + -------------- + total: 8.64748 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9635% +buckets with 2 minimizer positions = 2.5093% +buckets with 3 minimizer positions = 0.679399% +buckets with 4 minimizer positions = 0.290103% +buckets with 5 minimizer positions = 0.153452% +buckets with 6 minimizer positions = 0.0927941% +buckets with 7 minimizer positions = 0.0610528% +buckets with 8 minimizer positions = 0.0427541% +buckets with 9 minimizer positions = 0.0312239% +buckets with 10 minimizer positions = 0.0239568% +buckets with 11 minimizer positions = 0.0190289% +buckets with 12 minimizer positions = 0.0152078% +buckets with 13 minimizer positions = 0.0127741% +buckets with 14 minimizer positions = 0.0104008% +buckets with 15 minimizer positions = 0.00880816% +buckets with 16 minimizer positions = 0.00755039% +max_bucket_size 155775 +2025-09-14 17:35:37: saving data structure to disk... +2025-09-14 17:35:37: DONE +k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 158452704 bases, 155452734 kmers +read 200000 sequences, 318155284 bases, 312155314 kmers +read 300000 sequences, 484429755 bases, 475429785 kmers +read 400000 sequences, 657902795 bases, 645902825 kmers +read 500000 sequences, 832407154 bases, 817407184 kmers +read 600000 sequences, 1004979671 bases, 986979701 kmers +=== step 1.1: 'encoding input' 4.30204 [sec] (3.73961 [ns/kmer]) +read 682245 sequences, 1170866555 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.035583 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 4.76409 [sec] (4.14125 [ns/kmer]) +=== step 1: 'parse file' 9.06626 [sec] (7.88097 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 9.60368 [sec] (8.34812 [ns/kmer]) +num_minimizers = 193802281 +num_minimizer_positions = 200287417 +num_super_kmers = 208975066 +building minimizers MPHF with 8 threads and 65 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 12.9909 [sec] (11.2925 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.50973 [sec] (7.3972 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.25649 [sec] (1.96148 [ns/kmer]) +num_bits_per_offset = ceil(log2(1170866587)) = 31 +constants::min_l = 6 +min_size = 64 +max_bucket_size 3788 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 3847569/193802281 (1.98531%) +num_buckets_in_skew_index 3592/193802281 (0.00185344%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 9809818/200287417 (4.89787%) +num_minimizer_positions_of_buckets_in_skew_index 526479/200287417 (0.262862%) +computing minimizers offsets: 2.00298 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1179637 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 821390 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 443904 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 212956 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 176522 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3788: 79585 +num_kmers_in_skew_index 2913994 (0.253303%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1179637 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1179637)... + built mphs[0] for 1179637 kmers; bits/key = 2.56086 + built positions[0] for 1179637 kmers; bits/key = 7.00028 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 821390 + building MPHF with 8 threads and 1 partitions (avg. partition size = 821390)... + built mphs[1] for 821390 kmers; bits/key = 2.56173 + built positions[1] for 821390 kmers; bits/key = 8.00041 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 443904 + building MPHF with 8 threads and 1 partitions (avg. partition size = 443904)... + built mphs[2] for 443904 kmers; bits/key = 2.42106 + built positions[2] for 443904 kmers; bits/key = 9.00072 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 212956 + building MPHF with 8 threads and 1 partitions (avg. partition size = 212956)... + built mphs[3] for 212956 kmers; bits/key = 2.42657 + built positions[3] for 212956 kmers; bits/key = 10.0017 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 176522 + building MPHF with 8 threads and 1 partitions (avg. partition size = 176522)... + built mphs[4] for 176522 kmers; bits/key = 2.42852 + built positions[4] for 176522 kmers; bits/key = 11.0019 + lower = 2048; upper = 3788; num_bits_per_pos = 12; num_kmers_in_partition = 79585 + building MPHF with 8 threads and 1 partitions (avg. partition size = 79585)... + built mphs[5] for 79585 kmers; bits/key = 2.44287 + built positions[5] for 79585 kmers; bits/key = 12.0047 +computing skew index took: 2.18121 [sec] +=== step 3: 'build sparse and skew index' 4.34837 [sec] (3.77988 [ns/kmer]) +=== total_time 46.7754 [sec] (40.6602 [ns/kmer]) +total index size: 1181985390 [B] -- 1181.99 [MB] +SPACE BREAKDOWN: + minimizers: 0.479119 [bits/kmer] (2.84403 [bits/key]) -- 5.82895% + pieces: 0.00841122 [bits/kmer] -- 0.102331% + offsets: 5.39089 [bits/kmer] -- 65.5853% + offsets2: 0.264347 [bits/kmer] -- 3.21604% + offsets3: 0.0141874 [bits/kmer] -- 0.172604% + start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.26737e-05% + strings: 2.03558 [bits/kmer] -- 24.7648% + skew_index: 0.0271139 [bits/kmer] -- 0.329867% + weights: 1.27956e-06 [bits/kmer] -- 1.5567e-05% + -------------- + total: 8.21965 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 98.0128% +buckets with 2 minimizer positions = 1.66457% +buckets with 3 minimizer positions = 0.165762% +buckets with 4 minimizer positions = 0.0545515% +buckets with 5 minimizer positions = 0.0276849% +buckets with 6 minimizer positions = 0.0167021% +buckets with 7 minimizer positions = 0.0112088% +buckets with 8 minimizer positions = 0.00793438% +buckets with 9 minimizer positions = 0.00591686% +buckets with 10 minimizer positions = 0.00451181% +buckets with 11 minimizer positions = 0.00358923% +buckets with 12 minimizer positions = 0.00282092% +buckets with 13 minimizer positions = 0.00235962% +buckets with 14 minimizer positions = 0.00195251% +buckets with 15 minimizer positions = 0.00164394% +buckets with 16 minimizer positions = 0.00140556% +max_bucket_size 3788 +2025-09-14 17:36:25: saving data structure to disk... +2025-09-14 17:36:25: DONE +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 21756494 bases, 18756524 kmers +read 200000 sequences, 43415082 bases, 37415112 kmers +read 300000 sequences, 65780160 bases, 56780190 kmers +read 400000 sequences, 87471486 bases, 75471516 kmers +read 500000 sequences, 109226866 bases, 94226896 kmers +read 600000 sequences, 131648019 bases, 113648049 kmers +read 700000 sequences, 153316395 bases, 132316425 kmers +read 800000 sequences, 176702606 bases, 152702636 kmers +read 900000 sequences, 198938131 bases, 171938161 kmers +read 1000000 sequences, 220949217 bases, 190949247 kmers +read 1100000 sequences, 244049472 bases, 211049502 kmers +read 1200000 sequences, 267074826 bases, 231074856 kmers +read 1300000 sequences, 288917293 bases, 249917323 kmers +read 1400000 sequences, 311411250 bases, 269411280 kmers +read 1500000 sequences, 333749577 bases, 288749607 kmers +read 1600000 sequences, 356425695 bases, 308425725 kmers +read 1700000 sequences, 378782863 bases, 327782893 kmers +read 1800000 sequences, 401743561 bases, 347743591 kmers +read 1900000 sequences, 424135183 bases, 367135213 kmers +read 2000000 sequences, 446879049 bases, 386879079 kmers +read 2100000 sequences, 468734269 bases, 405734299 kmers +read 2200000 sequences, 490603237 bases, 424603267 kmers +read 2300000 sequences, 513905163 bases, 444905193 kmers +read 2400000 sequences, 537439218 bases, 465439248 kmers +read 2500000 sequences, 560503353 bases, 485503383 kmers +read 2600000 sequences, 583973645 bases, 505973675 kmers +read 2700000 sequences, 606563596 bases, 525563626 kmers +read 2800000 sequences, 629471143 bases, 545471173 kmers +read 2900000 sequences, 653036453 bases, 566036483 kmers +read 3000000 sequences, 676313831 bases, 586313861 kmers +read 3100000 sequences, 700155099 bases, 607155129 kmers +read 3200000 sequences, 723256428 bases, 627256458 kmers +read 3300000 sequences, 745736801 bases, 646736831 kmers +read 3400000 sequences, 768718458 bases, 666718488 kmers +read 3500000 sequences, 791774449 bases, 686774479 kmers +read 3600000 sequences, 814593816 bases, 706593846 kmers +read 3700000 sequences, 838379879 bases, 727379909 kmers +read 3800000 sequences, 860634933 bases, 746634963 kmers +read 3900000 sequences, 884047075 bases, 767047105 kmers +read 4000000 sequences, 907479686 bases, 787479716 kmers +read 4100000 sequences, 930543338 bases, 807543368 kmers +read 4200000 sequences, 953267462 bases, 827267492 kmers +read 4300000 sequences, 976927833 bases, 847927863 kmers +read 4400000 sequences, 1000738248 bases, 868738278 kmers +read 4500000 sequences, 1024531209 bases, 889531239 kmers +read 4600000 sequences, 1047717223 bases, 909717253 kmers +read 4700000 sequences, 1071027493 bases, 930027523 kmers +read 4800000 sequences, 1094084552 bases, 950084582 kmers +read 4900000 sequences, 1117956137 bases, 970956167 kmers +read 5000000 sequences, 1141125024 bases, 991125054 kmers +read 5100000 sequences, 1164319107 bases, 1011319137 kmers +read 5200000 sequences, 1187390563 bases, 1031390593 kmers +read 5300000 sequences, 1211053129 bases, 1052053159 kmers +read 5400000 sequences, 1234026672 bases, 1072026702 kmers +read 5500000 sequences, 1257295769 bases, 1092295799 kmers +read 5600000 sequences, 1279760698 bases, 1111760728 kmers +read 5700000 sequences, 1303188807 bases, 1132188837 kmers +read 5800000 sequences, 1326902250 bases, 1152902280 kmers +read 5900000 sequences, 1350165652 bases, 1173165682 kmers +read 6000000 sequences, 1373185888 bases, 1193185918 kmers +read 6100000 sequences, 1396446455 bases, 1213446485 kmers +read 6200000 sequences, 1420887422 bases, 1234887452 kmers +read 6300000 sequences, 1444176084 bases, 1255176114 kmers +read 6400000 sequences, 1467761803 bases, 1275761833 kmers +read 6500000 sequences, 1491517469 bases, 1296517499 kmers +read 6600000 sequences, 1515086149 bases, 1317086179 kmers +read 6700000 sequences, 1537506202 bases, 1336506232 kmers +read 6800000 sequences, 1560946391 bases, 1356946421 kmers +read 6900000 sequences, 1583945488 bases, 1376945518 kmers +read 7000000 sequences, 1606825999 bases, 1396826029 kmers +read 7100000 sequences, 1630889570 bases, 1417889600 kmers +read 7200000 sequences, 1653502338 bases, 1437502368 kmers +read 7300000 sequences, 1676836074 bases, 1457836104 kmers +read 7400000 sequences, 1700581893 bases, 1478581923 kmers +read 7500000 sequences, 1723991216 bases, 1498991246 kmers +read 7600000 sequences, 1747267694 bases, 1519267724 kmers +read 7700000 sequences, 1769997128 bases, 1538997158 kmers +read 7800000 sequences, 1793090725 bases, 1559090755 kmers +read 7900000 sequences, 1816572169 bases, 1579572199 kmers +read 8000000 sequences, 1839912405 bases, 1599912435 kmers +read 8100000 sequences, 1863462142 bases, 1620462172 kmers +read 8200000 sequences, 1887689183 bases, 1641689213 kmers +read 8300000 sequences, 1911245326 bases, 1662245356 kmers +read 8400000 sequences, 1934891774 bases, 1682891804 kmers +read 8500000 sequences, 1958265360 bases, 1703265390 kmers +read 8600000 sequences, 1981114530 bases, 1723114560 kmers +read 8700000 sequences, 2005160537 bases, 1744160567 kmers +read 8800000 sequences, 2028270585 bases, 1764270615 kmers +read 8900000 sequences, 2051383223 bases, 1784383253 kmers +read 9000000 sequences, 2074474142 bases, 1804474172 kmers +read 9100000 sequences, 2096460797 bases, 1823460827 kmers +read 9200000 sequences, 2119508963 bases, 1843508993 kmers +read 9300000 sequences, 2142674047 bases, 1863674077 kmers +read 9400000 sequences, 2164744513 bases, 1882744543 kmers +read 9500000 sequences, 2187346618 bases, 1902346648 kmers +read 9600000 sequences, 2209977347 bases, 1921977377 kmers +read 9700000 sequences, 2232411621 bases, 1941411651 kmers +read 9800000 sequences, 2254902856 bases, 1960902886 kmers +read 9900000 sequences, 2277498326 bases, 1980498356 kmers +read 10000000 sequences, 2299499706 bases, 1999499736 kmers +read 10100000 sequences, 2321026083 bases, 2018026113 kmers +read 10200000 sequences, 2343732502 bases, 2037732532 kmers +read 10300000 sequences, 2364673146 bases, 2055673176 kmers +read 10400000 sequences, 2386756547 bases, 2074756577 kmers +read 10500000 sequences, 2407972829 bases, 2092972859 kmers +read 10600000 sequences, 2429720496 bases, 2111720526 kmers +read 10700000 sequences, 2450999850 bases, 2129999880 kmers +read 10800000 sequences, 2471991237 bases, 2147991267 kmers +read 10900000 sequences, 2492905716 bases, 2165905746 kmers +read 11000000 sequences, 2514209537 bases, 2184209567 kmers +read 11100000 sequences, 2535680432 bases, 2202680462 kmers +read 11200000 sequences, 2556527106 bases, 2220527136 kmers +read 11300000 sequences, 2577149683 bases, 2238149713 kmers +read 11400000 sequences, 2597185570 bases, 2255185600 kmers +read 11500000 sequences, 2617632290 bases, 2272632320 kmers +read 11600000 sequences, 2638223488 bases, 2290223518 kmers +read 11700000 sequences, 2658091095 bases, 2307091125 kmers +read 11800000 sequences, 2676727586 bases, 2322727616 kmers +read 11900000 sequences, 2695970855 bases, 2338970885 kmers +read 12000000 sequences, 2714887902 bases, 2354887932 kmers +read 12100000 sequences, 2733216523 bases, 2370216553 kmers +read 12200000 sequences, 2751654575 bases, 2385654605 kmers +read 12300000 sequences, 2769824681 bases, 2400824711 kmers +read 12400000 sequences, 2788136547 bases, 2416136577 kmers +read 12500000 sequences, 2806066941 bases, 2431066971 kmers +read 12600000 sequences, 2823691733 bases, 2445691763 kmers +read 12700000 sequences, 2841752082 bases, 2460752112 kmers +read 12800000 sequences, 2859305620 bases, 2475305650 kmers +read 12900000 sequences, 2876642001 bases, 2489642031 kmers +read 13000000 sequences, 2893631233 bases, 2503631263 kmers +=== step 1.1: 'encoding input' 11.4321 [sec] (4.5629 [ns/kmer]) +read 13014214 sequences, 2895872181 bases, 2505445761 kmers +num_kmers 2505445761 +cost: 2.0 + 0.311662 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.13.bin'... +=== step 1.2: 'computing minimizers tuples' 11.1395 [sec] (4.4461 [ns/kmer]) +=== step 1: 'parse file' 22.5717 [sec] (9.00907 [ns/kmer]) + == files to merge = 14 +saving tuples to 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.1: 'merging minimizers tuples' 26.7822 [sec] (10.6896 [ns/kmer]) +num_minimizers = 417553335 +num_minimizer_positions = 474828363 +num_super_kmers = 493836140 +building minimizers MPHF with 8 threads and 140 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 27.6125 [sec] (11.021 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 20.3951 [sec] (8.1403 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.4: 'merging minimizers tuples ' 37.8879 [sec] (15.1222 [ns/kmer]) +num_bits_per_offset = ceil(log2(2895872213)) = 32 +constants::min_l = 6 +min_size = 64 +max_bucket_size 33191 +log2_max_bucket_size 16 +num_buckets_larger_than_1_not_in_skew_index 16634505/417553335 (3.9838%) +num_buckets_in_skew_index 75846/417553335 (0.0181644%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 59861399/474828363 (12.607%) +num_minimizer_positions_of_buckets_in_skew_index 14123980/474828363 (2.97454%) +computing minimizers offsets: 6.62443 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18483007 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14289333 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 10220043 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 7256268 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4841792 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2658327 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1446373 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 33191: 1382491 +num_kmers_in_skew_index 60577634 (2.41784%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18483007 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[0] for 18483007 kmers; bits/key = 2.64291 + built positions[0] for 18483007 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14289333 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[1] for 14289333 kmers; bits/key = 2.51635 + built positions[1] for 14289333 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 10220043 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[2] for 10220043 kmers; bits/key = 2.63949 + built positions[2] for 10220043 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 7256268 + building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 7256268 kmers; bits/key = 2.72044 + built positions[3] for 7256268 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4841792 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4841792 kmers; bits/key = 2.71841 + built positions[4] for 4841792 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2658327 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2658327)... + built mphs[5] for 2658327 kmers; bits/key = 2.55987 + built positions[5] for 2658327 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1446373 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1446373)... + built mphs[6] for 1446373 kmers; bits/key = 2.56056 + built positions[6] for 1446373 kmers; bits/key = 13.0002 + lower = 8192; upper = 33191; num_bits_per_pos = 16; num_kmers_in_partition = 1382491 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1382491)... + built mphs[7] for 1382491 kmers; bits/key = 2.5606 + built positions[7] for 1382491 kmers; bits/key = 16.0002 +computing skew index took: 14.4326 [sec] +=== step 3: 'build sparse and skew index' 21.4682 [sec] (8.5686 [ns/kmer]) +=== total_time 156.718 [sec] (62.5508 [ns/kmer]) +total index size: 2995577954 [B] -- 2995.58 [MB] +SPACE BREAKDOWN: + minimizers: 0.473465 [bits/kmer] (2.84093 [bits/key]) -- 4.94996% + pieces: 0.0585865 [bits/kmer] -- 0.612509% + offsets: 5.49972 [bits/kmer] -- 57.4983% + offsets2: 0.764561 [bits/kmer] -- 7.9933% + offsets3: 0.180394 [bits/kmer] -- 1.88598% + start_lists_of_size: 8.55736e-07 [bits/kmer] -- 8.94652e-06% + strings: 2.31166 [bits/kmer] -- 24.1679% + skew_index: 0.27662 [bits/kmer] -- 2.892% + weights: 5.8752e-07 [bits/kmer] -- 6.14239e-06% + -------------- + total: 9.56501 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.998% +buckets with 2 minimizer positions = 2.57019% +buckets with 3 minimizer positions = 0.580253% +buckets with 4 minimizer positions = 0.252657% +buckets with 5 minimizer positions = 0.141401% +buckets with 6 minimizer positions = 0.0899801% +buckets with 7 minimizer positions = 0.0622388% +buckets with 8 minimizer positions = 0.0453985% +buckets with 9 minimizer positions = 0.0345565% +buckets with 10 minimizer positions = 0.0272049% +buckets with 11 minimizer positions = 0.0217699% +buckets with 12 minimizer positions = 0.0179227% +buckets with 13 minimizer positions = 0.0150204% +buckets with 14 minimizer positions = 0.0126494% +buckets with 15 minimizer positions = 0.0108367% +buckets with 16 minimizer positions = 0.00935378% +max_bucket_size 33191 +2025-09-14 17:39:02: saving data structure to disk... +2025-09-14 17:39:04: DONE diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log new file mode 100644 index 0000000..83f38b9 --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 17:47:48: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 17:47:59: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 7886675/132860997 (5.93603%) +num_extensions = 124974322/132860997 (94.064%) +elapsed = 10798.4 millisec / 10.7984 sec / 0.179973 min / 66.131 ns/kmer +2025-09-14 17:47:59: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 17:48:56: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 13101335/525542891 (2.49291%) +num_extensions = 512441556/525542891 (97.5071%) +elapsed = 56221.4 millisec / 56.2214 sec / 0.937023 min / 80.8083 ns/kmer +2025-09-14 17:48:57: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-14 17:52:12: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437870528 (91.5856%) +num_negative_kmers = 131075447 (8.34889%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 110228289/1437870528 (7.66608%) +num_extensions = 1327642239/1437870528 (92.3339%) +elapsed = 195011 millisec / 195.011 sec / 3.25018 min / 124.213 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log new file mode 100644 index 0000000..9a41038 --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 17:54:46: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 17:56:00: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 4754204 (0.683333%) +num_negative_kmers = 690972341 (99.3151%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 3613872/4754204 (76.0142%) +num_extensions = 1140332/4754204 (23.9858%) +elapsed = 73785 millisec / 73.785 sec / 1.22975 min / 106.053 ns/kmer +2025-09-14 17:56:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 17:56:08: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 790414 (0.484063%) +num_negative_kmers = 162496946 (99.5159%) +num_invalid_kmers = 0 (0%) +num_searches = 499575/790414 (63.2042%) +num_extensions = 290839/790414 (36.7958%) +elapsed = 7559.28 millisec / 7.55928 sec / 0.125988 min / 46.2943 ns/kmer +2025-09-14 17:56:09: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-14 17:56:45: DONE +==== query report: +num_kmers = 395433242 +num_positive_kmers = 1134 (0.000286774%) +num_negative_kmers = 395408021 (99.9936%) +num_invalid_kmers = 24087 (0.00609129%) +num_searches = 895/1134 (78.9242%) +num_extensions = 239/1134 (21.0758%) +elapsed = 36117.8 millisec / 36.1178 sec / 0.601963 min / 91.3372 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log new file mode 100644 index 0000000..42a9725 --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log @@ -0,0 +1,9 @@ +lookup: avg_nanosec_per_positive_lookup 726.75 +avg_nanosec_per_negative_lookup 650.547 +iterator: avg_nanosec_per_kmer 20.9193 +lookup: avg_nanosec_per_positive_lookup 661.647 +avg_nanosec_per_negative_lookup 685.681 +iterator: avg_nanosec_per_kmer 20.7216 +lookup: avg_nanosec_per_positive_lookup 992.379 +avg_nanosec_per_negative_lookup 753.164 +iterator: avg_nanosec_per_kmer 20.8978 diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log new file mode 100644 index 0000000..aa3562c --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log @@ -0,0 +1,516 @@ +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 27657185 bases, 24657215 kmers +read 200000 sequences, 54659411 bases, 48659441 kmers +read 300000 sequences, 82042065 bases, 73042095 kmers +read 400000 sequences, 109137740 bases, 97137770 kmers +read 500000 sequences, 135591611 bases, 120591641 kmers +read 600000 sequences, 162605989 bases, 144606019 kmers +read 700000 sequences, 189421730 bases, 168421760 kmers +read 800000 sequences, 214809276 bases, 190809306 kmers +read 900000 sequences, 240465564 bases, 213465594 kmers +read 1000000 sequences, 265968295 bases, 235968325 kmers +read 1100000 sequences, 291953235 bases, 258953265 kmers +read 1200000 sequences, 316684260 bases, 280684290 kmers +read 1300000 sequences, 341304215 bases, 302304245 kmers +read 1400000 sequences, 365519325 bases, 323519355 kmers +read 1500000 sequences, 388985606 bases, 343985636 kmers +read 1600000 sequences, 411705914 bases, 363705944 kmers +read 1700000 sequences, 434632801 bases, 383632831 kmers +read 1800000 sequences, 456140575 bases, 402140605 kmers +read 1900000 sequences, 477396896 bases, 420396926 kmers +read 2000000 sequences, 498761432 bases, 438761462 kmers +read 2100000 sequences, 518417062 bases, 455417092 kmers +read 2200000 sequences, 537930862 bases, 471930892 kmers +read 2300000 sequences, 556305688 bases, 487305718 kmers +read 2400000 sequences, 573938040 bases, 501938070 kmers +=== step 1.1: 'encoding input' 2.29787 [sec] (4.57318 [ns/kmer]) +read 2406269 sequences, 574653270 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.287336 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.44 [sec] (2.86587 [ns/kmer]) +=== step 1: 'parse file' 3.73842 [sec] (7.44016 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 3.74764 [sec] (7.4585 [ns/kmer]) +num_minimizers = 72390526 +num_minimizer_positions = 78741053 +num_super_kmers = 78741053 +building minimizers MPHF with 8 threads and 25 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.14299 [sec] (10.2355 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.21144 [sec] (6.39136 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.03166 [sec] (2.0532 [ns/kmer]) +num_bits_per_offset = ceil(log2(574653302)) = 30 +constants::min_l = 6 +min_size = 64 +max_bucket_size 69558 +log2_max_bucket_size 17 +num_buckets_larger_than_1_not_in_skew_index 2336498/72390526 (3.22763%) +num_buckets_in_skew_index 4518/72390526 (0.00624115%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 7623230/78741053 (9.68139%) +num_minimizer_positions_of_buckets_in_skew_index 1068313/78741053 (1.35674%) +computing minimizers offsets: 0.99687 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1245692 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1024068 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 712068 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 409910 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 444216 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 285146 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 261943 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 69558: 486183 +num_kmers_in_skew_index 4869226 (0.969067%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1245692 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1245692)... + built mphs[0] for 1245692 kmers; bits/key = 2.41792 + built positions[0] for 1245692 kmers; bits/key = 7.00028 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1024068 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1024068)... + built mphs[1] for 1024068 kmers; bits/key = 2.56119 + built positions[1] for 1024068 kmers; bits/key = 8.00034 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 712068 + building MPHF with 8 threads and 1 partitions (avg. partition size = 712068)... + built mphs[2] for 712068 kmers; bits/key = 2.41921 + built positions[2] for 712068 kmers; bits/key = 9.00049 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 409910 + building MPHF with 8 threads and 1 partitions (avg. partition size = 409910)... + built mphs[3] for 409910 kmers; bits/key = 2.42137 + built positions[3] for 409910 kmers; bits/key = 10.0009 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 444216 + building MPHF with 8 threads and 1 partitions (avg. partition size = 444216)... + built mphs[4] for 444216 kmers; bits/key = 2.56391 + built positions[4] for 444216 kmers; bits/key = 11.0008 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 285146 + building MPHF with 8 threads and 1 partitions (avg. partition size = 285146)... + built mphs[5] for 285146 kmers; bits/key = 2.5666 + built positions[5] for 285146 kmers; bits/key = 12.0012 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 261943 + building MPHF with 8 threads and 1 partitions (avg. partition size = 261943)... + built mphs[6] for 261943 kmers; bits/key = 2.42416 + built positions[6] for 261943 kmers; bits/key = 13.0014 + lower = 8192; upper = 69558; num_bits_per_pos = 17; num_kmers_in_partition = 486183 + building MPHF with 8 threads and 1 partitions (avg. partition size = 486183)... + built mphs[7] for 486183 kmers; bits/key = 2.42062 + built positions[7] for 486183 kmers; bits/key = 17.0007 +computing skew index took: 3.60973 [sec] +=== step 3: 'build sparse and skew index' 4.67761 [sec] (9.30933 [ns/kmer]) +=== total_time 21.5498 [sec] (42.8881 [ns/kmer]) +total index size: 493924126 [B] -- 493.924 [MB] +SPACE BREAKDOWN: + minimizers: 0.418287 [bits/kmer] (2.90335 [bits/key]) -- 5.31901% + pieces: 0.0549683 [bits/kmer] -- 0.698985% + offsets: 4.46619 [bits/kmer] -- 56.7928% + offsets2: 0.45515 [bits/kmer] -- 5.78776% + offsets3: 0.063785 [bits/kmer] -- 0.811099% + start_lists_of_size: 4.26696e-06 [bits/kmer] -- 5.42593e-05% + strings: 2.28734 [bits/kmer] -- 29.0861% + skew_index: 0.118285 [bits/kmer] -- 1.50413% + weights: 2.92956e-06 [bits/kmer] -- 3.72527e-05% + -------------- + total: 7.86401 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.7661% +buckets with 2 minimizer positions = 2.08649% +buckets with 3 minimizer positions = 0.528401% +buckets with 4 minimizer positions = 0.211604% +buckets with 5 minimizer positions = 0.112209% +buckets with 6 minimizer positions = 0.0671649% +buckets with 7 minimizer positions = 0.0451164% +buckets with 8 minimizer positions = 0.0319876% +buckets with 9 minimizer positions = 0.0235431% +buckets with 10 minimizer positions = 0.0181944% +buckets with 11 minimizer positions = 0.0148058% +buckets with 12 minimizer positions = 0.0118427% +buckets with 13 minimizer positions = 0.0095413% +buckets with 14 minimizer positions = 0.00797204% +buckets with 15 minimizer positions = 0.00665557% +buckets with 16 minimizer positions = 0.00562228% +max_bucket_size 69558 +2025-09-14 17:32:38: saving data structure to disk... +2025-09-14 17:32:38: DONE +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 158452704 bases, 155452734 kmers +read 200000 sequences, 318155284 bases, 312155314 kmers +read 300000 sequences, 484429755 bases, 475429785 kmers +read 400000 sequences, 657902795 bases, 645902825 kmers +read 500000 sequences, 832407154 bases, 817407184 kmers +read 600000 sequences, 1004979671 bases, 986979701 kmers +=== step 1.1: 'encoding input' 4.37764 [sec] (3.80532 [ns/kmer]) +read 682245 sequences, 1170866555 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.035583 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 3.2358 [sec] (2.81276 [ns/kmer]) +=== step 1: 'parse file' 7.61669 [sec] (6.62091 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 8.09361 [sec] (7.03548 [ns/kmer]) +num_minimizers = 173245358 +num_minimizer_positions = 176049220 +num_super_kmers = 176049220 +building minimizers MPHF with 8 threads and 58 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 11.5493 [sec] (10.0394 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.25958 [sec] (6.31048 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.88591 [sec] (1.63935 [ns/kmer]) +num_bits_per_offset = ceil(log2(1170866587)) = 31 +constants::min_l = 6 +min_size = 64 +max_bucket_size 4013 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 1346106/173245358 (0.776994%) +num_buckets_in_skew_index 1718/173245358 (0.000991657%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 3918362/176049220 (2.22572%) +num_minimizer_positions_of_buckets_in_skew_index 233324/176049220 (0.132533%) +computing minimizers offsets: 1.37583 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 585298 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 326635 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 158808 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 108589 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 32581 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4013: 37778 +num_kmers_in_skew_index 1249689 (0.108631%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 585298 + building MPHF with 8 threads and 1 partitions (avg. partition size = 585298)... + built mphs[0] for 585298 kmers; bits/key = 2.41983 + built positions[0] for 585298 kmers; bits/key = 7.00055 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 326635 + building MPHF with 8 threads and 1 partitions (avg. partition size = 326635)... + built mphs[1] for 326635 kmers; bits/key = 2.42277 + built positions[1] for 326635 kmers; bits/key = 8.0011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 158808 + building MPHF with 8 threads and 1 partitions (avg. partition size = 158808)... + built mphs[2] for 158808 kmers; bits/key = 2.4294 + built positions[2] for 158808 kmers; bits/key = 9.00227 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 108589 + building MPHF with 8 threads and 1 partitions (avg. partition size = 108589)... + built mphs[3] for 108589 kmers; bits/key = 2.43546 + built positions[3] for 108589 kmers; bits/key = 10.0035 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 32581 + building MPHF with 8 threads and 1 partitions (avg. partition size = 32581)... + built mphs[4] for 32581 kmers; bits/key = 2.48341 + built positions[4] for 32581 kmers; bits/key = 11.0101 + lower = 2048; upper = 4013; num_bits_per_pos = 12; num_kmers_in_partition = 37778 + building MPHF with 8 threads and 1 partitions (avg. partition size = 37778)... + built mphs[5] for 37778 kmers; bits/key = 2.4734 + built positions[5] for 37778 kmers; bits/key = 12.0095 +computing skew index took: 0.998153 [sec] +=== step 3: 'build sparse and skew index' 2.52392 [sec] (2.19395 [ns/kmer]) +=== total_time 38.929 [sec] (33.8396 [ns/kmer]) +total index size: 1066231572 [B] -- 1066.23 [MB] +SPACE BREAKDOWN: + minimizers: 0.428384 [bits/kmer] (2.84459 [bits/key]) -- 5.77751% + pieces: 0.00841122 [bits/kmer] -- 0.11344% + offsets: 4.81907 [bits/kmer] -- 64.9935% + offsets2: 0.105589 [bits/kmer] -- 1.42405% + offsets3: 0.00628774 [bits/kmer] -- 0.0848011% + start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.51353e-05% + strings: 2.03558 [bits/kmer] -- 27.4534% + skew_index: 0.0113627 [bits/kmer] -- 0.153245% + weights: 1.27956e-06 [bits/kmer] -- 1.7257e-05% + -------------- + total: 7.41469 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.222% +buckets with 2 minimizer positions = 0.587049% +buckets with 3 minimizer positions = 0.0858742% +buckets with 4 minimizer positions = 0.0350243% +buckets with 5 minimizer positions = 0.0189223% +buckets with 6 minimizer positions = 0.011583% +buckets with 7 minimizer positions = 0.00779877% +buckets with 8 minimizer positions = 0.00559438% +buckets with 9 minimizer positions = 0.00408611% +buckets with 10 minimizer positions = 0.00312793% +buckets with 11 minimizer positions = 0.0024878% +buckets with 12 minimizer positions = 0.00196542% +buckets with 13 minimizer positions = 0.00159196% +buckets with 14 minimizer positions = 0.0013276% +buckets with 15 minimizer positions = 0.00114116% +buckets with 16 minimizer positions = 0.000962796% +max_bucket_size 4013 +2025-09-14 17:33:17: saving data structure to disk... +2025-09-14 17:33:18: DONE +k = 31, m = 21, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 21756494 bases, 18756524 kmers +read 200000 sequences, 43415082 bases, 37415112 kmers +read 300000 sequences, 65780160 bases, 56780190 kmers +read 400000 sequences, 87471486 bases, 75471516 kmers +read 500000 sequences, 109226866 bases, 94226896 kmers +read 600000 sequences, 131648019 bases, 113648049 kmers +read 700000 sequences, 153316395 bases, 132316425 kmers +read 800000 sequences, 176702606 bases, 152702636 kmers +read 900000 sequences, 198938131 bases, 171938161 kmers +read 1000000 sequences, 220949217 bases, 190949247 kmers +read 1100000 sequences, 244049472 bases, 211049502 kmers +read 1200000 sequences, 267074826 bases, 231074856 kmers +read 1300000 sequences, 288917293 bases, 249917323 kmers +read 1400000 sequences, 311411250 bases, 269411280 kmers +read 1500000 sequences, 333749577 bases, 288749607 kmers +read 1600000 sequences, 356425695 bases, 308425725 kmers +read 1700000 sequences, 378782863 bases, 327782893 kmers +read 1800000 sequences, 401743561 bases, 347743591 kmers +read 1900000 sequences, 424135183 bases, 367135213 kmers +read 2000000 sequences, 446879049 bases, 386879079 kmers +read 2100000 sequences, 468734269 bases, 405734299 kmers +read 2200000 sequences, 490603237 bases, 424603267 kmers +read 2300000 sequences, 513905163 bases, 444905193 kmers +read 2400000 sequences, 537439218 bases, 465439248 kmers +read 2500000 sequences, 560503353 bases, 485503383 kmers +read 2600000 sequences, 583973645 bases, 505973675 kmers +read 2700000 sequences, 606563596 bases, 525563626 kmers +read 2800000 sequences, 629471143 bases, 545471173 kmers +read 2900000 sequences, 653036453 bases, 566036483 kmers +read 3000000 sequences, 676313831 bases, 586313861 kmers +read 3100000 sequences, 700155099 bases, 607155129 kmers +read 3200000 sequences, 723256428 bases, 627256458 kmers +read 3300000 sequences, 745736801 bases, 646736831 kmers +read 3400000 sequences, 768718458 bases, 666718488 kmers +read 3500000 sequences, 791774449 bases, 686774479 kmers +read 3600000 sequences, 814593816 bases, 706593846 kmers +read 3700000 sequences, 838379879 bases, 727379909 kmers +read 3800000 sequences, 860634933 bases, 746634963 kmers +read 3900000 sequences, 884047075 bases, 767047105 kmers +read 4000000 sequences, 907479686 bases, 787479716 kmers +read 4100000 sequences, 930543338 bases, 807543368 kmers +read 4200000 sequences, 953267462 bases, 827267492 kmers +read 4300000 sequences, 976927833 bases, 847927863 kmers +read 4400000 sequences, 1000738248 bases, 868738278 kmers +read 4500000 sequences, 1024531209 bases, 889531239 kmers +read 4600000 sequences, 1047717223 bases, 909717253 kmers +read 4700000 sequences, 1071027493 bases, 930027523 kmers +read 4800000 sequences, 1094084552 bases, 950084582 kmers +read 4900000 sequences, 1117956137 bases, 970956167 kmers +read 5000000 sequences, 1141125024 bases, 991125054 kmers +read 5100000 sequences, 1164319107 bases, 1011319137 kmers +read 5200000 sequences, 1187390563 bases, 1031390593 kmers +read 5300000 sequences, 1211053129 bases, 1052053159 kmers +read 5400000 sequences, 1234026672 bases, 1072026702 kmers +read 5500000 sequences, 1257295769 bases, 1092295799 kmers +read 5600000 sequences, 1279760698 bases, 1111760728 kmers +read 5700000 sequences, 1303188807 bases, 1132188837 kmers +read 5800000 sequences, 1326902250 bases, 1152902280 kmers +read 5900000 sequences, 1350165652 bases, 1173165682 kmers +read 6000000 sequences, 1373185888 bases, 1193185918 kmers +read 6100000 sequences, 1396446455 bases, 1213446485 kmers +read 6200000 sequences, 1420887422 bases, 1234887452 kmers +read 6300000 sequences, 1444176084 bases, 1255176114 kmers +read 6400000 sequences, 1467761803 bases, 1275761833 kmers +read 6500000 sequences, 1491517469 bases, 1296517499 kmers +read 6600000 sequences, 1515086149 bases, 1317086179 kmers +read 6700000 sequences, 1537506202 bases, 1336506232 kmers +read 6800000 sequences, 1560946391 bases, 1356946421 kmers +read 6900000 sequences, 1583945488 bases, 1376945518 kmers +read 7000000 sequences, 1606825999 bases, 1396826029 kmers +read 7100000 sequences, 1630889570 bases, 1417889600 kmers +read 7200000 sequences, 1653502338 bases, 1437502368 kmers +read 7300000 sequences, 1676836074 bases, 1457836104 kmers +read 7400000 sequences, 1700581893 bases, 1478581923 kmers +read 7500000 sequences, 1723991216 bases, 1498991246 kmers +read 7600000 sequences, 1747267694 bases, 1519267724 kmers +read 7700000 sequences, 1769997128 bases, 1538997158 kmers +read 7800000 sequences, 1793090725 bases, 1559090755 kmers +read 7900000 sequences, 1816572169 bases, 1579572199 kmers +read 8000000 sequences, 1839912405 bases, 1599912435 kmers +read 8100000 sequences, 1863462142 bases, 1620462172 kmers +read 8200000 sequences, 1887689183 bases, 1641689213 kmers +read 8300000 sequences, 1911245326 bases, 1662245356 kmers +read 8400000 sequences, 1934891774 bases, 1682891804 kmers +read 8500000 sequences, 1958265360 bases, 1703265390 kmers +read 8600000 sequences, 1981114530 bases, 1723114560 kmers +read 8700000 sequences, 2005160537 bases, 1744160567 kmers +read 8800000 sequences, 2028270585 bases, 1764270615 kmers +read 8900000 sequences, 2051383223 bases, 1784383253 kmers +read 9000000 sequences, 2074474142 bases, 1804474172 kmers +read 9100000 sequences, 2096460797 bases, 1823460827 kmers +read 9200000 sequences, 2119508963 bases, 1843508993 kmers +read 9300000 sequences, 2142674047 bases, 1863674077 kmers +read 9400000 sequences, 2164744513 bases, 1882744543 kmers +read 9500000 sequences, 2187346618 bases, 1902346648 kmers +read 9600000 sequences, 2209977347 bases, 1921977377 kmers +read 9700000 sequences, 2232411621 bases, 1941411651 kmers +read 9800000 sequences, 2254902856 bases, 1960902886 kmers +read 9900000 sequences, 2277498326 bases, 1980498356 kmers +read 10000000 sequences, 2299499706 bases, 1999499736 kmers +read 10100000 sequences, 2321026083 bases, 2018026113 kmers +read 10200000 sequences, 2343732502 bases, 2037732532 kmers +read 10300000 sequences, 2364673146 bases, 2055673176 kmers +read 10400000 sequences, 2386756547 bases, 2074756577 kmers +read 10500000 sequences, 2407972829 bases, 2092972859 kmers +read 10600000 sequences, 2429720496 bases, 2111720526 kmers +read 10700000 sequences, 2450999850 bases, 2129999880 kmers +read 10800000 sequences, 2471991237 bases, 2147991267 kmers +read 10900000 sequences, 2492905716 bases, 2165905746 kmers +read 11000000 sequences, 2514209537 bases, 2184209567 kmers +read 11100000 sequences, 2535680432 bases, 2202680462 kmers +read 11200000 sequences, 2556527106 bases, 2220527136 kmers +read 11300000 sequences, 2577149683 bases, 2238149713 kmers +read 11400000 sequences, 2597185570 bases, 2255185600 kmers +read 11500000 sequences, 2617632290 bases, 2272632320 kmers +read 11600000 sequences, 2638223488 bases, 2290223518 kmers +read 11700000 sequences, 2658091095 bases, 2307091125 kmers +read 11800000 sequences, 2676727586 bases, 2322727616 kmers +read 11900000 sequences, 2695970855 bases, 2338970885 kmers +read 12000000 sequences, 2714887902 bases, 2354887932 kmers +read 12100000 sequences, 2733216523 bases, 2370216553 kmers +read 12200000 sequences, 2751654575 bases, 2385654605 kmers +read 12300000 sequences, 2769824681 bases, 2400824711 kmers +read 12400000 sequences, 2788136547 bases, 2416136577 kmers +read 12500000 sequences, 2806066941 bases, 2431066971 kmers +read 12600000 sequences, 2823691733 bases, 2445691763 kmers +read 12700000 sequences, 2841752082 bases, 2460752112 kmers +read 12800000 sequences, 2859305620 bases, 2475305650 kmers +read 12900000 sequences, 2876642001 bases, 2489642031 kmers +read 13000000 sequences, 2893631233 bases, 2503631263 kmers +=== step 1.1: 'encoding input' 11.41 [sec] (4.55408 [ns/kmer]) +read 13014214 sequences, 2895872181 bases, 2505445761 kmers +num_kmers 2505445761 +cost: 2.0 + 0.311662 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 7.43234 [sec] (2.96647 [ns/kmer]) +=== step 1: 'parse file' 18.8425 [sec] (7.52063 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 19.8093 [sec] (7.9065 [ns/kmer]) +num_minimizers = 386617003 +num_minimizer_positions = 425284125 +num_super_kmers = 425284125 +building minimizers MPHF with 8 threads and 129 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 25.5026 [sec] (10.1789 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.5315 [sec] (6.99736 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 11.5246 [sec] (4.59981 [ns/kmer]) +num_bits_per_offset = ceil(log2(2895872213)) = 32 +constants::min_l = 6 +min_size = 64 +max_bucket_size 34767 +log2_max_bucket_size 16 +num_buckets_larger_than_1_not_in_skew_index 11147152/386617003 (2.88325%) +num_buckets_in_skew_index 47919/386617003 (0.0123944%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 41920449/425284125 (9.85705%) +num_minimizer_positions_of_buckets_in_skew_index 7941744/425284125 (1.8674%) +computing minimizers offsets: 4.95243 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11994340 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8728433 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5803568 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3324419 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2008903 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1146661 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 501339 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 34767: 254893 +num_kmers_in_skew_index 33762556 (1.34757%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11994340 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11994340 kmers; bits/key = 2.56071 + built positions[0] for 11994340 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8728433 + building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8728433 kmers; bits/key = 2.57731 + built positions[1] for 8728433 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5803568 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5803568 kmers; bits/key = 2.55844 + built positions[2] for 5803568 kmers; bits/key = 9.00006 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3324419 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3324419 kmers; bits/key = 3.25356 + built positions[3] for 3324419 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2008903 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2008903)... + built mphs[4] for 2008903 kmers; bits/key = 2.56016 + built positions[4] for 2008903 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1146661 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1146661)... + built mphs[5] for 1146661 kmers; bits/key = 2.56092 + built positions[5] for 1146661 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 501339 + building MPHF with 8 threads and 1 partitions (avg. partition size = 501339)... + built mphs[6] for 501339 kmers; bits/key = 2.56325 + built positions[6] for 501339 kmers; bits/key = 13.0007 + lower = 8192; upper = 34767; num_bits_per_pos = 16; num_kmers_in_partition = 254893 + building MPHF with 8 threads and 1 partitions (avg. partition size = 254893)... + built mphs[7] for 254893 kmers; bits/key = 2.42455 + built positions[7] for 254893 kmers; bits/key = 16.0014 +computing skew index took: 11.1132 [sec] +=== step 3: 'build sparse and skew index' 16.42 [sec] (6.55374 [ns/kmer]) +=== total_time 109.631 [sec] (43.7569 [ns/kmer]) +total index size: 2720226056 [B] -- 2720.23 [MB] +SPACE BREAKDOWN: + minimizers: 0.436946 [bits/kmer] (2.8316 [bits/key]) -- 5.03058% + pieces: 0.0585865 [bits/kmer] -- 0.674509% + offsets: 5.09225 [bits/kmer] -- 58.6273% + offsets2: 0.535416 [bits/kmer] -- 6.16426% + offsets3: 0.101433 [bits/kmer] -- 1.16781% + start_lists_of_size: 8.55736e-07 [bits/kmer] -- 9.85212e-06% + strings: 2.31166 [bits/kmer] -- 26.6143% + skew_index: 0.149505 [bits/kmer] -- 1.72126% + weights: 5.8752e-07 [bits/kmer] -- 6.76414e-06% + -------------- + total: 8.6858 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1044% +buckets with 2 minimizer positions = 1.75374% +buckets with 3 minimizer positions = 0.449247% +buckets with 4 minimizer positions = 0.203979% +buckets with 5 minimizer positions = 0.116523% +buckets with 6 minimizer positions = 0.0751692% +buckets with 7 minimizer positions = 0.051812% +buckets with 8 minimizer positions = 0.0381574% +buckets with 9 minimizer positions = 0.0288166% +buckets with 10 minimizer positions = 0.0225926% +buckets with 11 minimizer positions = 0.0180313% +buckets with 12 minimizer positions = 0.0146659% +buckets with 13 minimizer positions = 0.0123083% +buckets with 14 minimizer positions = 0.0102678% +buckets with 15 minimizer positions = 0.00882372% +buckets with 16 minimizer positions = 0.00752295% +max_bucket_size 34767 +2025-09-14 17:35:08: saving data structure to disk... +2025-09-14 17:35:09: DONE diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log new file mode 100644 index 0000000..d203aab --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 17:42:45: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 17:42:54: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 7886675/132860997 (5.93603%) +num_extensions = 124974322/132860997 (94.064%) +elapsed = 9379.53 millisec / 9.37953 sec / 0.156325 min / 57.4418 ns/kmer +2025-09-14 17:42:55: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 17:43:51: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 13101335/525542891 (2.49291%) +num_extensions = 512441556/525542891 (97.5071%) +elapsed = 56689.4 millisec / 56.6894 sec / 0.944823 min / 81.4809 ns/kmer +2025-09-14 17:43:53: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-14 17:47:48: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437870528 (91.5856%) +num_negative_kmers = 131075447 (8.34889%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 110228289/1437870528 (7.66608%) +num_extensions = 1327642239/1437870528 (92.3339%) +elapsed = 235200 millisec / 235.2 sec / 3.91999 min / 149.811 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log new file mode 100644 index 0000000..542be99 --- /dev/null +++ b/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 17:52:12: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 17:53:45: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 4754204 (0.683333%) +num_negative_kmers = 690972341 (99.3151%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 3613872/4754204 (76.0142%) +num_extensions = 1140332/4754204 (23.9858%) +elapsed = 92907.5 millisec / 92.9075 sec / 1.54846 min / 133.538 ns/kmer +2025-09-14 17:53:46: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 17:53:54: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 790414 (0.484063%) +num_negative_kmers = 162496946 (99.5159%) +num_invalid_kmers = 0 (0%) +num_searches = 499575/790414 (63.2042%) +num_extensions = 290839/790414 (36.7958%) +elapsed = 7956.93 millisec / 7.95693 sec / 0.132616 min / 48.7296 ns/kmer +2025-09-14 17:53:55: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-14 17:54:46: DONE +==== query report: +num_kmers = 395433242 +num_positive_kmers = 1134 (0.000286774%) +num_negative_kmers = 395408021 (99.9936%) +num_invalid_kmers = 24087 (0.00609129%) +num_searches = 895/1134 (78.9242%) +num_extensions = 239/1134 (21.0758%) +elapsed = 51123.7 millisec / 51.1237 sec / 0.852062 min / 129.285 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log new file mode 100644 index 0000000..a713c1d --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log @@ -0,0 +1,9 @@ +lookup: avg_nanosec_per_positive_lookup 839.501 +avg_nanosec_per_negative_lookup 503.289 +iterator: avg_nanosec_per_kmer 20.3145 +lookup: avg_nanosec_per_positive_lookup 697.36 +avg_nanosec_per_negative_lookup 536.61 +iterator: avg_nanosec_per_kmer 20.3157 +lookup: avg_nanosec_per_positive_lookup 954.704 +avg_nanosec_per_negative_lookup 559.445 +iterator: avg_nanosec_per_kmer 20.33 diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log new file mode 100644 index 0000000..8d3dcc8 --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log @@ -0,0 +1,389 @@ +k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 63806937 bases, 57606999 kmers +read 200000 sequences, 129066588 bases, 116666650 kmers +read 300000 sequences, 192862556 bases, 174262618 kmers +read 400000 sequences, 256212661 bases, 231412723 kmers +read 500000 sequences, 319282064 bases, 288282126 kmers +read 600000 sequences, 379117165 bases, 341917227 kmers +read 700000 sequences, 436654305 bases, 393254367 kmers +read 800000 sequences, 492876125 bases, 443276187 kmers +read 900000 sequences, 547344740 bases, 491544802 kmers +read 1000000 sequences, 598624540 bases, 536624602 kmers +=== step 1.1: 'encoding input' 2.24143 [sec] (4.02711 [ns/kmer]) +read 1049410 sequences, 621649078 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.233795 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.64865 [sec] (2.96207 [ns/kmer]) +=== step 1: 'parse file' 3.89024 [sec] (6.98948 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 1.66089 [sec] (2.98406 [ns/kmer]) +num_minimizers = 28491340 +num_minimizer_positions = 34043772 +num_super_kmers = 35742796 +building minimizers MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.27479 [sec] (4.08704 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.34655 [sec] (2.4193 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.419702 [sec] (0.754065 [ns/kmer]) +num_bits_per_offset = ceil(log2(621649142)) = 30 +constants::min_l = 6 +min_size = 64 +max_bucket_size 890626 +log2_max_bucket_size 20 +num_buckets_larger_than_1_not_in_skew_index 1198106/28491340 (4.20516%) +num_buckets_in_skew_index 5680/28491340 (0.0199359%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 4772225/34043772 (14.0179%) +num_minimizer_positions_of_buckets_in_skew_index 1983993/34043772 (5.82777%) +computing minimizers offsets: 0.542615 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5364171 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3558842 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2165544 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1626075 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 914447 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1132014 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 713220 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 890626: 4875198 +num_kmers_in_skew_index 20349511 (3.65613%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5364171 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 5364171 kmers; bits/key = 2.65405 + built positions[0] for 5364171 kmers; bits/key = 7.00007 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3558842 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3558842 kmers; bits/key = 3.06667 + built positions[1] for 3558842 kmers; bits/key = 8.0001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2165544 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2165544)... + built mphs[2] for 2165544 kmers; bits/key = 2.56007 + built positions[2] for 2165544 kmers; bits/key = 9.00016 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1626075 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1626075)... + built mphs[3] for 1626075 kmers; bits/key = 2.56039 + built positions[3] for 1626075 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 914447 + building MPHF with 8 threads and 1 partitions (avg. partition size = 914447)... + built mphs[4] for 914447 kmers; bits/key = 2.56134 + built positions[4] for 914447 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1132014 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1132014)... + built mphs[5] for 1132014 kmers; bits/key = 2.5609 + built positions[5] for 1132014 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 713220 + building MPHF with 8 threads and 1 partitions (avg. partition size = 713220)... + built mphs[6] for 713220 kmers; bits/key = 2.4192 + built positions[6] for 713220 kmers; bits/key = 13.0005 + lower = 8192; upper = 890626; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4875198 kmers; bits/key = 2.70263 + built positions[7] for 4875198 kmers; bits/key = 20.0001 +computing skew index took: 8.02895 [sec] +=== step 3: 'build sparse and skew index' 8.60165 [sec] (15.4543 [ns/kmer]) +=== total_time 18.1938 [sec] (32.6883 [ns/kmer]) +total index size: 339159184 [B] -- 339.159 [MB] +SPACE BREAKDOWN: + minimizers: 0.150699 [bits/kmer] (2.94394 [bits/key]) -- 3.09135% + pieces: 0.0233256 [bits/kmer] -- 0.478488% + offsets: 1.58688 [bits/kmer] -- 32.5523% + offsets2: 0.257224 [bits/kmer] -- 5.27655% + offsets3: 0.106938 [bits/kmer] -- 2.19366% + start_lists_of_size: 3.85206e-06 [bits/kmer] -- 7.90189e-05% + strings: 2.2338 [bits/kmer] -- 45.8228% + skew_index: 0.51599 [bits/kmer] -- 10.5847% + weights: 2.6447e-06 [bits/kmer] -- 5.42518e-05% + -------------- + total: 4.87485 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.7749% +buckets with 2 minimizer positions = 2.30651% +buckets with 3 minimizer positions = 0.761358% +buckets with 4 minimizer positions = 0.355666% +buckets with 5 minimizer positions = 0.200977% +buckets with 6 minimizer positions = 0.12653% +buckets with 7 minimizer positions = 0.0847696% +buckets with 8 minimizer positions = 0.0617767% +buckets with 9 minimizer positions = 0.0458174% +buckets with 10 minimizer positions = 0.0352669% +buckets with 11 minimizer positions = 0.0280963% +buckets with 12 minimizer positions = 0.022821% +buckets with 13 minimizer positions = 0.0187285% +buckets with 14 minimizer positions = 0.0154047% +buckets with 15 minimizer positions = 0.0133093% +buckets with 16 minimizer positions = 0.0113754% +max_bucket_size 890626 +2025-09-14 18:12:36: saving data structure to disk... +2025-09-14 18:12:36: DONE +k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 796964911 bases, 790764973 kmers +=== step 1.1: 'encoding input' 4.19832 [sec] (3.63412 [ns/kmer]) +read 158680 sequences, 1165088827 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0170321 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 3.41341 [sec] (2.95469 [ns/kmer]) +=== step 1: 'parse file' 7.61186 [sec] (6.58892 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 3.30397 [sec] (2.85996 [ns/kmer]) +num_minimizers = 67109831 +num_minimizer_positions = 67978497 +num_super_kmers = 71741056 +building minimizers MPHF with 8 threads and 23 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 4.13569 [sec] (3.57991 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.80762 [sec] (2.43031 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.787093 [sec] (0.681318 [ns/kmer]) +num_bits_per_offset = ceil(log2(1165088891)) = 31 +constants::min_l = 6 +min_size = 64 +max_bucket_size 2836 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 321047/67109831 (0.47839%) +num_buckets_in_skew_index 892/67109831 (0.00132916%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 1060983/67978497 (1.56076%) +num_minimizer_positions_of_buckets_in_skew_index 129622/67978497 (0.190681%) +computing minimizers offsets: 0.617988 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 936900 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 646176 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 458164 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2836: 40401 +num_kmers_in_skew_index 2311880 (0.200119%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 936900 + building MPHF with 8 threads and 1 partitions (avg. partition size = 936900)... + built mphs[0] for 936900 kmers; bits/key = 2.41855 + built positions[0] for 936900 kmers; bits/key = 7.00038 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 646176 + building MPHF with 8 threads and 1 partitions (avg. partition size = 646176)... + built mphs[1] for 646176 kmers; bits/key = 2.41958 + built positions[1] for 646176 kmers; bits/key = 8.0005 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 458164 + building MPHF with 8 threads and 1 partitions (avg. partition size = 458164)... + built mphs[2] for 458164 kmers; bits/key = 2.42072 + built positions[2] for 458164 kmers; bits/key = 9.00079 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 + building MPHF with 8 threads and 1 partitions (avg. partition size = 209599)... + built mphs[3] for 209599 kmers; bits/key = 2.42681 + built positions[3] for 209599 kmers; bits/key = 10.0016 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 + building MPHF with 8 threads and 1 partitions (avg. partition size = 20640)... + built mphs[4] for 20640 kmers; bits/key = 2.51938 + built positions[4] for 20640 kmers; bits/key = 11.0171 + lower = 2048; upper = 2836; num_bits_per_pos = 12; num_kmers_in_partition = 40401 + building MPHF with 8 threads and 1 partitions (avg. partition size = 40401)... + built mphs[5] for 40401 kmers; bits/key = 2.46845 + built positions[5] for 40401 kmers; bits/key = 12.0092 +computing skew index took: 1.70895 [sec] +=== step 3: 'build sparse and skew index' 2.38415 [sec] (2.06375 [ns/kmer]) +=== total_time 21.0304 [sec] (18.2042 [ns/kmer]) +total index size: 591879628 [B] -- 591.88 [MB] +SPACE BREAKDOWN: + minimizers: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 4.0881% + pieces: 0.00224854 [bits/kmer] -- 0.0548598% + offsets: 1.85892 [bits/kmer] -- 45.3537% + offsets2: 0.0284707 [bits/kmer] -- 0.694626% + offsets3: 0.00347857 [bits/kmer] -- 0.08487% + start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.52795e-05% + strings: 2.01703 [bits/kmer] -- 49.2114% + skew_index: 0.0209999 [bits/kmer] -- 0.512354% + weights: 1.27418e-06 [bits/kmer] -- 3.10874e-05% + -------------- + total: 4.09871 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.5203% +buckets with 2 minimizer positions = 0.325268% +buckets with 3 minimizer positions = 0.0665655% +buckets with 4 minimizer positions = 0.028209% +buckets with 5 minimizer positions = 0.0153256% +buckets with 6 minimizer positions = 0.00941591% +buckets with 7 minimizer positions = 0.00646701% +buckets with 8 minimizer positions = 0.00453585% +buckets with 9 minimizer positions = 0.00351811% +buckets with 10 minimizer positions = 0.00259873% +buckets with 11 minimizer positions = 0.002031% +buckets with 12 minimizer positions = 0.00171659% +buckets with 13 minimizer positions = 0.00146476% +buckets with 14 minimizer positions = 0.00115482% +buckets with 15 minimizer positions = 0.000958131% +buckets with 16 minimizer positions = 0.000908958% +max_bucket_size 2836 +2025-09-14 18:12:57: saving data structure to disk... +2025-09-14 18:12:57: DONE +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 105696573 bases, 99496635 kmers +read 200000 sequences, 214697764 bases, 202297826 kmers +read 300000 sequences, 314555962 bases, 295956024 kmers +read 400000 sequences, 417096019 bases, 392296081 kmers +read 500000 sequences, 531577423 bases, 500577485 kmers +read 600000 sequences, 641881766 bases, 604681828 kmers +read 700000 sequences, 753533625 bases, 710133687 kmers +read 800000 sequences, 860572728 bases, 810972790 kmers +read 900000 sequences, 966201746 bases, 910401808 kmers +read 1000000 sequences, 1074799974 bases, 1012800036 kmers +read 1100000 sequences, 1177786303 bases, 1109586365 kmers +read 1200000 sequences, 1284445481 bases, 1210045543 kmers +read 1300000 sequences, 1387959208 bases, 1307359270 kmers +read 1400000 sequences, 1496344159 bases, 1409544221 kmers +read 1500000 sequences, 1601642232 bases, 1508642294 kmers +read 1600000 sequences, 1704579905 bases, 1605379967 kmers +read 1700000 sequences, 1809734567 bases, 1704334629 kmers +read 1800000 sequences, 1913668987 bases, 1802069049 kmers +read 1900000 sequences, 2015410398 bases, 1897610460 kmers +read 2000000 sequences, 2111050791 bases, 1987050853 kmers +read 2100000 sequences, 2208479896 bases, 2078279958 kmers +read 2200000 sequences, 2297838310 bases, 2161438372 kmers +read 2300000 sequences, 2384042166 bases, 2241442228 kmers +read 2400000 sequences, 2476010359 bases, 2327210421 kmers +read 2500000 sequences, 2554605267 bases, 2399605329 kmers +read 2600000 sequences, 2632827152 bases, 2471627214 kmers +read 2700000 sequences, 2705855836 bases, 2538455898 kmers +read 2800000 sequences, 2777866668 bases, 2604266730 kmers +read 2900000 sequences, 2846376916 bases, 2666576978 kmers +read 3000000 sequences, 2913930048 bases, 2727930110 kmers +=== step 1.1: 'encoding input' 10.7453 [sec] (3.87805 [ns/kmer]) +read 3079563 sequences, 2961741299 bases, 2770808393 kmers +num_kmers 2770808393 +cost: 2.0 + 0.137817 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 7.95214 [sec] (2.86997 [ns/kmer]) +=== step 1: 'parse file' 18.6976 [sec] (6.74808 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 8.00237 [sec] (2.8881 [ns/kmer]) +num_minimizers = 143944326 +num_minimizer_positions = 168540022 +num_super_kmers = 177417418 +building minimizers MPHF with 8 threads and 48 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 9.10448 [sec] (3.28586 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.85271 [sec] (2.47318 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.90136 [sec] (0.68621 [ns/kmer]) +num_bits_per_offset = ceil(log2(2961741363)) = 32 +constants::min_l = 6 +min_size = 64 +max_bucket_size 95788 +log2_max_bucket_size 17 +num_buckets_larger_than_1_not_in_skew_index 4117627/143944326 (2.86057%) +num_buckets_in_skew_index 38186/143944326 (0.0265283%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 16761511/168540022 (9.94512%) +num_minimizer_positions_of_buckets_in_skew_index 11989998/168540022 (7.11404%) +computing minimizers offsets: 2.2319 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28814291 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26301059 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23811843 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20591065 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19598470 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18267389 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13542165 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95788: 27801549 +num_kmers_in_skew_index 178727831 (6.45039%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28814291 + building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28814291 kmers; bits/key = 2.54378 + built positions[0] for 28814291 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26301059 + building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26301059 kmers; bits/key = 2.55149 + built positions[1] for 26301059 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23811843 + building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 23811843 kmers; bits/key = 2.55863 + built positions[2] for 23811843 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20591065 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 20591065 kmers; bits/key = 2.53983 + built positions[3] for 20591065 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19598470 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[4] for 19598470 kmers; bits/key = 2.58178 + built positions[4] for 19598470 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18267389 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[5] for 18267389 kmers; bits/key = 2.5988 + built positions[5] for 18267389 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13542165 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 13542165 kmers; bits/key = 2.63222 + built positions[6] for 13542165 kmers; bits/key = 13 + lower = 8192; upper = 95788; num_bits_per_pos = 17; num_kmers_in_partition = 27801549 + building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[7] for 27801549 kmers; bits/key = 2.57505 + built positions[7] for 27801549 kmers; bits/key = 17 +computing skew index took: 37.2083 [sec] +=== step 3: 'build sparse and skew index' 39.5769 [sec] (14.2835 [ns/kmer]) +=== total_time 84.1354 [sec] (30.3649 [ns/kmer]) +total index size: 1802099354 [B] -- 1802.1 [MB] +SPACE BREAKDOWN: + minimizers: 0.146815 [bits/kmer] (2.82607 [bits/key]) -- 2.82169% + pieces: 0.015002 [bits/kmer] -- 0.288328% + offsets: 1.71436 [bits/kmer] -- 32.9488% + offsets2: 0.193578 [bits/kmer] -- 3.72044% + offsets3: 0.138472 [bits/kmer] -- 2.66134% + start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.48715e-05% + strings: 2.13782 [bits/kmer] -- 41.0874% + skew_index: 0.857054 [bits/kmer] -- 16.472% + weights: 5.31253e-07 [bits/kmer] -- 1.02103e-05% + -------------- + total: 5.2031 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1129% +buckets with 2 minimizer positions = 1.66462% +buckets with 3 minimizer positions = 0.467231% +buckets with 4 minimizer positions = 0.212029% +buckets with 5 minimizer positions = 0.120713% +buckets with 6 minimizer positions = 0.0773542% +buckets with 7 minimizer positions = 0.0538271% +buckets with 8 minimizer positions = 0.039179% +buckets with 9 minimizer positions = 0.0302666% +buckets with 10 minimizer positions = 0.0237182% +buckets with 11 minimizer positions = 0.0193575% +buckets with 12 minimizer positions = 0.0158631% +buckets with 13 minimizer positions = 0.013326% +buckets with 14 minimizer positions = 0.0114822% +buckets with 15 minimizer positions = 0.00985728% +buckets with 16 minimizer positions = 0.00859013% +max_bucket_size 95788 +2025-09-14 18:14:22: saving data structure to disk... +2025-09-14 18:14:22: DONE diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log new file mode 100644 index 0000000..92e6c28 --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 18:21:30: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 18:21:44: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34555279/67275966 (51.3635%) +num_extensions = 32720687/67275966 (48.6365%) +elapsed = 14214.5 millisec / 14.2145 sec / 0.236908 min / 145.086 ns/kmer +2025-09-14 18:21:44: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 18:22:41: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149842881/293470517 (51.0589%) +num_extensions = 143627636/293470517 (48.9411%) +elapsed = 56499.8 millisec / 56.4998 sec / 0.941663 min / 122.457 ns/kmer +2025-09-14 18:22:41: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-14 18:24:37: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406484348 (85.0709%) +num_negative_kmers = 70660348 (14.7881%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 220326145/406484348 (54.2029%) +num_extensions = 186158203/406484348 (45.7971%) +elapsed = 115519 millisec / 115.519 sec / 1.92532 min / 241.763 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log new file mode 100644 index 0000000..9233f6b --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 18:25:40: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 18:26:13: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 756097 (0.163876%) +num_negative_kmers = 460616752 (99.8337%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 631375/756097 (83.5045%) +num_extensions = 124722/756097 (16.4955%) +elapsed = 32568.2 millisec / 32.5682 sec / 0.542803 min / 70.5881 ns/kmer +2025-09-14 18:26:13: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 18:26:18: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 41066 (0.0419159%) +num_negative_kmers = 97931350 (99.9581%) +num_invalid_kmers = 0 (0%) +num_searches = 39909/41066 (97.1826%) +num_extensions = 1157/41066 (2.81742%) +elapsed = 4492.78 millisec / 4.49278 sec / 0.0748797 min / 45.8576 ns/kmer +2025-09-14 18:26:18: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-14 18:26:36: DONE +==== query report: +num_kmers = 322085785 +num_positive_kmers = 8 (2.48381e-06%) +num_negative_kmers = 322073557 (99.9962%) +num_invalid_kmers = 12220 (0.00379402%) +num_searches = 7/8 (87.5%) +num_extensions = 1/8 (12.5%) +elapsed = 17574.8 millisec / 17.5748 sec / 0.292913 min / 54.5655 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log new file mode 100644 index 0000000..e957a20 --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log @@ -0,0 +1,9 @@ +lookup: avg_nanosec_per_positive_lookup 882.07 +avg_nanosec_per_negative_lookup 698.712 +iterator: avg_nanosec_per_kmer 20.3053 +lookup: avg_nanosec_per_positive_lookup 744.84 +avg_nanosec_per_negative_lookup 742.651 +iterator: avg_nanosec_per_kmer 20.3387 +lookup: avg_nanosec_per_positive_lookup 1023.33 +avg_nanosec_per_negative_lookup 805.361 +iterator: avg_nanosec_per_kmer 20.314 diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log new file mode 100644 index 0000000..7541d7e --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log @@ -0,0 +1,378 @@ +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 63806937 bases, 57606999 kmers +read 200000 sequences, 129066588 bases, 116666650 kmers +read 300000 sequences, 192862556 bases, 174262618 kmers +read 400000 sequences, 256212661 bases, 231412723 kmers +read 500000 sequences, 319282064 bases, 288282126 kmers +read 600000 sequences, 379117165 bases, 341917227 kmers +read 700000 sequences, 436654305 bases, 393254367 kmers +read 800000 sequences, 492876125 bases, 443276187 kmers +read 900000 sequences, 547344740 bases, 491544802 kmers +read 1000000 sequences, 598624540 bases, 536624602 kmers +=== step 1.1: 'encoding input' 2.25906 [sec] (4.05878 [ns/kmer]) +read 1049410 sequences, 621649078 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.233795 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 0.947124 [sec] (1.70167 [ns/kmer]) +=== step 1: 'parse file' 3.20678 [sec] (5.76152 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 1.36049 [sec] (2.44435 [ns/kmer]) +num_minimizers = 24274432 +num_minimizer_positions = 28219881 +num_super_kmers = 28219881 +building minimizers MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.93922 [sec] (3.48413 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.08409 [sec] (1.94775 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.362544 [sec] (0.651371 [ns/kmer]) +num_bits_per_offset = ceil(log2(621649142)) = 30 +constants::min_l = 6 +min_size = 64 +max_bucket_size 410845 +log2_max_bucket_size 19 +num_buckets_larger_than_1_not_in_skew_index 993045/24274432 (4.09091%) +num_buckets_in_skew_index 3485/24274432 (0.0143567%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 3760523/28219881 (13.3258%) +num_minimizer_positions_of_buckets_in_skew_index 1181456/28219881 (4.18661%) +computing minimizers offsets: 0.408446 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3728511 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2195092 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1214814 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1162612 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 910692 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 980893 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 616111 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 410845: 3780697 +num_kmers_in_skew_index 14589422 (2.62124%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3728511 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3728511 kmers; bits/key = 2.94604 + built positions[0] for 3728511 kmers; bits/key = 7.00009 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2195092 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2195092)... + built mphs[1] for 2195092 kmers; bits/key = 2.41717 + built positions[1] for 2195092 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1214814 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1214814)... + built mphs[2] for 1214814 kmers; bits/key = 2.41794 + built positions[2] for 1214814 kmers; bits/key = 9.0003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1162612 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1162612)... + built mphs[3] for 1162612 kmers; bits/key = 2.56091 + built positions[3] for 1162612 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 910692 + building MPHF with 8 threads and 1 partitions (avg. partition size = 910692)... + built mphs[4] for 910692 kmers; bits/key = 2.4185 + built positions[4] for 910692 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 980893 + building MPHF with 8 threads and 1 partitions (avg. partition size = 980893)... + built mphs[5] for 980893 kmers; bits/key = 2.56127 + built positions[5] for 980893 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 616111 + building MPHF with 8 threads and 1 partitions (avg. partition size = 616111)... + built mphs[6] for 616111 kmers; bits/key = 2.56247 + built positions[6] for 616111 kmers; bits/key = 13.0006 + lower = 8192; upper = 410845; num_bits_per_pos = 19; num_kmers_in_partition = 3780697 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3780697 kmers; bits/key = 2.9111 + built positions[7] for 3780697 kmers; bits/key = 19.0001 +computing skew index took: 6.35437 [sec] +=== step 3: 'build sparse and skew index' 6.78863 [sec] (12.1969 [ns/kmer]) +=== total_time 14.7418 [sec] (26.486 [ns/kmer]) +total index size: 304541358 [B] -- 304.541 [MB] +SPACE BREAKDOWN: + minimizers: 0.129216 [bits/kmer] (2.96278 [bits/key]) -- 2.95198% + pieces: 0.0233256 [bits/kmer] -- 0.532879% + offsets: 1.35201 [bits/kmer] -- 30.8869% + offsets2: 0.202693 [bits/kmer] -- 4.63057% + offsets3: 0.0636812 [bits/kmer] -- 1.45481% + start_lists_of_size: 3.85206e-06 [bits/kmer] -- 8.80012e-05% + strings: 2.2338 [bits/kmer] -- 51.0316% + skew_index: 0.372554 [bits/kmer] -- 8.51109% + weights: 2.6447e-06 [bits/kmer] -- 6.04187e-05% + -------------- + total: 4.37728 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.8947% +buckets with 2 minimizer positions = 2.3624% +buckets with 3 minimizer positions = 0.729043% +buckets with 4 minimizer positions = 0.320662% +buckets with 5 minimizer positions = 0.173973% +buckets with 6 minimizer positions = 0.108101% +buckets with 7 minimizer positions = 0.0744775% +buckets with 8 minimizer positions = 0.0531217% +buckets with 9 minimizer positions = 0.0397744% +buckets with 10 minimizer positions = 0.0304848% +buckets with 11 minimizer positions = 0.0243919% +buckets with 12 minimizer positions = 0.0200829% +buckets with 13 minimizer positions = 0.0170509% +buckets with 14 minimizer positions = 0.0139076% +buckets with 15 minimizer positions = 0.0119426% +buckets with 16 minimizer positions = 0.0105255% +max_bucket_size 410845 +2025-09-14 18:10:52: saving data structure to disk... +2025-09-14 18:10:52: DONE +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 796964911 bases, 790764973 kmers +=== step 1.1: 'encoding input' 4.28234 [sec] (3.70685 [ns/kmer]) +read 158680 sequences, 1165088827 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0170321 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.94983 [sec] (1.6878 [ns/kmer]) +=== step 1: 'parse file' 6.23273 [sec] (5.39513 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 2.59621 [sec] (2.24731 [ns/kmer]) +num_minimizers = 55460750 +num_minimizer_positions = 56012507 +num_super_kmers = 56012507 +building minimizers MPHF with 8 threads and 19 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.8204 [sec] (3.30699 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.24347 [sec] (1.94197 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.637693 [sec] (0.551995 [ns/kmer]) +num_bits_per_offset = ceil(log2(1165088891)) = 31 +constants::min_l = 6 +min_size = 64 +max_bucket_size 762 +log2_max_bucket_size 10 +num_buckets_larger_than_1_not_in_skew_index 215802/55460750 (0.389108%) +num_buckets_in_skew_index 496/55460750 (0.000894326%) +skew index num_partitions 4 +num_minimizer_positions_of_buckets_larger_than_1 703872/56012507 (1.25663%) +num_minimizer_positions_of_buckets_in_skew_index 64183/56012507 (0.114587%) +computing minimizers offsets: 0.414947 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 616638 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 406716 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 230283 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 762: 53117 +num_kmers_in_skew_index 1306754 (0.113114%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 616638 + building MPHF with 8 threads and 1 partitions (avg. partition size = 616638)... + built mphs[0] for 616638 kmers; bits/key = 2.41968 + built positions[0] for 616638 kmers; bits/key = 7.00054 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 406716 + building MPHF with 8 threads and 1 partitions (avg. partition size = 406716)... + built mphs[1] for 406716 kmers; bits/key = 2.42142 + built positions[1] for 406716 kmers; bits/key = 8.00087 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 230283 + building MPHF with 8 threads and 1 partitions (avg. partition size = 230283)... + built mphs[2] for 230283 kmers; bits/key = 2.4254 + built positions[2] for 230283 kmers; bits/key = 9.00152 + lower = 512; upper = 762; num_bits_per_pos = 10; num_kmers_in_partition = 53117 + building MPHF with 8 threads and 1 partitions (avg. partition size = 53117)... + built mphs[3] for 53117 kmers; bits/key = 2.45616 + built positions[3] for 53117 kmers; bits/key = 10.0066 +computing skew index took: 0.952059 [sec] +=== step 3: 'build sparse and skew index' 1.41301 [sec] (1.22312 [ns/kmer]) +=== total_time 16.9435 [sec] (14.6665 [ns/kmer]) +total index size: 538074106 [B] -- 538.074 [MB] +SPACE BREAKDOWN: + minimizers: 0.138427 [bits/kmer] (2.88344 [bits/key]) -- 3.71504% + pieces: 0.00224854 [bits/kmer] -- 0.0603456% + offsets: 1.53624 [bits/kmer] -- 41.2291% + offsets2: 0.018888 [bits/kmer] -- 0.506909% + offsets3: 0.00172258 [bits/kmer] -- 0.0462301% + start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.98073e-05% + strings: 2.01703 [bits/kmer] -- 54.1324% + skew_index: 0.0115484 [bits/kmer] -- 0.309932% + weights: 1.27418e-06 [bits/kmer] -- 3.4196e-05% + -------------- + total: 3.72611 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.61% +buckets with 2 minimizer positions = 0.265774% +buckets with 3 minimizer positions = 0.0543952% +buckets with 4 minimizer positions = 0.0225998% +buckets with 5 minimizer positions = 0.012288% +buckets with 6 minimizer positions = 0.00758735% +buckets with 7 minimizer positions = 0.00520188% +buckets with 8 minimizer positions = 0.00363681% +buckets with 9 minimizer positions = 0.00272986% +buckets with 10 minimizer positions = 0.00195634% +buckets with 11 minimizer positions = 0.00165342% +buckets with 12 minimizer positions = 0.00132887% +buckets with 13 minimizer positions = 0.00112332% +buckets with 14 minimizer positions = 0.000903342% +buckets with 15 minimizer positions = 0.000802369% +buckets with 16 minimizer positions = 0.000649108% +max_bucket_size 762 +2025-09-14 18:11:09: saving data structure to disk... +2025-09-14 18:11:09: DONE +k = 63, m = 25, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 105696573 bases, 99496635 kmers +read 200000 sequences, 214697764 bases, 202297826 kmers +read 300000 sequences, 314555962 bases, 295956024 kmers +read 400000 sequences, 417096019 bases, 392296081 kmers +read 500000 sequences, 531577423 bases, 500577485 kmers +read 600000 sequences, 641881766 bases, 604681828 kmers +read 700000 sequences, 753533625 bases, 710133687 kmers +read 800000 sequences, 860572728 bases, 810972790 kmers +read 900000 sequences, 966201746 bases, 910401808 kmers +read 1000000 sequences, 1074799974 bases, 1012800036 kmers +read 1100000 sequences, 1177786303 bases, 1109586365 kmers +read 1200000 sequences, 1284445481 bases, 1210045543 kmers +read 1300000 sequences, 1387959208 bases, 1307359270 kmers +read 1400000 sequences, 1496344159 bases, 1409544221 kmers +read 1500000 sequences, 1601642232 bases, 1508642294 kmers +read 1600000 sequences, 1704579905 bases, 1605379967 kmers +read 1700000 sequences, 1809734567 bases, 1704334629 kmers +read 1800000 sequences, 1913668987 bases, 1802069049 kmers +read 1900000 sequences, 2015410398 bases, 1897610460 kmers +read 2000000 sequences, 2111050791 bases, 1987050853 kmers +read 2100000 sequences, 2208479896 bases, 2078279958 kmers +read 2200000 sequences, 2297838310 bases, 2161438372 kmers +read 2300000 sequences, 2384042166 bases, 2241442228 kmers +read 2400000 sequences, 2476010359 bases, 2327210421 kmers +read 2500000 sequences, 2554605267 bases, 2399605329 kmers +read 2600000 sequences, 2632827152 bases, 2471627214 kmers +read 2700000 sequences, 2705855836 bases, 2538455898 kmers +read 2800000 sequences, 2777866668 bases, 2604266730 kmers +read 2900000 sequences, 2846376916 bases, 2666576978 kmers +read 3000000 sequences, 2913930048 bases, 2727930110 kmers +=== step 1.1: 'encoding input' 10.787 [sec] (3.89307 [ns/kmer]) +read 3079563 sequences, 2961741299 bases, 2770808393 kmers +num_kmers 2770808393 +cost: 2.0 + 0.137817 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 4.63569 [sec] (1.67304 [ns/kmer]) +=== step 1: 'parse file' 15.4231 [sec] (5.56628 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 6.42284 [sec] (2.31804 [ns/kmer]) +num_minimizers = 122641952 +num_minimizer_positions = 141137536 +num_super_kmers = 141137536 +building minimizers MPHF with 8 threads and 41 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 8.33851 [sec] (3.00941 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.50841 [sec] (1.98801 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.4806 [sec] (0.534355 [ns/kmer]) +num_bits_per_offset = ceil(log2(2961741363)) = 32 +constants::min_l = 6 +min_size = 64 +max_bucket_size 150582 +log2_max_bucket_size 18 +num_buckets_larger_than_1_not_in_skew_index 3263958/122641952 (2.66137%) +num_buckets_in_skew_index 28699/122641952 (0.0234006%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 13121826/141137536 (9.29719%) +num_minimizer_positions_of_buckets_in_skew_index 8666415/141137536 (6.1404%) +computing minimizers offsets: 1.64794 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 24843684 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22063432 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19418162 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17914507 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17076822 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 13955142 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 10150958 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 150582: 20601919 +num_kmers_in_skew_index 146024626 (5.27011%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 24843684 + building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 24843684 kmers; bits/key = 2.59049 + built positions[0] for 24843684 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 22063432 + building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 22063432 kmers; bits/key = 2.59243 + built positions[1] for 22063432 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19418162 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19418162 kmers; bits/key = 2.57982 + built positions[2] for 19418162 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17914507 + building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[3] for 17914507 kmers; bits/key = 2.56993 + built positions[3] for 17914507 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17076822 + building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17076822 kmers; bits/key = 2.5501 + built positions[4] for 17076822 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 13955142 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 13955142 kmers; bits/key = 2.56664 + built positions[5] for 13955142 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 10150958 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 10150958 kmers; bits/key = 2.65462 + built positions[6] for 10150958 kmers; bits/key = 13 + lower = 8192; upper = 150582; num_bits_per_pos = 18; num_kmers_in_partition = 20601919 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20601919 kmers; bits/key = 2.55951 + built positions[7] for 20601919 kmers; bits/key = 18 +computing skew index took: 28.0449 [sec] +=== step 3: 'build sparse and skew index' 29.8099 [sec] (10.7585 [ns/kmer]) +=== total_time 66.9833 [sec] (24.1746 [ns/kmer]) +total index size: 1624368030 [B] -- 1624.37 [MB] +SPACE BREAKDOWN: + minimizers: 0.124989 [bits/kmer] (2.82382 [bits/key]) -- 2.66503% + pieces: 0.015002 [bits/kmer] -- 0.319875% + offsets: 1.46065 [bits/kmer] -- 31.1443% + offsets2: 0.151544 [bits/kmer] -- 3.23125% + offsets3: 0.100088 [bits/kmer] -- 2.1341% + start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.64987e-05% + strings: 2.13782 [bits/kmer] -- 45.583% + skew_index: 0.699854 [bits/kmer] -- 14.9224% + weights: 5.31253e-07 [bits/kmer] -- 1.13275e-05% + -------------- + total: 4.68995 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.3152% +buckets with 2 minimizer positions = 1.58636% +buckets with 3 minimizer positions = 0.422838% +buckets with 4 minimizer positions = 0.186829% +buckets with 5 minimizer positions = 0.106346% +buckets with 6 minimizer positions = 0.0683665% +buckets with 7 minimizer positions = 0.0477504% +buckets with 8 minimizer positions = 0.0356257% +buckets with 9 minimizer positions = 0.0273895% +buckets with 10 minimizer positions = 0.0219101% +buckets with 11 minimizer positions = 0.0175666% +buckets with 12 minimizer positions = 0.0144339% +buckets with 13 minimizer positions = 0.0124484% +buckets with 14 minimizer positions = 0.0107361% +buckets with 15 minimizer positions = 0.0090222% +buckets with 16 minimizer positions = 0.00797117% +max_bucket_size 150582 +2025-09-14 18:12:17: saving data structure to disk... +2025-09-14 18:12:17: DONE diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log new file mode 100644 index 0000000..7e34907 --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 18:18:17: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 18:18:31: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34555279/67275966 (51.3635%) +num_extensions = 32720687/67275966 (48.6365%) +elapsed = 13556.6 millisec / 13.5566 sec / 0.225943 min / 138.371 ns/kmer +2025-09-14 18:18:31: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 18:19:25: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149842881/293470517 (51.0589%) +num_extensions = 143627636/293470517 (48.9411%) +elapsed = 53408.5 millisec / 53.4085 sec / 0.890142 min / 115.757 ns/kmer +2025-09-14 18:19:25: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-14 18:21:29: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406484348 (85.0709%) +num_negative_kmers = 70660348 (14.7881%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 220326145/406484348 (54.2029%) +num_extensions = 186158203/406484348 (45.7971%) +elapsed = 124005 millisec / 124.005 sec / 2.06675 min / 259.523 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log new file mode 100644 index 0000000..2bc20cc --- /dev/null +++ b/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-14 18:24:37: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-14 18:25:13: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 756097 (0.163876%) +num_negative_kmers = 460616752 (99.8337%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 631375/756097 (83.5045%) +num_extensions = 124722/756097 (16.4955%) +elapsed = 36476.6 millisec / 36.4766 sec / 0.607943 min / 79.0591 ns/kmer +2025-09-14 18:25:14: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-14 18:25:18: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 41066 (0.0419159%) +num_negative_kmers = 97931350 (99.9581%) +num_invalid_kmers = 0 (0%) +num_searches = 39909/41066 (97.1826%) +num_extensions = 1157/41066 (2.81742%) +elapsed = 4611.08 millisec / 4.61108 sec / 0.0768514 min / 47.0651 ns/kmer +2025-09-14 18:25:19: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-14 18:25:40: DONE +==== query report: +num_kmers = 322085785 +num_positive_kmers = 8 (2.48381e-06%) +num_negative_kmers = 322073557 (99.9962%) +num_invalid_kmers = 12220 (0.00379402%) +num_searches = 7/8 (87.5%) +num_extensions = 1/8 (12.5%) +elapsed = 21077.2 millisec / 21.0772 sec / 0.351287 min / 65.4398 ns/kmer From 2c2ccc0630c253b817a92057252dce1930215d97 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 14 Sep 2025 19:15:16 +0200 Subject: [PATCH 013/112] new results.png --- benchmarks/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/README.md b/benchmarks/README.md index 0150e26..10da718 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -29,8 +29,8 @@ bash ../script/streaming-query-low-hit.sh [prefix] where `[prefix]` should be replaced by a suitable basename, e.g., the current date. -These are the results obtained on 22/08/25 (see logs [here](results-22-08-25)) +These are the results obtained on 14/09/25 (see logs [here](results-14-09-25)) on a machine equipped with an Intel Xeon W-2245 CPU @ 3.90GHz, and running Ubuntu 18.04.6. -The code was compiled with `gcc` 9.4. +The code was compiled with `gcc` 10.3. -![](results-22-08-25/results.png) +![](results-14-09-25/results.png) From 7c2e9c2a800fc93797cf2c2da287469c6817bbe4 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 14 Sep 2025 19:16:06 +0200 Subject: [PATCH 014/112] new results.png --- benchmarks/results-14-09-25/results.png | Bin 0 -> 325036 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 benchmarks/results-14-09-25/results.png diff --git a/benchmarks/results-14-09-25/results.png b/benchmarks/results-14-09-25/results.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9d2fb0e9bc7de7cb3ac6b1ed234229ce33dc57 GIT binary patch literal 325036 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 BV`v4zUcHIzreBGtQm%bC7xL3ltQ|xIBjs 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

    b`fl>bQs|gEu`U>0Jd_Oc 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%0AmIoz>Q;)pAOiZri5 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
    Gi3K`tZlzx&PM5vT5b|RcA=?iTWtV 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�%hU0s@32m8A2(wyl7u}u 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�=lZB1K{s31v_2re=b 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%0AajjNx^q@W1a~U%n3Zsdw(;V|dFy&t6%XfR74^ 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

    MH8s!C#MiUEGE8u+;m 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 literal 0 HcmV?d00001 From 2155fff54f594d501637d947a60a7d56cbfd5075 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 16 Sep 2025 12:29:12 +0200 Subject: [PATCH 015/112] a note on SIMD for encoding in dictionary::lookup; optimized string_to_uint_kmer by setting chars rather than appending --- .../builder/build_sparse_and_skew_index.hpp | 26 +++++----- include/builder/parse_file.hpp | 47 ++++++++++++++++++- include/kmer.hpp | 8 +--- include/util.hpp | 2 +- src/dictionary.cpp | 14 ++++++ tools/perf.hpp | 36 +++++++------- 6 files changed, 91 insertions(+), 42 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index 019c0eb..0d38918 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -104,12 +104,10 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, assert(buckets_stats.num_buckets() == num_minimizers); const uint64_t min_size = 1ULL << constants::min_l; - const uint64_t log2_max_bucket_size = std::ceil(std::log2(buckets_stats.max_bucket_size())); + const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); + const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); - std::cout << "constants::min_l = " << constants::min_l << std::endl; - std::cout << "min_size = " << min_size << std::endl; - - std::cout << "max_bucket_size " << buckets_stats.max_bucket_size() << std::endl; + std::cout << "max_bucket_size " << max_bucket_size << std::endl; std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; @@ -119,8 +117,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); - it.next()) // + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); // + it.has_next(); it.next()) // { auto bucket = it.bucket(); const uint64_t bucket_size = bucket.size(); @@ -151,8 +149,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, std::vector tuples; // backed memory tuples.reserve(num_super_kmers_in_buckets_larger_than_1); - for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); it.has_next(); - it.next()) // + for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); // + it.has_next(); it.next()) // { auto bucket = it.bucket(); if (bucket.size() > 1) { @@ -171,7 +169,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); uint64_t num_partitions = constants::max_l - constants::min_l + 1; - if (buckets_stats.max_bucket_size() < (1ULL << constants::max_l)) { + if (max_bucket_size < (1ULL << constants::max_l)) { num_partitions = log2_max_bucket_size - constants::min_l; } std::cout << "skew index num_partitions " << num_partitions << std::endl; @@ -219,9 +217,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, lower = upper; upper = 2 * lower; partition_id += 1; - if (partition_id == num_partitions - 1) { - upper = buckets_stats.max_bucket_size(); - } + if (partition_id == num_partitions - 1) upper = max_bucket_size; } } list_id = 0; @@ -306,7 +302,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, lower = upper; upper = 2 * lower; partition_id += 1; - if (partition_id == num_partitions - 1) upper = buckets_stats.max_bucket_size(); + if (partition_id == num_partitions - 1) upper = max_bucket_size; } if (i == buckets.size()) break; @@ -404,7 +400,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, num_bits_per_pos += 1; partition_id += 1; if (partition_id == num_partitions - 1) { - upper = buckets_stats.max_bucket_size(); + upper = max_bucket_size; num_bits_per_pos = log2_max_bucket_size; } diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index 6f1c30e..d12852a 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -38,9 +38,16 @@ void parse_file(std::istream& is, parse_data& data, /* fit into the wanted number of bits */ assert(max_num_kmers_in_super_kmer < (1ULL << (sizeof(num_kmers_in_super_kmer_uint_type) * 8))); - const uint64_t num_bits = 8 * 8 * essentials::GB; // reserve 8 GB of memory bits::bit_vector::builder bvb_strings; - bvb_strings.reserve(num_bits); + { + const uint64_t num_bits = 8 * 8 * essentials::GB; // reserve 8 GB of memory + bvb_strings.reserve(num_bits); + + const uint64_t num_sequences = 100000000; + data.pieces.reserve(num_sequences); + } + + // std::unordered_map seq_lengths; std::string sequence; uint64_t num_sequences = 0; @@ -125,6 +132,8 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t n = sequence.length(); assert(n >= k); + // seq_lengths[n] += 1; + ++num_sequences; if (num_sequences % 100000 == 0) { std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " @@ -188,6 +197,40 @@ void parse_file(std::istream& is, parse_data& data, data.num_kmers << " [bits/kmer]" << std::endl; + // std::vector> seq_lengths_with_freq; + // seq_lengths_with_freq.reserve(seq_lengths.size()); + // for (auto p : seq_lengths) seq_lengths_with_freq.push_back(p); + // std::sort(seq_lengths_with_freq.begin(), seq_lengths_with_freq.end(), + // [](auto const& x, auto const& y) { + // auto log2x_first = std::ceil(std::log2(x.first)); + // auto log2y_first = std::ceil(std::log2(y.first)); + // if (log2x_first == log2y_first) + // return std::ceil(std::log2(x.first * x.second)) > + // std::ceil(std::log2(y.first * y.second)); + // return log2x_first < log2y_first; + // }); + // uint64_t count = 0; + // uint64_t num_bits = 5; + // for (auto p : seq_lengths_with_freq) { + // auto log2_len = std::ceil(std::log2(p.first)); + // if (log2_len > num_bits) { + // auto log2_count = std::ceil(std::log2(count)); + // std::cerr << "log2(num. sequence with log2(length) = " << num_bits + // << ") = " << log2_count << std::endl; + // count = 0; + // while (log2_len > num_bits) ++num_bits; + // } + // std::cerr << "num. sequences with length " << p.first << " = " << p.second + // << "; log2(length) = " << log2_len + // << "; log2(num. sequences) = " << std::ceil(std::log2(p.second)) + // << "; log2(total length) = " << std::ceil(std::log2(p.first * p.second)) << + // '\n'; + // ++count; + // } + // auto log2_count = std::ceil(std::log2(count)); + // std::cerr << "log2(num. sequence with log2(length) = " << num_bits << ") = " << log2_count + // << std::endl; + /* The parameter m (minimizer length) should be at least ceil(log_s(N))+1 diff --git a/include/kmer.hpp b/include/kmer.hpp index 6f12600..fc9e02f 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -68,18 +68,14 @@ struct uint_kmer_t { return res; } - void append(uint16_t b, uint64_t n) { - assert(b < uint_kmer_bits); - kmer = (kmer << b) | Kmer(n); - } void append64(uint64_t n) { if constexpr (uint_kmer_bits == 64) { kmer = n; } else { - append(64, n); + assert(64 < uint_kmer_bits); + kmer = (kmer << 64) | Kmer(n); } } - void append_char(uint64_t c) { append(bits_per_char, c); } /* Set the char at position i to c, assuming that the position is empty. */ diff --git a/include/util.hpp b/include/util.hpp index e55104f..80d8b36 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -190,7 +190,7 @@ template [[maybe_unused]] static kmer_t string_to_uint_kmer(char const* str, uint64_t k) { assert(k <= kmer_t::max_k); kmer_t x = 0; - for (int i = k - 1; i >= 0; i--) x.append_char(kmer_t::char_to_uint(str[i])); + for (uint64_t i = 0; i != k; ++i) x.set(i, kmer_t::char_to_uint(str[i])); return x; } diff --git a/src/dictionary.cpp b/src/dictionary.cpp index d6d3e62..265a9af 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -1,5 +1,7 @@ #include "include/dictionary.hpp" +#include "include/builder/util.hpp" + namespace sshash { template @@ -127,6 +129,18 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t template uint64_t dictionary::lookup(char const* string_kmer, bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + + /* + SIMD here does not help, as expected, because it is only used at the + beginning of each query. To be useful, we would need to process a + batch of random lookup queries and execute this preliminary step + for all queries in a first pass, then invoke + `lookup_uint(uint_kmer, check_reverse_complement)` directly. + */ + // __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(string_kmer)); + // uint64_t word = pack2bits_shift1(v); + // kmer_t uint_kmer(word); + return lookup_uint(uint_kmer, check_reverse_complement); } template diff --git a/tools/perf.hpp b/tools/perf.hpp index 842f87f..41f9892 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -56,24 +56,24 @@ void perf_test_lookup_access(dictionary const& dict) { double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); std::cout << "lookup: avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - // std::vector lookup_queries_uint; - // lookup_queries_uint.reserve(num_queries); - // for (auto const& kmer : lookup_queries) { - // kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); - // lookup_queries_uint.push_back(uint_kmer); - // } - // t.reset(); - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto uint_kmer : lookup_queries_uint) { - // auto id = dict.lookup_uint(uint_kmer); - // essentials::do_not_optimize_away(id); - // } - // } - // t.stop(); - // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup - // << std::endl; + std::vector lookup_queries_uint; + lookup_queries_uint.reserve(num_queries); + for (auto const& kmer : lookup_queries) { + kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); + lookup_queries_uint.push_back(uint_kmer); + } + t.reset(); + t.start(); + for (uint64_t r = 0; r != runs; ++r) { + for (auto uint_kmer : lookup_queries_uint) { + auto id = dict.lookup_uint(uint_kmer); + essentials::do_not_optimize_away(id); + } + } + t.stop(); + nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup + << std::endl; // std::vector> lookup_queries_uint_minimizer; // lookup_queries_uint_minimizer.reserve(num_queries); From c907f6d3b14b04be7cba42b9a786e7f34585dc70 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 16 Sep 2025 13:50:10 +0200 Subject: [PATCH 016/112] a note about loop-unrolling in string_to_uint_kmer --- include/util.hpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/include/util.hpp b/include/util.hpp index 80d8b36..a52dc21 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -189,8 +189,38 @@ static inline uint64_t get_seed_for_hash_function(build_configuration const& bui template [[maybe_unused]] static kmer_t string_to_uint_kmer(char const* str, uint64_t k) { assert(k <= kmer_t::max_k); + kmer_t x = 0; for (uint64_t i = 0; i != k; ++i) x.set(i, kmer_t::char_to_uint(str[i])); + + // /* manual loop-unrolling and limiting dependencies do not seem to help much...*/ + // assert(k >= 8); + // uint64_t i = 0; + // uint64_t w = 0; + // for (uint64_t iter = 0; i + 8 <= k; i += 8, ++iter) { + // uint64_t w0 = kmer_t::char_to_uint(str[i + 0]) << (0 * kmer_t::bits_per_char); + // uint64_t w1 = kmer_t::char_to_uint(str[i + 1]) << (1 * kmer_t::bits_per_char); + // uint64_t w2 = kmer_t::char_to_uint(str[i + 2]) << (2 * kmer_t::bits_per_char); + // uint64_t w3 = kmer_t::char_to_uint(str[i + 3]) << (3 * kmer_t::bits_per_char); + // uint64_t w4 = kmer_t::char_to_uint(str[i + 4]) << (4 * kmer_t::bits_per_char); + // uint64_t w5 = kmer_t::char_to_uint(str[i + 5]) << (5 * kmer_t::bits_per_char); + // uint64_t w6 = kmer_t::char_to_uint(str[i + 6]) << (6 * kmer_t::bits_per_char); + // uint64_t w7 = kmer_t::char_to_uint(str[i + 7]) << (7 * kmer_t::bits_per_char); + // w |= (w0 | w1 | w2 | w3 | w4 | w5 | w6 | w7) << (iter * 8 * kmer_t::bits_per_char); + // } + + // /* this does not seem to help...*/ + // // if (i + 4 <= k) { + // // uint64_t w0 = kmer_t::char_to_uint(str[i + 0]) << (0 * kmer_t::bits_per_char); + // // uint64_t w1 = kmer_t::char_to_uint(str[i + 1]) << (1 * kmer_t::bits_per_char); + // // uint64_t w2 = kmer_t::char_to_uint(str[i + 2]) << (2 * kmer_t::bits_per_char); + // // uint64_t w3 = kmer_t::char_to_uint(str[i + 3]) << (3 * kmer_t::bits_per_char); + // // w |= (w0 | w1 | w2 | w3) << (iter * 8 * kmer_t::bits_per_char); + // // } + + // kmer_t x = w; + // for (; i != k; ++i) x.set(i, kmer_t::char_to_uint(str[i])); + return x; } From 041d6d5468b77275c41e9ee4b191e5ba2b2d3b02 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 16 Sep 2025 16:09:48 +0200 Subject: [PATCH 017/112] removed useless line --- include/kmer.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/kmer.hpp b/include/kmer.hpp index fc9e02f..61fdd9b 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -14,7 +14,6 @@ namespace sshash { template struct uint_kmer_t { - using uint_t = Kmer; Kmer kmer; uint_kmer_t() {} @@ -88,7 +87,6 @@ struct uint_kmer_t { static constexpr uint16_t uint_kmer_bits = 8 * sizeof(Kmer); static constexpr uint8_t bits_per_char = BitsPerChar; - static_assert(uint_kmer_bits % 64 == 0, "Kmer must use 64*k bits"); static_assert(bits_per_char < 64, "BitsPerChar must be less than 64"); @@ -111,7 +109,7 @@ struct alpha_kmer_t : uint_kmer_t { [[maybe_unused]] virtual void reverse_complement_inplace(uint64_t) {} [[maybe_unused]] static void compute_reverse_complement(char const* input, char* output, uint64_t size) { - for (uint64_t i = 0; i != size; ++i) { output[i] = input[i]; } + for (uint64_t i = 0; i != size; ++i) output[i] = input[i]; } }; From c716fe71a6c42cf3477daf99fd273e9b9cb5ce83 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 19 Sep 2025 17:41:14 +0200 Subject: [PATCH 018/112] minor fix to num. partitions in skew index; better access --- include/buckets.hpp | 21 ++++---- .../builder/build_sparse_and_skew_index.hpp | 4 +- tools/perf.hpp | 54 ++++++++++--------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 22520bb..59cee01 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -198,18 +198,11 @@ struct buckets // } uint64_t id_to_offset(const uint64_t id, const uint64_t k) const { - constexpr uint64_t linear_scan_threshold = 8; + constexpr uint64_t linear_scan_threshold = 32; uint64_t lo = 0; uint64_t hi = pieces.size() - 1; assert(pieces.access(0) == 0); - while (lo < hi) { - if (hi - lo <= linear_scan_threshold) { - for (; lo < hi; ++lo) { - uint64_t val = pieces.access(lo) - lo * (k - 1); - if (val > id) break; - } - break; - } + while (hi - lo > linear_scan_threshold) { uint64_t mid = lo + (hi - lo) / 2; uint64_t val = pieces.access(mid); assert(val >= mid * (k - 1)); @@ -219,8 +212,14 @@ struct buckets // lo = mid + 1; } } - if (lo < pieces.size() and pieces.access(lo) - lo * (k - 1) > id) --lo; - return id + lo * (k - 1); + assert(lo < hi); + assert(hi < pieces.size()); + for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + uint64_t val = it.value() - lo * (k - 1); + if (val > id) break; + } + assert(lo > 0); + return id + (lo - 1) * (k - 1); } void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index 0d38918..c41b732 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -169,7 +169,9 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, [](bucket_type const& x, bucket_type const& y) { return x.size() < y.size(); }); uint64_t num_partitions = constants::max_l - constants::min_l + 1; - if (max_bucket_size < (1ULL << constants::max_l)) { + if (max_bucket_size < min_size) { + num_partitions = 0; + } else if (max_bucket_size < (1ULL << constants::max_l)) { num_partitions = log2_max_bucket_size - constants::min_l; } std::cout << "skew index num_partitions " << num_partitions << std::endl; diff --git a/tools/perf.hpp b/tools/perf.hpp index 41f9892..3036d5e 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -2,9 +2,13 @@ namespace sshash { +namespace perf { +using timer_type = essentials::timer; +} + template void perf_test_iterator(dictionary const& dict) { - essentials::timer t; + perf::timer_type t; t.start(); auto it = dict.begin(); while (it.has_next()) { @@ -44,7 +48,7 @@ void perf_test_lookup_access(dictionary const& dict) { } } - essentials::timer t; + perf::timer_type t; t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { @@ -103,7 +107,7 @@ void perf_test_lookup_access(dictionary const& dict) { } // { // perf test positive lookup, using a single std::string with all kmers contatenated - // essentials::timer t; + // perf::timer_type t; // t.start(); // uint64_t pos = 0; // for (uint64_t r = 0; r != runs; ++r) { @@ -158,7 +162,7 @@ void perf_test_lookup_access(dictionary const& dict) { random_kmer(kmer.data(), k); lookup_queries.push_back(kmer); } - essentials::timer t; + perf::timer_type t; t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { @@ -185,7 +189,7 @@ void perf_test_lookup_access(dictionary const& dict) { // lookup_queries.push_back(kmer); // } // } - // essentials::timer t; + // perf::timer_type t; // t.start(); // for (uint64_t r = 0; r != runs; ++r) { // for (auto const& string : lookup_queries) { @@ -206,7 +210,7 @@ void perf_test_lookup_access(dictionary const& dict) { // random_kmer(kmer.data(), k); // lookup_queries.push_back(kmer); // } - // essentials::timer t; + // perf::timer_type t; // t.start(); // for (uint64_t r = 0; r != runs; ++r) { // for (auto const& string : lookup_queries) { @@ -219,25 +223,23 @@ void perf_test_lookup_access(dictionary const& dict) { // std::cout << "avg_nanosec_per_negative_lookup_advanced " << nanosec_per_lookup << // std::endl; // } - // { - // // perf test access - // std::vector access_queries; - // access_queries.reserve(num_queries); - - // for (uint64_t i = 0; i != num_queries; ++i) access_queries.push_back(distr.gen()); - // essentials::timer t; - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto id : access_queries) { - // dict.access(id, kmer.data()); - // essentials::do_not_optimize_away(kmer[0]); - // } - // } - // t.stop(); - // double nanosec_per_access = t.elapsed() / static_cast(runs * - // access_queries.size()); std::cout << "avg_nanosec_per_access " << nanosec_per_access << - // std::endl; - // } + { + // perf test access + std::vector access_queries; + access_queries.reserve(num_queries); + for (uint64_t i = 0; i != num_queries; ++i) access_queries.push_back(distr.gen()); + perf::timer_type t; + t.start(); + for (uint64_t r = 0; r != runs; ++r) { + for (auto id : access_queries) { + dict.access(id, kmer.data()); + essentials::do_not_optimize_away(kmer[0]); + } + } + t.stop(); + double nanosec_per_access = t.elapsed() / static_cast(runs * access_queries.size()); + std::cout << "avg_nanosec_per_access " << nanosec_per_access << std::endl; + } } // namespace sshash template @@ -268,7 +270,7 @@ void perf_test_lookup_weight(dictionary const& dict) { } } - essentials::timer t; + perf::timer_type t; t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { From 1ec6110804ddba8efb231376e276fcdc0d98fac6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 19 Sep 2025 19:08:20 +0200 Subject: [PATCH 019/112] use a bits::compact_vector for (iteration to be fixed) --- include/buckets.hpp | 111 +++++++++++++++--- .../builder/build_sparse_and_skew_index.hpp | 3 +- src/statistics.cpp | 85 +++++++------- 3 files changed, 140 insertions(+), 59 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 59cee01..cbeb4a7 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -11,10 +11,40 @@ template struct buckets // { lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const { - auto p = pieces.locate(offset); - uint64_t contig_id = p.first.pos; - uint64_t contig_begin = p.first.val; - uint64_t contig_end = p.second.val; + /* for bits::elias_fano */ + // auto p = pieces.locate(offset); + + /* for bits::compact_vector */ + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = pieces.size() - 1; + assert(pieces.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = pieces.access(mid); + if (offset <= val) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < pieces.size()); + for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + if (*it > offset) break; + } + assert(lo > 0); + --lo; + + /* bits::compact_vector */ + uint64_t contig_id = lo; + uint64_t contig_begin = pieces.access(lo); + uint64_t contig_end = pieces.access(lo + 1); + + /* bits::elias_fano */ + // uint64_t contig_id = p.first.pos; + // uint64_t contig_begin = p.first.val; + // uint64_t contig_end = p.second.val; /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -198,6 +228,28 @@ struct buckets // } uint64_t id_to_offset(const uint64_t id, const uint64_t k) const { + // constexpr uint64_t linear_scan_threshold = 32; + // uint64_t lo = 0; + // uint64_t hi = pieces.size() - 1; + // assert(pieces.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = pieces.access(mid); + // assert(val >= mid * (k - 1)); + // if (id <= val - mid * (k - 1)) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < pieces.size()); + // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + // uint64_t val = it.value() - lo * (k - 1); + // if (val > id) break; + // } + // assert(lo > 0); + // return id + (lo - 1) * (k - 1); constexpr uint64_t linear_scan_threshold = 32; uint64_t lo = 0; uint64_t hi = pieces.size() - 1; @@ -214,8 +266,8 @@ struct buckets // } assert(lo < hi); assert(hi < pieces.size()); - for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - uint64_t val = it.value() - lo * (k - 1); + for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + uint64_t val = *it - lo * (k - 1); if (val > id) break; } assert(lo > 0); @@ -241,11 +293,37 @@ struct buckets // , m_it(ptr->strings, m_k) // { m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - auto [pos, piece_end] = m_buckets->pieces.next_geq(m_offset); - if (piece_end == m_offset) pos += 1; - m_pieces_it = m_buckets->pieces.get_iterator_at(pos); - next_piece(); + // auto [pos, piece_end] = m_buckets->pieces.next_geq(m_offset); + // if (piece_end == m_offset) pos += 1; + + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = m_buckets->pieces.size() - 1; + assert(m_buckets->pieces.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = m_buckets->pieces.access(mid); + if (m_offset <= val) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < m_buckets->pieces.size()); + for (m_pieces_it = m_buckets->pieces.get_iterator_at(lo); lo <= hi; + ++lo, ++m_pieces_it) { + m_next_offset = *m_pieces_it; + if (m_next_offset > m_offset) break; + } + + // assert(lo > 0); + // --lo; + + // m_pieces_it = m_buckets->pieces.get_iterator_at(pos); + // next_piece(); m_ret.second.resize(m_k, 0); + m_clear = true; } bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } @@ -278,15 +356,18 @@ struct buckets // uint64_t m_offset; uint64_t m_next_offset; kmer_iterator m_it; - bits::elias_fano::iterator m_pieces_it; + // bits::elias_fano::iterator m_pieces_it; + bits::compact_vector::iterator m_pieces_it; bool m_clear; void next_piece() { m_it.at(kmer_t::bits_per_char * m_offset); - m_next_offset = m_pieces_it.value(); + // m_next_offset = m_pieces_it.value(); + m_next_offset = *m_pieces_it; assert(m_next_offset > m_offset); m_clear = true; - m_pieces_it.next(); + // m_pieces_it.next(); + ++m_pieces_it; } }; @@ -310,7 +391,9 @@ struct buckets // visit_impl(visitor, *this); } - bits::elias_fano pieces; + // bits::elias_fano pieces; + bits::compact_vector pieces; + std::vector start_lists_of_size; bits::compact_vector offsets; bits::compact_vector offsets2; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index c41b732..d18ea3f 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -97,7 +97,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); + // m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); + m_buckets.pieces.build(data.pieces.begin(), data.pieces.size(), num_bits_per_offset); m_buckets.strings.swap(data.strings); /* compute offsets2 and offsets3 */ diff --git a/src/statistics.cpp b/src/statistics.cpp index dc8c518..d898094 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -16,50 +16,47 @@ void dictionary::compute_statistics() const // buckets_statistics buckets_stats(num_minimizers, num_kmers, num_super_kmers); minimizer_iterator minimizer_it(m_k, m_m, m_hasher); - for (uint64_t bucket_id = 0; bucket_id != num_minimizers; ++bucket_id) { - // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - - // TODO: fixme - uint64_t begin = 0; - uint64_t end = 0; - const uint64_t bucket_size = end - begin; - buckets_stats.add_bucket_size(bucket_size); - for (uint64_t i = begin; i != end; ++i) { - const uint64_t pos_in_seq = m_buckets.offsets.access(i); - auto p = m_buckets.pieces.locate(pos_in_seq); - const uint64_t contig_begin = p.first.val; - const uint64_t contig_end = p.second.val; - uint64_t offset = pos_in_seq; - if (offset <= uint64_t(m_k - m_m)) { - assert(contig_begin == 0); - offset = 0; - } else if (offset - (m_k - m_m) < contig_begin) { - offset = contig_begin; - } else { - offset -= m_k - m_m; - } - kmer_iterator it(m_buckets.strings, m_k, kmer_t::bits_per_char * offset); - minimizer_it.set_position(offset); - uint64_t num_kmers_in_super_kmer = 0; - auto kmer = it.get(); - auto mini_info = minimizer_it.next(kmer); - while (mini_info.pos_in_seq < pos_in_seq) { - it.next(); - kmer = it.get(); - mini_info = minimizer_it.next(kmer); - } - while (mini_info.pos_in_seq == pos_in_seq and - (mini_info.pos_in_seq - mini_info.pos_in_kmer + m_k) <= contig_end) // - { - num_kmers_in_super_kmer += 1; - it.next(); - kmer = it.get(); - mini_info = minimizer_it.next(kmer); - } - assert(num_kmers_in_super_kmer > 0); - buckets_stats.add_num_kmers_in_super_kmer(bucket_size, num_kmers_in_super_kmer); - } - } + // FIXME + // for (uint64_t bucket_id = 0; bucket_id != num_minimizers; ++bucket_id) { + // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); + // const uint64_t bucket_size = end - begin; + // buckets_stats.add_bucket_size(bucket_size); + // for (uint64_t i = begin; i != end; ++i) { + // const uint64_t pos_in_seq = m_buckets.offsets.access(i); + // auto p = m_buckets.pieces.locate(pos_in_seq); + // const uint64_t contig_begin = p.first.val; + // const uint64_t contig_end = p.second.val; + // uint64_t offset = pos_in_seq; + // if (offset <= uint64_t(m_k - m_m)) { + // assert(contig_begin == 0); + // offset = 0; + // } else if (offset - (m_k - m_m) < contig_begin) { + // offset = contig_begin; + // } else { + // offset -= m_k - m_m; + // } + // kmer_iterator it(m_buckets.strings, m_k, kmer_t::bits_per_char * offset); + // minimizer_it.set_position(offset); + // uint64_t num_kmers_in_super_kmer = 0; + // auto kmer = it.get(); + // auto mini_info = minimizer_it.next(kmer); + // while (mini_info.pos_in_seq < pos_in_seq) { + // it.next(); + // kmer = it.get(); + // mini_info = minimizer_it.next(kmer); + // } + // while (mini_info.pos_in_seq == pos_in_seq and + // (mini_info.pos_in_seq - mini_info.pos_in_kmer + m_k) <= contig_end) // + // { + // num_kmers_in_super_kmer += 1; + // it.next(); + // kmer = it.get(); + // mini_info = minimizer_it.next(kmer); + // } + // assert(num_kmers_in_super_kmer > 0); + // buckets_stats.add_num_kmers_in_super_kmer(bucket_size, num_kmers_in_super_kmer); + // } + // } buckets_stats.print_full(); From bbcc2b6d864f70aaf1b2181aa03b4ba704ece34f Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 20 Sep 2025 12:50:31 +0200 Subject: [PATCH 020/112] updated external/bits --- external/pthash | 2 +- include/buckets.hpp | 182 +++++++++--------- .../builder/build_sparse_and_skew_index.hpp | 4 +- 3 files changed, 94 insertions(+), 94 deletions(-) diff --git a/external/pthash b/external/pthash index dfe4832..fff7ea9 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit dfe4832113f416520ff2253d09f2efde6fc7501d +Subproject commit fff7ea996bd07b42a9e59375f93e627841aa01f5 diff --git a/include/buckets.hpp b/include/buckets.hpp index cbeb4a7..7d6427e 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -12,39 +12,39 @@ struct buckets // { lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const { /* for bits::elias_fano */ - // auto p = pieces.locate(offset); + auto p = pieces.locate(offset); - /* for bits::compact_vector */ - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = pieces.size() - 1; - assert(pieces.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = pieces.access(mid); - if (offset <= val) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < pieces.size()); - for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { - if (*it > offset) break; - } - assert(lo > 0); - --lo; + // /* for bits::compact_vector */ + // constexpr uint64_t linear_scan_threshold = 8; + // uint64_t lo = 0; + // uint64_t hi = pieces.size() - 1; + // assert(pieces.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = pieces.access(mid); + // if (offset <= val) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < pieces.size()); + // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + // if (*it > offset) break; + // } + // assert(lo > 0); + // --lo; - /* bits::compact_vector */ - uint64_t contig_id = lo; - uint64_t contig_begin = pieces.access(lo); - uint64_t contig_end = pieces.access(lo + 1); + // /* bits::compact_vector */ + // uint64_t contig_id = lo; + // uint64_t contig_begin = pieces.access(lo); + // uint64_t contig_end = pieces.access(lo + 1); /* bits::elias_fano */ - // uint64_t contig_id = p.first.pos; - // uint64_t contig_begin = p.first.val; - // uint64_t contig_end = p.second.val; + uint64_t contig_id = p.first.pos; + uint64_t contig_begin = p.first.val; + uint64_t contig_end = p.second.val; /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -228,28 +228,6 @@ struct buckets // } uint64_t id_to_offset(const uint64_t id, const uint64_t k) const { - // constexpr uint64_t linear_scan_threshold = 32; - // uint64_t lo = 0; - // uint64_t hi = pieces.size() - 1; - // assert(pieces.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = pieces.access(mid); - // assert(val >= mid * (k - 1)); - // if (id <= val - mid * (k - 1)) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < pieces.size()); - // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - // uint64_t val = it.value() - lo * (k - 1); - // if (val > id) break; - // } - // assert(lo > 0); - // return id + (lo - 1) * (k - 1); constexpr uint64_t linear_scan_threshold = 32; uint64_t lo = 0; uint64_t hi = pieces.size() - 1; @@ -266,12 +244,34 @@ struct buckets // } assert(lo < hi); assert(hi < pieces.size()); - for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { - uint64_t val = *it - lo * (k - 1); + for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + uint64_t val = it.value() - lo * (k - 1); if (val > id) break; } assert(lo > 0); return id + (lo - 1) * (k - 1); + // constexpr uint64_t linear_scan_threshold = 32; + // uint64_t lo = 0; + // uint64_t hi = pieces.size() - 1; + // assert(pieces.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = pieces.access(mid); + // assert(val >= mid * (k - 1)); + // if (id <= val - mid * (k - 1)) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < pieces.size()); + // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + // uint64_t val = *it - lo * (k - 1); + // if (val > id) break; + // } + // assert(lo > 0); + // return id + (lo - 1) * (k - 1); } void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { @@ -293,37 +293,37 @@ struct buckets // , m_it(ptr->strings, m_k) // { m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - // auto [pos, piece_end] = m_buckets->pieces.next_geq(m_offset); - // if (piece_end == m_offset) pos += 1; - - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = m_buckets->pieces.size() - 1; - assert(m_buckets->pieces.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = m_buckets->pieces.access(mid); - if (m_offset <= val) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < m_buckets->pieces.size()); - for (m_pieces_it = m_buckets->pieces.get_iterator_at(lo); lo <= hi; - ++lo, ++m_pieces_it) { - m_next_offset = *m_pieces_it; - if (m_next_offset > m_offset) break; - } - - // assert(lo > 0); - // --lo; - - // m_pieces_it = m_buckets->pieces.get_iterator_at(pos); - // next_piece(); + auto [pos, piece_end] = m_buckets->pieces.next_geq(m_offset); + if (piece_end == m_offset) pos += 1; + + // constexpr uint64_t linear_scan_threshold = 32; + // uint64_t lo = 0; + // uint64_t hi = m_buckets->pieces.size() - 1; + // assert(m_buckets->pieces.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = m_buckets->pieces.access(mid); + // if (m_offset <= val) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < m_buckets->pieces.size()); + // for (m_pieces_it = m_buckets->pieces.get_iterator_at(lo); lo <= hi; + // ++lo, ++m_pieces_it) { + // m_next_offset = *m_pieces_it; + // if (m_next_offset > m_offset) break; + // } + + // // assert(lo > 0); + // // --lo; + + m_pieces_it = m_buckets->pieces.get_iterator_at(pos); + next_piece(); m_ret.second.resize(m_k, 0); - m_clear = true; + // m_clear = true; } bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } @@ -356,18 +356,18 @@ struct buckets // uint64_t m_offset; uint64_t m_next_offset; kmer_iterator m_it; - // bits::elias_fano::iterator m_pieces_it; - bits::compact_vector::iterator m_pieces_it; + bits::elias_fano::iterator m_pieces_it; + // bits::compact_vector::iterator m_pieces_it; bool m_clear; void next_piece() { m_it.at(kmer_t::bits_per_char * m_offset); - // m_next_offset = m_pieces_it.value(); - m_next_offset = *m_pieces_it; + m_next_offset = m_pieces_it.value(); + // m_next_offset = *m_pieces_it; assert(m_next_offset > m_offset); m_clear = true; - // m_pieces_it.next(); - ++m_pieces_it; + m_pieces_it.next(); + // ++m_pieces_it; } }; @@ -391,8 +391,8 @@ struct buckets // visit_impl(visitor, *this); } - // bits::elias_fano pieces; - bits::compact_vector pieces; + bits::elias_fano pieces; + // bits::compact_vector pieces; std::vector start_lists_of_size; bits::compact_vector offsets; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index d18ea3f..88d0754 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -97,8 +97,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - // m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); - m_buckets.pieces.build(data.pieces.begin(), data.pieces.size(), num_bits_per_offset); + m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); + // m_buckets.pieces.build(data.pieces.begin(), data.pieces.size(), num_bits_per_offset); m_buckets.strings.swap(data.strings); /* compute offsets2 and offsets3 */ From 27d8b72ef4ddd7feadb26a3406d99b7636b94554 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 22 Sep 2025 11:35:48 +0200 Subject: [PATCH 021/112] updated external/bits and using bits::endpoints_sequence --- external/pthash | 2 +- include/buckets.hpp | 127 ++++-------------- .../builder/build_sparse_and_skew_index.hpp | 5 +- include/builder/parse_file.hpp | 20 +-- include/constants.hpp | 4 +- include/dictionary.hpp | 2 +- src/info.cpp | 55 +------- test/check.cpp | 13 +- test/test_alphabet.cpp | 1 + 9 files changed, 51 insertions(+), 178 deletions(-) diff --git a/external/pthash b/external/pthash index fff7ea9..6c30dca 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit fff7ea996bd07b42a9e59375f93e627841aa01f5 +Subproject commit 6c30dca229879f326fbede53e461d803e45e8c13 diff --git a/include/buckets.hpp b/include/buckets.hpp index 7d6427e..76fe90d 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -1,6 +1,6 @@ #pragma once -#include "external/pthash/external/bits/include/elias_fano.hpp" +#include "external/pthash/external/bits/include/endpoints_sequence.hpp" #include "util.hpp" #include "kmer_iterator.hpp" @@ -11,37 +11,8 @@ template struct buckets // { lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const { - /* for bits::elias_fano */ - auto p = pieces.locate(offset); - - // /* for bits::compact_vector */ - // constexpr uint64_t linear_scan_threshold = 8; - // uint64_t lo = 0; - // uint64_t hi = pieces.size() - 1; - // assert(pieces.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = pieces.access(mid); - // if (offset <= val) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < pieces.size()); - // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { - // if (*it > offset) break; - // } - // assert(lo > 0); - // --lo; - - // /* bits::compact_vector */ - // uint64_t contig_id = lo; - // uint64_t contig_begin = pieces.access(lo); - // uint64_t contig_end = pieces.access(lo + 1); - - /* bits::elias_fano */ + auto p = strings_endpoints.locate(offset); + uint64_t contig_id = p.first.pos; uint64_t contig_begin = p.first.val; uint64_t contig_end = p.second.val; @@ -72,19 +43,19 @@ struct buckets // /* Return where the contig begins and ends in strings. */ std::pair // [begin, end) contig_offsets(const uint64_t contig_id) const { - uint64_t begin = pieces.access(contig_id); - uint64_t end = pieces.access(contig_id + 1); + uint64_t begin = strings_endpoints.access(contig_id); + uint64_t end = strings_endpoints.access(contig_id + 1); assert(end > begin); return {begin, end}; } kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_begin = pieces.access(contig_id); + uint64_t contig_begin = strings_endpoints.access(contig_id); return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); } kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_end = pieces.access(contig_id + 1); + uint64_t contig_end = strings_endpoints.access(contig_id + 1); return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * (contig_end - k + 1)); } @@ -230,11 +201,11 @@ struct buckets // uint64_t id_to_offset(const uint64_t id, const uint64_t k) const { constexpr uint64_t linear_scan_threshold = 32; uint64_t lo = 0; - uint64_t hi = pieces.size() - 1; - assert(pieces.access(0) == 0); + uint64_t hi = strings_endpoints.size() - 1; + assert(strings_endpoints.access(0) == 0); while (hi - lo > linear_scan_threshold) { uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = pieces.access(mid); + uint64_t val = strings_endpoints.access(mid); assert(val >= mid * (k - 1)); if (id <= val - mid * (k - 1)) { hi = mid; @@ -243,35 +214,13 @@ struct buckets // } } assert(lo < hi); - assert(hi < pieces.size()); - for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + assert(hi < strings_endpoints.size()); + for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { uint64_t val = it.value() - lo * (k - 1); if (val > id) break; } assert(lo > 0); return id + (lo - 1) * (k - 1); - // constexpr uint64_t linear_scan_threshold = 32; - // uint64_t lo = 0; - // uint64_t hi = pieces.size() - 1; - // assert(pieces.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = pieces.access(mid); - // assert(val >= mid * (k - 1)); - // if (id <= val - mid * (k - 1)) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < pieces.size()); - // for (auto it = pieces.get_iterator_at(lo); lo <= hi; ++lo, ++it) { - // uint64_t val = *it - lo * (k - 1); - // if (val > id) break; - // } - // assert(lo > 0); - // return id + (lo - 1) * (k - 1); } void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { @@ -293,37 +242,11 @@ struct buckets // , m_it(ptr->strings, m_k) // { m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - auto [pos, piece_end] = m_buckets->pieces.next_geq(m_offset); + auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); if (piece_end == m_offset) pos += 1; - - // constexpr uint64_t linear_scan_threshold = 32; - // uint64_t lo = 0; - // uint64_t hi = m_buckets->pieces.size() - 1; - // assert(m_buckets->pieces.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = m_buckets->pieces.access(mid); - // if (m_offset <= val) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < m_buckets->pieces.size()); - // for (m_pieces_it = m_buckets->pieces.get_iterator_at(lo); lo <= hi; - // ++lo, ++m_pieces_it) { - // m_next_offset = *m_pieces_it; - // if (m_next_offset > m_offset) break; - // } - - // // assert(lo > 0); - // // --lo; - - m_pieces_it = m_buckets->pieces.get_iterator_at(pos); + m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); next_piece(); m_ret.second.resize(m_k, 0); - // m_clear = true; } bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } @@ -356,18 +279,15 @@ struct buckets // uint64_t m_offset; uint64_t m_next_offset; kmer_iterator m_it; - bits::elias_fano::iterator m_pieces_it; - // bits::compact_vector::iterator m_pieces_it; + bits::endpoints_sequence<>::iterator m_strings_endpoints_it; bool m_clear; void next_piece() { m_it.at(kmer_t::bits_per_char * m_offset); - m_next_offset = m_pieces_it.value(); - // m_next_offset = *m_pieces_it; + m_next_offset = m_strings_endpoints_it.value(); assert(m_next_offset > m_offset); m_clear = true; - m_pieces_it.next(); - // ++m_pieces_it; + m_strings_endpoints_it.next(); } }; @@ -376,9 +296,9 @@ struct buckets // } uint64_t num_bits() const { - return 8 * (pieces.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // - offsets.num_bytes() + offsets2.num_bytes() + offsets3.num_bytes() + // - strings.num_bytes()); // + return 8 * (strings_endpoints.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // + offsets.num_bytes() + offsets2.num_bytes() + offsets3.num_bytes() + // + strings.num_bytes()); // } template @@ -391,8 +311,7 @@ struct buckets // visit_impl(visitor, *this); } - bits::elias_fano pieces; - // bits::compact_vector pieces; + bits::endpoints_sequence<> strings_endpoints; std::vector start_lists_of_size; bits::compact_vector offsets; @@ -404,7 +323,7 @@ struct buckets // private: template static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.pieces); + visitor.visit(t.strings_endpoints); visitor.visit(t.start_lists_of_size); visitor.visit(t.offsets); visitor.visit(t.offsets2); @@ -415,7 +334,7 @@ struct buckets // bool is_valid(lookup_result res) const { return res.contig_size != constants::invalid_uint64 and // res.kmer_id_in_contig < res.contig_size and // - res.contig_id < pieces.size(); // + res.contig_id < strings_endpoints.size(); // } }; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index 88d0754..b5f1f6b 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -97,8 +97,9 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - m_buckets.pieces.encode(data.pieces.begin(), data.pieces.size(), data.pieces.back()); - // m_buckets.pieces.build(data.pieces.begin(), data.pieces.size(), num_bits_per_offset); + m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), + data.strings_endpoints.size(), + data.strings_endpoints.back()); m_buckets.strings.swap(data.strings); /* compute offsets2 and offsets3 */ diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index d12852a..b40e46b 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -11,7 +11,7 @@ struct parse_data { uint64_t num_kmers; minimizers_tuples minimizers; - std::vector pieces; + std::vector strings_endpoints; bits::bit_vector strings; weights::builder weights_builder; }; @@ -44,7 +44,7 @@ void parse_file(std::istream& is, parse_data& data, bvb_strings.reserve(num_bits); const uint64_t num_sequences = 100000000; - data.pieces.reserve(num_sequences); + data.strings_endpoints.reserve(num_sequences); } // std::unordered_map seq_lengths; @@ -141,7 +141,7 @@ void parse_file(std::istream& is, parse_data& data, } assert(bvb_strings.num_bits() % kmer_t::bits_per_char == 0); - data.pieces.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); + data.strings_endpoints.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); num_bases += n; @@ -171,11 +171,11 @@ void parse_file(std::istream& is, parse_data& data, } /* - So pieces will be of size p+1, where p is the number of DNA sequences + So strings_endpoints will be of size p+1, where p is the number of DNA sequences in the input file. */ - data.pieces.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); - assert(data.pieces.front() == 0); + data.strings_endpoints.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); + assert(data.strings_endpoints.front() == 0); /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ @@ -183,8 +183,8 @@ void parse_file(std::istream& is, parse_data& data, bvb_strings.build(data.strings); - assert(data.pieces.front() == 0); - assert(data.pieces.size() == num_sequences + 1); + assert(data.strings_endpoints.front() == 0); + assert(data.strings_endpoints.size() == num_sequences + 1); timer.stop(); print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding input'"); @@ -291,8 +291,8 @@ void parse_file(std::istream& is, parse_data& data, for (uint64_t i = index_begin; i != index_end; ++i) // { - const uint64_t begin = data.pieces[i]; - const uint64_t end = data.pieces[i + 1]; + const uint64_t begin = data.strings_endpoints[i]; + const uint64_t end = data.strings_endpoints[i + 1]; const uint64_t sequence_len = end - begin; assert(sequence_len >= k); diff --git a/include/constants.hpp b/include/constants.hpp index 3ba35b8..3925292 100644 --- a/include/constants.hpp +++ b/include/constants.hpp @@ -1,7 +1,5 @@ #pragma once -#include "kmer.hpp" - namespace sshash::constants { constexpr uint64_t invalid_uint64 = uint64_t(-1); @@ -22,7 +20,7 @@ constexpr int forward_orientation = 1; constexpr int backward_orientation = -1; namespace current_version_number { -constexpr uint8_t x = 4; +constexpr uint8_t x = 5; constexpr uint8_t y = 0; constexpr uint8_t z = 0; } // namespace current_version_number diff --git a/include/dictionary.hpp b/include/dictionary.hpp index b9d0c33..1276280 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -26,7 +26,7 @@ struct dictionary { uint64_t size() const { return m_size; } uint64_t k() const { return m_k; } uint64_t m() const { return m_m; } - uint64_t num_contigs() const { return m_buckets.pieces.size() - 1; } + uint64_t num_contigs() const { return m_buckets.strings_endpoints.size() - 1; } bool canonical() const { return m_canonical; } bool weighted() const { return !m_weights.empty(); } hasher_type const& hasher() const { return m_hasher; } diff --git a/src/info.cpp b/src/info.cpp index 904639a..cef4ab1 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -2,39 +2,6 @@ namespace sshash { -static double bits_per_kmer_formula(uint64_t k, /* kmer length */ - uint64_t m, /* minimizer length */ - uint64_t n, /* num. kmers */ - uint64_t M) /* num. strings in SPSS */ -{ - /* - Caveats: - 1. we assume an alphabet of size 4 - 2. this assumes a random minimizer scheme, so num. super-kmers is ~ 2n/(k-m+2) - 3. we neglect lower order terms and skew index space - 4. not canonical - */ - - assert(k > 0); - assert(k >= m); - - const uint64_t N = n + M * (k - 1); // num. characters in SPSS - - /* summing (M-1) provides an upper bound to the num. of super-kmers */ - double Z = (2.0 * n) / (k - m + 2) + (M - 1); - - /* A cache line is 64 B = 512 bits --> - max window_size that fits in a cache line is 512/2 = 256 - assuming a 2-bit encoded stream. */ - const uint64_t window_size = 1; /* 256; */ - - double num_bits = - 2 * N + Z * (5.0 + std::ceil(std::log2(std::ceil(static_cast(N) / window_size)))) + - M * (2.0 + std::ceil(std::log2(static_cast(N) / M))); - - return num_bits / n; -} - double perc(uint64_t amount, uint64_t total) { return (amount * 100.0) / total; } template @@ -47,11 +14,9 @@ void dictionary::print_space_breakdown() const { << " [bits/kmer] (" << static_cast(m_minimizers.num_bits()) / m_minimizers.size() << " [bits/key]) -- " << perc(m_minimizers.num_bits(), num_bits()) << "%\n"; - std::cout << " pieces: " << (8.0 * m_buckets.pieces.num_bytes()) / size() << " [bits/kmer] -- " - << perc(m_buckets.pieces.num_bytes() * 8, num_bits()) << "%\n"; - // std::cout << " sizes: " << (m_buckets.bucket_sizes.num_bytes() * 8.0) / size() - // << " [bits/kmer] -- " << perc(m_buckets.bucket_sizes.num_bytes() * 8, num_bits()) - // << "%\n"; + std::cout << " strings_endpoints: " << (8.0 * m_buckets.strings_endpoints.num_bytes()) / size() + << " [bits/kmer] -- " << perc(m_buckets.strings_endpoints.num_bytes() * 8, num_bits()) + << "%\n"; std::cout << " offsets: " << (8.0 * m_buckets.offsets.num_bytes()) / size() << " [bits/kmer] -- " << perc(8 * m_buckets.offsets.num_bytes(), num_bits()) << "%\n"; @@ -77,10 +42,6 @@ void dictionary::print_space_breakdown() const { std::cout << " --------------\n"; std::cout << " total: " << static_cast(num_bits()) / size() << " [bits/kmer]" << std::endl; - - // std::cout << " Close-form formula: " << bits_per_kmer_formula(k(), m(), size(), - // num_contigs()) - // << " [bits/kmer]" << std::endl; } template @@ -93,16 +54,6 @@ void dictionary::print_info() const { std::cout << "m = " << m() << '\n'; std::cout << "canonical = " << (canonical() ? "true" : "false") << '\n'; std::cout << "weighted = " << (weighted() ? "true" : "false") << '\n'; - - std::cout << "num_super_kmers = " << m_buckets.offsets.size() << '\n'; - std::cout << "num_pieces = " << m_buckets.pieces.size() << " (+" - << (2.0 * m_buckets.pieces.size() * (k() - 1)) / size() << " [bits/kmer])" << '\n'; - std::cout << "bits_per_offset = ceil(log2(" << m_buckets.strings.num_bits() / 2 - << ")) = " << std::ceil(std::log2(m_buckets.strings.num_bits() / 2)) << '\n'; - uint64_t num_kmers_in_skew_index = m_skew_index.print_info(); - std::cout << "num_kmers_in_skew_index " << num_kmers_in_skew_index << "(" - << (num_kmers_in_skew_index * 100.0) / size() << "%)" << std::endl; - print_space_breakdown(); } diff --git a/test/check.cpp b/test/check.cpp index 2e2760f..9a3f1c6 100644 --- a/test/check.cpp +++ b/test/check.cpp @@ -1,12 +1,15 @@ #include #include +#include "include/kmer.hpp" #include "include/util.hpp" #include "external/gz/zip_stream.hpp" #include "external/pthash/external/cmd_line_parser/include/parser.hpp" using namespace sshash; +using kmer_type = default_kmer_t; + std::unordered_set parse_file(std::istream& is, const uint64_t k) { std::unordered_set kmers; @@ -31,8 +34,8 @@ std::unordered_set parse_file(std::istream& is, const uint64_t k) { for (uint64_t end = 0; end != sequence.length() - k + 1; ++end) { char const* kmer = sequence.data() + end; - assert(util::is_valid(kmer, k)); - default_kmer_t uint_kmer = util::string_to_uint_kmer(kmer, k); + assert(util::is_valid(kmer, k)); + kmer_type uint_kmer = util::string_to_uint_kmer(kmer, k); kmers.insert(uint_kmer.kmer); @@ -71,13 +74,13 @@ void query_from_fastq_file(std::string const& query_filename, if (line.size() >= k) { for (uint64_t i = 0; i != line.size() - k + 1; ++i) { char const* kmer = line.data() + i; - if (util::is_valid(kmer, k)) // + if (util::is_valid(kmer, k)) // { - default_kmer_t uint_kmer = util::string_to_uint_kmer(kmer, k); + kmer_type uint_kmer = util::string_to_uint_kmer(kmer, k); if (auto it = kmers.find(uint_kmer.kmer); it != kmers.end()) { num_positive_kmers += 1; } - default_kmer_t uint_kmer_rc = uint_kmer; + kmer_type uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(k); if (auto it = kmers.find(uint_kmer_rc.kmer); it != kmers.end()) { num_positive_kmers += 1; diff --git a/test/test_alphabet.cpp b/test/test_alphabet.cpp index 42b8df4..5e798db 100644 --- a/test/test_alphabet.cpp +++ b/test/test_alphabet.cpp @@ -1,3 +1,4 @@ +#include "include/kmer.hpp" #include "include/util.hpp" #include "tools/common.hpp" // for random_kmer From 6b48d472fd6496892a3146a90dfd8d7fe90735f5 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 22 Sep 2025 11:38:25 +0200 Subject: [PATCH 022/112] added missing include for compilation on Linux --- include/kmer.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/kmer.hpp b/include/kmer.hpp index 61fdd9b..8c35228 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -3,6 +3,7 @@ // #include "bitpack.hpp" // #include +#include #include // template From dd1a7d234367e36bc04a2b84322b73f31fe5957b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 22 Sep 2025 12:39:30 +0200 Subject: [PATCH 023/112] added missing include for compilation on Linux --- include/kmer.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/kmer.hpp b/include/kmer.hpp index 8c35228..82a6111 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -3,6 +3,7 @@ // #include "bitpack.hpp" // #include +#include // for uint types #include #include From 053f012c5f809e5a813a486d86a7a5702b7e4b60 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 23 Sep 2025 08:58:47 +0200 Subject: [PATCH 024/112] results 22-09-25 for k=31 --- .../k31/22-09-25.canon.bench_log | 15 + .../k31/22-09-25.canon.build_log | 530 ++++++++++++++++++ ...2-09-25.canon.high-hit.streaming_query_log | 30 + ...22-09-25.canon.low-hit.streaming_query_log | 30 + .../k31/22-09-25.regular.bench_log | 16 + .../k31/22-09-25.regular.build_log | 510 +++++++++++++++++ ...09-25.regular.high-hit.streaming_query_log | 30 + ...-09-25.regular.low-hit.streaming_query_log | 30 + 8 files changed, 1191 insertions(+) create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.build_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.build_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log new file mode 100644 index 0000000..b3a922d --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log @@ -0,0 +1,15 @@ +lookup: avg_nanosec_per_positive_lookup 535.238 +lookup_uint: avg_nanosec_per_positive_lookup 507.966 +avg_nanosec_per_negative_lookup 374.646 +avg_nanosec_per_access 352.13 +iterator: avg_nanosec_per_kmer 20.1425 +lookup: avg_nanosec_per_positive_lookup 503.807 +lookup_uint: avg_nanosec_per_positive_lookup 480.337 +avg_nanosec_per_negative_lookup 406.413 +avg_nanosec_per_access 371.677 +iterator: avg_nanosec_per_kmer 20.0371 +lookup: avg_nanosec_per_positive_lookup 702.591 +lookup_uint: avg_nanosec_per_positive_lookup 679.425 +avg_nanosec_per_negative_lookup 427.235 +avg_nanosec_per_access 510.499 +iterator: avg_nanosec_per_kmer 20.1687 diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log new file mode 100644 index 0000000..75a0091 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log @@ -0,0 +1,530 @@ +k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 27657185 bases, 24657215 kmers +read 200000 sequences, 54659411 bases, 48659441 kmers +read 300000 sequences, 82042065 bases, 73042095 kmers +read 400000 sequences, 109137740 bases, 97137770 kmers +read 500000 sequences, 135591611 bases, 120591641 kmers +read 600000 sequences, 162605989 bases, 144606019 kmers +read 700000 sequences, 189421730 bases, 168421760 kmers +read 800000 sequences, 214809276 bases, 190809306 kmers +read 900000 sequences, 240465564 bases, 213465594 kmers +read 1000000 sequences, 265968295 bases, 235968325 kmers +read 1100000 sequences, 291953235 bases, 258953265 kmers +read 1200000 sequences, 316684260 bases, 280684290 kmers +read 1300000 sequences, 341304215 bases, 302304245 kmers +read 1400000 sequences, 365519325 bases, 323519355 kmers +read 1500000 sequences, 388985606 bases, 343985636 kmers +read 1600000 sequences, 411705914 bases, 363705944 kmers +read 1700000 sequences, 434632801 bases, 383632831 kmers +read 1800000 sequences, 456140575 bases, 402140605 kmers +read 1900000 sequences, 477396896 bases, 420396926 kmers +read 2000000 sequences, 498761432 bases, 438761462 kmers +read 2100000 sequences, 518417062 bases, 455417092 kmers +read 2200000 sequences, 537930862 bases, 471930892 kmers +read 2300000 sequences, 556305688 bases, 487305718 kmers +read 2400000 sequences, 573938040 bases, 501938070 kmers +=== step 1.1: 'encoding input' 2.31093 [sec] (4.59918 [ns/kmer]) +read 2406269 sequences, 574653270 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.287336 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 2.1582 [sec] (4.29522 [ns/kmer]) +=== step 1: 'parse file' 4.46929 [sec] (8.89474 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 4.41628 [sec] (8.78923 [ns/kmer]) +num_minimizers = 79426371 +num_minimizer_positions = 88821250 +num_super_kmers = 92441796 +building minimizers MPHF with 8 threads and 27 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.3561 [sec] (10.6596 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75659 [sec] (7.47633 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.02586 [sec] (2.04166 [ns/kmer]) +num_bits_per_offset = ceil(log2(574653302)) = 30 +max_bucket_size 155775 +log2_max_bucket_size 18 +num_buckets_larger_than_1_not_in_skew_index 3198593/79426371 (4.02712%) +num_buckets_in_skew_index 7428/79426371 (0.00935206%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 10916988/88821250 (12.291%) +num_minimizer_positions_of_buckets_in_skew_index 1683912/88821250 (1.89584%) +computing minimizers offsets: 1.30397 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2268785 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1392132 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1162932 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 935073 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 655983 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 438277 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 431217 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 155775: 832367 +num_kmers_in_skew_index 8116766 (1.61539%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2268785 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2268785)... + built mphs[0] for 2268785 kmers; bits/key = 2.56 + built positions[0] for 2268785 kmers; bits/key = 7.00016 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1392132 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1392132)... + built mphs[1] for 1392132 kmers; bits/key = 2.5606 + built positions[1] for 1392132 kmers; bits/key = 8.00025 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1162932 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1162932)... + built mphs[2] for 1162932 kmers; bits/key = 2.56092 + built positions[2] for 1162932 kmers; bits/key = 9.00031 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 935073 + building MPHF with 8 threads and 1 partitions (avg. partition size = 935073)... + built mphs[3] for 935073 kmers; bits/key = 2.4185 + built positions[3] for 935073 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 655983 + building MPHF with 8 threads and 1 partitions (avg. partition size = 655983)... + built mphs[4] for 655983 kmers; bits/key = 2.56224 + built positions[4] for 655983 kmers; bits/key = 11.0006 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 438277 + building MPHF with 8 threads and 1 partitions (avg. partition size = 438277)... + built mphs[5] for 438277 kmers; bits/key = 2.56404 + built positions[5] for 438277 kmers; bits/key = 12.0007 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 431217 + building MPHF with 8 threads and 1 partitions (avg. partition size = 431217)... + built mphs[6] for 431217 kmers; bits/key = 2.42117 + built positions[6] for 431217 kmers; bits/key = 13.0007 + lower = 8192; upper = 155775; num_bits_per_pos = 18; num_kmers_in_partition = 832367 + building MPHF with 8 threads and 1 partitions (avg. partition size = 832367)... + built mphs[7] for 832367 kmers; bits/key = 2.41872 + built positions[7] for 832367 kmers; bits/key = 18.0004 +computing skew index took: 6.32683 [sec] +=== step 3: 'build sparse and skew index' 7.70924 [sec] (15.3428 [ns/kmer]) +=== total_time 26.7334 [sec] (53.2044 [ns/kmer]) +total index size: 549290580 [B] -- 549.291 [MB] +SPACE BREAKDOWN: + minimizers: 0.452782 [bits/kmer] (2.86438 [bits/key]) -- 5.1773% + strings_endpoints: 0.153015 [bits/kmer] -- 1.74964% + offsets: 4.90028 [bits/kmer] -- 56.0318% + offsets2: 0.651806 [bits/kmer] -- 7.45302% + offsets3: 0.10054 [bits/kmer] -- 1.14961% + start_lists_of_size: 4.26696e-06 [bits/kmer] -- 4.87902e-05% + strings: 2.28734 [bits/kmer] -- 26.1543% + skew_index: 0.199768 [bits/kmer] -- 2.28423% + weights: 2.92956e-06 [bits/kmer] -- 3.34978e-05% + -------------- + total: 8.74553 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9635% +buckets with 2 minimizer positions = 2.5093% +buckets with 3 minimizer positions = 0.679399% +buckets with 4 minimizer positions = 0.290103% +buckets with 5 minimizer positions = 0.153452% +buckets with 6 minimizer positions = 0.0927941% +buckets with 7 minimizer positions = 0.0610528% +buckets with 8 minimizer positions = 0.0427541% +buckets with 9 minimizer positions = 0.0312239% +buckets with 10 minimizer positions = 0.0239568% +buckets with 11 minimizer positions = 0.0190289% +buckets with 12 minimizer positions = 0.0152078% +buckets with 13 minimizer positions = 0.0127741% +buckets with 14 minimizer positions = 0.0104008% +buckets with 15 minimizer positions = 0.00880816% +buckets with 16 minimizer positions = 0.00755039% +max_bucket_size 155775 +2025-09-22 14:42:25: saving data structure to disk... +2025-09-22 14:42:25: DONE +k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 158452704 bases, 155452734 kmers +read 200000 sequences, 318155284 bases, 312155314 kmers +read 300000 sequences, 484429755 bases, 475429785 kmers +read 400000 sequences, 657902795 bases, 645902825 kmers +read 500000 sequences, 832407154 bases, 817407184 kmers +read 600000 sequences, 1004979671 bases, 986979701 kmers +=== step 1.1: 'encoding input' 4.31978 [sec] (3.75502 [ns/kmer]) +read 682245 sequences, 1170866555 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.035583 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 5.09074 [sec] (4.4252 [ns/kmer]) +=== step 1: 'parse file' 9.41073 [sec] (8.1804 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 9.73956 [sec] (8.46624 [ns/kmer]) +num_minimizers = 193802281 +num_minimizer_positions = 200287417 +num_super_kmers = 208975066 +building minimizers MPHF with 8 threads and 65 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 12.7565 [sec] (11.0887 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.57548 [sec] (7.45435 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 9.391 [sec] (8.16325 [ns/kmer]) +num_bits_per_offset = ceil(log2(1170866587)) = 31 +max_bucket_size 3788 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 3847569/193802281 (1.98531%) +num_buckets_in_skew_index 3592/193802281 (0.00185344%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 9809818/200287417 (4.89787%) +num_minimizer_positions_of_buckets_in_skew_index 526479/200287417 (0.262862%) +computing minimizers offsets: 2.2088 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1179637 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 821390 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 443904 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 212956 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 176522 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3788: 79585 +num_kmers_in_skew_index 2913994 (0.253303%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1179637 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1179637)... + built mphs[0] for 1179637 kmers; bits/key = 2.56086 + built positions[0] for 1179637 kmers; bits/key = 7.00028 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 821390 + building MPHF with 8 threads and 1 partitions (avg. partition size = 821390)... + built mphs[1] for 821390 kmers; bits/key = 2.56173 + built positions[1] for 821390 kmers; bits/key = 8.00041 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 443904 + building MPHF with 8 threads and 1 partitions (avg. partition size = 443904)... + built mphs[2] for 443904 kmers; bits/key = 2.42106 + built positions[2] for 443904 kmers; bits/key = 9.00072 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 212956 + building MPHF with 8 threads and 1 partitions (avg. partition size = 212956)... + built mphs[3] for 212956 kmers; bits/key = 2.42657 + built positions[3] for 212956 kmers; bits/key = 10.0017 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 176522 + building MPHF with 8 threads and 1 partitions (avg. partition size = 176522)... + built mphs[4] for 176522 kmers; bits/key = 2.42852 + built positions[4] for 176522 kmers; bits/key = 11.0019 + lower = 2048; upper = 3788; num_bits_per_pos = 12; num_kmers_in_partition = 79585 + building MPHF with 8 threads and 1 partitions (avg. partition size = 79585)... + built mphs[5] for 79585 kmers; bits/key = 2.44287 + built positions[5] for 79585 kmers; bits/key = 12.0047 +computing skew index took: 2.32617 [sec] +=== step 3: 'build sparse and skew index' 4.70918 [sec] (4.09352 [ns/kmer]) +=== total_time 54.5824 [sec] (47.4465 [ns/kmer]) +total index size: 1195312570 [B] -- 1195.31 [MB] +SPACE BREAKDOWN: + minimizers: 0.479119 [bits/kmer] (2.84403 [bits/key]) -- 5.76396% + strings_endpoints: 0.10109 [bits/kmer] -- 1.21614% + offsets: 5.39089 [bits/kmer] -- 64.8541% + offsets2: 0.264347 [bits/kmer] -- 3.18018% + offsets3: 0.0141874 [bits/kmer] -- 0.170679% + start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.24209e-05% + strings: 2.03558 [bits/kmer] -- 24.4887% + skew_index: 0.0271139 [bits/kmer] -- 0.326189% + weights: 1.27956e-06 [bits/kmer] -- 1.53935e-05% + -------------- + total: 8.31233 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 98.0128% +buckets with 2 minimizer positions = 1.66457% +buckets with 3 minimizer positions = 0.165762% +buckets with 4 minimizer positions = 0.0545515% +buckets with 5 minimizer positions = 0.0276849% +buckets with 6 minimizer positions = 0.0167021% +buckets with 7 minimizer positions = 0.0112088% +buckets with 8 minimizer positions = 0.00793438% +buckets with 9 minimizer positions = 0.00591686% +buckets with 10 minimizer positions = 0.00451181% +buckets with 11 minimizer positions = 0.00358923% +buckets with 12 minimizer positions = 0.00282092% +buckets with 13 minimizer positions = 0.00235962% +buckets with 14 minimizer positions = 0.00195251% +buckets with 15 minimizer positions = 0.00164394% +buckets with 16 minimizer positions = 0.00140556% +max_bucket_size 3788 +2025-09-22 14:43:20: saving data structure to disk... +2025-09-22 14:43:20: DONE +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 21756494 bases, 18756524 kmers +read 200000 sequences, 43415082 bases, 37415112 kmers +read 300000 sequences, 65780160 bases, 56780190 kmers +read 400000 sequences, 87471486 bases, 75471516 kmers +read 500000 sequences, 109226866 bases, 94226896 kmers +read 600000 sequences, 131648019 bases, 113648049 kmers +read 700000 sequences, 153316395 bases, 132316425 kmers +read 800000 sequences, 176702606 bases, 152702636 kmers +read 900000 sequences, 198938131 bases, 171938161 kmers +read 1000000 sequences, 220949217 bases, 190949247 kmers +read 1100000 sequences, 244049472 bases, 211049502 kmers +read 1200000 sequences, 267074826 bases, 231074856 kmers +read 1300000 sequences, 288917293 bases, 249917323 kmers +read 1400000 sequences, 311411250 bases, 269411280 kmers +read 1500000 sequences, 333749577 bases, 288749607 kmers +read 1600000 sequences, 356425695 bases, 308425725 kmers +read 1700000 sequences, 378782863 bases, 327782893 kmers +read 1800000 sequences, 401743561 bases, 347743591 kmers +read 1900000 sequences, 424135183 bases, 367135213 kmers +read 2000000 sequences, 446879049 bases, 386879079 kmers +read 2100000 sequences, 468734269 bases, 405734299 kmers +read 2200000 sequences, 490603237 bases, 424603267 kmers +read 2300000 sequences, 513905163 bases, 444905193 kmers +read 2400000 sequences, 537439218 bases, 465439248 kmers +read 2500000 sequences, 560503353 bases, 485503383 kmers +read 2600000 sequences, 583973645 bases, 505973675 kmers +read 2700000 sequences, 606563596 bases, 525563626 kmers +read 2800000 sequences, 629471143 bases, 545471173 kmers +read 2900000 sequences, 653036453 bases, 566036483 kmers +read 3000000 sequences, 676313831 bases, 586313861 kmers +read 3100000 sequences, 700155099 bases, 607155129 kmers +read 3200000 sequences, 723256428 bases, 627256458 kmers +read 3300000 sequences, 745736801 bases, 646736831 kmers +read 3400000 sequences, 768718458 bases, 666718488 kmers +read 3500000 sequences, 791774449 bases, 686774479 kmers +read 3600000 sequences, 814593816 bases, 706593846 kmers +read 3700000 sequences, 838379879 bases, 727379909 kmers +read 3800000 sequences, 860634933 bases, 746634963 kmers +read 3900000 sequences, 884047075 bases, 767047105 kmers +read 4000000 sequences, 907479686 bases, 787479716 kmers +read 4100000 sequences, 930543338 bases, 807543368 kmers +read 4200000 sequences, 953267462 bases, 827267492 kmers +read 4300000 sequences, 976927833 bases, 847927863 kmers +read 4400000 sequences, 1000738248 bases, 868738278 kmers +read 4500000 sequences, 1024531209 bases, 889531239 kmers +read 4600000 sequences, 1047717223 bases, 909717253 kmers +read 4700000 sequences, 1071027493 bases, 930027523 kmers +read 4800000 sequences, 1094084552 bases, 950084582 kmers +read 4900000 sequences, 1117956137 bases, 970956167 kmers +read 5000000 sequences, 1141125024 bases, 991125054 kmers +read 5100000 sequences, 1164319107 bases, 1011319137 kmers +read 5200000 sequences, 1187390563 bases, 1031390593 kmers +read 5300000 sequences, 1211053129 bases, 1052053159 kmers +read 5400000 sequences, 1234026672 bases, 1072026702 kmers +read 5500000 sequences, 1257295769 bases, 1092295799 kmers +read 5600000 sequences, 1279760698 bases, 1111760728 kmers +read 5700000 sequences, 1303188807 bases, 1132188837 kmers +read 5800000 sequences, 1326902250 bases, 1152902280 kmers +read 5900000 sequences, 1350165652 bases, 1173165682 kmers +read 6000000 sequences, 1373185888 bases, 1193185918 kmers +read 6100000 sequences, 1396446455 bases, 1213446485 kmers +read 6200000 sequences, 1420887422 bases, 1234887452 kmers +read 6300000 sequences, 1444176084 bases, 1255176114 kmers +read 6400000 sequences, 1467761803 bases, 1275761833 kmers +read 6500000 sequences, 1491517469 bases, 1296517499 kmers +read 6600000 sequences, 1515086149 bases, 1317086179 kmers +read 6700000 sequences, 1537506202 bases, 1336506232 kmers +read 6800000 sequences, 1560946391 bases, 1356946421 kmers +read 6900000 sequences, 1583945488 bases, 1376945518 kmers +read 7000000 sequences, 1606825999 bases, 1396826029 kmers +read 7100000 sequences, 1630889570 bases, 1417889600 kmers +read 7200000 sequences, 1653502338 bases, 1437502368 kmers +read 7300000 sequences, 1676836074 bases, 1457836104 kmers +read 7400000 sequences, 1700581893 bases, 1478581923 kmers +read 7500000 sequences, 1723991216 bases, 1498991246 kmers +read 7600000 sequences, 1747267694 bases, 1519267724 kmers +read 7700000 sequences, 1769997128 bases, 1538997158 kmers +read 7800000 sequences, 1793090725 bases, 1559090755 kmers +read 7900000 sequences, 1816572169 bases, 1579572199 kmers +read 8000000 sequences, 1839912405 bases, 1599912435 kmers +read 8100000 sequences, 1863462142 bases, 1620462172 kmers +read 8200000 sequences, 1887689183 bases, 1641689213 kmers +read 8300000 sequences, 1911245326 bases, 1662245356 kmers +read 8400000 sequences, 1934891774 bases, 1682891804 kmers +read 8500000 sequences, 1958265360 bases, 1703265390 kmers +read 8600000 sequences, 1981114530 bases, 1723114560 kmers +read 8700000 sequences, 2005160537 bases, 1744160567 kmers +read 8800000 sequences, 2028270585 bases, 1764270615 kmers +read 8900000 sequences, 2051383223 bases, 1784383253 kmers +read 9000000 sequences, 2074474142 bases, 1804474172 kmers +read 9100000 sequences, 2096460797 bases, 1823460827 kmers +read 9200000 sequences, 2119508963 bases, 1843508993 kmers +read 9300000 sequences, 2142674047 bases, 1863674077 kmers +read 9400000 sequences, 2164744513 bases, 1882744543 kmers +read 9500000 sequences, 2187346618 bases, 1902346648 kmers +read 9600000 sequences, 2209977347 bases, 1921977377 kmers +read 9700000 sequences, 2232411621 bases, 1941411651 kmers +read 9800000 sequences, 2254902856 bases, 1960902886 kmers +read 9900000 sequences, 2277498326 bases, 1980498356 kmers +read 10000000 sequences, 2299499706 bases, 1999499736 kmers +read 10100000 sequences, 2321026083 bases, 2018026113 kmers +read 10200000 sequences, 2343732502 bases, 2037732532 kmers +read 10300000 sequences, 2364673146 bases, 2055673176 kmers +read 10400000 sequences, 2386756547 bases, 2074756577 kmers +read 10500000 sequences, 2407972829 bases, 2092972859 kmers +read 10600000 sequences, 2429720496 bases, 2111720526 kmers +read 10700000 sequences, 2450999850 bases, 2129999880 kmers +read 10800000 sequences, 2471991237 bases, 2147991267 kmers +read 10900000 sequences, 2492905716 bases, 2165905746 kmers +read 11000000 sequences, 2514209537 bases, 2184209567 kmers +read 11100000 sequences, 2535680432 bases, 2202680462 kmers +read 11200000 sequences, 2556527106 bases, 2220527136 kmers +read 11300000 sequences, 2577149683 bases, 2238149713 kmers +read 11400000 sequences, 2597185570 bases, 2255185600 kmers +read 11500000 sequences, 2617632290 bases, 2272632320 kmers +read 11600000 sequences, 2638223488 bases, 2290223518 kmers +read 11700000 sequences, 2658091095 bases, 2307091125 kmers +read 11800000 sequences, 2676727586 bases, 2322727616 kmers +read 11900000 sequences, 2695970855 bases, 2338970885 kmers +read 12000000 sequences, 2714887902 bases, 2354887932 kmers +read 12100000 sequences, 2733216523 bases, 2370216553 kmers +read 12200000 sequences, 2751654575 bases, 2385654605 kmers +read 12300000 sequences, 2769824681 bases, 2400824711 kmers +read 12400000 sequences, 2788136547 bases, 2416136577 kmers +read 12500000 sequences, 2806066941 bases, 2431066971 kmers +read 12600000 sequences, 2823691733 bases, 2445691763 kmers +read 12700000 sequences, 2841752082 bases, 2460752112 kmers +read 12800000 sequences, 2859305620 bases, 2475305650 kmers +read 12900000 sequences, 2876642001 bases, 2489642031 kmers +read 13000000 sequences, 2893631233 bases, 2503631263 kmers +=== step 1.1: 'encoding input' 11.3953 [sec] (4.54823 [ns/kmer]) +read 13014214 sequences, 2895872181 bases, 2505445761 kmers +num_kmers 2505445761 +cost: 2.0 + 0.311662 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.13.bin'... +=== step 1.2: 'computing minimizers tuples' 11.5039 [sec] (4.59155 [ns/kmer]) +=== step 1: 'parse file' 22.8994 [sec] (9.13984 [ns/kmer]) + == files to merge = 14 +saving tuples to 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.1: 'merging minimizers tuples' 27.5279 [sec] (10.9872 [ns/kmer]) +num_minimizers = 417553335 +num_minimizer_positions = 474828363 +num_super_kmers = 493836140 +building minimizers MPHF with 8 threads and 140 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 27.7076 [sec] (11.0589 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 20.5021 [sec] (8.18299 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.4: 'merging minimizers tuples ' 35.7576 [sec] (14.272 [ns/kmer]) +num_bits_per_offset = ceil(log2(2895872213)) = 32 +max_bucket_size 33191 +log2_max_bucket_size 16 +num_buckets_larger_than_1_not_in_skew_index 16634505/417553335 (3.9838%) +num_buckets_in_skew_index 75846/417553335 (0.0181644%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 59861399/474828363 (12.607%) +num_minimizer_positions_of_buckets_in_skew_index 14123980/474828363 (2.97454%) +computing minimizers offsets: 6.66934 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18483007 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14289333 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 10220043 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 7256268 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4841792 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2658327 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1446373 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 33191: 1382491 +num_kmers_in_skew_index 60577634 (2.41784%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18483007 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[0] for 18483007 kmers; bits/key = 2.64291 + built positions[0] for 18483007 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14289333 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[1] for 14289333 kmers; bits/key = 2.51635 + built positions[1] for 14289333 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 10220043 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[2] for 10220043 kmers; bits/key = 2.63949 + built positions[2] for 10220043 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 7256268 + building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 7256268 kmers; bits/key = 2.72044 + built positions[3] for 7256268 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4841792 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4841792 kmers; bits/key = 2.71841 + built positions[4] for 4841792 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2658327 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2658327)... + built mphs[5] for 2658327 kmers; bits/key = 2.55987 + built positions[5] for 2658327 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1446373 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1446373)... + built mphs[6] for 1446373 kmers; bits/key = 2.56056 + built positions[6] for 1446373 kmers; bits/key = 13.0002 + lower = 8192; upper = 33191; num_bits_per_pos = 16; num_kmers_in_partition = 1382491 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1382491)... + built mphs[7] for 1382491 kmers; bits/key = 2.5606 + built positions[7] for 1382491 kmers; bits/key = 16.0002 +computing skew index took: 14.7756 [sec] +=== step 3: 'build sparse and skew index' 21.8723 [sec] (8.72991 [ns/kmer]) +=== total_time 156.267 [sec] (62.3709 [ns/kmer]) +total index size: 3029549959 [B] -- 3029.55 [MB] +SPACE BREAKDOWN: + minimizers: 0.473465 [bits/kmer] (2.84093 [bits/key]) -- 4.89446% + strings_endpoints: 0.167061 [bits/kmer] -- 1.727% + offsets: 5.49972 [bits/kmer] -- 56.8536% + offsets2: 0.764561 [bits/kmer] -- 7.90367% + offsets3: 0.180394 [bits/kmer] -- 1.86483% + start_lists_of_size: 8.55736e-07 [bits/kmer] -- 8.8462e-06% + strings: 2.31166 [bits/kmer] -- 23.8969% + skew_index: 0.27662 [bits/kmer] -- 2.85957% + weights: 5.8752e-07 [bits/kmer] -- 6.07351e-06% + -------------- + total: 9.67349 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.998% +buckets with 2 minimizer positions = 2.57019% +buckets with 3 minimizer positions = 0.580253% +buckets with 4 minimizer positions = 0.252657% +buckets with 5 minimizer positions = 0.141401% +buckets with 6 minimizer positions = 0.0899801% +buckets with 7 minimizer positions = 0.0622388% +buckets with 8 minimizer positions = 0.0453985% +buckets with 9 minimizer positions = 0.0345565% +buckets with 10 minimizer positions = 0.0272049% +buckets with 11 minimizer positions = 0.0217699% +buckets with 12 minimizer positions = 0.0179227% +buckets with 13 minimizer positions = 0.0150204% +buckets with 14 minimizer positions = 0.0126494% +buckets with 15 minimizer positions = 0.0108367% +buckets with 16 minimizer positions = 0.00935378% +max_bucket_size 33191 +2025-09-22 14:45:57: saving data structure to disk... +2025-09-22 14:45:58: DONE diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log new file mode 100644 index 0000000..da1388b --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-22 14:47:56: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-22 14:48:03: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 7886675/132860997 (5.93603%) +num_extensions = 124974322/132860997 (94.064%) +elapsed = 7116.47 millisec / 7.11647 sec / 0.118608 min / 43.5825 ns/kmer +2025-09-22 14:48:04: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-22 14:48:48: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 13101335/525542891 (2.49291%) +num_extensions = 512441556/525542891 (97.5071%) +elapsed = 44111.6 millisec / 44.1116 sec / 0.735193 min / 63.4026 ns/kmer +2025-09-22 14:48:49: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-22 14:51:29: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437870528 (91.5856%) +num_negative_kmers = 131075447 (8.34889%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 110228289/1437870528 (7.66608%) +num_extensions = 1327642239/1437870528 (92.3339%) +elapsed = 159868 millisec / 159.868 sec / 2.66446 min / 101.828 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log new file mode 100644 index 0000000..1f00751 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-22 14:51:29: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-22 14:52:36: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 4754204 (0.683333%) +num_negative_kmers = 690972341 (99.3151%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 3613872/4754204 (76.0142%) +num_extensions = 1140332/4754204 (23.9858%) +elapsed = 66567.4 millisec / 66.5674 sec / 1.10946 min / 95.6788 ns/kmer +2025-09-22 14:52:36: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-22 14:52:43: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 790414 (0.484063%) +num_negative_kmers = 162496946 (99.5159%) +num_invalid_kmers = 0 (0%) +num_searches = 499575/790414 (63.2042%) +num_extensions = 290839/790414 (36.7958%) +elapsed = 6415.18 millisec / 6.41517 sec / 0.10692 min / 39.2876 ns/kmer +2025-09-22 14:52:44: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-22 14:53:20: DONE +==== query report: +num_kmers = 395433242 +num_positive_kmers = 1134 (0.000286774%) +num_negative_kmers = 395408021 (99.9936%) +num_invalid_kmers = 24087 (0.00609129%) +num_searches = 895/1134 (78.9242%) +num_extensions = 239/1134 (21.0758%) +elapsed = 35571.2 millisec / 35.5712 sec / 0.592854 min / 89.955 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log new file mode 100644 index 0000000..b3fc097 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log @@ -0,0 +1,16 @@ +lookup: avg_nanosec_per_positive_lookup 657.587 +lookup_uint: avg_nanosec_per_positive_lookup 606.03 +avg_nanosec_per_negative_lookup 638.93 +avg_nanosec_per_access 353.624 +iterator: avg_nanosec_per_kmer 20.1514 +lookup: avg_nanosec_per_positive_lookup 635.15 +lookup_uint: avg_nanosec_per_positive_lookup 580.118 +avg_nanosec_per_negative_lookup 690.095 +avg_nanosec_per_access 371.206 +iterator: avg_nanosec_per_kmer 20.019 +lookup: avg_nanosec_per_positive_lookup 880.499 +lookup_uint: avg_nanosec_per_positive_lookup 827.422 +avg_nanosec_per_negative_lookup 744.67 +avg_nanosec_per_access 512.398 +iterator: avg_nanosec_per_kmer 20.1606 + diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log new file mode 100644 index 0000000..db48c82 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log @@ -0,0 +1,510 @@ +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 27657185 bases, 24657215 kmers +read 200000 sequences, 54659411 bases, 48659441 kmers +read 300000 sequences, 82042065 bases, 73042095 kmers +read 400000 sequences, 109137740 bases, 97137770 kmers +read 500000 sequences, 135591611 bases, 120591641 kmers +read 600000 sequences, 162605989 bases, 144606019 kmers +read 700000 sequences, 189421730 bases, 168421760 kmers +read 800000 sequences, 214809276 bases, 190809306 kmers +read 900000 sequences, 240465564 bases, 213465594 kmers +read 1000000 sequences, 265968295 bases, 235968325 kmers +read 1100000 sequences, 291953235 bases, 258953265 kmers +read 1200000 sequences, 316684260 bases, 280684290 kmers +read 1300000 sequences, 341304215 bases, 302304245 kmers +read 1400000 sequences, 365519325 bases, 323519355 kmers +read 1500000 sequences, 388985606 bases, 343985636 kmers +read 1600000 sequences, 411705914 bases, 363705944 kmers +read 1700000 sequences, 434632801 bases, 383632831 kmers +read 1800000 sequences, 456140575 bases, 402140605 kmers +read 1900000 sequences, 477396896 bases, 420396926 kmers +read 2000000 sequences, 498761432 bases, 438761462 kmers +read 2100000 sequences, 518417062 bases, 455417092 kmers +read 2200000 sequences, 537930862 bases, 471930892 kmers +read 2300000 sequences, 556305688 bases, 487305718 kmers +read 2400000 sequences, 573938040 bases, 501938070 kmers +=== step 1.1: 'encoding input' 2.26235 [sec] (4.5025 [ns/kmer]) +read 2406269 sequences, 574653270 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.287336 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.52123 [sec] (3.02753 [ns/kmer]) +=== step 1: 'parse file' 3.78371 [sec] (7.5303 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 3.74893 [sec] (7.46107 [ns/kmer]) +num_minimizers = 72390526 +num_minimizer_positions = 78741053 +num_super_kmers = 78741053 +building minimizers MPHF with 8 threads and 25 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 4.99695 [sec] (9.94488 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.21692 [sec] (6.40227 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.969803 [sec] (1.93009 [ns/kmer]) +num_bits_per_offset = ceil(log2(574653302)) = 30 +max_bucket_size 69558 +log2_max_bucket_size 17 +num_buckets_larger_than_1_not_in_skew_index 2336498/72390526 (3.22763%) +num_buckets_in_skew_index 4518/72390526 (0.00624115%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 7623230/78741053 (9.68139%) +num_minimizer_positions_of_buckets_in_skew_index 1068313/78741053 (1.35674%) +computing minimizers offsets: 0.979831 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1245692 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1024068 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 712068 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 409910 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 444216 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 285146 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 261943 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 69558: 486183 +num_kmers_in_skew_index 4869226 (0.969067%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1245692 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1245692)... + built mphs[0] for 1245692 kmers; bits/key = 2.41792 + built positions[0] for 1245692 kmers; bits/key = 7.00028 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1024068 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1024068)... + built mphs[1] for 1024068 kmers; bits/key = 2.56119 + built positions[1] for 1024068 kmers; bits/key = 8.00034 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 712068 + building MPHF with 8 threads and 1 partitions (avg. partition size = 712068)... + built mphs[2] for 712068 kmers; bits/key = 2.41921 + built positions[2] for 712068 kmers; bits/key = 9.00049 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 409910 + building MPHF with 8 threads and 1 partitions (avg. partition size = 409910)... + built mphs[3] for 409910 kmers; bits/key = 2.42137 + built positions[3] for 409910 kmers; bits/key = 10.0009 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 444216 + building MPHF with 8 threads and 1 partitions (avg. partition size = 444216)... + built mphs[4] for 444216 kmers; bits/key = 2.56391 + built positions[4] for 444216 kmers; bits/key = 11.0008 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 285146 + building MPHF with 8 threads and 1 partitions (avg. partition size = 285146)... + built mphs[5] for 285146 kmers; bits/key = 2.5666 + built positions[5] for 285146 kmers; bits/key = 12.0012 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 261943 + building MPHF with 8 threads and 1 partitions (avg. partition size = 261943)... + built mphs[6] for 261943 kmers; bits/key = 2.42416 + built positions[6] for 261943 kmers; bits/key = 13.0014 + lower = 8192; upper = 69558; num_bits_per_pos = 17; num_kmers_in_partition = 486183 + building MPHF with 8 threads and 1 partitions (avg. partition size = 486183)... + built mphs[7] for 486183 kmers; bits/key = 2.42062 + built positions[7] for 486183 kmers; bits/key = 17.0007 +computing skew index took: 3.85367 [sec] +=== step 3: 'build sparse and skew index' 4.90973 [sec] (9.77129 [ns/kmer]) +=== total_time 21.6261 [sec] (43.0399 [ns/kmer]) +total index size: 500082250 [B] -- 500.082 [MB] +SPACE BREAKDOWN: + minimizers: 0.418287 [bits/kmer] (2.90335 [bits/key]) -- 5.25351% + strings_endpoints: 0.153015 [bits/kmer] -- 1.9218% + offsets: 4.46619 [bits/kmer] -- 56.0934% + offsets2: 0.45515 [bits/kmer] -- 5.71649% + offsets3: 0.063785 [bits/kmer] -- 0.801111% + start_lists_of_size: 4.26696e-06 [bits/kmer] -- 5.35912e-05% + strings: 2.28734 [bits/kmer] -- 28.7279% + skew_index: 0.118285 [bits/kmer] -- 1.48561% + weights: 2.92956e-06 [bits/kmer] -- 3.67939e-05% + -------------- + total: 7.96206 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.7661% +buckets with 2 minimizer positions = 2.08649% +buckets with 3 minimizer positions = 0.528401% +buckets with 4 minimizer positions = 0.211604% +buckets with 5 minimizer positions = 0.112209% +buckets with 6 minimizer positions = 0.0671649% +buckets with 7 minimizer positions = 0.0451164% +buckets with 8 minimizer positions = 0.0319876% +buckets with 9 minimizer positions = 0.0235431% +buckets with 10 minimizer positions = 0.0181944% +buckets with 11 minimizer positions = 0.0148058% +buckets with 12 minimizer positions = 0.0118427% +buckets with 13 minimizer positions = 0.0095413% +buckets with 14 minimizer positions = 0.00797204% +buckets with 15 minimizer positions = 0.00665557% +buckets with 16 minimizer positions = 0.00562228% +max_bucket_size 69558 +2025-09-22 11:44:05: saving data structure to disk... +2025-09-22 11:44:05: DONE +k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 158452704 bases, 155452734 kmers +read 200000 sequences, 318155284 bases, 312155314 kmers +read 300000 sequences, 484429755 bases, 475429785 kmers +read 400000 sequences, 657902795 bases, 645902825 kmers +read 500000 sequences, 832407154 bases, 817407184 kmers +read 600000 sequences, 1004979671 bases, 986979701 kmers +=== step 1.1: 'encoding input' 4.28193 [sec] (3.72212 [ns/kmer]) +read 682245 sequences, 1170866555 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.035583 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 3.51667 [sec] (3.05691 [ns/kmer]) +=== step 1: 'parse file' 7.79875 [sec] (6.77917 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 8.13306 [sec] (7.06977 [ns/kmer]) +num_minimizers = 173245358 +num_minimizer_positions = 176049220 +num_super_kmers = 176049220 +building minimizers MPHF with 8 threads and 58 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 11.4833 [sec] (9.98201 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.21551 [sec] (6.27217 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.00477 [sec] (1.74268 [ns/kmer]) +num_bits_per_offset = ceil(log2(1170866587)) = 31 +max_bucket_size 4013 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 1346106/173245358 (0.776994%) +num_buckets_in_skew_index 1718/173245358 (0.000991657%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 3918362/176049220 (2.22572%) +num_minimizer_positions_of_buckets_in_skew_index 233324/176049220 (0.132533%) +computing minimizers offsets: 1.40661 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 585298 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 326635 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 158808 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 108589 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 32581 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4013: 37778 +num_kmers_in_skew_index 1249689 (0.108631%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 585298 + building MPHF with 8 threads and 1 partitions (avg. partition size = 585298)... + built mphs[0] for 585298 kmers; bits/key = 2.41983 + built positions[0] for 585298 kmers; bits/key = 7.00055 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 326635 + building MPHF with 8 threads and 1 partitions (avg. partition size = 326635)... + built mphs[1] for 326635 kmers; bits/key = 2.42277 + built positions[1] for 326635 kmers; bits/key = 8.0011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 158808 + building MPHF with 8 threads and 1 partitions (avg. partition size = 158808)... + built mphs[2] for 158808 kmers; bits/key = 2.4294 + built positions[2] for 158808 kmers; bits/key = 9.00227 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 108589 + building MPHF with 8 threads and 1 partitions (avg. partition size = 108589)... + built mphs[3] for 108589 kmers; bits/key = 2.43546 + built positions[3] for 108589 kmers; bits/key = 10.0035 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 32581 + building MPHF with 8 threads and 1 partitions (avg. partition size = 32581)... + built mphs[4] for 32581 kmers; bits/key = 2.48341 + built positions[4] for 32581 kmers; bits/key = 11.0101 + lower = 2048; upper = 4013; num_bits_per_pos = 12; num_kmers_in_partition = 37778 + building MPHF with 8 threads and 1 partitions (avg. partition size = 37778)... + built mphs[5] for 37778 kmers; bits/key = 2.4734 + built positions[5] for 37778 kmers; bits/key = 12.0095 +computing skew index took: 0.993522 [sec] +=== step 3: 'build sparse and skew index' 2.54755 [sec] (2.21449 [ns/kmer]) +=== total_time 39.1829 [sec] (34.0603 [ns/kmer]) +total index size: 1079558752 [B] -- 1079.56 [MB] +SPACE BREAKDOWN: + minimizers: 0.428384 [bits/kmer] (2.84459 [bits/key]) -- 5.70618% + strings_endpoints: 0.10109 [bits/kmer] -- 1.34654% + offsets: 4.81907 [bits/kmer] -- 64.1912% + offsets2: 0.105589 [bits/kmer] -- 1.40647% + offsets3: 0.00628774 [bits/kmer] -- 0.0837542% + start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.4825e-05% + strings: 2.03558 [bits/kmer] -- 27.1145% + skew_index: 0.0113627 [bits/kmer] -- 0.151354% + weights: 1.27956e-06 [bits/kmer] -- 1.7044e-05% + -------------- + total: 7.50737 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.222% +buckets with 2 minimizer positions = 0.587049% +buckets with 3 minimizer positions = 0.0858742% +buckets with 4 minimizer positions = 0.0350243% +buckets with 5 minimizer positions = 0.0189223% +buckets with 6 minimizer positions = 0.011583% +buckets with 7 minimizer positions = 0.00779877% +buckets with 8 minimizer positions = 0.00559438% +buckets with 9 minimizer positions = 0.00408611% +buckets with 10 minimizer positions = 0.00312793% +buckets with 11 minimizer positions = 0.0024878% +buckets with 12 minimizer positions = 0.00196542% +buckets with 13 minimizer positions = 0.00159196% +buckets with 14 minimizer positions = 0.0013276% +buckets with 15 minimizer positions = 0.00114116% +buckets with 16 minimizer positions = 0.000962796% +max_bucket_size 4013 +2025-09-22 11:44:45: saving data structure to disk... +2025-09-22 11:44:45: DONE +k = 31, m = 21, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 21756494 bases, 18756524 kmers +read 200000 sequences, 43415082 bases, 37415112 kmers +read 300000 sequences, 65780160 bases, 56780190 kmers +read 400000 sequences, 87471486 bases, 75471516 kmers +read 500000 sequences, 109226866 bases, 94226896 kmers +read 600000 sequences, 131648019 bases, 113648049 kmers +read 700000 sequences, 153316395 bases, 132316425 kmers +read 800000 sequences, 176702606 bases, 152702636 kmers +read 900000 sequences, 198938131 bases, 171938161 kmers +read 1000000 sequences, 220949217 bases, 190949247 kmers +read 1100000 sequences, 244049472 bases, 211049502 kmers +read 1200000 sequences, 267074826 bases, 231074856 kmers +read 1300000 sequences, 288917293 bases, 249917323 kmers +read 1400000 sequences, 311411250 bases, 269411280 kmers +read 1500000 sequences, 333749577 bases, 288749607 kmers +read 1600000 sequences, 356425695 bases, 308425725 kmers +read 1700000 sequences, 378782863 bases, 327782893 kmers +read 1800000 sequences, 401743561 bases, 347743591 kmers +read 1900000 sequences, 424135183 bases, 367135213 kmers +read 2000000 sequences, 446879049 bases, 386879079 kmers +read 2100000 sequences, 468734269 bases, 405734299 kmers +read 2200000 sequences, 490603237 bases, 424603267 kmers +read 2300000 sequences, 513905163 bases, 444905193 kmers +read 2400000 sequences, 537439218 bases, 465439248 kmers +read 2500000 sequences, 560503353 bases, 485503383 kmers +read 2600000 sequences, 583973645 bases, 505973675 kmers +read 2700000 sequences, 606563596 bases, 525563626 kmers +read 2800000 sequences, 629471143 bases, 545471173 kmers +read 2900000 sequences, 653036453 bases, 566036483 kmers +read 3000000 sequences, 676313831 bases, 586313861 kmers +read 3100000 sequences, 700155099 bases, 607155129 kmers +read 3200000 sequences, 723256428 bases, 627256458 kmers +read 3300000 sequences, 745736801 bases, 646736831 kmers +read 3400000 sequences, 768718458 bases, 666718488 kmers +read 3500000 sequences, 791774449 bases, 686774479 kmers +read 3600000 sequences, 814593816 bases, 706593846 kmers +read 3700000 sequences, 838379879 bases, 727379909 kmers +read 3800000 sequences, 860634933 bases, 746634963 kmers +read 3900000 sequences, 884047075 bases, 767047105 kmers +read 4000000 sequences, 907479686 bases, 787479716 kmers +read 4100000 sequences, 930543338 bases, 807543368 kmers +read 4200000 sequences, 953267462 bases, 827267492 kmers +read 4300000 sequences, 976927833 bases, 847927863 kmers +read 4400000 sequences, 1000738248 bases, 868738278 kmers +read 4500000 sequences, 1024531209 bases, 889531239 kmers +read 4600000 sequences, 1047717223 bases, 909717253 kmers +read 4700000 sequences, 1071027493 bases, 930027523 kmers +read 4800000 sequences, 1094084552 bases, 950084582 kmers +read 4900000 sequences, 1117956137 bases, 970956167 kmers +read 5000000 sequences, 1141125024 bases, 991125054 kmers +read 5100000 sequences, 1164319107 bases, 1011319137 kmers +read 5200000 sequences, 1187390563 bases, 1031390593 kmers +read 5300000 sequences, 1211053129 bases, 1052053159 kmers +read 5400000 sequences, 1234026672 bases, 1072026702 kmers +read 5500000 sequences, 1257295769 bases, 1092295799 kmers +read 5600000 sequences, 1279760698 bases, 1111760728 kmers +read 5700000 sequences, 1303188807 bases, 1132188837 kmers +read 5800000 sequences, 1326902250 bases, 1152902280 kmers +read 5900000 sequences, 1350165652 bases, 1173165682 kmers +read 6000000 sequences, 1373185888 bases, 1193185918 kmers +read 6100000 sequences, 1396446455 bases, 1213446485 kmers +read 6200000 sequences, 1420887422 bases, 1234887452 kmers +read 6300000 sequences, 1444176084 bases, 1255176114 kmers +read 6400000 sequences, 1467761803 bases, 1275761833 kmers +read 6500000 sequences, 1491517469 bases, 1296517499 kmers +read 6600000 sequences, 1515086149 bases, 1317086179 kmers +read 6700000 sequences, 1537506202 bases, 1336506232 kmers +read 6800000 sequences, 1560946391 bases, 1356946421 kmers +read 6900000 sequences, 1583945488 bases, 1376945518 kmers +read 7000000 sequences, 1606825999 bases, 1396826029 kmers +read 7100000 sequences, 1630889570 bases, 1417889600 kmers +read 7200000 sequences, 1653502338 bases, 1437502368 kmers +read 7300000 sequences, 1676836074 bases, 1457836104 kmers +read 7400000 sequences, 1700581893 bases, 1478581923 kmers +read 7500000 sequences, 1723991216 bases, 1498991246 kmers +read 7600000 sequences, 1747267694 bases, 1519267724 kmers +read 7700000 sequences, 1769997128 bases, 1538997158 kmers +read 7800000 sequences, 1793090725 bases, 1559090755 kmers +read 7900000 sequences, 1816572169 bases, 1579572199 kmers +read 8000000 sequences, 1839912405 bases, 1599912435 kmers +read 8100000 sequences, 1863462142 bases, 1620462172 kmers +read 8200000 sequences, 1887689183 bases, 1641689213 kmers +read 8300000 sequences, 1911245326 bases, 1662245356 kmers +read 8400000 sequences, 1934891774 bases, 1682891804 kmers +read 8500000 sequences, 1958265360 bases, 1703265390 kmers +read 8600000 sequences, 1981114530 bases, 1723114560 kmers +read 8700000 sequences, 2005160537 bases, 1744160567 kmers +read 8800000 sequences, 2028270585 bases, 1764270615 kmers +read 8900000 sequences, 2051383223 bases, 1784383253 kmers +read 9000000 sequences, 2074474142 bases, 1804474172 kmers +read 9100000 sequences, 2096460797 bases, 1823460827 kmers +read 9200000 sequences, 2119508963 bases, 1843508993 kmers +read 9300000 sequences, 2142674047 bases, 1863674077 kmers +read 9400000 sequences, 2164744513 bases, 1882744543 kmers +read 9500000 sequences, 2187346618 bases, 1902346648 kmers +read 9600000 sequences, 2209977347 bases, 1921977377 kmers +read 9700000 sequences, 2232411621 bases, 1941411651 kmers +read 9800000 sequences, 2254902856 bases, 1960902886 kmers +read 9900000 sequences, 2277498326 bases, 1980498356 kmers +read 10000000 sequences, 2299499706 bases, 1999499736 kmers +read 10100000 sequences, 2321026083 bases, 2018026113 kmers +read 10200000 sequences, 2343732502 bases, 2037732532 kmers +read 10300000 sequences, 2364673146 bases, 2055673176 kmers +read 10400000 sequences, 2386756547 bases, 2074756577 kmers +read 10500000 sequences, 2407972829 bases, 2092972859 kmers +read 10600000 sequences, 2429720496 bases, 2111720526 kmers +read 10700000 sequences, 2450999850 bases, 2129999880 kmers +read 10800000 sequences, 2471991237 bases, 2147991267 kmers +read 10900000 sequences, 2492905716 bases, 2165905746 kmers +read 11000000 sequences, 2514209537 bases, 2184209567 kmers +read 11100000 sequences, 2535680432 bases, 2202680462 kmers +read 11200000 sequences, 2556527106 bases, 2220527136 kmers +read 11300000 sequences, 2577149683 bases, 2238149713 kmers +read 11400000 sequences, 2597185570 bases, 2255185600 kmers +read 11500000 sequences, 2617632290 bases, 2272632320 kmers +read 11600000 sequences, 2638223488 bases, 2290223518 kmers +read 11700000 sequences, 2658091095 bases, 2307091125 kmers +read 11800000 sequences, 2676727586 bases, 2322727616 kmers +read 11900000 sequences, 2695970855 bases, 2338970885 kmers +read 12000000 sequences, 2714887902 bases, 2354887932 kmers +read 12100000 sequences, 2733216523 bases, 2370216553 kmers +read 12200000 sequences, 2751654575 bases, 2385654605 kmers +read 12300000 sequences, 2769824681 bases, 2400824711 kmers +read 12400000 sequences, 2788136547 bases, 2416136577 kmers +read 12500000 sequences, 2806066941 bases, 2431066971 kmers +read 12600000 sequences, 2823691733 bases, 2445691763 kmers +read 12700000 sequences, 2841752082 bases, 2460752112 kmers +read 12800000 sequences, 2859305620 bases, 2475305650 kmers +read 12900000 sequences, 2876642001 bases, 2489642031 kmers +read 13000000 sequences, 2893631233 bases, 2503631263 kmers +=== step 1.1: 'encoding input' 11.4051 [sec] (4.55211 [ns/kmer]) +read 13014214 sequences, 2895872181 bases, 2505445761 kmers +num_kmers 2505445761 +cost: 2.0 + 0.311662 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 7.78984 [sec] (3.10917 [ns/kmer]) +=== step 1: 'parse file' 19.1951 [sec] (7.66134 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 21.5746 [sec] (8.61108 [ns/kmer]) +num_minimizers = 386617003 +num_minimizer_positions = 425284125 +num_super_kmers = 425284125 +building minimizers MPHF with 8 threads and 129 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 25.8223 [sec] (10.3065 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.4648 [sec] (6.97072 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 9.34746 [sec] (3.73086 [ns/kmer]) +num_bits_per_offset = ceil(log2(2895872213)) = 32 +max_bucket_size 34767 +log2_max_bucket_size 16 +num_buckets_larger_than_1_not_in_skew_index 11147152/386617003 (2.88325%) +num_buckets_in_skew_index 47919/386617003 (0.0123944%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 41920449/425284125 (9.85705%) +num_minimizer_positions_of_buckets_in_skew_index 7941744/425284125 (1.8674%) +computing minimizers offsets: 4.9896 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11994340 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8728433 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5803568 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3324419 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2008903 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1146661 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 501339 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 34767: 254893 +num_kmers_in_skew_index 33762556 (1.34757%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11994340 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11994340 kmers; bits/key = 2.56071 + built positions[0] for 11994340 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8728433 + building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8728433 kmers; bits/key = 2.57731 + built positions[1] for 8728433 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5803568 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5803568 kmers; bits/key = 2.55844 + built positions[2] for 5803568 kmers; bits/key = 9.00006 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3324419 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3324419 kmers; bits/key = 3.25356 + built positions[3] for 3324419 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2008903 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2008903)... + built mphs[4] for 2008903 kmers; bits/key = 2.56016 + built positions[4] for 2008903 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1146661 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1146661)... + built mphs[5] for 1146661 kmers; bits/key = 2.56092 + built positions[5] for 1146661 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 501339 + building MPHF with 8 threads and 1 partitions (avg. partition size = 501339)... + built mphs[6] for 501339 kmers; bits/key = 2.56325 + built positions[6] for 501339 kmers; bits/key = 13.0007 + lower = 8192; upper = 34767; num_bits_per_pos = 16; num_kmers_in_partition = 254893 + building MPHF with 8 threads and 1 partitions (avg. partition size = 254893)... + built mphs[7] for 254893 kmers; bits/key = 2.42455 + built positions[7] for 254893 kmers; bits/key = 16.0014 +computing skew index took: 11.5687 [sec] +=== step 3: 'build sparse and skew index' 16.9099 [sec] (6.74927 [ns/kmer]) +=== total_time 110.314 [sec] (44.0297 [ns/kmer]) +total index size: 2754198061 [B] -- 2754.2 [MB] +SPACE BREAKDOWN: + minimizers: 0.436946 [bits/kmer] (2.8316 [bits/key]) -- 4.96853% + strings_endpoints: 0.167061 [bits/kmer] -- 1.89965% + offsets: 5.09225 [bits/kmer] -- 57.9042% + offsets2: 0.535416 [bits/kmer] -- 6.08823% + offsets3: 0.101433 [bits/kmer] -- 1.1534% + start_lists_of_size: 8.55736e-07 [bits/kmer] -- 9.7306e-06% + strings: 2.31166 [bits/kmer] -- 26.286% + skew_index: 0.149505 [bits/kmer] -- 1.70003% + weights: 5.8752e-07 [bits/kmer] -- 6.68071e-06% + -------------- + total: 8.79428 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1044% +buckets with 2 minimizer positions = 1.75374% +buckets with 3 minimizer positions = 0.449247% +buckets with 4 minimizer positions = 0.203979% +buckets with 5 minimizer positions = 0.116523% +buckets with 6 minimizer positions = 0.0751692% +buckets with 7 minimizer positions = 0.051812% +buckets with 8 minimizer positions = 0.0381574% +buckets with 9 minimizer positions = 0.0288166% +buckets with 10 minimizer positions = 0.0225926% +buckets with 11 minimizer positions = 0.0180313% +buckets with 12 minimizer positions = 0.0146659% +buckets with 13 minimizer positions = 0.0123083% +buckets with 14 minimizer positions = 0.0102678% +buckets with 15 minimizer positions = 0.00882372% +buckets with 16 minimizer positions = 0.00752295% +max_bucket_size 34767 +2025-09-22 11:46:36: saving data structure to disk... +2025-09-22 11:46:38: DONE diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log new file mode 100644 index 0000000..cff7f52 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-22 11:52:13: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-22 11:52:21: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 7886675/132860997 (5.93603%) +num_extensions = 124974322/132860997 (94.064%) +elapsed = 7183.91 millisec / 7.18391 sec / 0.119732 min / 43.9955 ns/kmer +2025-09-22 11:52:21: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-22 11:53:12: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 13101335/525542891 (2.49291%) +num_extensions = 512441556/525542891 (97.5071%) +elapsed = 50824 millisec / 50.824 sec / 0.847066 min / 73.0505 ns/kmer +2025-09-22 11:53:13: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-22 11:56:39: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437870528 (91.5856%) +num_negative_kmers = 131075447 (8.34889%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 110228289/1437870528 (7.66608%) +num_extensions = 1327642239/1437870528 (92.3339%) +elapsed = 206161 millisec / 206.161 sec / 3.43602 min / 131.315 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log new file mode 100644 index 0000000..66ac619 --- /dev/null +++ b/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-22 11:57:32: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-22 11:59:00: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 4754204 (0.683333%) +num_negative_kmers = 690972341 (99.3151%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 3613872/4754204 (76.0142%) +num_extensions = 1140332/4754204 (23.9858%) +elapsed = 87904.3 millisec / 87.9043 sec / 1.46507 min / 126.347 ns/kmer +2025-09-22 11:59:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-22 11:59:07: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 790414 (0.484063%) +num_negative_kmers = 162496946 (99.5159%) +num_invalid_kmers = 0 (0%) +num_searches = 499575/790414 (63.2042%) +num_extensions = 290839/790414 (36.7958%) +elapsed = 7198.34 millisec / 7.19834 sec / 0.119972 min / 44.0839 ns/kmer +2025-09-22 11:59:08: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-22 11:59:59: DONE +==== query report: +num_kmers = 395433242 +num_positive_kmers = 1134 (0.000286774%) +num_negative_kmers = 395408021 (99.9936%) +num_invalid_kmers = 24087 (0.00609129%) +num_searches = 895/1134 (78.9242%) +num_extensions = 239/1134 (21.0758%) +elapsed = 50901.6 millisec / 50.9016 sec / 0.848359 min / 128.724 ns/kmer From a9723354e71e2fb768bfe00d6da38ac689defae7 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 23 Sep 2025 09:13:12 +0200 Subject: [PATCH 025/112] a note in readme --- benchmarks/README.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/benchmarks/README.md b/benchmarks/README.md index 10da718..a353aa4 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -34,3 +34,44 @@ on a machine equipped with an Intel Xeon W-2245 CPU @ 3.90GHz, and running Ubunt The code was compiled with `gcc` 10.3. ![](results-14-09-25/results.png) + + +## Linux with Intel x86 vs. Apple with M1 arm + +Very interestingly, random lookup queries on an Apple M1 arm processor are much faster than +the same queries (actually, the queries are random, drawn uniformly from the set of indexed +kmers using a randomly generated seed) under Linux with an Intel x86 processor. +This matches the same observation made for PTHash, [here](https://github.com/jermp/pthash/tree/master/benchmarks). +(The performance for streaming queries is the same, instead.) + +For access queries and negative lookups, the trend is the opposite. + +#### Linux, Intel x86 + +Taken from [these logs](results-22-09-25). + + ./sshash bench -i human.k31.sshash + lookup: avg_nanosec_per_positive_lookup 880.499 + lookup_uint: avg_nanosec_per_positive_lookup 827.422 + avg_nanosec_per_negative_lookup 744.67 + avg_nanosec_per_access 512.398 + + ./sshash bench -i human.k31.canon.sshash + lookup: avg_nanosec_per_positive_lookup 702.591 + lookup_uint: avg_nanosec_per_positive_lookup 679.425 + avg_nanosec_per_negative_lookup 427.235 + avg_nanosec_per_access 510.499 + +#### Apple, M1 arm + + ./sshash bench -i human.k31.sshash + lookup: avg_nanosec_per_positive_lookup 578.065 + lookup_uint: avg_nanosec_per_positive_lookup 499.311 + avg_nanosec_per_negative_lookup 656.382 + avg_nanosec_per_access 882.288 + + ./sshash bench -i human.k31.canon.sshash + lookup: avg_nanosec_per_positive_lookup 622.091 + lookup_uint: avg_nanosec_per_positive_lookup 604.484 + avg_nanosec_per_negative_lookup 878.432 + avg_nanosec_per_access 886.565 From cfc22a20b98c82303b6bc5cb0ce28abc06f23b74 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 23 Sep 2025 15:53:52 +0200 Subject: [PATCH 026/112] perf lookup by list size --- include/util.hpp | 9 ++++ src/dictionary.cpp | 16 +++++-- tools/perf.hpp | 106 +++++++++++++++++++++++++++++++++++++-------- tools/sshash.cpp | 10 +++-- 4 files changed, 116 insertions(+), 25 deletions(-) diff --git a/include/util.hpp b/include/util.hpp index a52dc21..1866daa 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -36,6 +36,14 @@ struct lookup_result { , kmer_orientation(constants::forward_orientation) , contig_id(constants::invalid_uint64) , contig_size(constants::invalid_uint64) + + /* + The kmer's minimizer occurs for `list_size` times. + If `list_size` == -1, then the minimizer is part of + the skew index. + */ + , list_size(constants::invalid_uint64) + , minimizer_found(mf) {} uint64_t kmer_id; // "absolute" kmer-id @@ -43,6 +51,7 @@ struct lookup_result { int64_t kmer_orientation; uint64_t contig_id; uint64_t contig_size; + uint64_t list_size; bool minimizer_found; uint64_t contig_begin(const uint64_t k) const { // diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 265a9af..3f3399b 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -23,7 +23,9 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, uint64_t status = code & 1; if (status == 0) { // minimizer occurs once uint64_t offset = code >> 1; - return m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); + auto res = m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); + res.list_size = 1; + return res; } status = code & 3; @@ -35,7 +37,9 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, assert(list_size < m_buckets.start_lists_of_size.size()); uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; uint64_t end = begin + list_size; - return m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); + auto res = m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); + res.list_size = list_size; + return res; } // minimizer is part of the skew index @@ -93,9 +97,11 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t uint64_t status = code & 1; if (status == 0) { // minimizer occurs once uint64_t offset = code >> 1; - return m_buckets.lookup_canonical_at_offset( // + auto res = m_buckets.lookup_canonical_at_offset( // offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // ); + res.list_size = 1; + return res; } status = code & 3; @@ -107,9 +113,11 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t assert(list_size < m_buckets.start_lists_of_size.size()); uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; uint64_t end = begin + list_size; - return m_buckets.lookup_canonical( // + auto res = m_buckets.lookup_canonical( // begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // ); + res.list_size = list_size; + return res; } // minimizer is part of the skew index diff --git a/tools/perf.hpp b/tools/perf.hpp index 3036d5e..cc71d85 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -21,6 +21,76 @@ void perf_test_iterator(dictionary const& dict) { std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; } +template +void perf_test_lookup_by_list_size(dictionary const& dict) { + constexpr uint64_t num_queries = 1000000; + constexpr uint64_t runs = 5; + const uint64_t k = dict.k(); + + const uint64_t min_size = 1ULL << constants::min_l; + std::vector> lookup_queries(min_size + 2); + for (auto& v : lookup_queries) v.reserve(num_queries); + { + uint64_t i = 0; + auto it = dict.begin(); + while (it.has_next()) { + auto [_, kmer] = it.next(); + auto res = dict.lookup_advanced(kmer.c_str()); + if (res.list_size == constants::invalid_uint64) { + if (lookup_queries[res.list_size + 1].size() < num_queries) { + lookup_queries[res.list_size + 1].push_back(kmer); + } + } else { + assert(res.list_size > 0 and res.list_size <= min_size); + if (lookup_queries[res.list_size].size() < num_queries) { + lookup_queries[res.list_size].push_back(kmer); + } + } + ++i; + if (i % 100000000 == 0) std::cout << i << " kmers" << std::endl; + if (i == 1000000000) break; + } + } + + { + std::string kmer_rc(k, 0); + for (auto& v : lookup_queries) { + std::mt19937 g(essentials::get_random_seed()); + std::shuffle(v.begin(), v.end(), g); + assert(v.size() <= num_queries); + // if (v.size() > num_queries) v.resize(num_queries); + for (uint64_t i = 1; i < v.size(); i += 2) { + /* transform 50% of the kmers into their reverse complements */ + kmer_t::compute_reverse_complement(v[i].data(), kmer_rc.data(), k); + v[i] = kmer_rc; + } + } + } + + for (uint64_t list_size = 1; list_size <= min_size + 1; ++list_size) { + if (lookup_queries[list_size].empty()) continue; + perf::timer_type t; + t.start(); + for (uint64_t r = 0; r != runs; ++r) { + for (auto const& string : lookup_queries[list_size]) { + auto id = dict.lookup(string.c_str()); + essentials::do_not_optimize_away(id); + } + } + t.stop(); + double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries[list_size].size()); + std::cout << "list_size "; + if (list_size <= min_size) { + std::cout << "= " << list_size; + } else { + std::cout << "> " << min_size; + } + std::cout << ": avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + std::cout << " (avg. among " << lookup_queries[list_size].size() << " queries)" + << std::endl; + } +} + template void perf_test_lookup_access(dictionary const& dict) { constexpr uint64_t num_queries = 1000000; @@ -60,24 +130,24 @@ void perf_test_lookup_access(dictionary const& dict) { double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); std::cout << "lookup: avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - std::vector lookup_queries_uint; - lookup_queries_uint.reserve(num_queries); - for (auto const& kmer : lookup_queries) { - kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); - lookup_queries_uint.push_back(uint_kmer); - } - t.reset(); - t.start(); - for (uint64_t r = 0; r != runs; ++r) { - for (auto uint_kmer : lookup_queries_uint) { - auto id = dict.lookup_uint(uint_kmer); - essentials::do_not_optimize_away(id); - } - } - t.stop(); - nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup - << std::endl; + // std::vector lookup_queries_uint; + // lookup_queries_uint.reserve(num_queries); + // for (auto const& kmer : lookup_queries) { + // kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); + // lookup_queries_uint.push_back(uint_kmer); + // } + // t.reset(); + // t.start(); + // for (uint64_t r = 0; r != runs; ++r) { + // for (auto uint_kmer : lookup_queries_uint) { + // auto id = dict.lookup_uint(uint_kmer); + // essentials::do_not_optimize_away(id); + // } + // } + // t.stop(); + // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); + // std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup + // << std::endl; // std::vector> lookup_queries_uint_minimizer; // lookup_queries_uint_minimizer.reserve(num_queries); diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 62d81de..4b72d08 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -45,9 +45,13 @@ int bench(int argc, char** argv) { bool verbose = parser.get("verbose"); dictionary dict; load_dictionary(dict, index_filename, verbose); - perf_test_lookup_access(dict); - if (dict.weighted()) perf_test_lookup_weight(dict); - perf_test_iterator(dict); + + perf_test_lookup_by_list_size(dict); + + // perf_test_lookup_access(dict); + // if (dict.weighted()) perf_test_lookup_weight(dict); + // perf_test_iterator(dict); + return 0; } From 3c698d725084f467df53047423e13cdc71639116 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 25 Sep 2025 14:05:29 +0200 Subject: [PATCH 027/112] updated results to 22/09/25 --- benchmarks/README.md | 16 +- .../k63/22-09-25.canon.bench_log | 15 + .../k63/22-09-25.canon.build_log | 383 ++++++++++++++++++ ...2-09-25.canon.high-hit.streaming_query_log | 30 ++ ...22-09-25.canon.low-hit.streaming_query_log | 30 ++ .../k63/22-09-25.regular.bench_log | 15 + .../k63/22-09-25.regular.build_log | 372 +++++++++++++++++ ...09-25.regular.high-hit.streaming_query_log | 30 ++ ...-09-25.regular.low-hit.streaming_query_log | 30 ++ benchmarks/results-22-09-25/results.png | Bin 0 -> 404609 bytes 10 files changed, 911 insertions(+), 10 deletions(-) create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.build_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.build_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log create mode 100644 benchmarks/results-22-09-25/results.png diff --git a/benchmarks/README.md b/benchmarks/README.md index a353aa4..a921284 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -29,11 +29,11 @@ bash ../script/streaming-query-low-hit.sh [prefix] where `[prefix]` should be replaced by a suitable basename, e.g., the current date. -These are the results obtained on 14/09/25 (see logs [here](results-14-09-25)) +These are the results obtained on 22/09/25 (see logs [here](results-22-09-25)) on a machine equipped with an Intel Xeon W-2245 CPU @ 3.90GHz, and running Ubuntu 18.04.6. The code was compiled with `gcc` 10.3. -![](results-14-09-25/results.png) +![](results-22-09-25/results.png) ## Linux with Intel x86 vs. Apple with M1 arm @@ -51,27 +51,23 @@ For access queries and negative lookups, the trend is the opposite. Taken from [these logs](results-22-09-25). ./sshash bench -i human.k31.sshash - lookup: avg_nanosec_per_positive_lookup 880.499 - lookup_uint: avg_nanosec_per_positive_lookup 827.422 + avg_nanosec_per_positive_lookup 880.499 avg_nanosec_per_negative_lookup 744.67 avg_nanosec_per_access 512.398 ./sshash bench -i human.k31.canon.sshash - lookup: avg_nanosec_per_positive_lookup 702.591 - lookup_uint: avg_nanosec_per_positive_lookup 679.425 + avg_nanosec_per_positive_lookup 702.591 avg_nanosec_per_negative_lookup 427.235 avg_nanosec_per_access 510.499 #### Apple, M1 arm ./sshash bench -i human.k31.sshash - lookup: avg_nanosec_per_positive_lookup 578.065 - lookup_uint: avg_nanosec_per_positive_lookup 499.311 + avg_nanosec_per_positive_lookup 578.065 avg_nanosec_per_negative_lookup 656.382 avg_nanosec_per_access 882.288 ./sshash bench -i human.k31.canon.sshash - lookup: avg_nanosec_per_positive_lookup 622.091 - lookup_uint: avg_nanosec_per_positive_lookup 604.484 + avg_nanosec_per_positive_lookup 622.091 avg_nanosec_per_negative_lookup 878.432 avg_nanosec_per_access 886.565 diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log new file mode 100644 index 0000000..22a4db8 --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log @@ -0,0 +1,15 @@ +lookup: avg_nanosec_per_positive_lookup 735.896 +lookup_uint: avg_nanosec_per_positive_lookup 639.714 +avg_nanosec_per_negative_lookup 492.637 +avg_nanosec_per_access 383.641 +iterator: avg_nanosec_per_kmer 21.4101 +lookup: avg_nanosec_per_positive_lookup 654.075 +lookup_uint: avg_nanosec_per_positive_lookup 563.22 +avg_nanosec_per_negative_lookup 517.91 +avg_nanosec_per_access 442.89 +iterator: avg_nanosec_per_kmer 21.3375 +lookup: avg_nanosec_per_positive_lookup 864.983 +lookup_uint: avg_nanosec_per_positive_lookup 760.047 +avg_nanosec_per_negative_lookup 545.579 +avg_nanosec_per_access 492.503 +iterator: avg_nanosec_per_kmer 21.3217 diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log new file mode 100644 index 0000000..c864754 --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log @@ -0,0 +1,383 @@ +k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 63806937 bases, 57606999 kmers +read 200000 sequences, 129066588 bases, 116666650 kmers +read 300000 sequences, 192862556 bases, 174262618 kmers +read 400000 sequences, 256212661 bases, 231412723 kmers +read 500000 sequences, 319282064 bases, 288282126 kmers +read 600000 sequences, 379117165 bases, 341917227 kmers +read 700000 sequences, 436654305 bases, 393254367 kmers +read 800000 sequences, 492876125 bases, 443276187 kmers +read 900000 sequences, 547344740 bases, 491544802 kmers +read 1000000 sequences, 598624540 bases, 536624602 kmers +=== step 1.1: 'encoding input' 2.30271 [sec] (4.13721 [ns/kmer]) +read 1049410 sequences, 621649078 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.233795 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.50597 [sec] (2.70572 [ns/kmer]) +=== step 1: 'parse file' 3.80885 [sec] (6.84325 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 1.73063 [sec] (3.10936 [ns/kmer]) +num_minimizers = 28491340 +num_minimizer_positions = 34043772 +num_super_kmers = 35742796 +building minimizers MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.21848 [sec] (3.98588 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.30838 [sec] (2.35072 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.396595 [sec] (0.71255 [ns/kmer]) +num_bits_per_offset = ceil(log2(621649142)) = 30 +max_bucket_size 890626 +log2_max_bucket_size 20 +num_buckets_larger_than_1_not_in_skew_index 1198106/28491340 (4.20516%) +num_buckets_in_skew_index 5680/28491340 (0.0199359%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 4772225/34043772 (14.0179%) +num_minimizer_positions_of_buckets_in_skew_index 1983993/34043772 (5.82777%) +computing minimizers offsets: 0.514023 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5364171 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3558842 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2165544 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1626075 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 914447 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1132014 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 713220 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 890626: 4875198 +num_kmers_in_skew_index 20349511 (3.65613%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5364171 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 5364171 kmers; bits/key = 2.65405 + built positions[0] for 5364171 kmers; bits/key = 7.00007 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3558842 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3558842 kmers; bits/key = 3.06667 + built positions[1] for 3558842 kmers; bits/key = 8.0001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2165544 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2165544)... + built mphs[2] for 2165544 kmers; bits/key = 2.56007 + built positions[2] for 2165544 kmers; bits/key = 9.00016 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1626075 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1626075)... + built mphs[3] for 1626075 kmers; bits/key = 2.56039 + built positions[3] for 1626075 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 914447 + building MPHF with 8 threads and 1 partitions (avg. partition size = 914447)... + built mphs[4] for 914447 kmers; bits/key = 2.56134 + built positions[4] for 914447 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1132014 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1132014)... + built mphs[5] for 1132014 kmers; bits/key = 2.5609 + built positions[5] for 1132014 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 713220 + building MPHF with 8 threads and 1 partitions (avg. partition size = 713220)... + built mphs[6] for 713220 kmers; bits/key = 2.4192 + built positions[6] for 713220 kmers; bits/key = 13.0005 + lower = 8192; upper = 890626; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4875198 kmers; bits/key = 2.70263 + built positions[7] for 4875198 kmers; bits/key = 20.0001 +computing skew index took: 7.8054 [sec] +=== step 3: 'build sparse and skew index' 8.34865 [sec] (14.9998 [ns/kmer]) +=== total_time 17.8116 [sec] (32.0015 [ns/kmer]) +total index size: 345772245 [B] -- 345.772 [MB] +SPACE BREAKDOWN: + minimizers: 0.150699 [bits/kmer] (2.94394 [bits/key]) -- 3.03222% + strings_endpoints: 0.118377 [bits/kmer] -- 2.38188% + offsets: 1.58688 [bits/kmer] -- 31.9297% + offsets2: 0.257224 [bits/kmer] -- 5.17563% + offsets3: 0.106938 [bits/kmer] -- 2.15171% + start_lists_of_size: 3.85206e-06 [bits/kmer] -- 7.75077e-05% + strings: 2.2338 [bits/kmer] -- 44.9464% + skew_index: 0.51599 [bits/kmer] -- 10.3823% + weights: 2.6447e-06 [bits/kmer] -- 5.32142e-05% + -------------- + total: 4.96991 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.7749% +buckets with 2 minimizer positions = 2.30651% +buckets with 3 minimizer positions = 0.761358% +buckets with 4 minimizer positions = 0.355666% +buckets with 5 minimizer positions = 0.200977% +buckets with 6 minimizer positions = 0.12653% +buckets with 7 minimizer positions = 0.0847696% +buckets with 8 minimizer positions = 0.0617767% +buckets with 9 minimizer positions = 0.0458174% +buckets with 10 minimizer positions = 0.0352669% +buckets with 11 minimizer positions = 0.0280963% +buckets with 12 minimizer positions = 0.022821% +buckets with 13 minimizer positions = 0.0187285% +buckets with 14 minimizer positions = 0.0154047% +buckets with 15 minimizer positions = 0.0133093% +buckets with 16 minimizer positions = 0.0113754% +max_bucket_size 890626 +2025-09-23 16:22:40: saving data structure to disk... +2025-09-23 16:22:40: DONE +k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 796964911 bases, 790764973 kmers +=== step 1.1: 'encoding input' 4.36744 [sec] (3.78051 [ns/kmer]) +read 158680 sequences, 1165088827 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0170321 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 3.1119 [sec] (2.6937 [ns/kmer]) +=== step 1: 'parse file' 7.47946 [sec] (6.47432 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 3.44959 [sec] (2.98601 [ns/kmer]) +num_minimizers = 67109831 +num_minimizer_positions = 67978497 +num_super_kmers = 71741056 +building minimizers MPHF with 8 threads and 23 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 4.15503 [sec] (3.59665 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.7257 [sec] (2.3594 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.739574 [sec] (0.640185 [ns/kmer]) +num_bits_per_offset = ceil(log2(1165088891)) = 31 +max_bucket_size 2836 +log2_max_bucket_size 12 +num_buckets_larger_than_1_not_in_skew_index 321047/67109831 (0.47839%) +num_buckets_in_skew_index 892/67109831 (0.00132916%) +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 1060983/67978497 (1.56076%) +num_minimizer_positions_of_buckets_in_skew_index 129622/67978497 (0.190681%) +computing minimizers offsets: 0.575935 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 936900 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 646176 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 458164 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2836: 40401 +num_kmers_in_skew_index 2311880 (0.200119%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 936900 + building MPHF with 8 threads and 1 partitions (avg. partition size = 936900)... + built mphs[0] for 936900 kmers; bits/key = 2.41855 + built positions[0] for 936900 kmers; bits/key = 7.00038 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 646176 + building MPHF with 8 threads and 1 partitions (avg. partition size = 646176)... + built mphs[1] for 646176 kmers; bits/key = 2.41958 + built positions[1] for 646176 kmers; bits/key = 8.0005 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 458164 + building MPHF with 8 threads and 1 partitions (avg. partition size = 458164)... + built mphs[2] for 458164 kmers; bits/key = 2.42072 + built positions[2] for 458164 kmers; bits/key = 9.00079 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 + building MPHF with 8 threads and 1 partitions (avg. partition size = 209599)... + built mphs[3] for 209599 kmers; bits/key = 2.42681 + built positions[3] for 209599 kmers; bits/key = 10.0016 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 + building MPHF with 8 threads and 1 partitions (avg. partition size = 20640)... + built mphs[4] for 20640 kmers; bits/key = 2.51938 + built positions[4] for 20640 kmers; bits/key = 11.0171 + lower = 2048; upper = 2836; num_bits_per_pos = 12; num_kmers_in_partition = 40401 + building MPHF with 8 threads and 1 partitions (avg. partition size = 40401)... + built mphs[5] for 40401 kmers; bits/key = 2.46845 + built positions[5] for 40401 kmers; bits/key = 12.0092 +computing skew index took: 1.56144 [sec] +=== step 3: 'build sparse and skew index' 2.19377 [sec] (1.89896 [ns/kmer]) +=== total_time 20.7431 [sec] (17.9555 [ns/kmer]) +total index size: 605398091 [B] -- 605.398 [MB] +SPACE BREAKDOWN: + minimizers: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 3.99682% + strings_endpoints: 0.0958626 [bits/kmer] -- 2.28662% + offsets: 1.85892 [bits/kmer] -- 44.341% + offsets2: 0.0284707 [bits/kmer] -- 0.679115% + offsets3: 0.00347857 [bits/kmer] -- 0.0829748% + start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.42684e-05% + strings: 2.01703 [bits/kmer] -- 48.1125% + skew_index: 0.0209999 [bits/kmer] -- 0.500913% + weights: 1.27418e-06 [bits/kmer] -- 3.03932e-05% + -------------- + total: 4.19232 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.5203% +buckets with 2 minimizer positions = 0.325268% +buckets with 3 minimizer positions = 0.0665655% +buckets with 4 minimizer positions = 0.028209% +buckets with 5 minimizer positions = 0.0153256% +buckets with 6 minimizer positions = 0.00941591% +buckets with 7 minimizer positions = 0.00646701% +buckets with 8 minimizer positions = 0.00453585% +buckets with 9 minimizer positions = 0.00351811% +buckets with 10 minimizer positions = 0.00259873% +buckets with 11 minimizer positions = 0.002031% +buckets with 12 minimizer positions = 0.00171659% +buckets with 13 minimizer positions = 0.00146476% +buckets with 14 minimizer positions = 0.00115482% +buckets with 15 minimizer positions = 0.000958131% +buckets with 16 minimizer positions = 0.000908958% +max_bucket_size 2836 +2025-09-23 16:23:01: saving data structure to disk... +2025-09-23 16:23:01: DONE +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 105696573 bases, 99496635 kmers +read 200000 sequences, 214697764 bases, 202297826 kmers +read 300000 sequences, 314555962 bases, 295956024 kmers +read 400000 sequences, 417096019 bases, 392296081 kmers +read 500000 sequences, 531577423 bases, 500577485 kmers +read 600000 sequences, 641881766 bases, 604681828 kmers +read 700000 sequences, 753533625 bases, 710133687 kmers +read 800000 sequences, 860572728 bases, 810972790 kmers +read 900000 sequences, 966201746 bases, 910401808 kmers +read 1000000 sequences, 1074799974 bases, 1012800036 kmers +read 1100000 sequences, 1177786303 bases, 1109586365 kmers +read 1200000 sequences, 1284445481 bases, 1210045543 kmers +read 1300000 sequences, 1387959208 bases, 1307359270 kmers +read 1400000 sequences, 1496344159 bases, 1409544221 kmers +read 1500000 sequences, 1601642232 bases, 1508642294 kmers +read 1600000 sequences, 1704579905 bases, 1605379967 kmers +read 1700000 sequences, 1809734567 bases, 1704334629 kmers +read 1800000 sequences, 1913668987 bases, 1802069049 kmers +read 1900000 sequences, 2015410398 bases, 1897610460 kmers +read 2000000 sequences, 2111050791 bases, 1987050853 kmers +read 2100000 sequences, 2208479896 bases, 2078279958 kmers +read 2200000 sequences, 2297838310 bases, 2161438372 kmers +read 2300000 sequences, 2384042166 bases, 2241442228 kmers +read 2400000 sequences, 2476010359 bases, 2327210421 kmers +read 2500000 sequences, 2554605267 bases, 2399605329 kmers +read 2600000 sequences, 2632827152 bases, 2471627214 kmers +read 2700000 sequences, 2705855836 bases, 2538455898 kmers +read 2800000 sequences, 2777866668 bases, 2604266730 kmers +read 2900000 sequences, 2846376916 bases, 2666576978 kmers +read 3000000 sequences, 2913930048 bases, 2727930110 kmers +=== step 1.1: 'encoding input' 11.1348 [sec] (4.01861 [ns/kmer]) +read 3079563 sequences, 2961741299 bases, 2770808393 kmers +num_kmers 2770808393 +cost: 2.0 + 0.137817 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 7.65458 [sec] (2.76258 [ns/kmer]) +=== step 1: 'parse file' 18.7895 [sec] (6.78123 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 8.38571 [sec] (3.02645 [ns/kmer]) +num_minimizers = 143944326 +num_minimizer_positions = 168540022 +num_super_kmers = 177417418 +building minimizers MPHF with 8 threads and 48 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 9.11584 [sec] (3.28996 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.93647 [sec] (2.50341 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.11908 [sec] (0.764788 [ns/kmer]) +num_bits_per_offset = ceil(log2(2961741363)) = 32 +max_bucket_size 95788 +log2_max_bucket_size 17 +num_buckets_larger_than_1_not_in_skew_index 4117627/143944326 (2.86057%) +num_buckets_in_skew_index 38186/143944326 (0.0265283%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 16761511/168540022 (9.94512%) +num_minimizer_positions_of_buckets_in_skew_index 11989998/168540022 (7.11404%) +computing minimizers offsets: 2.27826 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28814291 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26301059 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23811843 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20591065 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19598470 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18267389 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13542165 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95788: 27801549 +num_kmers_in_skew_index 178727831 (6.45039%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28814291 + building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28814291 kmers; bits/key = 2.54378 + built positions[0] for 28814291 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26301059 + building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26301059 kmers; bits/key = 2.55149 + built positions[1] for 26301059 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23811843 + building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 23811843 kmers; bits/key = 2.55863 + built positions[2] for 23811843 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20591065 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 20591065 kmers; bits/key = 2.53983 + built positions[3] for 20591065 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19598470 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[4] for 19598470 kmers; bits/key = 2.58178 + built positions[4] for 19598470 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18267389 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[5] for 18267389 kmers; bits/key = 2.5988 + built positions[5] for 18267389 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13542165 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 13542165 kmers; bits/key = 2.63222 + built positions[6] for 13542165 kmers; bits/key = 13 + lower = 8192; upper = 95788; num_bits_per_pos = 17; num_kmers_in_partition = 27801549 + building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[7] for 27801549 kmers; bits/key = 2.57505 + built positions[7] for 27801549 kmers; bits/key = 17 +computing skew index took: 37.3858 [sec] +=== step 3: 'build sparse and skew index' 39.8074 [sec] (14.3667 [ns/kmer]) +=== total_time 85.154 [sec] (30.7325 [ns/kmer]) +total index size: 1836738632 [B] -- 1836.74 [MB] +SPACE BREAKDOWN: + minimizers: 0.146815 [bits/kmer] (2.82607 [bits/key]) -- 2.76847% + strings_endpoints: 0.115014 [bits/kmer] -- 2.1688% + offsets: 1.71436 [bits/kmer] -- 32.3274% + offsets2: 0.193578 [bits/kmer] -- 3.65028% + offsets3: 0.138472 [bits/kmer] -- 2.61115% + start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.45911e-05% + strings: 2.13782 [bits/kmer] -- 40.3125% + skew_index: 0.857054 [bits/kmer] -- 16.1613% + weights: 5.31253e-07 [bits/kmer] -- 1.00178e-05% + -------------- + total: 5.30311 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1129% +buckets with 2 minimizer positions = 1.66462% +buckets with 3 minimizer positions = 0.467231% +buckets with 4 minimizer positions = 0.212029% +buckets with 5 minimizer positions = 0.120713% +buckets with 6 minimizer positions = 0.0773542% +buckets with 7 minimizer positions = 0.0538271% +buckets with 8 minimizer positions = 0.039179% +buckets with 9 minimizer positions = 0.0302666% +buckets with 10 minimizer positions = 0.0237182% +buckets with 11 minimizer positions = 0.0193575% +buckets with 12 minimizer positions = 0.0158631% +buckets with 13 minimizer positions = 0.013326% +buckets with 14 minimizer positions = 0.0114822% +buckets with 15 minimizer positions = 0.00985728% +buckets with 16 minimizer positions = 0.00859013% +max_bucket_size 95788 +2025-09-23 16:24:27: saving data structure to disk... +2025-09-23 16:24:28: DONE diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log new file mode 100644 index 0000000..39a7d5e --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-23 16:31:58: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-23 16:32:07: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34555279/67275966 (51.3635%) +num_extensions = 32720687/67275966 (48.6365%) +elapsed = 9090.23 millisec / 9.09023 sec / 0.151504 min / 92.7835 ns/kmer +2025-09-23 16:32:07: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-23 16:32:50: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149842881/293470517 (51.0589%) +num_extensions = 143627636/293470517 (48.9411%) +elapsed = 43002.5 millisec / 43.0025 sec / 0.716709 min / 93.2034 ns/kmer +2025-09-23 16:32:51: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-23 16:34:26: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406484348 (85.0709%) +num_negative_kmers = 70660348 (14.7881%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 220326145/406484348 (54.2029%) +num_extensions = 186158203/406484348 (45.7971%) +elapsed = 95445 millisec / 95.445 sec / 1.59075 min / 199.752 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log new file mode 100644 index 0000000..36d95ea --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-23 16:35:31: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-23 16:36:00: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 756097 (0.163876%) +num_negative_kmers = 460616752 (99.8337%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 631375/756097 (83.5045%) +num_extensions = 124722/756097 (16.4955%) +elapsed = 29558.2 millisec / 29.5582 sec / 0.492637 min / 64.0643 ns/kmer +2025-09-23 16:36:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-23 16:36:04: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 41066 (0.0419159%) +num_negative_kmers = 97931350 (99.9581%) +num_invalid_kmers = 0 (0%) +num_searches = 39909/41066 (97.1826%) +num_extensions = 1157/41066 (2.81742%) +elapsed = 4090.97 millisec / 4.09097 sec / 0.0681828 min / 41.7563 ns/kmer +2025-09-23 16:36:05: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-23 16:36:22: DONE +==== query report: +num_kmers = 322085785 +num_positive_kmers = 8 (2.48381e-06%) +num_negative_kmers = 322073557 (99.9962%) +num_invalid_kmers = 12220 (0.00379402%) +num_searches = 7/8 (87.5%) +num_extensions = 1/8 (12.5%) +elapsed = 17016.8 millisec / 17.0168 sec / 0.283613 min / 52.833 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log new file mode 100644 index 0000000..20ef0a7 --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log @@ -0,0 +1,15 @@ +lookup: avg_nanosec_per_positive_lookup 825.592 +lookup_uint: avg_nanosec_per_positive_lookup 700.603 +avg_nanosec_per_negative_lookup 742.499 +avg_nanosec_per_access 380.348 +iterator: avg_nanosec_per_kmer 21.454 +lookup: avg_nanosec_per_positive_lookup 743.867 +lookup_uint: avg_nanosec_per_positive_lookup 626.492 +avg_nanosec_per_negative_lookup 794.711 +avg_nanosec_per_access 439.499 +iterator: avg_nanosec_per_kmer 21.3152 +lookup: avg_nanosec_per_positive_lookup 1000.88 +lookup_uint: avg_nanosec_per_positive_lookup 889.295 +avg_nanosec_per_negative_lookup 868.472 +avg_nanosec_per_access 493.09 +iterator: avg_nanosec_per_kmer 21.3136 diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log new file mode 100644 index 0000000..adccf07 --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log @@ -0,0 +1,372 @@ +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 63806937 bases, 57606999 kmers +read 200000 sequences, 129066588 bases, 116666650 kmers +read 300000 sequences, 192862556 bases, 174262618 kmers +read 400000 sequences, 256212661 bases, 231412723 kmers +read 500000 sequences, 319282064 bases, 288282126 kmers +read 600000 sequences, 379117165 bases, 341917227 kmers +read 700000 sequences, 436654305 bases, 393254367 kmers +read 800000 sequences, 492876125 bases, 443276187 kmers +read 900000 sequences, 547344740 bases, 491544802 kmers +read 1000000 sequences, 598624540 bases, 536624602 kmers +=== step 1.1: 'encoding input' 2.3 [sec] (4.13234 [ns/kmer]) +read 1049410 sequences, 621649078 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.233795 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 0.856038 [sec] (1.53802 [ns/kmer]) +=== step 1: 'parse file' 3.15616 [sec] (5.67057 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 1.37876 [sec] (2.47718 [ns/kmer]) +num_minimizers = 24274432 +num_minimizer_positions = 28219881 +num_super_kmers = 28219881 +building minimizers MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.89722 [sec] (3.40868 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.06945 [sec] (1.92144 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.431166 [sec] (0.774662 [ns/kmer]) +num_bits_per_offset = ceil(log2(621649142)) = 30 +max_bucket_size 410845 +log2_max_bucket_size 19 +num_buckets_larger_than_1_not_in_skew_index 993045/24274432 (4.09091%) +num_buckets_in_skew_index 3485/24274432 (0.0143567%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 3760523/28219881 (13.3258%) +num_minimizer_positions_of_buckets_in_skew_index 1181456/28219881 (4.18661%) +computing minimizers offsets: 0.389512 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3728511 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2195092 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1214814 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1162612 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 910692 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 980893 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 616111 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 410845: 3780697 +num_kmers_in_skew_index 14589422 (2.62124%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3728511 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3728511 kmers; bits/key = 2.94604 + built positions[0] for 3728511 kmers; bits/key = 7.00009 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2195092 + building MPHF with 8 threads and 1 partitions (avg. partition size = 2195092)... + built mphs[1] for 2195092 kmers; bits/key = 2.41717 + built positions[1] for 2195092 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1214814 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1214814)... + built mphs[2] for 1214814 kmers; bits/key = 2.41794 + built positions[2] for 1214814 kmers; bits/key = 9.0003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1162612 + building MPHF with 8 threads and 1 partitions (avg. partition size = 1162612)... + built mphs[3] for 1162612 kmers; bits/key = 2.56091 + built positions[3] for 1162612 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 910692 + building MPHF with 8 threads and 1 partitions (avg. partition size = 910692)... + built mphs[4] for 910692 kmers; bits/key = 2.4185 + built positions[4] for 910692 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 980893 + building MPHF with 8 threads and 1 partitions (avg. partition size = 980893)... + built mphs[5] for 980893 kmers; bits/key = 2.56127 + built positions[5] for 980893 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 616111 + building MPHF with 8 threads and 1 partitions (avg. partition size = 616111)... + built mphs[6] for 616111 kmers; bits/key = 2.56247 + built positions[6] for 616111 kmers; bits/key = 13.0006 + lower = 8192; upper = 410845; num_bits_per_pos = 19; num_kmers_in_partition = 3780697 + building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3780697 kmers; bits/key = 2.9111 + built positions[7] for 3780697 kmers; bits/key = 19.0001 +computing skew index took: 6.10412 [sec] +=== step 3: 'build sparse and skew index' 6.51701 [sec] (11.7089 [ns/kmer]) +=== total_time 14.4498 [sec] (25.9614 [ns/kmer]) +total index size: 311154419 [B] -- 311.154 [MB] +SPACE BREAKDOWN: + minimizers: 0.129216 [bits/kmer] (2.96278 [bits/key]) -- 2.88924% + strings_endpoints: 0.118377 [bits/kmer] -- 2.64688% + offsets: 1.35201 [bits/kmer] -- 30.2305% + offsets2: 0.202693 [bits/kmer] -- 4.53216% + offsets3: 0.0636812 [bits/kmer] -- 1.42389% + start_lists_of_size: 3.85206e-06 [bits/kmer] -- 8.61309e-05% + strings: 2.2338 [bits/kmer] -- 49.947% + skew_index: 0.372554 [bits/kmer] -- 8.3302% + weights: 2.6447e-06 [bits/kmer] -- 5.91346e-05% + -------------- + total: 4.47233 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.8947% +buckets with 2 minimizer positions = 2.3624% +buckets with 3 minimizer positions = 0.729043% +buckets with 4 minimizer positions = 0.320662% +buckets with 5 minimizer positions = 0.173973% +buckets with 6 minimizer positions = 0.108101% +buckets with 7 minimizer positions = 0.0744775% +buckets with 8 minimizer positions = 0.0531217% +buckets with 9 minimizer positions = 0.0397744% +buckets with 10 minimizer positions = 0.0304848% +buckets with 11 minimizer positions = 0.0243919% +buckets with 12 minimizer positions = 0.0200829% +buckets with 13 minimizer positions = 0.0170509% +buckets with 14 minimizer positions = 0.0139076% +buckets with 15 minimizer positions = 0.0119426% +buckets with 16 minimizer positions = 0.0105255% +max_bucket_size 410845 +2025-09-23 16:20:56: saving data structure to disk... +2025-09-23 16:20:56: DONE +k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 796964911 bases, 790764973 kmers +=== step 1.1: 'encoding input' 4.37008 [sec] (3.7828 [ns/kmer]) +read 158680 sequences, 1165088827 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0170321 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 1.78121 [sec] (1.54184 [ns/kmer]) +=== step 1: 'parse file' 6.15143 [sec] (5.32475 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 2.73686 [sec] (2.36906 [ns/kmer]) +num_minimizers = 55460750 +num_minimizer_positions = 56012507 +num_super_kmers = 56012507 +building minimizers MPHF with 8 threads and 19 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.80367 [sec] (3.2925 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.11025 [sec] (1.82666 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.625056 [sec] (0.541057 [ns/kmer]) +num_bits_per_offset = ceil(log2(1165088891)) = 31 +max_bucket_size 762 +log2_max_bucket_size 10 +num_buckets_larger_than_1_not_in_skew_index 215802/55460750 (0.389108%) +num_buckets_in_skew_index 496/55460750 (0.000894326%) +skew index num_partitions 4 +num_minimizer_positions_of_buckets_larger_than_1 703872/56012507 (1.25663%) +num_minimizer_positions_of_buckets_in_skew_index 64183/56012507 (0.114587%) +computing minimizers offsets: 0.412738 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 616638 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 406716 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 230283 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 762: 53117 +num_kmers_in_skew_index 1306754 (0.113114%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 616638 + building MPHF with 8 threads and 1 partitions (avg. partition size = 616638)... + built mphs[0] for 616638 kmers; bits/key = 2.41968 + built positions[0] for 616638 kmers; bits/key = 7.00054 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 406716 + building MPHF with 8 threads and 1 partitions (avg. partition size = 406716)... + built mphs[1] for 406716 kmers; bits/key = 2.42142 + built positions[1] for 406716 kmers; bits/key = 8.00087 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 230283 + building MPHF with 8 threads and 1 partitions (avg. partition size = 230283)... + built mphs[2] for 230283 kmers; bits/key = 2.4254 + built positions[2] for 230283 kmers; bits/key = 9.00152 + lower = 512; upper = 762; num_bits_per_pos = 10; num_kmers_in_partition = 53117 + building MPHF with 8 threads and 1 partitions (avg. partition size = 53117)... + built mphs[3] for 53117 kmers; bits/key = 2.45616 + built positions[3] for 53117 kmers; bits/key = 10.0066 +computing skew index took: 0.860879 [sec] +=== step 3: 'build sparse and skew index' 1.32153 [sec] (1.14393 [ns/kmer]) +=== total_time 16.7488 [sec] (14.498 [ns/kmer]) +total index size: 551592569 [B] -- 551.593 [MB] +SPACE BREAKDOWN: + minimizers: 0.138427 [bits/kmer] (2.88344 [bits/key]) -- 3.624% + strings_endpoints: 0.0958626 [bits/kmer] -- 2.50967% + offsets: 1.53624 [bits/kmer] -- 40.2186% + offsets2: 0.018888 [bits/kmer] -- 0.494485% + offsets3: 0.00172258 [bits/kmer] -- 0.0450971% + start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.85866e-05% + strings: 2.01703 [bits/kmer] -- 52.8057% + skew_index: 0.0115484 [bits/kmer] -- 0.302336% + weights: 1.27418e-06 [bits/kmer] -- 3.3358e-05% + -------------- + total: 3.81973 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.61% +buckets with 2 minimizer positions = 0.265774% +buckets with 3 minimizer positions = 0.0543952% +buckets with 4 minimizer positions = 0.0225998% +buckets with 5 minimizer positions = 0.012288% +buckets with 6 minimizer positions = 0.00758735% +buckets with 7 minimizer positions = 0.00520188% +buckets with 8 minimizer positions = 0.00363681% +buckets with 9 minimizer positions = 0.00272986% +buckets with 10 minimizer positions = 0.00195634% +buckets with 11 minimizer positions = 0.00165342% +buckets with 12 minimizer positions = 0.00132887% +buckets with 13 minimizer positions = 0.00112332% +buckets with 14 minimizer positions = 0.000903342% +buckets with 15 minimizer positions = 0.000802369% +buckets with 16 minimizer positions = 0.000649108% +max_bucket_size 762 +2025-09-23 16:21:13: saving data structure to disk... +2025-09-23 16:21:14: DONE +k = 63, m = 25, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' +reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... +read 100000 sequences, 105696573 bases, 99496635 kmers +read 200000 sequences, 214697764 bases, 202297826 kmers +read 300000 sequences, 314555962 bases, 295956024 kmers +read 400000 sequences, 417096019 bases, 392296081 kmers +read 500000 sequences, 531577423 bases, 500577485 kmers +read 600000 sequences, 641881766 bases, 604681828 kmers +read 700000 sequences, 753533625 bases, 710133687 kmers +read 800000 sequences, 860572728 bases, 810972790 kmers +read 900000 sequences, 966201746 bases, 910401808 kmers +read 1000000 sequences, 1074799974 bases, 1012800036 kmers +read 1100000 sequences, 1177786303 bases, 1109586365 kmers +read 1200000 sequences, 1284445481 bases, 1210045543 kmers +read 1300000 sequences, 1387959208 bases, 1307359270 kmers +read 1400000 sequences, 1496344159 bases, 1409544221 kmers +read 1500000 sequences, 1601642232 bases, 1508642294 kmers +read 1600000 sequences, 1704579905 bases, 1605379967 kmers +read 1700000 sequences, 1809734567 bases, 1704334629 kmers +read 1800000 sequences, 1913668987 bases, 1802069049 kmers +read 1900000 sequences, 2015410398 bases, 1897610460 kmers +read 2000000 sequences, 2111050791 bases, 1987050853 kmers +read 2100000 sequences, 2208479896 bases, 2078279958 kmers +read 2200000 sequences, 2297838310 bases, 2161438372 kmers +read 2300000 sequences, 2384042166 bases, 2241442228 kmers +read 2400000 sequences, 2476010359 bases, 2327210421 kmers +read 2500000 sequences, 2554605267 bases, 2399605329 kmers +read 2600000 sequences, 2632827152 bases, 2471627214 kmers +read 2700000 sequences, 2705855836 bases, 2538455898 kmers +read 2800000 sequences, 2777866668 bases, 2604266730 kmers +read 2900000 sequences, 2846376916 bases, 2666576978 kmers +read 3000000 sequences, 2913930048 bases, 2727930110 kmers +=== step 1.1: 'encoding input' 11.1331 [sec] (4.01798 [ns/kmer]) +read 3079563 sequences, 2961741299 bases, 2770808393 kmers +num_kmers 2770808393 +cost: 2.0 + 0.137817 [bits/kmer] +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.7.bin'... +=== step 1.2: 'computing minimizers tuples' 4.38803 [sec] (1.58367 [ns/kmer]) +=== step 1: 'parse file' 15.5212 [sec] (5.60168 [ns/kmer]) + == files to merge = 8 +saving tuples to 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 6.71091 [sec] (2.422 [ns/kmer]) +num_minimizers = 122641952 +num_minimizer_positions = 141137536 +num_super_kmers = 141137536 +building minimizers MPHF with 8 threads and 41 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 8.38381 [sec] (3.02576 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.50409 [sec] (1.98646 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.66107 [sec] (0.599488 [ns/kmer]) +num_bits_per_offset = ceil(log2(2961741363)) = 32 +max_bucket_size 150582 +log2_max_bucket_size 18 +num_buckets_larger_than_1_not_in_skew_index 3263958/122641952 (2.66137%) +num_buckets_in_skew_index 28699/122641952 (0.0234006%) +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 13121826/141137536 (9.29719%) +num_minimizer_positions_of_buckets_in_skew_index 8666415/141137536 (6.1404%) +computing minimizers offsets: 1.59879 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 24843684 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22063432 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19418162 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17914507 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17076822 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 13955142 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 10150958 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 150582: 20601919 +num_kmers_in_skew_index 146024626 (5.27011%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 24843684 + building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 24843684 kmers; bits/key = 2.59049 + built positions[0] for 24843684 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 22063432 + building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 22063432 kmers; bits/key = 2.59243 + built positions[1] for 22063432 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19418162 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19418162 kmers; bits/key = 2.57982 + built positions[2] for 19418162 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17914507 + building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[3] for 17914507 kmers; bits/key = 2.56993 + built positions[3] for 17914507 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17076822 + building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17076822 kmers; bits/key = 2.5501 + built positions[4] for 17076822 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 13955142 + building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 13955142 kmers; bits/key = 2.56664 + built positions[5] for 13955142 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 10150958 + building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 10150958 kmers; bits/key = 2.65462 + built positions[6] for 10150958 kmers; bits/key = 13 + lower = 8192; upper = 150582; num_bits_per_pos = 18; num_kmers_in_partition = 20601919 + building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20601919 kmers; bits/key = 2.55951 + built positions[7] for 20601919 kmers; bits/key = 18 +computing skew index took: 28.2744 [sec] +=== step 3: 'build sparse and skew index' 29.9941 [sec] (10.825 [ns/kmer]) +=== total_time 67.7751 [sec] (24.4604 [ns/kmer]) +total index size: 1659007308 [B] -- 1659.01 [MB] +SPACE BREAKDOWN: + minimizers: 0.124989 [bits/kmer] (2.82382 [bits/key]) -- 2.60939% + strings_endpoints: 0.115014 [bits/kmer] -- 2.40115% + offsets: 1.46065 [bits/kmer] -- 30.494% + offsets2: 0.151544 [bits/kmer] -- 3.16378% + offsets3: 0.100088 [bits/kmer] -- 2.08954% + start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.61542e-05% + strings: 2.13782 [bits/kmer] -- 44.6312% + skew_index: 0.699854 [bits/kmer] -- 14.6109% + weights: 5.31253e-07 [bits/kmer] -- 1.1091e-05% + -------------- + total: 4.78996 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.3152% +buckets with 2 minimizer positions = 1.58636% +buckets with 3 minimizer positions = 0.422838% +buckets with 4 minimizer positions = 0.186829% +buckets with 5 minimizer positions = 0.106346% +buckets with 6 minimizer positions = 0.0683665% +buckets with 7 minimizer positions = 0.0477504% +buckets with 8 minimizer positions = 0.0356257% +buckets with 9 minimizer positions = 0.0273895% +buckets with 10 minimizer positions = 0.0219101% +buckets with 11 minimizer positions = 0.0175666% +buckets with 12 minimizer positions = 0.0144339% +buckets with 13 minimizer positions = 0.0124484% +buckets with 14 minimizer positions = 0.0107361% +buckets with 15 minimizer positions = 0.0090222% +buckets with 16 minimizer positions = 0.00797117% +max_bucket_size 150582 +2025-09-23 16:22:22: saving data structure to disk... +2025-09-23 16:22:22: DONE diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log new file mode 100644 index 0000000..6318ff2 --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-23 16:29:06: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-23 16:29:16: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34555279/67275966 (51.3635%) +num_extensions = 32720687/67275966 (48.6365%) +elapsed = 9789.27 millisec / 9.78927 sec / 0.163155 min / 99.9186 ns/kmer +2025-09-23 16:29:16: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-23 16:30:04: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149842881/293470517 (51.0589%) +num_extensions = 143627636/293470517 (48.9411%) +elapsed = 47937.7 millisec / 47.9377 sec / 0.798961 min / 103.9 ns/kmer +2025-09-23 16:30:05: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... +2025-09-23 16:31:57: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406484348 (85.0709%) +num_negative_kmers = 70660348 (14.7881%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 220326145/406484348 (54.2029%) +num_extensions = 186158203/406484348 (45.7971%) +elapsed = 112753 millisec / 112.753 sec / 1.87922 min / 235.975 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log new file mode 100644 index 0000000..ee576da --- /dev/null +++ b/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log @@ -0,0 +1,30 @@ +2025-09-23 16:34:26: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... +2025-09-23 16:35:03: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 756097 (0.163876%) +num_negative_kmers = 460616752 (99.8337%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 631375/756097 (83.5045%) +num_extensions = 124722/756097 (16.4955%) +elapsed = 36566.9 millisec / 36.5669 sec / 0.609448 min / 79.2548 ns/kmer +2025-09-23 16:35:03: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... +2025-09-23 16:35:08: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 41066 (0.0419159%) +num_negative_kmers = 97931350 (99.9581%) +num_invalid_kmers = 0 (0%) +num_searches = 39909/41066 (97.1826%) +num_extensions = 1157/41066 (2.81742%) +elapsed = 4663.84 millisec / 4.66384 sec / 0.0777306 min / 47.6036 ns/kmer +2025-09-23 16:35:09: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... +2025-09-23 16:35:30: DONE +==== query report: +num_kmers = 322085785 +num_positive_kmers = 8 (2.48381e-06%) +num_negative_kmers = 322073557 (99.9962%) +num_invalid_kmers = 12220 (0.00379402%) +num_searches = 7/8 (87.5%) +num_extensions = 1/8 (12.5%) +elapsed = 21788.5 millisec / 21.7885 sec / 0.363142 min / 67.6483 ns/kmer diff --git a/benchmarks/results-22-09-25/results.png b/benchmarks/results-22-09-25/results.png new file mode 100644 index 0000000000000000000000000000000000000000..14f10b52ec1256efdf06af720a4401a71ac92dec GIT binary patch literal 404609 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

    K*2{V}LjjRUr@?|j+mCgQ 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�b87^Vqu_lk+8v_w98cKC4;S{J88hM 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�{Qa0*c-H18{n&S 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 QhXQ^SWK^VUBu&5mUpOd60ssI2 literal 0 HcmV?d00001 From 43dd436855b88c23dfee0bee1a64d33a356899ba Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 27 Sep 2025 00:22:23 +0200 Subject: [PATCH 028/112] added endpoints.hpp --- CMakeLists.txt | 1 - include/buckets.hpp | 253 +++++++++--------- .../builder/build_sparse_and_skew_index.hpp | 8 +- include/builder/parse_file.hpp | 22 +- include/dictionary.hpp | 128 +++++---- include/endpoints.hpp | 173 ++++++++++++ include/streaming_query.hpp | 4 +- src/build.cpp | 3 +- src/dictionary.cpp | 230 ++++++++-------- src/info.cpp | 29 +- src/query.cpp | 6 +- src/statistics.cpp | 66 ----- test/check.hpp | 23 +- test/check_from_file.hpp | 134 +++++----- tools/build.cpp | 12 +- tools/common.hpp | 2 +- tools/perf.hpp | 103 ++----- tools/sort.cpp | 221 +++++++++++++++ tools/sshash.cpp | 40 +-- 19 files changed, 874 insertions(+), 584 deletions(-) create mode 100644 include/endpoints.hpp delete mode 100644 src/statistics.cpp create mode 100644 tools/sort.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 617b38e..4c16337 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,6 @@ set(SSHASH_SOURCES src/dictionary.cpp src/query.cpp src/info.cpp - src/statistics.cpp ) # Create a static lib diff --git a/include/buckets.hpp b/include/buckets.hpp index 76fe90d..89fea2b 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -4,6 +4,7 @@ #include "util.hpp" #include "kmer_iterator.hpp" +#include "endpoints.hpp" namespace sshash { @@ -13,9 +14,13 @@ struct buckets // lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const { auto p = strings_endpoints.locate(offset); - uint64_t contig_id = p.first.pos; - uint64_t contig_begin = p.first.val; - uint64_t contig_end = p.second.val; + // uint64_t contig_id = p.first.pos; + // uint64_t contig_begin = p.first.val; + // uint64_t contig_end = p.second.val; + + uint64_t contig_id = p.string_id; + uint64_t contig_begin = p.string_begin; + uint64_t contig_end = p.string_end; /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -40,25 +45,25 @@ struct buckets // return res; } - /* Return where the contig begins and ends in strings. */ - std::pair // [begin, end) - contig_offsets(const uint64_t contig_id) const { - uint64_t begin = strings_endpoints.access(contig_id); - uint64_t end = strings_endpoints.access(contig_id + 1); - assert(end > begin); - return {begin, end}; - } - - kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_begin = strings_endpoints.access(contig_id); - return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); - } - - kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_end = strings_endpoints.access(contig_id + 1); - return util::read_kmer_at(strings, k - 1, - kmer_t::bits_per_char * (contig_end - k + 1)); - } + // /* Return where the contig begins and ends in strings. */ + // std::pair // [begin, end) + // contig_offsets(const uint64_t contig_id) const { + // uint64_t begin = strings_endpoints.access(contig_id); + // uint64_t end = strings_endpoints.access(contig_id + 1); + // assert(end > begin); + // return {begin, end}; + // } + + // kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { + // uint64_t contig_begin = strings_endpoints.access(contig_id); + // return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); + // } + + // kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { + // uint64_t contig_end = strings_endpoints.access(contig_id + 1); + // return util::read_kmer_at(strings, k - 1, + // kmer_t::bits_per_char * (contig_end - k + 1)); + // } lookup_result lookup(uint64_t begin, uint64_t end, kmer_t kmer, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // @@ -72,7 +77,7 @@ struct buckets // uint64_t pos_in_seq = offsets2.access(i); auto res = lookup_at_offset_no_check_minimizer(pos_in_seq, kmer, mini_info, k); if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); + // assert(is_valid(res)); return res; } } @@ -90,7 +95,7 @@ struct buckets // auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); if (read_kmer == kmer) { - assert(is_valid(res)); + // assert(is_valid(res)); return res; } } @@ -128,7 +133,7 @@ struct buckets // auto res = lookup_canonical_at_offset_no_check_minimizer( // pos_in_seq, kmer, kmer_rc, mini_info, k, m); if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); + // assert(is_valid(res)); return res; } } @@ -145,7 +150,7 @@ struct buckets // uint64_t pos_in_kmer = mini_info.pos_in_kmer; auto res = check_offset(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); + // assert(is_valid(res)); return res; } pos_in_kmer = k - m - mini_info.pos_in_kmer; @@ -185,11 +190,11 @@ struct buckets // auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); if (read_kmer == kmer) { - assert(is_valid(res)); + // assert(is_valid(res)); return res; } if (read_kmer == kmer_rc) { - assert(is_valid(res)); + // assert(is_valid(res)); res.kmer_orientation = constants::backward_orientation; return res; } @@ -198,29 +203,31 @@ struct buckets // return lookup_result(); } - uint64_t id_to_offset(const uint64_t id, const uint64_t k) const { - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = strings_endpoints.size() - 1; - assert(strings_endpoints.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = strings_endpoints.access(mid); - assert(val >= mid * (k - 1)); - if (id <= val - mid * (k - 1)) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < strings_endpoints.size()); - for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - uint64_t val = it.value() - lo * (k - 1); - if (val > id) break; - } - assert(lo > 0); - return id + (lo - 1) * (k - 1); + uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { + return strings_endpoints.id_to_offset(kmer_id, k); + + // constexpr uint64_t linear_scan_threshold = 32; + // uint64_t lo = 0; + // uint64_t hi = strings_endpoints.size() - 1; + // assert(strings_endpoints.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = strings_endpoints.access(mid); + // assert(val >= mid * (k - 1)); + // if (kmer_id <= val - mid * (k - 1)) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < strings_endpoints.size()); + // for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + // uint64_t val = it.value() - lo * (k - 1); + // if (val > kmer_id) break; + // } + // assert(lo > 0); + // return kmer_id + (lo - 1) * (k - 1); } void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { @@ -229,71 +236,72 @@ struct buckets // util::uint_kmer_to_string(read_kmer, string_kmer, k); } - struct iterator { - iterator() {} - - iterator(buckets const* ptr, // - const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) - const uint64_t k) - : m_buckets(ptr) - , m_begin_kmer_id(begin_kmer_id) - , m_end_kmer_id(end_kmer_id) - , m_k(k) - , m_it(ptr->strings, m_k) // - { - m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); - if (piece_end == m_offset) pos += 1; - m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); - next_piece(); - m_ret.second.resize(m_k, 0); - } - - bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } - - std::pair next() { - if (m_offset == m_next_offset - m_k + 1) { - m_offset = m_next_offset; - next_piece(); - } - m_ret.first = m_begin_kmer_id; - if (m_clear) { - util::uint_kmer_to_string(m_it.get(), m_ret.second.data(), m_k); - assert(kmer_t::bits_per_char * m_offset == m_it.position()); - m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); - } else { - memmove(m_ret.second.data(), m_ret.second.data() + 1, m_k - 1); - m_ret.second[m_k - 1] = kmer_t::uint64_to_char(m_it.get_next_char()); - } - m_clear = false; - ++m_begin_kmer_id; - ++m_offset; - return m_ret; - } - - private: - std::pair m_ret; - buckets const* m_buckets; - uint64_t m_begin_kmer_id, m_end_kmer_id; - uint64_t m_k; - uint64_t m_offset; - uint64_t m_next_offset; - kmer_iterator m_it; - bits::endpoints_sequence<>::iterator m_strings_endpoints_it; - bool m_clear; - - void next_piece() { - m_it.at(kmer_t::bits_per_char * m_offset); - m_next_offset = m_strings_endpoints_it.value(); - assert(m_next_offset > m_offset); - m_clear = true; - m_strings_endpoints_it.next(); - } - }; - - iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id, const uint64_t k) const { - return iterator(this, begin_kmer_id, end_kmer_id, k); - } + // struct iterator { + // iterator() {} + + // iterator(buckets const* ptr, // + // const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) + // const uint64_t k) + // : m_buckets(ptr) + // , m_begin_kmer_id(begin_kmer_id) + // , m_end_kmer_id(end_kmer_id) + // , m_k(k) + // , m_it(ptr->strings, m_k) // + // { + // m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); + // auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); + // if (piece_end == m_offset) pos += 1; + // m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); + // next_piece(); + // m_ret.second.resize(m_k, 0); + // } + + // bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } + + // std::pair next() { + // if (m_offset == m_next_offset - m_k + 1) { + // m_offset = m_next_offset; + // next_piece(); + // } + // m_ret.first = m_begin_kmer_id; + // if (m_clear) { + // util::uint_kmer_to_string(m_it.get(), m_ret.second.data(), m_k); + // assert(kmer_t::bits_per_char * m_offset == m_it.position()); + // m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); + // } else { + // memmove(m_ret.second.data(), m_ret.second.data() + 1, m_k - 1); + // m_ret.second[m_k - 1] = kmer_t::uint64_to_char(m_it.get_next_char()); + // } + // m_clear = false; + // ++m_begin_kmer_id; + // ++m_offset; + // return m_ret; + // } + + // private: + // std::pair m_ret; + // buckets const* m_buckets; + // uint64_t m_begin_kmer_id, m_end_kmer_id; + // uint64_t m_k; + // uint64_t m_offset; + // uint64_t m_next_offset; + // kmer_iterator m_it; + // bits::endpoints_sequence<>::iterator m_strings_endpoints_it; + // bool m_clear; + + // void next_piece() { + // m_it.at(kmer_t::bits_per_char * m_offset); + // m_next_offset = m_strings_endpoints_it.value(); + // assert(m_next_offset > m_offset); + // m_clear = true; + // m_strings_endpoints_it.next(); + // } + // }; + + // iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id, const uint64_t k) const + // { + // return iterator(this, begin_kmer_id, end_kmer_id, k); + // } uint64_t num_bits() const { return 8 * (strings_endpoints.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // @@ -311,7 +319,8 @@ struct buckets // visit_impl(visitor, *this); } - bits::endpoints_sequence<> strings_endpoints; + // bits::endpoints_sequence<> strings_endpoints; + endpoints2 strings_endpoints; std::vector start_lists_of_size; bits::compact_vector offsets; @@ -331,11 +340,11 @@ struct buckets // visitor.visit(t.strings); } - bool is_valid(lookup_result res) const { - return res.contig_size != constants::invalid_uint64 and // - res.kmer_id_in_contig < res.contig_size and // - res.contig_id < strings_endpoints.size(); // - } + // bool is_valid(lookup_result res) const { + // return res.contig_size != constants::invalid_uint64 and // + // res.kmer_id_in_contig < res.contig_size and // + // res.contig_id < strings_endpoints.size(); // + // } }; } // namespace sshash \ No newline at end of file diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index b5f1f6b..685a898 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -97,9 +97,11 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), - data.strings_endpoints.size(), - data.strings_endpoints.back()); + // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), + // data.strings_endpoints.size(), + // data.strings_endpoints.back()); + m_buckets.strings_endpoints.build(data.strings_endpoints); + m_buckets.strings.swap(data.strings); /* compute offsets2 and offsets3 */ diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index b40e46b..c37e6f7 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -7,9 +7,10 @@ namespace sshash { template struct parse_data { - parse_data(build_configuration const& build_config) : num_kmers(0), minimizers(build_config) {} + parse_data(build_configuration const& build_config) + : num_kmers(0), num_sequences(0), minimizers(build_config) {} - uint64_t num_kmers; + uint64_t num_kmers, num_sequences; minimizers_tuples minimizers; std::vector strings_endpoints; bits::bit_vector strings; @@ -50,7 +51,6 @@ void parse_file(std::istream& is, parse_data& data, // std::unordered_map seq_lengths; std::string sequence; - uint64_t num_sequences = 0; uint64_t num_bases = 0; hasher_type hasher(build_config.seed); @@ -134,9 +134,9 @@ void parse_file(std::istream& is, parse_data& data, // seq_lengths[n] += 1; - ++num_sequences; - if (num_sequences % 100000 == 0) { - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " + ++data.num_sequences; + if (data.num_sequences % 100000 == 0) { + std::cout << "read " << data.num_sequences << " sequences, " << num_bases << " bases, " << data.num_kmers << " kmers" << std::endl; } @@ -184,16 +184,16 @@ void parse_file(std::istream& is, parse_data& data, bvb_strings.build(data.strings); assert(data.strings_endpoints.front() == 0); - assert(data.strings_endpoints.size() == num_sequences + 1); + assert(data.strings_endpoints.size() == data.num_sequences + 1); timer.stop(); print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding input'"); - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " + std::cout << "read " << data.num_sequences << " sequences, " << num_bases << " bases, " << data.num_kmers << " kmers" << std::endl; std::cout << "num_kmers " << data.num_kmers << std::endl; std::cout << "cost: 2.0 + " - << static_cast(kmer_t::bits_per_char * num_sequences * (k - 1)) / + << static_cast(kmer_t::bits_per_char * data.num_sequences * (k - 1)) / data.num_kmers << " [bits/kmer]" << std::endl; @@ -250,7 +250,7 @@ void parse_file(std::istream& is, parse_data& data, timer.start(); const uint64_t num_threads = build_config.num_threads; - const uint64_t num_sequences_per_thread = (num_sequences + num_threads - 1) / num_threads; + const uint64_t num_sequences_per_thread = (data.num_sequences + num_threads - 1) / num_threads; std::vector threads; threads.reserve(num_threads); @@ -283,7 +283,7 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t index_begin = t * num_sequences_per_thread; const uint64_t index_end = - std::min(index_begin + num_sequences_per_thread, num_sequences); + std::min(index_begin + num_sequences_per_thread, data.num_sequences); kmer_iterator it(data.strings, k); minimizer_iterator minimizer_it(k, m, hasher); diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 1276280..406fec9 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -14,7 +14,8 @@ struct dictionary { : m_vnum(constants::current_version_number::x, // constants::current_version_number::y, // constants::current_version_number::z) - , m_size(0) + , m_num_kmers(0) + , m_num_strings(0) , m_k(0) , m_m(0) , m_canonical(false) {} @@ -23,45 +24,39 @@ struct dictionary { void build(std::string const& input_filename, build_configuration const& build_config); essentials::version_number vnum() const { return m_vnum; } - uint64_t size() const { return m_size; } + uint64_t num_kmers() const { return m_num_kmers; } + uint64_t num_strings() const { return m_num_strings; } uint64_t k() const { return m_k; } uint64_t m() const { return m_m; } - uint64_t num_contigs() const { return m_buckets.strings_endpoints.size() - 1; } bool canonical() const { return m_canonical; } bool weighted() const { return !m_weights.empty(); } hasher_type const& hasher() const { return m_hasher; } - /* Lookup queries. Return the kmer_id of the kmer or -1 if it is not found in the dictionary. */ - uint64_t lookup(char const* string_kmer, bool check_reverse_complement = true) const; - uint64_t lookup_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; - - /* Advanced lookup queries. Return also contig information. */ - lookup_result lookup_advanced(char const* string_kmer, - bool check_reverse_complement = true) const; - lookup_result lookup_advanced_uint(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - - /* Return the number of kmers in contig. Since contigs do not have duplicates, - the length of the contig is always size + k - 1. */ - uint64_t contig_size(uint64_t contig_id) const; - - /* Navigational queries. */ - neighbourhood kmer_forward_neighbours(char const* string_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_forward_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_backward_neighbours(char const* string_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_backward_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - - /* forward and backward */ - neighbourhood kmer_neighbours(char const* string_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - neighbourhood contig_neighbours(uint64_t contig_id, - bool check_reverse_complement = true) const; + /* Lookup queries. */ + lookup_result lookup(char const* string_kmer, bool check_reverse_complement = true) const; + lookup_result lookup_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; + + // /* Return the number of kmers in contig. Since contigs do not have duplicates, + // the length of the contig is always size + k - 1. */ + // uint64_t contig_size(uint64_t contig_id) const; + + // /* Navigational queries. */ + // neighbourhood kmer_forward_neighbours(char const* string_kmer, + // bool check_reverse_complement = true) const; + // neighbourhood kmer_forward_neighbours(kmer_t uint_kmer, + // bool check_reverse_complement = true) const; + // neighbourhood kmer_backward_neighbours(char const* string_kmer, + // bool check_reverse_complement = true) const; + // neighbourhood kmer_backward_neighbours(kmer_t uint_kmer, + // bool check_reverse_complement = true) const; + + // /* forward and backward */ + // neighbourhood kmer_neighbours(char const* string_kmer, + // bool check_reverse_complement = true) const; + // neighbourhood kmer_neighbours(kmer_t uint_kmer, + // bool check_reverse_complement = true) const; + // neighbourhood contig_neighbours(uint64_t contig_id, + // bool check_reverse_complement = true) const; /* Return the weight of the kmer given its id. */ uint64_t weight(uint64_t kmer_id) const; @@ -80,42 +75,43 @@ struct dictionary { streaming_query_report // streaming_query_from_file(std::string const& filename, bool multiline) const; - struct iterator { - iterator(dictionary const* ptr, const uint64_t begin_kmer_id, const uint64_t end_kmer_id) { - m_it = ptr->m_buckets.at(begin_kmer_id, end_kmer_id, ptr->m_k); - } + // struct iterator { + // iterator(dictionary const* ptr, const uint64_t begin_kmer_id, const uint64_t end_kmer_id) + // { + // m_it = ptr->m_buckets.at(begin_kmer_id, end_kmer_id, ptr->m_k); + // } - bool has_next() const { return m_it.has_next(); } + // bool has_next() const { return m_it.has_next(); } - /* (kmer-id, kmer) */ - std::pair next() { return m_it.next(); } + // /* (kmer-id, kmer) */ + // std::pair next() { return m_it.next(); } - private: - typename buckets::iterator m_it; - }; + // private: + // typename buckets::iterator m_it; + // }; - iterator begin() const { return iterator(this, 0, size()); } + // iterator begin() const { return iterator(this, 0, num_kmers()); } - iterator at_kmer_id(const uint64_t kmer_id) const { - assert(kmer_id < size()); - return iterator(this, kmer_id, size()); - } + // iterator at_kmer_id(const uint64_t kmer_id) const { + // assert(kmer_id < num_kmers()); + // return iterator(this, kmer_id, num_kmers()); + // } - std::pair // [begin, end) - contig_offsets(const uint64_t contig_id) const { - return m_buckets.contig_offsets(contig_id); - } + // std::pair // [begin, end) + // contig_offsets(const uint64_t contig_id) const { + // return m_buckets.contig_offsets(contig_id); + // } - iterator at_contig_id(const uint64_t contig_id) const { - assert(contig_id < num_contigs()); - auto [begin, end] = contig_offsets(contig_id); - uint64_t contig_length = end - begin; // in bases - assert(contig_length >= m_k); - uint64_t contig_size = contig_length - m_k + 1; // in kmers - uint64_t begin_kmer_id = begin - contig_id * (m_k - 1); - uint64_t end_kmer_id = begin_kmer_id + contig_size; - return iterator(this, begin_kmer_id, end_kmer_id); - } + // iterator at_contig_id(const uint64_t contig_id) const { + // assert(contig_id < num_strings()); + // auto [begin, end] = contig_offsets(contig_id); + // uint64_t contig_length = end - begin; // in bases + // assert(contig_length >= m_k); + // uint64_t contig_size = contig_length - m_k + 1; // in kmers + // uint64_t begin_kmer_id = begin - contig_id * (m_k - 1); + // uint64_t end_kmer_id = begin_kmer_id + contig_size; + // return iterator(this, begin_kmer_id, end_kmer_id); + // } bits::bit_vector const& strings() const { return m_buckets.strings; } @@ -139,7 +135,8 @@ struct dictionary { static void visit_impl(Visitor& visitor, T&& t) { visitor.visit(t.m_vnum); util::check_version_number(t.m_vnum); - visitor.visit(t.m_size); + visitor.visit(t.m_num_kmers); + visitor.visit(t.m_num_strings); visitor.visit(t.m_k); visitor.visit(t.m_m); visitor.visit(t.m_canonical); @@ -151,7 +148,8 @@ struct dictionary { } essentials::version_number m_vnum; - uint64_t m_size; + uint64_t m_num_kmers; + uint64_t m_num_strings; uint16_t m_k; uint16_t m_m; bool m_canonical; diff --git a/include/endpoints.hpp b/include/endpoints.hpp new file mode 100644 index 0000000..ed9692f --- /dev/null +++ b/include/endpoints.hpp @@ -0,0 +1,173 @@ +#pragma once + +namespace sshash { + +/* + + If we sort the strings by increasing lengths, + we can avoid storing an offset *per string* and the + resulting locate query. + Rather, we can keep an offset *per group of lists* + having the same length. Call A such sequence. + We can then use a locate query on A to determine the + group of lists to which an offset belongs. + + The common API is, given an offset: + return (contig_id, contig_begin, contig_end). + +*/ + +struct locate_result { + uint64_t string_id, string_begin, string_end; +}; + +/* + This solution stores an array of triples, T, one triple + per group of strings having the same length: + (string length, + absolute string id of the first string in the group, + offset of group). + + We use 32-bit ints for the first two components, and + a 64-bit int for the third component. + + Additionally, we store a sequence of locate query "hints", H, + of size g, where g := next_power_of_two(U/n). + Then for a query, we do i = x >> log(g) and use this as an index + into H: H[i] indicates the position in T of the first element of T + that has its high bits equal to x >> log(g), and start scanning T + from there. +*/ +struct endpoints1 {}; + +/* + This solution stores an array of pairs, P, one pair + per group of strings having the same length: + (string length, + absolute string id of the first string in the group). + + We use 32-bit ints for both components. + + The offsets of the groups are encoded using `bits::endpoints_sequence`. +*/ +struct endpoints2 { + endpoints2() {} + + void build(std::vector const& se) { + std::vector v; + v.reserve(se.size()); + strings_groups_info.reserve(se.size()); + + assert(se.front() == 0); + uint64_t prev_len = se[1] - se[0]; + uint64_t string_id = 0; + uint64_t string_group_begin = 0; + for (uint64_t i = 1; i != se.size(); ++i) { + uint64_t curr_len = se[i] - se[i - 1]; + if (curr_len >= 1ULL << 32) { + std::cerr << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " + "string length" + << std::endl; + } + assert(curr_len >= prev_len); + if (curr_len > prev_len) { + if (string_id >= 1ULL << 32) { + std::cerr + << "More than 2^32-1 strings...a u32 is not enough to hold a string_id" + << std::endl; + } + // std::cout << "len = " << prev_len << ", string_id = " << string_id + // << ", offset = " << string_group_begin << std::endl; + strings_groups_info.push_back({static_cast(prev_len), // + static_cast(string_id)}); + v.push_back(string_group_begin); + prev_len = curr_len; + string_id = i - 1; + string_group_begin = se[i - 1]; + } + } + // std::cout << "len = " << prev_len << ", string_id = " << string_id + // << ", offset = " << string_group_begin << std::endl; + strings_groups_info.push_back({static_cast(prev_len), // + static_cast(string_id)}); + v.push_back(string_group_begin); + v.push_back(string_group_begin + prev_len); + strings_endpoints.encode(v.begin(), v.size(), v.back()); + } + + locate_result locate(const uint64_t kmer_offset) const { + auto p = strings_endpoints.locate(kmer_offset); + uint64_t i = p.first.pos; + uint64_t string_group_begin = p.first.val; + + assert(i < strings_groups_info.size()); + auto q = strings_groups_info[i]; + uint64_t string_id_relative_to_group = (kmer_offset - string_group_begin) / q.string_length; + uint64_t string_id = q.string_id + string_id_relative_to_group; + uint64_t string_begin = string_group_begin + string_id_relative_to_group * q.string_length; + uint64_t string_end = string_begin + q.string_length; + + return {string_id, string_begin, string_end}; + } + + uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = strings_endpoints.size() - 1; + assert(strings_endpoints.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = strings_endpoints.access(mid); + assert(val >= strings_groups_info[mid].string_id * (k - 1)); + uint64_t id = val - strings_groups_info[mid].string_id * (k - 1); + if (kmer_id <= id) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < strings_endpoints.size()); + for (auto it = strings_endpoints.get_iterator_at(lo); lo < hi; ++lo, it.next()) { + uint64_t val = it.value() - strings_groups_info[lo].string_id * (k - 1); + if (val > kmer_id) break; + } + assert(lo > 0); + auto const& p = strings_groups_info[lo - 1]; + uint64_t id = strings_endpoints.access(lo - 1) - p.string_id * (k - 1); + assert(id <= kmer_id); + uint64_t offset = + kmer_id + ((kmer_id - id) / (p.string_length - k + 1) + p.string_id) * (k - 1); + return offset; + } + + uint64_t num_bytes() const { + return strings_endpoints.num_bytes() + essentials::vec_bytes(strings_groups_info); + } + + struct string_group_info { + uint32_t string_length; // all strings in the group have the same length + uint32_t string_id; // first id in the group + }; + + bits::endpoints_sequence<> strings_endpoints; + std::vector strings_groups_info; + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.strings_endpoints); + visitor.visit(t.strings_groups_info); + } +}; + +} // namespace sshash \ No newline at end of file diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index 163cbd4..c9aede1 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -50,7 +50,7 @@ struct streaming_query { m_minimizer_it_rc.reset(); } - lookup_result lookup_advanced(char const* kmer) // + lookup_result lookup(char const* kmer) // { /* 1. validation */ bool is_valid = @@ -101,7 +101,7 @@ struct streaming_query { m_prev_mini_info_rc = m_curr_mini_info_rc; m_start = false; - assert(equal_lookup_result(m_dict->lookup_advanced(kmer), m_res)); + assert(equal_lookup_result(m_dict->lookup(kmer), m_res)); return m_res; } diff --git a/src/build.cpp b/src/build.cpp index ecf5123..5203583 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -41,7 +41,8 @@ void dictionary::build(std::string const& filename, timer.start(); parse_data data(build_config); parse_file(filename, data, build_config); - m_size = data.num_kmers; + m_num_kmers = data.num_kmers; + m_num_strings = data.num_sequences; if (build_config.weighted) { essentials::timer_type timer; timer.start(); diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 3f3399b..c9cc100 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -135,9 +135,9 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t } template -uint64_t dictionary::lookup(char const* string_kmer, bool check_reverse_complement) const { +lookup_result dictionary::lookup(char const* string_kmer, + bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - /* SIMD here does not help, as expected, because it is only used at the beginning of each query. To be useful, we would need to process a @@ -148,24 +148,11 @@ uint64_t dictionary::lookup(char const* string_kmer, bool check_reverse_ // __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(string_kmer)); // uint64_t word = pack2bits_shift1(v); // kmer_t uint_kmer(word); - return lookup_uint(uint_kmer, check_reverse_complement); } template -uint64_t dictionary::lookup_uint(kmer_t uint_kmer, bool check_reverse_complement) const { - auto res = lookup_advanced_uint(uint_kmer, check_reverse_complement); - return res.kmer_id; -} - -template -lookup_result dictionary::lookup_advanced(char const* string_kmer, - bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - return lookup_advanced_uint(uint_kmer, check_reverse_complement); -} -template -lookup_result dictionary::lookup_advanced_uint(kmer_t uint_kmer, - bool check_reverse_complement) const { +lookup_result dictionary::lookup_uint(kmer_t uint_kmer, + bool check_reverse_complement) const { if (m_canonical) return lookup_uint_canonical(uint_kmer); auto res = lookup_uint_regular(uint_kmer); assert(res.kmer_orientation == constants::forward_orientation); @@ -189,121 +176,122 @@ bool dictionary::is_member_uint(kmer_t uint_kmer, bool check_reverse_com template void dictionary::access(uint64_t kmer_id, char* string_kmer) const { - assert(kmer_id < size()); + assert(kmer_id < num_kmers()); m_buckets.access(kmer_id, string_kmer, m_k); } template uint64_t dictionary::weight(uint64_t kmer_id) const { - assert(kmer_id < size()); + assert(kmer_id < num_kmers()); return m_weights.weight(kmer_id); } -template -uint64_t dictionary::contig_size(uint64_t contig_id) const { - assert(contig_id < num_contigs()); - auto [begin, end] = m_buckets.contig_offsets(contig_id); - uint64_t contig_length = end - begin; - assert(contig_length >= m_k); - return contig_length - m_k + 1; -} - -template -void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, - bool check_reverse_complement) const { - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - kmer_t new_kmer = suffix; - new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); - res.forward[i] = lookup_advanced_uint(new_kmer, check_reverse_complement); - } -} -template -void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, - bool check_reverse_complement) const { - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - kmer_t new_kmer = prefix; - new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); - res.backward[i] = lookup_advanced_uint(new_kmer, check_reverse_complement); - } -} - -template -neighbourhood dictionary::kmer_forward_neighbours( - char const* string_kmer, bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - return kmer_forward_neighbours(uint_kmer, check_reverse_complement); -} - -template -kmer_t dictionary::get_suffix(kmer_t kmer) const { - kmer_t suffix = kmer; - suffix.drop_char(); - return suffix; -} -template -neighbourhood dictionary::kmer_forward_neighbours( - kmer_t uint_kmer, bool check_reverse_complement) const { - neighbourhood res; - forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); - return res; -} - -template -neighbourhood dictionary::kmer_backward_neighbours( - char const* string_kmer, bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - return kmer_backward_neighbours(uint_kmer, check_reverse_complement); -} - -template -kmer_t dictionary::get_prefix(kmer_t kmer) const { - kmer_t prefix = kmer; - prefix.pad_char(); - prefix.take_chars(m_k); - return prefix; -} - -template -neighbourhood dictionary::kmer_backward_neighbours( - kmer_t uint_kmer, bool check_reverse_complement) const { - neighbourhood res; - backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); - return res; -} - -template -neighbourhood dictionary::kmer_neighbours(char const* string_kmer, - bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - return kmer_neighbours(uint_kmer, check_reverse_complement); -} - -template -neighbourhood dictionary::kmer_neighbours(kmer_t uint_kmer, - bool check_reverse_complement) const { - neighbourhood res; - forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); - backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); - return res; -} - -template -neighbourhood dictionary::contig_neighbours(uint64_t contig_id, - bool check_reverse_complement) const { - assert(contig_id < num_contigs()); - neighbourhood res; - kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); - forward_neighbours(suffix, res, check_reverse_complement); - kmer_t prefix = m_buckets.contig_prefix(contig_id, m_k); - prefix.pad_char(); - backward_neighbours(prefix, res, check_reverse_complement); - return res; -} +// template +// uint64_t dictionary::contig_size(uint64_t contig_id) const { +// assert(contig_id < num_strings()); +// auto [begin, end] = m_buckets.contig_offsets(contig_id); +// uint64_t contig_length = end - begin; +// assert(contig_length >= m_k); +// return contig_length - m_k + 1; +// } + +// template +// void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, +// bool check_reverse_complement) const { +// for (size_t i = 0; i < kmer_t::alphabet_size; i++) { +// kmer_t new_kmer = suffix; +// new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); +// res.forward[i] = lookup_uint(new_kmer, check_reverse_complement); +// } +// } +// template +// void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, +// bool check_reverse_complement) const { +// for (size_t i = 0; i < kmer_t::alphabet_size; i++) { +// kmer_t new_kmer = prefix; +// new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); +// res.backward[i] = lookup_uint(new_kmer, check_reverse_complement); +// } +// } + +// template +// neighbourhood dictionary::kmer_forward_neighbours( +// char const* string_kmer, bool check_reverse_complement) const { +// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); +// return kmer_forward_neighbours(uint_kmer, check_reverse_complement); +// } + +// template +// kmer_t dictionary::get_suffix(kmer_t kmer) const { +// kmer_t suffix = kmer; +// suffix.drop_char(); +// return suffix; +// } +// template +// neighbourhood dictionary::kmer_forward_neighbours( +// kmer_t uint_kmer, bool check_reverse_complement) const { +// neighbourhood res; +// forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); +// return res; +// } + +// template +// neighbourhood dictionary::kmer_backward_neighbours( +// char const* string_kmer, bool check_reverse_complement) const { +// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); +// return kmer_backward_neighbours(uint_kmer, check_reverse_complement); +// } + +// template +// kmer_t dictionary::get_prefix(kmer_t kmer) const { +// kmer_t prefix = kmer; +// prefix.pad_char(); +// prefix.take_chars(m_k); +// return prefix; +// } + +// template +// neighbourhood dictionary::kmer_backward_neighbours( +// kmer_t uint_kmer, bool check_reverse_complement) const { +// neighbourhood res; +// backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); +// return res; +// } + +// template +// neighbourhood dictionary::kmer_neighbours(char const* string_kmer, +// bool check_reverse_complement) const { +// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); +// return kmer_neighbours(uint_kmer, check_reverse_complement); +// } + +// template +// neighbourhood dictionary::kmer_neighbours(kmer_t uint_kmer, +// bool check_reverse_complement) const { +// neighbourhood res; +// forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); +// backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); +// return res; +// } + +// template +// neighbourhood dictionary::contig_neighbours(uint64_t contig_id, +// bool check_reverse_complement) const +// { +// assert(contig_id < num_strings()); +// neighbourhood res; +// kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); +// forward_neighbours(suffix, res, check_reverse_complement); +// kmer_t prefix = m_buckets.contig_prefix(contig_id, m_k); +// prefix.pad_char(); +// backward_neighbours(prefix, res, check_reverse_complement); +// return res; +// } template uint64_t dictionary::num_bits() const { - return 8 * (sizeof(m_vnum) + sizeof(m_size) + sizeof(m_hasher) + sizeof(m_k) + sizeof(m_m) + - sizeof(m_canonical)) + + return 8 * (sizeof(m_vnum) + sizeof(m_num_kmers) + sizeof(m_num_strings) + sizeof(m_hasher) + + sizeof(m_k) + sizeof(m_m) + sizeof(m_canonical)) + m_minimizers.num_bits() + m_buckets.num_bits() + m_skew_index.num_bits() + m_weights.num_bits(); } diff --git a/src/info.cpp b/src/info.cpp index cef4ab1..64bf719 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -10,37 +10,37 @@ void dictionary::print_space_breakdown() const { std::cout << "total index size: " << num_bytes << " [B] -- " << essentials::convert(num_bytes, essentials::MB) << " [MB]" << '\n'; std::cout << "SPACE BREAKDOWN:\n"; - std::cout << " minimizers: " << static_cast(m_minimizers.num_bits()) / size() + std::cout << " minimizers: " << static_cast(m_minimizers.num_bits()) / num_kmers() << " [bits/kmer] (" << static_cast(m_minimizers.num_bits()) / m_minimizers.size() << " [bits/key]) -- " << perc(m_minimizers.num_bits(), num_bits()) << "%\n"; - std::cout << " strings_endpoints: " << (8.0 * m_buckets.strings_endpoints.num_bytes()) / size() - << " [bits/kmer] -- " << perc(m_buckets.strings_endpoints.num_bytes() * 8, num_bits()) - << "%\n"; + std::cout << " strings_endpoints: " + << (8.0 * m_buckets.strings_endpoints.num_bytes()) / num_kmers() << " [bits/kmer] -- " + << perc(m_buckets.strings_endpoints.num_bytes() * 8, num_bits()) << "%\n"; - std::cout << " offsets: " << (8.0 * m_buckets.offsets.num_bytes()) / size() + std::cout << " offsets: " << (8.0 * m_buckets.offsets.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_buckets.offsets.num_bytes(), num_bits()) << "%\n"; - std::cout << " offsets2: " << (8.0 * m_buckets.offsets2.num_bytes()) / size() + std::cout << " offsets2: " << (8.0 * m_buckets.offsets2.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_buckets.offsets2.num_bytes(), num_bits()) << "%\n"; - std::cout << " offsets3: " << (8.0 * m_buckets.offsets3.num_bytes()) / size() + std::cout << " offsets3: " << (8.0 * m_buckets.offsets3.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_buckets.offsets3.num_bytes(), num_bits()) << "%\n"; std::cout << " start_lists_of_size: " - << (8.0 * essentials::vec_bytes(m_buckets.start_lists_of_size)) / size() + << (8.0 * essentials::vec_bytes(m_buckets.start_lists_of_size)) / num_kmers() << " [bits/kmer] -- " << perc(8 * essentials::vec_bytes(m_buckets.start_lists_of_size), num_bits()) << "%\n"; - std::cout << " strings: " << (8.0 * m_buckets.strings.num_bytes()) / size() + std::cout << " strings: " << (8.0 * m_buckets.strings.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_buckets.strings.num_bytes(), num_bits()) << "%\n"; - std::cout << " skew_index: " << static_cast(m_skew_index.num_bits()) / size() + std::cout << " skew_index: " << static_cast(m_skew_index.num_bits()) / num_kmers() << " [bits/kmer] -- " << perc(m_skew_index.num_bits(), num_bits()) << "%\n"; - std::cout << " weights: " << static_cast(m_weights.num_bits()) / size() + std::cout << " weights: " << static_cast(m_weights.num_bits()) / num_kmers() << " [bits/kmer] -- " << perc(m_weights.num_bits(), num_bits()) << "%\n"; - if (weighted()) m_weights.print_space_breakdown(size()); + if (weighted()) m_weights.print_space_breakdown(num_kmers()); std::cout << " --------------\n"; - std::cout << " total: " << static_cast(num_bits()) / size() << " [bits/kmer]" + std::cout << " total: " << static_cast(num_bits()) / num_kmers() << " [bits/kmer]" << std::endl; } @@ -48,7 +48,8 @@ template void dictionary::print_info() const { std::cout << "=== dictionary info:\n"; std::cout << "version number = " << m_vnum.to_string() << '\n'; - std::cout << "num_kmers = " << size() << '\n'; + std::cout << "num_kmers = " << num_kmers() << '\n'; + std::cout << "num_strings = " << num_strings() << '\n'; std::cout << "k = " << k() << '\n'; std::cout << "num_minimizers = " << m_minimizers.size() << std::endl; std::cout << "m = " << m() << '\n'; diff --git a/src/query.cpp b/src/query.cpp index 06a7707..8f8a3b3 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -21,7 +21,7 @@ streaming_query_report streaming_query_from_fasta_file_multiline(dictionary const* report.num_kmers += num_kmers; for (uint64_t i = 0; i != num_kmers; ++i) { char const* kmer = line.data() + i; - query.lookup_advanced(kmer); + query.lookup(kmer); } } report.num_searches = query.num_searches(); @@ -90,7 +90,7 @@ streaming_query_report streaming_query_from_fastq_file(dictionary const* report.num_kmers += num_kmers; for (uint64_t i = 0; i != line.size() - k + 1; ++i) { char const* kmer = line.data() + i; - query.lookup_advanced(kmer); + query.lookup(kmer); } } std::getline(is, line); // skip '+' diff --git a/src/statistics.cpp b/src/statistics.cpp deleted file mode 100644 index d898094..0000000 --- a/src/statistics.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "include/dictionary.hpp" -#include "include/buckets_statistics.hpp" -#include "include/minimizer_iterator.hpp" - -namespace sshash { - -template -void dictionary::compute_statistics() const // -{ - std::cout << "computing bucket statistics..." << std::endl; - - const uint64_t num_kmers = size(); - const uint64_t num_minimizers = m_minimizers.size(); - const uint64_t num_super_kmers = m_buckets.offsets.size(); - - buckets_statistics buckets_stats(num_minimizers, num_kmers, num_super_kmers); - minimizer_iterator minimizer_it(m_k, m_m, m_hasher); - - // FIXME - // for (uint64_t bucket_id = 0; bucket_id != num_minimizers; ++bucket_id) { - // const auto [begin, end] = m_buckets.locate_bucket(bucket_id); - // const uint64_t bucket_size = end - begin; - // buckets_stats.add_bucket_size(bucket_size); - // for (uint64_t i = begin; i != end; ++i) { - // const uint64_t pos_in_seq = m_buckets.offsets.access(i); - // auto p = m_buckets.pieces.locate(pos_in_seq); - // const uint64_t contig_begin = p.first.val; - // const uint64_t contig_end = p.second.val; - // uint64_t offset = pos_in_seq; - // if (offset <= uint64_t(m_k - m_m)) { - // assert(contig_begin == 0); - // offset = 0; - // } else if (offset - (m_k - m_m) < contig_begin) { - // offset = contig_begin; - // } else { - // offset -= m_k - m_m; - // } - // kmer_iterator it(m_buckets.strings, m_k, kmer_t::bits_per_char * offset); - // minimizer_it.set_position(offset); - // uint64_t num_kmers_in_super_kmer = 0; - // auto kmer = it.get(); - // auto mini_info = minimizer_it.next(kmer); - // while (mini_info.pos_in_seq < pos_in_seq) { - // it.next(); - // kmer = it.get(); - // mini_info = minimizer_it.next(kmer); - // } - // while (mini_info.pos_in_seq == pos_in_seq and - // (mini_info.pos_in_seq - mini_info.pos_in_kmer + m_k) <= contig_end) // - // { - // num_kmers_in_super_kmer += 1; - // it.next(); - // kmer = it.get(); - // mini_info = minimizer_it.next(kmer); - // } - // assert(num_kmers_in_super_kmer > 0); - // buckets_stats.add_num_kmers_in_super_kmer(bucket_size, num_kmers_in_super_kmer); - // } - // } - - buckets_stats.print_full(); - - std::cout << "DONE" << std::endl; -} - -} // namespace sshash diff --git a/test/check.hpp b/test/check.hpp index 42475cf..1dd216e 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -5,14 +5,14 @@ namespace sshash { template bool check_dictionary(dictionary const& dict) { const uint64_t k = dict.k(); - const uint64_t n = dict.size(); + const uint64_t n = dict.num_kmers(); std::cout << "checking correctness of access and positive lookup..." << std::endl; uint64_t id = 0; std::string kmer(k, 0); for (; id != n; ++id) { if (id != 0 and id % 5000000 == 0) std::cout << "checked " << id << " kmers" << std::endl; dict.access(id, kmer.data()); - uint64_t got_id = dict.lookup(kmer.c_str()); + uint64_t got_id = dict.lookup(kmer.c_str()).kmer_id; if (got_id == constants::invalid_uint64) { std::cout << "kmer '" << kmer << "' not found!" << std::endl; return false; @@ -34,7 +34,7 @@ bool check_dictionary(dictionary const& dict) { template bool check_correctness_negative_lookup(dictionary const& dict) { std::cout << "checking correctness of negative lookup with random kmers..." << std::endl; - const uint64_t num_lookups = std::min(1000000, dict.size()); + const uint64_t num_lookups = std::min(1000000, dict.num_kmers()); std::string kmer(dict.k(), 0); for (uint64_t i = 0; i != num_lookups; ++i) { random_kmer(kmer.data(), dict.k()); @@ -42,8 +42,8 @@ bool check_correctness_negative_lookup(dictionary const& dict) { We could use a std::unordered_set to check if kmer is really absent, but that would take much more memory... */ - uint64_t id = dict.lookup(kmer.c_str()); - if (id != constants::invalid_uint64) { + auto res = dict.lookup(kmer.c_str()); + if (res.kmer_id != constants::invalid_uint64) { std::cout << "kmer '" << kmer << "' found!" << std::endl; } } @@ -54,14 +54,14 @@ bool check_correctness_negative_lookup(dictionary const& dict) { template bool check_correctness_navigational_contig_query(dictionary const& dict) { std::cout << "checking correctness of navigational queries for contigs..." << std::endl; - const uint64_t num_contigs = dict.num_contigs(); + const uint64_t num_strings = dict.num_strings(); const uint64_t k = dict.k(); uint64_t kmer_id = 0; std::string kmer(k, 0); uint64_t contig_id = 0; - for (; contig_id != num_contigs; ++contig_id) { + for (; contig_id != num_strings; ++contig_id) { if (contig_id != 0 and contig_id % 1000000 == 0) { - std::cout << "checked " << contig_id << "/" << num_contigs << " contigs" << std::endl; + std::cout << "checked " << contig_id << "/" << num_strings << " contigs" << std::endl; } auto res = dict.contig_neighbours(contig_id); @@ -92,7 +92,8 @@ bool check_correctness_kmer_iterator(dictionary const& dict) { std::cout << "checking correctness of kmer iterator..." << std::endl; std::string expected_kmer(dict.k(), 0); constexpr uint64_t runs = 3; - essentials::uniform_int_rng distr(0, dict.size() - 1, essentials::get_random_seed()); + essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, + essentials::get_random_seed()); for (uint64_t run = 0; run != runs; ++run) { uint64_t from_kmer_id = distr.gen(); auto it = dict.at_kmer_id(from_kmer_id); @@ -108,7 +109,7 @@ bool check_correctness_kmer_iterator(dictionary const& dict) { } ++from_kmer_id; } - assert(from_kmer_id == dict.size()); + assert(from_kmer_id == dict.num_kmers()); } std::cout << "EVERYTHING OK!" << std::endl; return true; @@ -118,7 +119,7 @@ template bool check_correctness_contig_iterator(dictionary const& dict) { std::cout << "checking correctness of contig iterator..." << std::endl; std::string expected_kmer(dict.k(), 0); - for (uint64_t contig_id = 0; contig_id != dict.num_contigs(); ++contig_id) { + for (uint64_t contig_id = 0; contig_id != dict.num_strings(); ++contig_id) { auto [begin, _] = dict.contig_offsets(contig_id); uint64_t from_kmer_id = begin - contig_id * (dict.k() - 1); auto it = dict.at_contig_id(contig_id); diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index b0f4a7c..4dc5b6e 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -59,21 +59,18 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& } util::uint_kmer_to_string(uint_kmer, expected_kmer_str.data(), k); - uint64_t id = dict.lookup(expected_kmer_str.c_str()); + auto curr = dict.lookup(expected_kmer_str.c_str()); /* Since we assume that we stream through the file from which the index was built, - ids are assigned sequentially to kmers, so it must be id == num_kmers. + ids are assigned sequentially to kmers, so it must be curr.kmer_id == num_kmers. */ - if (id != num_kmers) std::cout << "wrong id assigned" << std::endl; + if (curr.kmer_id != num_kmers) std::cout << "wrong id assigned" << std::endl; - if (id == constants::invalid_uint64) { + if (curr.kmer_id == constants::invalid_uint64) { std::cout << "kmer '" << expected_kmer_str << "' not found!" << std::endl; } - assert(id != constants::invalid_uint64); - - auto curr = dict.lookup_advanced(expected_kmer_str.c_str()); - assert(curr.kmer_id == id); + assert(curr.kmer_id != constants::invalid_uint64); if (curr.kmer_orientation != orientation) { std::cout << "ERROR: got orientation " << int(curr.kmer_orientation) @@ -131,23 +128,24 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& } /* check also contig_size() */ - uint64_t contig_size = dict.contig_size(curr.contig_id); - if (contig_size != curr.contig_size) { - std::cout << "ERROR: got contig_size " << contig_size << " but expected " - << curr.contig_size << std::endl; - } - assert(contig_size == curr.contig_size); + // uint64_t contig_size = dict.contig_size(curr.contig_id); + // if (contig_size != curr.contig_size) { + // std::cout << "ERROR: got contig_size " << contig_size << " but expected " + // << curr.contig_size << std::endl; + // } + // assert(contig_size == curr.contig_size); prev = curr; // check access - dict.access(id, got_kmer_str.data()); + dict.access(curr.kmer_id, got_kmer_str.data()); kmer_t got_uint_kmer = util::string_to_uint_kmer(got_kmer_str.data(), k); kmer_t got_uint_kmer_rc = got_uint_kmer; got_uint_kmer_rc.reverse_complement_inplace(k); if (got_uint_kmer != uint_kmer and got_uint_kmer_rc != uint_kmer) { std::cout << "ERROR: got '" << got_kmer_str << "' but expected '" << expected_kmer_str << "'" << std::endl; + return false; } ++num_kmers; } @@ -158,58 +156,60 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& return check_correctness_negative_lookup(dict); } -template -bool check_correctness_navigational_kmer_query(std::istream& is, dictionary const& dict) { - const uint64_t k = dict.k(); - std::string sequence; - uint64_t num_kmers = 0; - - std::cout << "checking correctness of navigational queries for kmers..." << std::endl; - - while (!is.eof()) // - { - if constexpr (fmt == input_file_type::cf_seg) { - std::getline(is, sequence, '\t'); // skip '\t' - std::getline(is, sequence); // DNA sequence - } else { - static_assert(fmt == input_file_type::fasta); - std::getline(is, sequence); // header sequence - std::getline(is, sequence); // DNA sequence - } - for (uint64_t i = 0; i + k <= sequence.length(); ++i) { - assert(util::is_valid(sequence.data() + i, k)); - if (num_kmers != 0 and num_kmers % 5000000 == 0) { - std::cout << "checked " << num_kmers << " kmers" << std::endl; - } - neighbourhood curr = dict.kmer_neighbours(sequence.data() + i); - if (i + k < sequence.length()) { - char next_nuc = sequence[i + k]; - bool next_nuc_not_found = curr.forward[kmer_t::char_to_uint(next_nuc)].kmer_id == - constants::invalid_uint64; - if (next_nuc_not_found) { - std::cout << "expected forward[" << next_nuc << "]" << std::endl; - } - assert(!next_nuc_not_found); - } - - if (i != 0) { - char prev_nuc = sequence[i - 1]; - bool prev_nuc_not_found = curr.backward[kmer_t::char_to_uint(prev_nuc)].kmer_id == - constants::invalid_uint64; - if (prev_nuc_not_found) { - std::cout << "expected backward[" << prev_nuc << "]" << std::endl; - } - assert(!prev_nuc_not_found); - } - - ++num_kmers; - } - } - std::cout << "checked " << num_kmers << " kmers" << std::endl; - - std::cout << "EVERYTHING OK!" << std::endl; - return true; -} +// template +// bool check_correctness_navigational_kmer_query(std::istream& is, dictionary const& dict) +// { +// const uint64_t k = dict.k(); +// std::string sequence; +// uint64_t num_kmers = 0; + +// std::cout << "checking correctness of navigational queries for kmers..." << std::endl; + +// while (!is.eof()) // +// { +// if constexpr (fmt == input_file_type::cf_seg) { +// std::getline(is, sequence, '\t'); // skip '\t' +// std::getline(is, sequence); // DNA sequence +// } else { +// static_assert(fmt == input_file_type::fasta); +// std::getline(is, sequence); // header sequence +// std::getline(is, sequence); // DNA sequence +// } +// for (uint64_t i = 0; i + k <= sequence.length(); ++i) { +// assert(util::is_valid(sequence.data() + i, k)); +// if (num_kmers != 0 and num_kmers % 5000000 == 0) { +// std::cout << "checked " << num_kmers << " kmers" << std::endl; +// } +// neighbourhood curr = dict.kmer_neighbours(sequence.data() + i); +// if (i + k < sequence.length()) { +// char next_nuc = sequence[i + k]; +// bool next_nuc_not_found = curr.forward[kmer_t::char_to_uint(next_nuc)].kmer_id == +// constants::invalid_uint64; +// if (next_nuc_not_found) { +// std::cout << "expected forward[" << next_nuc << "]" << std::endl; +// } +// assert(!next_nuc_not_found); +// } + +// if (i != 0) { +// char prev_nuc = sequence[i - 1]; +// bool prev_nuc_not_found = curr.backward[kmer_t::char_to_uint(prev_nuc)].kmer_id +// == +// constants::invalid_uint64; +// if (prev_nuc_not_found) { +// std::cout << "expected backward[" << prev_nuc << "]" << std::endl; +// } +// assert(!prev_nuc_not_found); +// } + +// ++num_kmers; +// } +// } +// std::cout << "checked " << num_kmers << " kmers" << std::endl; + +// std::cout << "EVERYTHING OK!" << std::endl; +// return true; +// } template bool check_correctness_weights(std::istream& is, dictionary const& dict) { diff --git a/tools/build.cpp b/tools/build.cpp index 56aa2d4..ed2df27 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -82,17 +82,17 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - check_correctness_navigational_kmer_query(dict, input_filename); - check_correctness_navigational_contig_query(dict); - if (build_config.weighted) check_correctness_weights(dict, input_filename); - check_correctness_kmer_iterator(dict); - check_correctness_contig_iterator(dict); + // check_correctness_navigational_kmer_query(dict, input_filename); + // check_correctness_navigational_contig_query(dict); + // if (build_config.weighted) check_correctness_weights(dict, input_filename); + // check_correctness_kmer_iterator(dict); + // check_correctness_contig_iterator(dict); } bool bench = parser.get("bench"); if (bench) { perf_test_lookup_access(dict); if (dict.weighted()) perf_test_lookup_weight(dict); - perf_test_iterator(dict); + // perf_test_iterator(dict); } if (parser.parsed("output_filename")) { auto output_filename = parser.get("output_filename"); diff --git a/tools/common.hpp b/tools/common.hpp index 6ee652d..98bc926 100644 --- a/tools/common.hpp +++ b/tools/common.hpp @@ -17,7 +17,7 @@ void load_dictionary(dictionary& dict, std::string const& index_filename if (verbose) { std::cout << "total index size: " << num_bytes_read << " [B] -- " << essentials::convert(num_bytes_read, essentials::MB) << " [MB] (" - << (num_bytes_read * 8.0) / dict.size() << " [bits/kmer])" << std::endl; + << (num_bytes_read * 8.0) / dict.num_kmers() << " [bits/kmer])" << std::endl; dict.print_info(); } } diff --git a/tools/perf.hpp b/tools/perf.hpp index cc71d85..bb05604 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -6,20 +6,20 @@ namespace perf { using timer_type = essentials::timer; } -template -void perf_test_iterator(dictionary const& dict) { - perf::timer_type t; - t.start(); - auto it = dict.begin(); - while (it.has_next()) { - auto [kmer_id, kmer] = it.next(); - essentials::do_not_optimize_away(kmer_id); - essentials::do_not_optimize_away(kmer[0]); - } - t.stop(); - double avg_nanosec = t.elapsed() / dict.size(); - std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; -} +// template +// void perf_test_iterator(dictionary const& dict) { +// perf::timer_type t; +// t.start(); +// auto it = dict.begin(); +// while (it.has_next()) { +// auto [kmer_id, kmer] = it.next(); +// essentials::do_not_optimize_away(kmer_id); +// essentials::do_not_optimize_away(kmer[0]); +// } +// t.stop(); +// double avg_nanosec = t.elapsed() / dict.num_kmers(); +// std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; +// } template void perf_test_lookup_by_list_size(dictionary const& dict) { @@ -73,8 +73,8 @@ void perf_test_lookup_by_list_size(dictionary const& dict) { t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries[list_size]) { - auto id = dict.lookup(string.c_str()); - essentials::do_not_optimize_away(id); + auto res = dict.lookup(string.c_str()); + essentials::do_not_optimize_away(res.kmer_id); } } t.stop(); @@ -95,7 +95,8 @@ template void perf_test_lookup_access(dictionary const& dict) { constexpr uint64_t num_queries = 1000000; constexpr uint64_t runs = 5; - essentials::uniform_int_rng distr(0, dict.size() - 1, essentials::get_random_seed()); + essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, + essentials::get_random_seed()); const uint64_t k = dict.k(); // const uint64_t m = dict.m(); std::string kmer(k, 0); @@ -122,13 +123,13 @@ void perf_test_lookup_access(dictionary const& dict) { t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { - auto id = dict.lookup(string.c_str()); - essentials::do_not_optimize_away(id); + auto res = dict.lookup(string.c_str()); + essentials::do_not_optimize_away(res.kmer_id); } } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "lookup: avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + std::cout << "avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; // std::vector lookup_queries_uint; // lookup_queries_uint.reserve(num_queries); @@ -236,63 +237,15 @@ void perf_test_lookup_access(dictionary const& dict) { t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { - auto id = dict.lookup(string.c_str()); - essentials::do_not_optimize_away(id); + auto res = dict.lookup(string.c_str()); + essentials::do_not_optimize_away(res.kmer_id); } } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; } - // { - // // perf test positive lookup_advanced - // std::vector lookup_queries; - // lookup_queries.reserve(num_queries); - // for (uint64_t i = 0; i != num_queries; ++i) { - // uint64_t id = distr.gen(); - // dict.access(id, kmer.data()); - // if ((i & 1) == 0) { - // /* transform 50% of the kmers into their reverse complements */ - // kmer_t::compute_reverse_complement(kmer.data(), kmer_rc.data(), k); - // lookup_queries.push_back(kmer_rc); - // } else { - // lookup_queries.push_back(kmer); - // } - // } - // perf::timer_type t; - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto const& string : lookup_queries) { - // auto res = dict.lookup_advanced(string.c_str()); - // essentials::do_not_optimize_away(res.kmer_id); - // } - // } - // t.stop(); - // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "avg_nanosec_per_positive_lookup_advanced " << nanosec_per_lookup << - // std::endl; - // } - // { - // // perf test negative lookup_advanced - // std::vector lookup_queries; - // lookup_queries.reserve(num_queries); - // for (uint64_t i = 0; i != num_queries; ++i) { - // random_kmer(kmer.data(), k); - // lookup_queries.push_back(kmer); - // } - // perf::timer_type t; - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto const& string : lookup_queries) { - // auto res = dict.lookup_advanced(string.c_str()); - // essentials::do_not_optimize_away(res.kmer_id); - // } - // } - // t.stop(); - // double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "avg_nanosec_per_negative_lookup_advanced " << nanosec_per_lookup << - // std::endl; - // } + { // perf test access std::vector access_queries; @@ -310,6 +263,7 @@ void perf_test_lookup_access(dictionary const& dict) { double nanosec_per_access = t.elapsed() / static_cast(runs * access_queries.size()); std::cout << "avg_nanosec_per_access " << nanosec_per_access << std::endl; } + } // namespace sshash template @@ -321,7 +275,8 @@ void perf_test_lookup_weight(dictionary const& dict) { constexpr uint64_t num_queries = 1000000; constexpr uint64_t runs = 5; - essentials::uniform_int_rng distr(0, dict.size() - 1, essentials::get_random_seed()); + essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, + essentials::get_random_seed()); uint64_t k = dict.k(); std::string kmer(k, 0); std::string kmer_rc(k, 0); @@ -344,8 +299,8 @@ void perf_test_lookup_weight(dictionary const& dict) { t.start(); for (uint64_t r = 0; r != runs; ++r) { for (auto const& string : lookup_queries) { - auto id = dict.lookup(string.c_str()); - auto w = dict.weight(id); + auto res = dict.lookup(string.c_str()); + auto w = dict.weight(res.kmer_id); essentials::do_not_optimize_away(w); } } diff --git a/tools/sort.cpp b/tools/sort.cpp new file mode 100644 index 0000000..1ea176f --- /dev/null +++ b/tools/sort.cpp @@ -0,0 +1,221 @@ +#pragma once + +#include "external/pthash/include/pthash.hpp" +#include "external/pthash/external/bits/external/essentials/include/essentials.hpp" +// #include "external/gz/zip_stream.hpp" +// #include "external/gz/zip_stream.cpp" +#include "include/builder/util.hpp" + +namespace sshash { + +void sort(std::istream& is, std::string const& output_filename, + std::string const& tmp_dirname) // +{ + constexpr uint64_t limit_in_bytes = 4 * essentials::GB; + constexpr uint64_t limit_in_num_sequences = 1000000; + + std::vector buffer; + buffer.reserve(limit_in_num_sequences); + + std::string run_identifier = + std::to_string(pthash::clock_type::now().time_since_epoch().count()); + + std::string sequence; + uint64_t num_sequences = 0; + uint64_t num_bases = 0; + uint64_t bytes = 0; + uint64_t num_files_to_merge = 0; + + auto get_tmp_output_filename = [&](uint64_t id) { + return tmp_dirname + "/sshash.tmp.run" + run_identifier + "." + std::to_string(id); + }; + + auto sort_and_flush = [&]() { + if (buffer.empty()) return; + + std::cout << "sorting buffer..." << std::endl; + std::sort(buffer.begin(), buffer.end(), + [&](auto const& x, auto const& y) { return x.length() < y.length(); }); + + auto tmp_output_filename = get_tmp_output_filename(num_files_to_merge); + std::cout << "saving to file '" << tmp_output_filename << "'..." << std::endl; + std::ofstream out(tmp_output_filename.c_str()); + if (!out.is_open()) throw std::runtime_error("cannot open file"); + for (auto const& s : buffer) out << s << '\n'; + out.close(); + + buffer.clear(); + bytes = 0; + num_files_to_merge += 1; + }; + + while (true) { + std::getline(is, sequence); // header sequence + std::getline(is, sequence); // DNA sequence + if (is.eof()) break; + + if (++num_sequences % 100000 == 0) { + std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases" + << std::endl; + } + + const uint64_t n = sequence.size(); + num_bases += n; + + uint64_t seq_bytes = n + 16; // overhead + if (bytes + seq_bytes > limit_in_bytes or buffer.size() == limit_in_num_sequences) { + sort_and_flush(); + } + + bytes += seq_bytes; + buffer.emplace_back(sequence); + num_bases += n; + } + sort_and_flush(); + + std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases" << std::endl; + + /* merge */ + { + assert(num_files_to_merge > 0); + std::cout << "files to merge = " << num_files_to_merge << std::endl; + + struct lines_iterator { + lines_iterator(uint8_t const* begin, uint8_t const* end) : m_begin(begin), m_end(end) { + advance_to_next(); + } + + void advance_to_next() { m_sequence = read_line(); } + + std::string const& sequence() const { return m_sequence; } + bool has_next() const { return !m_sequence.empty(); } + + private: + uint8_t const* m_begin; + uint8_t const* m_end; + std::string m_sequence; + + std::string read_line() { + uint8_t const* begin = m_begin; + while (m_begin != m_end and *m_begin++ != '\n') + ; + if (begin == m_begin) return std::string(""); + return std::string(reinterpret_cast(begin), m_begin - begin - 1); + } + }; + + std::vector iterators; + std::vector idx_heap; + iterators.reserve(num_files_to_merge); + idx_heap.reserve(num_files_to_merge); + std::vector> mm_files(num_files_to_merge); + + auto heap_idx_comparator = [&](uint32_t i, uint32_t j) { + return iterators[i].sequence().length() > iterators[j].sequence().length(); + }; + + auto advance_heap_head = [&]() { + auto idx = idx_heap.front(); + iterators[idx].advance_to_next(); + if (iterators[idx].has_next()) { // percolate down the head + uint64_t pos = 0; + uint64_t size = idx_heap.size(); + while (2 * pos + 1 < size) { + uint64_t i = 2 * pos + 1; + if (i + 1 < size and heap_idx_comparator(idx_heap[i], idx_heap[i + 1])) ++i; + if (heap_idx_comparator(idx_heap[i], idx_heap[pos])) break; + std::swap(idx_heap[pos], idx_heap[i]); + pos = i; + } + } else { + std::pop_heap(idx_heap.begin(), idx_heap.end(), heap_idx_comparator); + idx_heap.pop_back(); + } + }; + + /* create the input iterators and make the heap */ + for (uint64_t i = 0; i != num_files_to_merge; ++i) { + auto tmp_output_filename = get_tmp_output_filename(i); + mm_files[i].open(tmp_output_filename, mm::advice::sequential); + iterators.emplace_back(mm_files[i].data(), mm_files[i].data() + mm_files[i].size()); + idx_heap.push_back(i); + } + std::make_heap(idx_heap.begin(), idx_heap.end(), heap_idx_comparator); + + std::ofstream out(output_filename.c_str()); + if (!out.is_open()) throw std::runtime_error("cannot open file"); + + uint64_t num_written_sequences = 0; + while (!idx_heap.empty()) { + auto const& it = iterators[idx_heap.front()]; + out << '>' << '\n' << it.sequence() << '\n'; + num_written_sequences += 1; + if (num_written_sequences % 1000000 == 0) { + std::cout << "written sequences = " << num_written_sequences << "/" << num_sequences + << std::endl; + } + advance_heap_head(); + } + std::cout << "written sequences = " << num_written_sequences << "/" << num_sequences + << std::endl; + out.close(); + assert(num_written_sequences == num_sequences); + + /* remove tmp files */ + for (uint64_t i = 0; i != num_files_to_merge; ++i) { + mm_files[i].close(); + auto tmp_output_filename = get_tmp_output_filename(i); + std::remove(tmp_output_filename.c_str()); + } + } +} + +void sort(std::string const& input_filename, std::string const& output_filename, + std::string const& tmp_dirname) // +{ + std::ifstream is(input_filename.c_str()); + if (!is.good()) throw std::runtime_error("error in opening the file '" + input_filename + "'"); + std::cout << "reading file '" << input_filename << "'..." << std::endl; + if (util::ends_with(input_filename, ".gz")) { + zip_istream zis(is); + sort(zis, output_filename, tmp_dirname); + } else { + sort(is, output_filename, tmp_dirname); + } + is.close(); +} + +template +int sort(int argc, char** argv) { + cmd_line_parser::parser parser(argc, argv); + + /* Required arguments. */ + parser.add("input_filename", + "Must be a FASTA file (.fa/fasta extension) compressed with gzip (.gz) or not.", + "-i", true); + parser.add("output_filename", "Output filename.", "-o", true); + + /* Optional arguments. */ + parser.add("tmp_dirname", + "Temporary directory used for merging in external memory. Default " + "is directory '" + + constants::default_tmp_dirname + "'.", + "-d", false); + + if (!parser.parse()) return 0; + + auto input_filename = parser.get("input_filename"); + + std::string output_filename = parser.get("output_filename"); + std::string tmp_dirname = constants::default_tmp_dirname; + if (parser.parsed("tmp_dirname")) { + tmp_dirname = parser.get("tmp_dirname"); + essentials::create_directory(tmp_dirname); + } + + sort(input_filename, output_filename, tmp_dirname); + + return 0; +} + +} // namespace sshash \ No newline at end of file diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 4b72d08..6802381 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -10,11 +10,12 @@ #include "src/dictionary.cpp" #include "src/query.cpp" #include "src/info.cpp" -#include "src/statistics.cpp" +// #include "src/statistics.cpp" #include "build.cpp" #include "query.cpp" #include "permute.cpp" +#include "sort.cpp" using namespace sshash; @@ -29,9 +30,9 @@ int check(int argc, char** argv) { dictionary dict; load_dictionary(dict, index_filename, verbose); check_dictionary(dict); - check_correctness_navigational_contig_query(dict); - check_correctness_kmer_iterator(dict); - check_correctness_contig_iterator(dict); + // check_correctness_navigational_contig_query(dict); + // check_correctness_kmer_iterator(dict); + // check_correctness_contig_iterator(dict); return 0; } @@ -46,9 +47,9 @@ int bench(int argc, char** argv) { dictionary dict; load_dictionary(dict, index_filename, verbose); - perf_test_lookup_by_list_size(dict); + // perf_test_lookup_by_list_size(dict); - // perf_test_lookup_access(dict); + perf_test_lookup_access(dict); // if (dict.weighted()) perf_test_lookup_weight(dict); // perf_test_iterator(dict); @@ -73,14 +74,18 @@ int help(char* arg0) { std::cout << "== SSHash: (S)parse and (S)kew (Hash)ing of k-mers =========================" << std::endl << std::endl; - std::cout << "Usage: " << arg0 << " ...\n\n" - << "Available tools:\n" - << " build \t build a dictionary \n" - << " query \t query a dictionary \n" - << " check \t check correctness of a dictionary \n" - << " bench \t run performance tests for a dictionary \n" - << " permute \t permute a weighted input file \n" - << " compute-statistics \t compute index statistics " << std::endl; + std::cout + << "Usage: " << arg0 << " ...\n\n" + << "Available tools:\n" + << " build \t build a dictionary \n" + << " query \t query a dictionary \n" + << " check \t check correctness of a dictionary \n" + << " bench \t run performance tests for a dictionary \n" + << " permute \t permute a weighted input file \n" + // << " compute-statistics \t compute index statistics " << std::endl; + << " sort \t sort the strings in an input file by (non-decreasing) length " + << std::endl; + return 0; } @@ -97,8 +102,11 @@ int main(int argc, char** argv) { return bench(argc - 1, argv + 1); } else if (tool == "permute") { return permute(argc - 1, argv + 1); - } else if (tool == "compute-statistics") { - return compute_statistics(argc - 1, argv + 1); + // } else if (tool == "compute-statistics") { + // return compute_statistics(argc - 1, argv + 1); + // } + } else if (tool == "sort") { + return sort(argc - 1, argv + 1); } std::cout << "Unsupported tool '" << tool << "'.\n" << std::endl; return help(argv[0]); From 4390b13491ab2c7bda6d5a060e34a878b9eaded7 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 1 Oct 2025 15:42:28 +0200 Subject: [PATCH 029/112] minor --- include/endpoints.hpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/include/endpoints.hpp b/include/endpoints.hpp index ed9692f..867a325 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -2,6 +2,32 @@ namespace sshash { +struct endpoints // +{ + string_group_info get_string_group_info(uint64_t offset) const { + const uint64_t num_bits_super_group = bits::util::ceil_log2_uint64(m_data.size()); + uint64_t super_group = offset & ((1ULL << num_bits_super_group) - 1); + offset >>= num_bits_super_group; + + assert(super_group < m_data.size()); + auto const& v = m_data[super_group]; + const uint64_t num_bits_group = bits::util::ceil_log2_uint64(v.size()); + uint64_t group = offset & ((1ULL << num_bits_group) - 1); + offset >>= num_bits_group; + + return v[group]; + } + + struct string_group_info { + uint32_t string_length; // all strings in the group have the same length + uint32_t string_id; // absolute id of the first string in the group + uint64_t offset; // absolute offset where this group of strings begins + }; + +private: + std::vector> m_data; +}; + /* If we sort the strings by increasing lengths, From df7438bea6e1e4ee143eb8f2e41358defdf401e8 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 3 Oct 2025 23:53:12 +0200 Subject: [PATCH 030/112] using encoded offsets --- include/buckets.hpp | 104 ++++++--- .../builder/build_sparse_and_skew_index.hpp | 46 +++- include/builder/parse_file.hpp | 120 +++++++--- include/endpoints.hpp | 207 ++++++++++++++++-- include/util.hpp | 9 +- test/check_from_file.hpp | 37 ++-- tools/build.cpp | 3 + 7 files changed, 417 insertions(+), 109 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 89fea2b..32a1903 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -11,16 +11,44 @@ namespace sshash { template struct buckets // { - lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const { - auto p = strings_endpoints.locate(offset); + lookup_result offset_to_id(uint64_t encoded_offset, uint64_t pos_in_kmer, + const uint64_t k) const { + // auto p = strings_endpoints.locate(offset); // uint64_t contig_id = p.first.pos; // uint64_t contig_begin = p.first.val; // uint64_t contig_end = p.second.val; - uint64_t contig_id = p.string_id; - uint64_t contig_begin = p.string_begin; - uint64_t contig_end = p.string_end; + // uint64_t contig_id = p.string_id; + // uint64_t contig_begin = p.string_begin; + // uint64_t contig_end = p.string_end; + + // struct string_group_info { + // uint32_t strings_length; // all strings in the group have the same length + // uint32_t first_id; // absolute id of the first string in the group + // uint64_t group_offset; // absolute offset where this group of strings begins + // }; + // locate_result locate(const uint64_t kmer_offset) const { + // auto p = strings_endpoints.locate(kmer_offset); + // uint64_t i = p.first.pos; + // uint64_t string_group_begin = p.first.val; + // assert(i < strings_groups_info.size()); + // auto q = strings_groups_info[i]; + // uint64_t string_id_relative_to_group = (kmer_offset - string_group_begin) / + // q.string_length; uint64_t string_id = q.string_id + string_id_relative_to_group; + // uint64_t string_begin = string_group_begin + string_id_relative_to_group * + // q.string_length; uint64_t string_end = string_begin + q.string_length; return + // {string_id, string_begin, string_end}; + // } + auto [offset, p] = strings_endpoints.decode(encoded_offset); + + if (offset < pos_in_kmer or (offset - pos_in_kmer) < p.group_offset) return lookup_result(); + + offset -= pos_in_kmer; + uint64_t string_id_relative_to_group = (offset - p.group_offset) / p.strings_length; + uint64_t contig_id = p.first_id + string_id_relative_to_group; + uint64_t contig_begin = p.group_offset + string_id_relative_to_group * p.strings_length; + uint64_t contig_end = contig_begin + p.strings_length; /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -41,6 +69,7 @@ struct buckets // res.contig_size = contig_size; assert(contig_begin == res.contig_begin(k)); assert(contig_end == res.contig_end(k)); + assert(offset == res.kmer_offset(k)); return res; } @@ -69,13 +98,15 @@ struct buckets // const uint64_t k, const uint64_t m) const // { { /* check minimizer first */ - uint64_t bit_offset = kmer_t::bits_per_char * offsets2.access(begin); + uint64_t offset = offsets2.access(begin); + auto p = strings_endpoints.decode(offset); + uint64_t bit_offset = kmer_t::bits_per_char * p.first; uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); } for (uint64_t i = begin; i != end; ++i) { - uint64_t pos_in_seq = offsets2.access(i); - auto res = lookup_at_offset_no_check_minimizer(pos_in_seq, kmer, mini_info, k); + uint64_t offset = offsets2.access(i); + auto res = lookup_at_offset_no_check_minimizer(offset, kmer, mini_info, k); if (res.kmer_id != constants::invalid_uint64) { // assert(is_valid(res)); return res; @@ -84,34 +115,32 @@ struct buckets // return lookup_result(); } - lookup_result lookup_at_offset_no_check_minimizer(uint64_t pos_in_seq, kmer_t kmer, + lookup_result lookup_at_offset_no_check_minimizer(uint64_t offset, kmer_t kmer, minimizer_info mini_info, const uint64_t k) const // { - if (pos_in_seq >= mini_info.pos_in_kmer) { - uint64_t offset = pos_in_seq - mini_info.pos_in_kmer; - auto res = offset_to_id(offset, k); + auto res = offset_to_id(offset, mini_info.pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + offset = res.kmer_offset(k); if (offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - if (read_kmer == kmer) { - // assert(is_valid(res)); - return res; - } + if (read_kmer == kmer) return res; } } return lookup_result(); } - lookup_result lookup_at_offset(uint64_t pos_in_seq, kmer_t kmer, minimizer_info mini_info, + lookup_result lookup_at_offset(uint64_t offset, kmer_t kmer, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // { { /* check minimizer first */ - uint64_t bit_offset = kmer_t::bits_per_char * pos_in_seq; + auto p = strings_endpoints.decode(offset); + uint64_t bit_offset = kmer_t::bits_per_char * p.first; uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); } - return lookup_at_offset_no_check_minimizer(pos_in_seq, kmer, mini_info, k); + return lookup_at_offset_no_check_minimizer(offset, kmer, mini_info, k); } lookup_result lookup_canonical(uint64_t begin, uint64_t end, kmer_t kmer, kmer_t kmer_rc, @@ -119,7 +148,9 @@ struct buckets // const uint64_t m) const // { { /* check minimizer first */ - uint64_t bit_offset = kmer_t::bits_per_char * offsets2.access(begin); + uint64_t offset = offsets2.access(begin); + auto p = strings_endpoints.decode(offset); + uint64_t bit_offset = kmer_t::bits_per_char * p.first; uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); auto tmp = kmer_t(mini_info.minimizer); tmp.reverse_complement_inplace(m); @@ -129,9 +160,10 @@ struct buckets // } } for (uint64_t i = begin; i != end; ++i) { - uint64_t pos_in_seq = offsets2.access(i); + uint64_t offset = offsets2.access(i); auto res = lookup_canonical_at_offset_no_check_minimizer( // - pos_in_seq, kmer, kmer_rc, mini_info, k, m); + offset, kmer, kmer_rc, mini_info, k, m // + ); if (res.kmer_id != constants::invalid_uint64) { // assert(is_valid(res)); return res; @@ -140,7 +172,7 @@ struct buckets // return lookup_result(); } - lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t pos_in_seq, // + lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t offset, // const kmer_t kmer, const kmer_t kmer_rc, // const minimizer_info mini_info, // @@ -148,16 +180,16 @@ struct buckets // const uint64_t m) const // { uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_offset(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); + auto res = check_offset(offset, pos_in_kmer, kmer, kmer_rc, k); if (res.kmer_id != constants::invalid_uint64) { // assert(is_valid(res)); return res; } pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_offset(pos_in_seq, pos_in_kmer, kmer, kmer_rc, k); + return check_offset(offset, pos_in_kmer, kmer, kmer_rc, k); } - lookup_result lookup_canonical_at_offset(const uint64_t pos_in_seq, // + lookup_result lookup_canonical_at_offset(const uint64_t offset, // const kmer_t kmer, const kmer_t kmer_rc, // const minimizer_info mini_info, // @@ -165,7 +197,8 @@ struct buckets // const uint64_t m) const // { { /* check minimizer first */ - uint64_t bit_offset = kmer_t::bits_per_char * pos_in_seq; + auto p = strings_endpoints.decode(offset); + uint64_t bit_offset = kmer_t::bits_per_char * p.first; uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); auto tmp = kmer_t(mini_info.minimizer); tmp.reverse_complement_inplace(m); @@ -175,17 +208,17 @@ struct buckets // } } return lookup_canonical_at_offset_no_check_minimizer( // - pos_in_seq, kmer, kmer_rc, mini_info, k, m // + offset, kmer, kmer_rc, mini_info, k, m // ); } - lookup_result check_offset(const uint64_t pos_in_seq, const uint64_t pos_in_kmer, // - const kmer_t kmer, const kmer_t kmer_rc, // - const uint64_t k) const // + lookup_result check_offset(uint64_t offset, const uint64_t pos_in_kmer, // + const kmer_t kmer, const kmer_t kmer_rc, // + const uint64_t k) const // { - if (pos_in_seq >= pos_in_kmer) { - uint64_t offset = pos_in_seq - pos_in_kmer; - auto res = offset_to_id(offset, k); + auto res = offset_to_id(offset, pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + offset = res.kmer_offset(k); if (offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); @@ -320,7 +353,8 @@ struct buckets // } // bits::endpoints_sequence<> strings_endpoints; - endpoints2 strings_endpoints; + // endpoints2 strings_endpoints; + endpoints strings_endpoints; std::vector start_lists_of_size; bits::compact_vector offsets; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index 685a898..9ab99c9 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -11,20 +11,46 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, build_configuration const& build_config) // { const uint64_t num_kmers = data.num_kmers; + // const uint64_t num_sequences = data.num_sequences; const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); const uint64_t num_minimizers = data.minimizers.num_minimizers(); const uint64_t num_threads = build_config.num_threads; - const uint64_t num_bits_per_offset = - std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); + endpoints::builder endpoints_builder; + uint64_t num_bits_per_offset = endpoints_builder.build_from(data.strings_endpoints); + endpoints_builder.build(m_buckets.strings_endpoints); + + std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; + + { + // print + auto const& data = m_buckets.strings_endpoints.data(); + for (uint64_t i = 0; i != data.size(); ++i) { + std::cout << "super_group " << i << ":\n\t"; + for (uint64_t j = 0; j != data[i].size(); ++j) { + auto sg_info = data[i][j]; + std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << "," + << sg_info.group_offset << ")" << ' '; + } + std::cout << std::endl; + std::cout << "num_bits_per_group = " + << m_buckets.strings_endpoints.num_bits_per_group(data[i].size()) + << std::endl; + } + } + + if (!build_config.sorted) { + num_bits_per_offset = std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); + + std::cout << "num_bits_per_offset = ceil(log2(" + << data.strings.num_bits() / kmer_t::bits_per_char + << ")) = " << num_bits_per_offset << std::endl; + } + bits::compact_vector::builder offsets_builder; offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); - std::cout << "num_bits_per_offset = ceil(log2(" - << data.strings.num_bits() / kmer_t::bits_per_char << ")) = " << num_bits_per_offset - << std::endl; - mm::file_source input(data.minimizers.get_minimizers_filename(), mm::advice::sequential); minimizer_tuple const* begin = input.data(); @@ -100,7 +126,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), // data.strings_endpoints.size(), // data.strings_endpoints.back()); - m_buckets.strings_endpoints.build(data.strings_endpoints); + // m_buckets.strings_endpoints.build(data.strings_endpoints); m_buckets.strings.swap(data.strings); @@ -429,6 +455,12 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, ++pos_in_bucket; } assert(mt.pos_in_seq >= mt.pos_in_kmer); + + if (build_config.sorted) { // decode offset + auto p = m_buckets.strings_endpoints.decode(mt.pos_in_seq); + mt.pos_in_seq = p.first; // absolute offset + } + const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; kmer_iterator it(m_buckets.strings, k, kmer_t::bits_per_char * starting_pos_of_super_kmer); diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index c37e6f7..a98d2f2 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -1,5 +1,8 @@ #pragma once +#include + +#include "util.hpp" #include "external/gz/zip_stream.hpp" #include "include/minimizer_iterator.hpp" @@ -40,19 +43,38 @@ void parse_file(std::istream& is, parse_data& data, assert(max_num_kmers_in_super_kmer < (1ULL << (sizeof(num_kmers_in_super_kmer_uint_type) * 8))); bits::bit_vector::builder bvb_strings; + + struct _string_group_info { + uint32_t super_group_id; + uint32_t group_id; + uint64_t group_offset; // absolute offset where this group of strings begins + }; + + /* log2(string length) --> (super group id, current group id) */ + std::unordered_map> super_group_id(0); + + /* string-length --> _string_group_info */ + std::unordered_map string_groups_info(0); + { const uint64_t num_bits = 8 * 8 * essentials::GB; // reserve 8 GB of memory bvb_strings.reserve(num_bits); const uint64_t num_sequences = 100000000; data.strings_endpoints.reserve(num_sequences); - } - // std::unordered_map seq_lengths; + if (build_config.sorted) { + super_group_id.reserve(1ULL << 5); + string_groups_info.reserve(1ULL << 16); + } + } std::string sequence; uint64_t num_bases = 0; + uint32_t prev_len = 0; + uint32_t ceil_log2_prev_len = 0; + hasher_type hasher(build_config.seed); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); @@ -132,7 +154,30 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t n = sequence.length(); assert(n >= k); - // seq_lengths[n] += 1; + if (build_config.sorted) // + { + uint32_t ceil_log2_len = bits::util::ceil_log2_uint32(n); + if (ceil_log2_len > ceil_log2_prev_len) { + super_group_id[ceil_log2_len] = {super_group_id.size(), 0}; + } else { + assert(ceil_log2_len == ceil_log2_prev_len); + if (n > prev_len) super_group_id[ceil_log2_len].second += 1; + } + + if (!string_groups_info.empty()) { + if (n > prev_len) { + uint64_t offset = bvb_strings.num_bits() / kmer_t::bits_per_char; + auto p = super_group_id[ceil_log2_len]; + string_groups_info[n] = {p.first, p.second, offset}; + } + } else { + auto p = super_group_id[ceil_log2_len]; + string_groups_info[n] = {p.first, p.second, 0}; + } + + prev_len = n; + ceil_log2_prev_len = ceil_log2_len; + } ++data.num_sequences; if (data.num_sequences % 100000 == 0) { @@ -197,39 +242,21 @@ void parse_file(std::istream& is, parse_data& data, data.num_kmers << " [bits/kmer]" << std::endl; - // std::vector> seq_lengths_with_freq; - // seq_lengths_with_freq.reserve(seq_lengths.size()); - // for (auto p : seq_lengths) seq_lengths_with_freq.push_back(p); - // std::sort(seq_lengths_with_freq.begin(), seq_lengths_with_freq.end(), - // [](auto const& x, auto const& y) { - // auto log2x_first = std::ceil(std::log2(x.first)); - // auto log2y_first = std::ceil(std::log2(y.first)); - // if (log2x_first == log2y_first) - // return std::ceil(std::log2(x.first * x.second)) > - // std::ceil(std::log2(y.first * y.second)); - // return log2x_first < log2y_first; - // }); - // uint64_t count = 0; - // uint64_t num_bits = 5; - // for (auto p : seq_lengths_with_freq) { - // auto log2_len = std::ceil(std::log2(p.first)); - // if (log2_len > num_bits) { - // auto log2_count = std::ceil(std::log2(count)); - // std::cerr << "log2(num. sequence with log2(length) = " << num_bits - // << ") = " << log2_count << std::endl; - // count = 0; - // while (log2_len > num_bits) ++num_bits; - // } - // std::cerr << "num. sequences with length " << p.first << " = " << p.second - // << "; log2(length) = " << log2_len - // << "; log2(num. sequences) = " << std::ceil(std::log2(p.second)) - // << "; log2(total length) = " << std::ceil(std::log2(p.first * p.second)) << - // '\n'; - // ++count; - // } - // auto log2_count = std::ceil(std::log2(count)); - // std::cerr << "log2(num. sequence with log2(length) = " << num_bits << ") = " << log2_count - // << std::endl; + for (auto const& p : super_group_id) { + std::cout << "log2(string-length) = " << p.first << ": super_group_id = " << p.second.first + << ", num. groups in super group = " << p.second.second + 1 << std::endl; + } + for (auto const& p : string_groups_info) { + std::cout << "string-length = " << p.first + << ": super_group_id = " << p.second.super_group_id + << ", group id = " << p.second.group_id + << ", group_offset = " << p.second.group_offset << std::endl; + } + + const uint64_t num_bits_per_super_group = + super_group_id.size() == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_id.size()); + assert(num_bits_per_super_group > 0); + std::cout << "num_bits_per_super_group = " << num_bits_per_super_group << std::endl; /* The parameter m (minimizer length) should be at least @@ -322,6 +349,27 @@ void parse_file(std::istream& is, parse_data& data, } } + if (build_config.sorted) { // encode mini_info.pos_in_seq + auto p = string_groups_info[sequence_len]; + assert(mini_info.pos_in_seq >= p.group_offset); + mini_info.pos_in_seq -= p.group_offset; // relative to beginning of group + + uint32_t log2_seq_len = bits::util::ceil_log2_uint32(sequence_len); + auto q = super_group_id[log2_seq_len]; + assert(p.group_id < q.second + 1); + assert(p.super_group_id == q.first); + const uint64_t num_bits_per_group = + q.second + 1 == 1 ? 1 : bits::util::ceil_log2_uint64(q.second + 1); + assert(num_bits_per_group > 0); + // std::cout << "num_bits_per_group = " << num_bits_per_group << std::endl; + mini_info.pos_in_seq <<= num_bits_per_group; + mini_info.pos_in_seq += p.group_id; + + assert(p.super_group_id < (1ULL << num_bits_per_super_group)); + mini_info.pos_in_seq <<= num_bits_per_super_group; + mini_info.pos_in_seq += p.super_group_id; + } + if (prev_mini_info.minimizer == constants::invalid_uint64) { prev_mini_info = mini_info; } diff --git a/include/endpoints.hpp b/include/endpoints.hpp index 867a325..7db85c6 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -4,25 +4,206 @@ namespace sshash { struct endpoints // { - string_group_info get_string_group_info(uint64_t offset) const { - const uint64_t num_bits_super_group = bits::util::ceil_log2_uint64(m_data.size()); - uint64_t super_group = offset & ((1ULL << num_bits_super_group) - 1); - offset >>= num_bits_super_group; + struct string_group_info { + uint32_t strings_length; // all strings in the group have the same length + uint32_t first_id; // absolute id of the first string in the group + uint64_t group_offset; // absolute offset where this group of strings begins + }; + + struct builder // + { + uint64_t build_from(std::vector const& se) { + reserve(128); // reserve space for super groups + assert(se.front() == 0); + uint64_t prev_len = se[1] - se[0]; + uint64_t log2_prev_len = bits::util::ceil_log2_uint64(prev_len); + + // std::cout << "log2_prev_len = " << log2_prev_len << std::endl; + + uint64_t first_id = 0; + uint64_t group_offset = 0; + new_super_group(1ULL << 15); + + uint64_t prev_group_offset = 0; + uint64_t num_bits_per_offset = 0; + + for (uint64_t i = 1; i != se.size(); ++i) { + uint64_t curr_len = se[i] - se[i - 1]; + uint64_t log2_curr_len = bits::util::ceil_log2_uint64(curr_len); + + // std::cout << "log2_curr_len = " << log2_curr_len << std::endl; + + if (curr_len >= (1ULL << 32)) { + std::cerr + << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " + "string length" + << std::endl; + } + assert(curr_len >= prev_len); + if (curr_len > prev_len) // + { + if (first_id >= (1ULL << 32)) { + std::cerr << "More than 2^32-1 strings...a u32 is not enough to hold a " + "string id" + << std::endl; + } + // std::cout << "len = " << prev_len << ", first_id = " << first_id + // << ", offset = " << group_offset << std::endl; + + push_back({static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // + + if (group_offset > 0) { + // std::cout << "cumulative_len = " << (group_offset - prev_group_offset) + // << std::endl; + uint64_t log2_group_offset = + bits::util::ceil_log2_uint64(group_offset - prev_group_offset) + + (m_data.back().size() == 1 + ? 1 + : bits::util::ceil_log2_uint64(m_data.back().size())); + if (log2_group_offset > num_bits_per_offset) { + num_bits_per_offset = log2_group_offset; + } + // std::cout << "log2_group_offset = " << log2_group_offset << std::endl; + prev_group_offset = group_offset; + } + + if (log2_curr_len > log2_prev_len) { + new_super_group(1ULL << 15); + log2_prev_len = log2_curr_len; + } + + prev_len = curr_len; + first_id = i - 1; + group_offset = se[i - 1]; + } + } + // std::cout << "len = " << prev_len << ", first_id = " << first_id + // << ", offset = " << group_offset << std::endl; + push_back({static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // + + if (group_offset > 0) { + // std::cout << "cumulative_len = " << (se.back() - prev_group_offset) << std::endl; + uint64_t log2_group_offset = + bits::util::ceil_log2_uint64(se.back() - prev_group_offset) + + (m_data.back().size() == 1 + ? 1 + : bits::util::ceil_log2_uint64(m_data.back().size())); + if (log2_group_offset > num_bits_per_offset) { + num_bits_per_offset = log2_group_offset; + } + // std::cout << "log2_group_offset = " << log2_group_offset << std::endl; + } + + num_bits_per_offset += + m_data.size() == 1 ? 1 : bits::util::ceil_log2_uint64(m_data.size()); + return num_bits_per_offset; + } + + /* Reserve space for n super groups. */ + void reserve(uint64_t n = 0) { m_data.reserve(n); } + + /* Reserve space for n group in the new group. */ + void new_super_group(uint64_t n = 0) { + std::vector v; + v.reserve(n); + m_data.emplace_back(v); + } + + void push_back(string_group_info sgi) { m_data.back().push_back(sgi); } + + void build(endpoints& e) { e.m_data.swap(m_data); } + + private: + std::vector> m_data; + }; + + /* (absolute offset, string_group_info) */ + std::pair decode(const uint64_t offset) const // + { + const uint64_t p = num_bits_per_super_group(); + // std::cout << "num_bits_per_super_group = " << p << std::endl; + + uint64_t super_group = offset & ((1ULL << p) - 1); + // std::cout << "super_group = " << super_group << std::endl; assert(super_group < m_data.size()); auto const& v = m_data[super_group]; - const uint64_t num_bits_group = bits::util::ceil_log2_uint64(v.size()); - uint64_t group = offset & ((1ULL << num_bits_group) - 1); - offset >>= num_bits_group; + const uint64_t q = num_bits_per_group(v.size()); + // std::cout << "num_bits_per_group = " << q << std::endl; + + uint64_t group = (offset >> p) & ((1ULL << q) - 1); + // std::cout << "group = " << group << std::endl; - return v[group]; + assert(group < v.size()); + return {(offset >> (p + q)) + v[group].group_offset, v[group]}; } - struct string_group_info { - uint32_t string_length; // all strings in the group have the same length - uint32_t string_id; // absolute id of the first string in the group - uint64_t offset; // absolute offset where this group of strings begins - }; + uint64_t num_bits_per_super_group() const { + uint64_t b = m_data.size() == 1 ? 1 : bits::util::ceil_log2_uint64(m_data.size()); + assert(b > 0); + return b; + } + uint64_t num_bits_per_group(uint64_t group_size) const { + uint64_t b = group_size == 1 ? 1 : bits::util::ceil_log2_uint64(group_size); + assert(b > 0); + return b; + } + + uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { + return 0; + // TODO + + // constexpr uint64_t linear_scan_threshold = 32; + // uint64_t lo = 0; + // uint64_t hi = strings_endpoints.size() - 1; + // assert(strings_endpoints.access(0) == 0); + // while (hi - lo > linear_scan_threshold) { + // uint64_t mid = lo + (hi - lo) / 2; + // uint64_t val = strings_endpoints.access(mid); + // assert(val >= strings_groups_info[mid].string_id * (k - 1)); + // uint64_t id = val - strings_groups_info[mid].string_id * (k - 1); + // if (kmer_id <= id) { + // hi = mid; + // } else { + // lo = mid + 1; + // } + // } + // assert(lo < hi); + // assert(hi < strings_endpoints.size()); + // for (auto it = strings_endpoints.get_iterator_at(lo); lo < hi; ++lo, it.next()) { + // uint64_t val = it.value() - strings_groups_info[lo].string_id * (k - 1); + // if (val > kmer_id) break; + // } + // assert(lo > 0); + // auto const& p = strings_groups_info[lo - 1]; + // uint64_t id = strings_endpoints.access(lo - 1) - p.string_id * (k - 1); + // assert(id <= kmer_id); + // uint64_t offset = + // kmer_id + ((kmer_id - id) / (p.string_length - k + 1) + p.string_id) * (k - 1); + // return offset; + } + + std::vector> const& data() const { return m_data; } + + uint64_t num_bytes() const { + uint64_t n = sizeof(uint64_t); // for std::vector::size + for (auto const& v : m_data) n += sizeof(uint64_t) + essentials::vec_bytes(v); + return n; + } + + template + void visit(Visitor& visitor) const { + visitor.visit(m_data); + } + + template + void visit(Visitor& visitor) { + visitor.visit(m_data); + } private: std::vector> m_data; diff --git a/include/util.hpp b/include/util.hpp index 1866daa..6b0e3ae 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -52,10 +52,15 @@ struct lookup_result { uint64_t contig_id; uint64_t contig_size; uint64_t list_size; + bool minimizer_found; + uint64_t kmer_offset(const uint64_t k) const { // + return kmer_id + contig_id * (k - 1); + } + uint64_t contig_begin(const uint64_t k) const { // - return kmer_id + contig_id * (k - 1) - kmer_id_in_contig; + return kmer_offset(k) - kmer_id_in_contig; } uint64_t contig_end(const uint64_t k) const { // @@ -147,6 +152,7 @@ struct build_configuration { , canonical(false) , weighted(false) , verbose(true) + , sorted(false) , tmp_dirname(constants::default_tmp_dirname) @@ -163,6 +169,7 @@ struct build_configuration { bool canonical; bool weighted; bool verbose; + bool sorted; std::string tmp_dirname; diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index 4dc5b6e..ba04b08 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -36,15 +36,17 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& /* transform 50% of the read nucleotides into lower-case letters (assuming the input is upper-case): lower-case kmers must be found anyway in the index */ - if ((num_sequences & 1) == 0) { - std::transform(sequence.begin(), sequence.end(), sequence.begin(), - [](char c) { return std::tolower(c); }); - } + // if ((num_sequences & 1) == 0) { + // std::transform(sequence.begin(), sequence.end(), sequence.begin(), + // [](char c) { return std::tolower(c); }); + // } ++num_sequences; for (uint64_t i = 0; i + k <= sequence.length(); ++i) { assert(util::is_valid(sequence.data() + i, k)); + // std::cout << "kmer = '" << std::string(sequence.data() + i, k) << "'" << std::endl; + kmer_t uint_kmer = util::string_to_uint_kmer(sequence.data() + i, k); auto orientation = constants::forward_orientation; @@ -53,10 +55,10 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& } /* transform 50% of the kmers into their reverse complements */ - if ((num_kmers & 1) == 0) { - uint_kmer.reverse_complement_inplace(k); - orientation = constants::backward_orientation; - } + // if ((num_kmers & 1) == 0) { + // uint_kmer.reverse_complement_inplace(k); + // orientation = constants::backward_orientation; + // } util::uint_kmer_to_string(uint_kmer, expected_kmer_str.data(), k); auto curr = dict.lookup(expected_kmer_str.c_str()); @@ -138,15 +140,16 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& prev = curr; // check access - dict.access(curr.kmer_id, got_kmer_str.data()); - kmer_t got_uint_kmer = util::string_to_uint_kmer(got_kmer_str.data(), k); - kmer_t got_uint_kmer_rc = got_uint_kmer; - got_uint_kmer_rc.reverse_complement_inplace(k); - if (got_uint_kmer != uint_kmer and got_uint_kmer_rc != uint_kmer) { - std::cout << "ERROR: got '" << got_kmer_str << "' but expected '" - << expected_kmer_str << "'" << std::endl; - return false; - } + // dict.access(curr.kmer_id, got_kmer_str.data()); + // kmer_t got_uint_kmer = util::string_to_uint_kmer(got_kmer_str.data(), k); + // kmer_t got_uint_kmer_rc = got_uint_kmer; + // got_uint_kmer_rc.reverse_complement_inplace(k); + // if (got_uint_kmer != uint_kmer and got_uint_kmer_rc != uint_kmer) { + // std::cout << "ERROR: got '" << got_kmer_str << "' but expected '" + // << expected_kmer_str << "'" << std::endl; + // return false; + // } + ++num_kmers; } } diff --git a/tools/build.cpp b/tools/build.cpp index ed2df27..b531316 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -47,6 +47,8 @@ int build(int argc, char** argv) { parser.add("check", "Check correctness after construction.", "--check", false, true); parser.add("bench", "Run performance benchmark after construction.", "--bench", false, true); parser.add("verbose", "Verbose output during construction.", "--verbose", false, true); + parser.add("sorted", "Assume that the input contains strings sorted by non-decreasing lengths.", + "--sorted", false, true); if (!parser.parse()) return 0; @@ -65,6 +67,7 @@ int build(int argc, char** argv) { build_config.canonical = parser.get("canonical"); build_config.weighted = parser.get("weighted"); build_config.verbose = parser.get("verbose"); + build_config.sorted = parser.get("sorted"); if (parser.parsed("tmp_dirname")) { build_config.tmp_dirname = parser.get("tmp_dirname"); essentials::create_directory(build_config.tmp_dirname); From 3ccbbf488fd0ba804f32a6495863fa1aaf4f1add Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 4 Oct 2025 14:19:10 +0200 Subject: [PATCH 031/112] clean up --- include/buckets.hpp | 204 +++++----- .../builder/build_sparse_and_skew_index.hpp | 30 +- include/builder/parse_file.hpp | 65 ++- include/endpoints.hpp | 383 ++++++------------ 4 files changed, 263 insertions(+), 419 deletions(-) diff --git a/include/buckets.hpp b/include/buckets.hpp index 32a1903..bba3975 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -1,54 +1,39 @@ #pragma once #include "external/pthash/external/bits/include/endpoints_sequence.hpp" +#include "endpoints.hpp" #include "util.hpp" #include "kmer_iterator.hpp" -#include "endpoints.hpp" namespace sshash { template struct buckets // { - lookup_result offset_to_id(uint64_t encoded_offset, uint64_t pos_in_kmer, - const uint64_t k) const { + lookup_result offset_to_id(endpoints::decoded_offset p, uint64_t pos_in_kmer, + const uint64_t k) const // + { // auto p = strings_endpoints.locate(offset); - // uint64_t contig_id = p.first.pos; // uint64_t contig_begin = p.first.val; // uint64_t contig_end = p.second.val; - // uint64_t contig_id = p.string_id; - // uint64_t contig_begin = p.string_begin; - // uint64_t contig_end = p.string_end; - - // struct string_group_info { - // uint32_t strings_length; // all strings in the group have the same length - // uint32_t first_id; // absolute id of the first string in the group - // uint64_t group_offset; // absolute offset where this group of strings begins - // }; - // locate_result locate(const uint64_t kmer_offset) const { - // auto p = strings_endpoints.locate(kmer_offset); - // uint64_t i = p.first.pos; - // uint64_t string_group_begin = p.first.val; - // assert(i < strings_groups_info.size()); - // auto q = strings_groups_info[i]; - // uint64_t string_id_relative_to_group = (kmer_offset - string_group_begin) / - // q.string_length; uint64_t string_id = q.string_id + string_id_relative_to_group; - // uint64_t string_begin = string_group_begin + string_id_relative_to_group * - // q.string_length; uint64_t string_end = string_begin + q.string_length; return - // {string_id, string_begin, string_end}; - // } - auto [offset, p] = strings_endpoints.decode(encoded_offset); - - if (offset < pos_in_kmer or (offset - pos_in_kmer) < p.group_offset) return lookup_result(); + /****/ + // auto [offset, p] = strings_endpoints.decode(encoded_offset); + uint64_t offset = p.offset; + if (offset < pos_in_kmer or (offset - pos_in_kmer) < p.group_info.group_offset) { + return lookup_result(); + } offset -= pos_in_kmer; - uint64_t string_id_relative_to_group = (offset - p.group_offset) / p.strings_length; - uint64_t contig_id = p.first_id + string_id_relative_to_group; - uint64_t contig_begin = p.group_offset + string_id_relative_to_group * p.strings_length; - uint64_t contig_end = contig_begin + p.strings_length; + uint64_t string_id_relative_to_group = + (offset - p.group_info.group_offset) / p.group_info.strings_length; + uint64_t contig_id = p.group_info.first_id + string_id_relative_to_group; + uint64_t contig_begin = + p.group_info.group_offset + string_id_relative_to_group * p.group_info.strings_length; + uint64_t contig_end = contig_begin + p.group_info.strings_length; + /****/ /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -97,31 +82,34 @@ struct buckets // lookup_result lookup(uint64_t begin, uint64_t end, kmer_t kmer, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // { - { /* check minimizer first */ - uint64_t offset = offsets2.access(begin); - auto p = strings_endpoints.decode(offset); - uint64_t bit_offset = kmer_t::bits_per_char * p.first; - uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); - if (read_mmer != mini_info.minimizer) return lookup_result(false); - } - for (uint64_t i = begin; i != end; ++i) { - uint64_t offset = offsets2.access(i); - auto res = lookup_at_offset_no_check_minimizer(offset, kmer, mini_info, k); - if (res.kmer_id != constants::invalid_uint64) { - // assert(is_valid(res)); - return res; - } + /* check minimizer first */ + uint64_t offset = offsets2.access(begin); + endpoints::decoded_offset p = strings_endpoints.decode(offset); + uint64_t read_mmer = + uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + if (read_mmer != mini_info.minimizer) return lookup_result(false); + + auto res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); + if (res.kmer_id != constants::invalid_uint64) return res; + + for (uint64_t i = begin + 1; i < end; ++i) { + offset = offsets2.access(i); + p = strings_endpoints.decode(offset); + res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); + if (res.kmer_id != constants::invalid_uint64) return res; } + return lookup_result(); } - lookup_result lookup_at_offset_no_check_minimizer(uint64_t offset, kmer_t kmer, + lookup_result lookup_at_offset_no_check_minimizer(endpoints::decoded_offset p, kmer_t kmer, minimizer_info mini_info, const uint64_t k) const // { - auto res = offset_to_id(offset, mini_info.pos_in_kmer, k); + // auto res = offset_to_id(offset, mini_info.pos_in_kmer, k); + auto res = offset_to_id(p, mini_info.pos_in_kmer, k); if (res.kmer_id != constants::invalid_uint64) { - offset = res.kmer_offset(k); + uint64_t offset = res.kmer_offset(k); if (offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); @@ -131,48 +119,56 @@ struct buckets // return lookup_result(); } - lookup_result lookup_at_offset(uint64_t offset, kmer_t kmer, minimizer_info mini_info, - const uint64_t k, const uint64_t m) const // + lookup_result lookup_at_offset(const uint64_t encoded_offset, // + const kmer_t kmer, // + const minimizer_info mini_info, // + const uint64_t k, // + const uint64_t m) const // { - { /* check minimizer first */ - auto p = strings_endpoints.decode(offset); - uint64_t bit_offset = kmer_t::bits_per_char * p.first; - uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); - if (read_mmer != mini_info.minimizer) return lookup_result(false); - } - return lookup_at_offset_no_check_minimizer(offset, kmer, mini_info, k); + /* check minimizer first */ + endpoints::decoded_offset p = strings_endpoints.decode(encoded_offset); + uint64_t read_mmer = + uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + if (read_mmer != mini_info.minimizer) return lookup_result(false); + return lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); } lookup_result lookup_canonical(uint64_t begin, uint64_t end, kmer_t kmer, kmer_t kmer_rc, minimizer_info mini_info, const uint64_t k, const uint64_t m) const // { - { /* check minimizer first */ - uint64_t offset = offsets2.access(begin); - auto p = strings_endpoints.decode(offset); - uint64_t bit_offset = kmer_t::bits_per_char * p.first; - uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); + /* check minimizer first */ + uint64_t offset = offsets2.access(begin); + endpoints::decoded_offset p = strings_endpoints.decode(offset); + uint64_t read_mmer = + uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t minimizer_rc = 0; + { auto tmp = kmer_t(mini_info.minimizer); tmp.reverse_complement_inplace(m); - uint64_t minimizer_rc = uint64_t(tmp); - if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { - return lookup_result(false); - } + minimizer_rc = uint64_t(tmp); + } + if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { + return lookup_result(false); } - for (uint64_t i = begin; i != end; ++i) { - uint64_t offset = offsets2.access(i); - auto res = lookup_canonical_at_offset_no_check_minimizer( // - offset, kmer, kmer_rc, mini_info, k, m // + + auto res = lookup_canonical_at_offset_no_check_minimizer( // + p, kmer, kmer_rc, mini_info, k, m // + ); + if (res.kmer_id != constants::invalid_uint64) return res; + + for (uint64_t i = begin + 1; i < end; ++i) { + offset = offsets2.access(i); + p = strings_endpoints.decode(offset); + res = lookup_canonical_at_offset_no_check_minimizer( // + p, kmer, kmer_rc, mini_info, k, m // ); - if (res.kmer_id != constants::invalid_uint64) { - // assert(is_valid(res)); - return res; - } + if (res.kmer_id != constants::invalid_uint64) return res; } return lookup_result(); } - lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t offset, // + lookup_result lookup_canonical_at_offset_no_check_minimizer(endpoints::decoded_offset p, // const kmer_t kmer, const kmer_t kmer_rc, // const minimizer_info mini_info, // @@ -180,54 +176,47 @@ struct buckets // const uint64_t m) const // { uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_offset(offset, pos_in_kmer, kmer, kmer_rc, k); - if (res.kmer_id != constants::invalid_uint64) { - // assert(is_valid(res)); - return res; - } + auto res = check_offset(p, pos_in_kmer, kmer, kmer_rc, k); + if (res.kmer_id != constants::invalid_uint64) return res; pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_offset(offset, pos_in_kmer, kmer, kmer_rc, k); + return check_offset(p, pos_in_kmer, kmer, kmer_rc, k); } - lookup_result lookup_canonical_at_offset(const uint64_t offset, // - const kmer_t kmer, + lookup_result lookup_canonical_at_offset(const uint64_t encoded_offset, // + const kmer_t kmer, // const kmer_t kmer_rc, // const minimizer_info mini_info, // - const uint64_t k, - const uint64_t m) const // + const uint64_t k, // + const uint64_t m) const // { - { /* check minimizer first */ - auto p = strings_endpoints.decode(offset); - uint64_t bit_offset = kmer_t::bits_per_char * p.first; - uint64_t read_mmer = uint64_t(util::read_kmer_at(strings, m, bit_offset)); + /* check minimizer first */ + endpoints::decoded_offset p = strings_endpoints.decode(encoded_offset); + uint64_t read_mmer = + uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t minimizer_rc = 0; + { auto tmp = kmer_t(mini_info.minimizer); tmp.reverse_complement_inplace(m); - uint64_t minimizer_rc = uint64_t(tmp); - if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { - return lookup_result(false); - } + minimizer_rc = uint64_t(tmp); } - return lookup_canonical_at_offset_no_check_minimizer( // - offset, kmer, kmer_rc, mini_info, k, m // - ); + if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { + return lookup_result(false); + } + return lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); } - lookup_result check_offset(uint64_t offset, const uint64_t pos_in_kmer, // - const kmer_t kmer, const kmer_t kmer_rc, // - const uint64_t k) const // + lookup_result check_offset(endpoints::decoded_offset p, const uint64_t pos_in_kmer, // + const kmer_t kmer, const kmer_t kmer_rc, // + const uint64_t k) const // { - auto res = offset_to_id(offset, pos_in_kmer, k); + auto res = offset_to_id(p, pos_in_kmer, k); if (res.kmer_id != constants::invalid_uint64) { - offset = res.kmer_offset(k); + uint64_t offset = res.kmer_offset(k); if (offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - if (read_kmer == kmer) { - // assert(is_valid(res)); - return res; - } + if (read_kmer == kmer) return res; if (read_kmer == kmer_rc) { - // assert(is_valid(res)); res.kmer_orientation = constants::backward_orientation; return res; } @@ -353,7 +342,6 @@ struct buckets // } // bits::endpoints_sequence<> strings_endpoints; - // endpoints2 strings_endpoints; endpoints strings_endpoints; std::vector start_lists_of_size; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index 9ab99c9..eebfdd8 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -11,35 +11,16 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, build_configuration const& build_config) // { const uint64_t num_kmers = data.num_kmers; - // const uint64_t num_sequences = data.num_sequences; const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); const uint64_t num_minimizers = data.minimizers.num_minimizers(); const uint64_t num_threads = build_config.num_threads; - endpoints::builder endpoints_builder; - uint64_t num_bits_per_offset = endpoints_builder.build_from(data.strings_endpoints); - endpoints_builder.build(m_buckets.strings_endpoints); + uint64_t num_bits_per_offset = data.endpoints_builder.num_bits_per_offset(); + data.endpoints_builder.build(m_buckets.strings_endpoints); std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; - { - // print - auto const& data = m_buckets.strings_endpoints.data(); - for (uint64_t i = 0; i != data.size(); ++i) { - std::cout << "super_group " << i << ":\n\t"; - for (uint64_t j = 0; j != data[i].size(); ++j) { - auto sg_info = data[i][j]; - std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << "," - << sg_info.group_offset << ")" << ' '; - } - std::cout << std::endl; - std::cout << "num_bits_per_group = " - << m_buckets.strings_endpoints.num_bits_per_group(data[i].size()) - << std::endl; - } - } - if (!build_config.sorted) { num_bits_per_offset = std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); @@ -298,11 +279,6 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, std::cout << "computing minimizers offsets: " << timer.elapsed() / 1000000 << " [sec]" << std::endl; - // for (uint64_t i = 0; i != m_buckets.start_lists_of_size.size(); ++i) { - // std::cout << "start of lists of size " << i << ": " << m_buckets.start_lists_of_size[i] - // << std::endl; - // } - timer.reset(); if (num_buckets_in_skew_index == 0) return buckets_stats; @@ -458,7 +434,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, if (build_config.sorted) { // decode offset auto p = m_buckets.strings_endpoints.decode(mt.pos_in_seq); - mt.pos_in_seq = p.first; // absolute offset + mt.pos_in_seq = p.offset; // absolute offset } const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index a98d2f2..714e670 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -17,6 +17,7 @@ struct parse_data { minimizers_tuples minimizers; std::vector strings_endpoints; bits::bit_vector strings; + endpoints::builder endpoints_builder; weights::builder weights_builder; }; @@ -72,7 +73,7 @@ void parse_file(std::istream& is, parse_data& data, std::string sequence; uint64_t num_bases = 0; - uint32_t prev_len = 0; + uint64_t prev_len = 0; uint32_t ceil_log2_prev_len = 0; hasher_type hasher(build_config.seed); @@ -156,7 +157,7 @@ void parse_file(std::istream& is, parse_data& data, if (build_config.sorted) // { - uint32_t ceil_log2_len = bits::util::ceil_log2_uint32(n); + uint64_t ceil_log2_len = bits::util::ceil_log2_uint64(n); if (ceil_log2_len > ceil_log2_prev_len) { super_group_id[ceil_log2_len] = {super_group_id.size(), 0}; } else { @@ -215,6 +216,19 @@ void parse_file(std::istream& is, parse_data& data, } } + if (build_config.sorted) { + /* prev_len is now the length of the longest string */ + if (prev_len >= (1ULL << 32)) { + std::cerr << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " + "string length" + << std::endl; + } + if (data.num_sequences >= (1ULL << 32)) { + std::cerr << "More than 2^32-1 strings...a u32 is not enough to hold a string id" + << std::endl; + } + } + /* So strings_endpoints will be of size p+1, where p is the number of DNA sequences in the input file. @@ -242,21 +256,19 @@ void parse_file(std::istream& is, parse_data& data, data.num_kmers << " [bits/kmer]" << std::endl; - for (auto const& p : super_group_id) { - std::cout << "log2(string-length) = " << p.first << ": super_group_id = " << p.second.first - << ", num. groups in super group = " << p.second.second + 1 << std::endl; - } - for (auto const& p : string_groups_info) { - std::cout << "string-length = " << p.first - << ": super_group_id = " << p.second.super_group_id - << ", group id = " << p.second.group_id - << ", group_offset = " << p.second.group_offset << std::endl; - } + // for (auto const& p : super_group_id) { + // std::cout << "log2(string-length) = " << p.first << ": super_group_id = " << + // p.second.first + // << ", num. groups in super group = " << p.second.second + 1 << std::endl; + // } + // for (auto const& p : string_groups_info) { + // std::cout << "string-length = " << p.first + // << ": super_group_id = " << p.second.super_group_id + // << ", group id = " << p.second.group_id + // << ", group_offset = " << p.second.group_offset << std::endl; + // } - const uint64_t num_bits_per_super_group = - super_group_id.size() == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_id.size()); - assert(num_bits_per_super_group > 0); - std::cout << "num_bits_per_super_group = " << num_bits_per_super_group << std::endl; + data.endpoints_builder.build_from(data.strings_endpoints); /* The parameter m (minimizer length) should be at least @@ -349,25 +361,10 @@ void parse_file(std::istream& is, parse_data& data, } } - if (build_config.sorted) { // encode mini_info.pos_in_seq + if (build_config.sorted) { // encode offset auto p = string_groups_info[sequence_len]; - assert(mini_info.pos_in_seq >= p.group_offset); - mini_info.pos_in_seq -= p.group_offset; // relative to beginning of group - - uint32_t log2_seq_len = bits::util::ceil_log2_uint32(sequence_len); - auto q = super_group_id[log2_seq_len]; - assert(p.group_id < q.second + 1); - assert(p.super_group_id == q.first); - const uint64_t num_bits_per_group = - q.second + 1 == 1 ? 1 : bits::util::ceil_log2_uint64(q.second + 1); - assert(num_bits_per_group > 0); - // std::cout << "num_bits_per_group = " << num_bits_per_group << std::endl; - mini_info.pos_in_seq <<= num_bits_per_group; - mini_info.pos_in_seq += p.group_id; - - assert(p.super_group_id < (1ULL << num_bits_per_super_group)); - mini_info.pos_in_seq <<= num_bits_per_super_group; - mini_info.pos_in_seq += p.super_group_id; + mini_info.pos_in_seq = data.endpoints_builder.encode( + mini_info.pos_in_seq, p.super_group_id, p.group_id, p.group_offset); } if (prev_mini_info.minimizer == constants::invalid_uint64) { diff --git a/include/endpoints.hpp b/include/endpoints.hpp index 7db85c6..c2dd9d5 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -10,62 +10,77 @@ struct endpoints // uint64_t group_offset; // absolute offset where this group of strings begins }; + struct string_super_group_info { + uint8_t num_bits_per_group; + std::vector string_groups_info; + + template + void visit(Visitor& visitor) const { + visitor.visit(num_bits_per_group); + visitor.visit(string_groups_info); + } + + template + void visit(Visitor& visitor) { + visitor.visit(num_bits_per_group); + visitor.visit(string_groups_info); + } + }; + struct builder // { - uint64_t build_from(std::vector const& se) { - reserve(128); // reserve space for super groups + builder() : m_num_bits_per_super_group(0), m_num_bits_per_offset(0) {} + + void build_from(std::vector const& se) // + { + m_string_super_groups_info.reserve(128); // reserve space for super groups + assert(se.front() == 0); uint64_t prev_len = se[1] - se[0]; uint64_t log2_prev_len = bits::util::ceil_log2_uint64(prev_len); - // std::cout << "log2_prev_len = " << log2_prev_len << std::endl; - uint64_t first_id = 0; uint64_t group_offset = 0; - new_super_group(1ULL << 15); + /* Reserve space for n groups in the new super group. */ + auto new_super_group = [&](uint64_t n = 0) { + string_super_group_info ssgi; + ssgi.num_bits_per_group = 0; + ssgi.string_groups_info.reserve(n); + m_string_super_groups_info.emplace_back(ssgi); + }; + + new_super_group(1ULL << 15); uint64_t prev_group_offset = 0; - uint64_t num_bits_per_offset = 0; + m_num_bits_per_offset = 0; for (uint64_t i = 1; i != se.size(); ++i) { uint64_t curr_len = se[i] - se[i - 1]; uint64_t log2_curr_len = bits::util::ceil_log2_uint64(curr_len); - - // std::cout << "log2_curr_len = " << log2_curr_len << std::endl; - - if (curr_len >= (1ULL << 32)) { - std::cerr - << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " - "string length" - << std::endl; - } assert(curr_len >= prev_len); + if (curr_len > prev_len) // { - if (first_id >= (1ULL << 32)) { - std::cerr << "More than 2^32-1 strings...a u32 is not enough to hold a " - "string id" - << std::endl; - } // std::cout << "len = " << prev_len << ", first_id = " << first_id // << ", offset = " << group_offset << std::endl; - push_back({static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // + m_string_super_groups_info.back().string_groups_info.push_back( + {static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // if (group_offset > 0) { // std::cout << "cumulative_len = " << (group_offset - prev_group_offset) // << std::endl; uint64_t log2_group_offset = bits::util::ceil_log2_uint64(group_offset - prev_group_offset) + - (m_data.back().size() == 1 + (m_string_super_groups_info.back().string_groups_info.size() == 1 ? 1 - : bits::util::ceil_log2_uint64(m_data.back().size())); - if (log2_group_offset > num_bits_per_offset) { - num_bits_per_offset = log2_group_offset; + : bits::util::ceil_log2_uint64(m_string_super_groups_info.back() + .string_groups_info.size())); + if (log2_group_offset > m_num_bits_per_offset) { + m_num_bits_per_offset = log2_group_offset; } - // std::cout << "log2_group_offset = " << log2_group_offset << std::endl; prev_group_offset = group_offset; } @@ -79,78 +94,105 @@ struct endpoints // group_offset = se[i - 1]; } } + // std::cout << "len = " << prev_len << ", first_id = " << first_id // << ", offset = " << group_offset << std::endl; - push_back({static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // + + m_string_super_groups_info.back().string_groups_info.push_back( + {static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // if (group_offset > 0) { // std::cout << "cumulative_len = " << (se.back() - prev_group_offset) << std::endl; uint64_t log2_group_offset = bits::util::ceil_log2_uint64(se.back() - prev_group_offset) + - (m_data.back().size() == 1 + (m_string_super_groups_info.back().string_groups_info.size() == 1 ? 1 - : bits::util::ceil_log2_uint64(m_data.back().size())); - if (log2_group_offset > num_bits_per_offset) { - num_bits_per_offset = log2_group_offset; + : bits::util::ceil_log2_uint64( + m_string_super_groups_info.back().string_groups_info.size())); + if (log2_group_offset > m_num_bits_per_offset) { + m_num_bits_per_offset = log2_group_offset; } // std::cout << "log2_group_offset = " << log2_group_offset << std::endl; } - num_bits_per_offset += - m_data.size() == 1 ? 1 : bits::util::ceil_log2_uint64(m_data.size()); - return num_bits_per_offset; - } - - /* Reserve space for n super groups. */ - void reserve(uint64_t n = 0) { m_data.reserve(n); } + m_num_bits_per_super_group = + m_string_super_groups_info.size() == 1 + ? 1 + : bits::util::ceil_log2_uint64(m_string_super_groups_info.size()); + assert(m_num_bits_per_super_group > 0); + std::cout << "num_bits_per_super_group = " << m_num_bits_per_super_group << std::endl; + + m_num_bits_per_offset += m_num_bits_per_super_group; + + /* set num. bits per group for all super groups */ + for (auto& g : m_string_super_groups_info) { + g.num_bits_per_group = + g.string_groups_info.size() == 1 + ? 1 + : bits::util::ceil_log2_uint64(g.string_groups_info.size()); + } - /* Reserve space for n group in the new group. */ - void new_super_group(uint64_t n = 0) { - std::vector v; - v.reserve(n); - m_data.emplace_back(v); + { + // print + for (uint64_t i = 0; i != m_string_super_groups_info.size(); ++i) { + std::cout << "super_group " << i << ":\n\t"; + auto const& g = m_string_super_groups_info[i]; + for (auto sg_info : g.string_groups_info) { + std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << "," + << sg_info.group_offset << ")" << ' '; + } + std::cout << std::endl; + std::cout << "num_bits_per_group = " << int(g.num_bits_per_group) << std::endl; + } + } } - void push_back(string_group_info sgi) { m_data.back().push_back(sgi); } + uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } + + uint64_t encode(uint64_t offset, uint64_t super_group_id, uint64_t group_id, + uint64_t group_offset) // + { + assert(offset >= group_offset); + offset -= group_offset; // relative to beginning of group + auto const& g = m_string_super_groups_info[super_group_id]; + assert(group_id < g.string_groups_info.size()); + offset <<= g.num_bits_per_group; + offset += group_id; + assert(super_group_id < (1ULL << m_num_bits_per_super_group)); + offset <<= m_num_bits_per_super_group; + offset += super_group_id; + return offset; + } - void build(endpoints& e) { e.m_data.swap(m_data); } + void build(endpoints& e) { + std::swap(e.m_num_bits_per_super_group, m_num_bits_per_super_group); + e.m_string_super_groups_info.swap(m_string_super_groups_info); + } private: - std::vector> m_data; + uint8_t m_num_bits_per_super_group; + std::vector m_string_super_groups_info; + + uint64_t m_num_bits_per_offset; }; - /* (absolute offset, string_group_info) */ - std::pair decode(const uint64_t offset) const // + struct decoded_offset { + uint64_t offset; // absolute offset + string_group_info group_info; + }; + decoded_offset decode(const uint64_t offset) const // { - const uint64_t p = num_bits_per_super_group(); - // std::cout << "num_bits_per_super_group = " << p << std::endl; - - uint64_t super_group = offset & ((1ULL << p) - 1); - // std::cout << "super_group = " << super_group << std::endl; - - assert(super_group < m_data.size()); - auto const& v = m_data[super_group]; - const uint64_t q = num_bits_per_group(v.size()); - // std::cout << "num_bits_per_group = " << q << std::endl; - - uint64_t group = (offset >> p) & ((1ULL << q) - 1); - // std::cout << "group = " << group << std::endl; - - assert(group < v.size()); - return {(offset >> (p + q)) + v[group].group_offset, v[group]}; - } - - uint64_t num_bits_per_super_group() const { - uint64_t b = m_data.size() == 1 ? 1 : bits::util::ceil_log2_uint64(m_data.size()); - assert(b > 0); - return b; - } - uint64_t num_bits_per_group(uint64_t group_size) const { - uint64_t b = group_size == 1 ? 1 : bits::util::ceil_log2_uint64(group_size); - assert(b > 0); - return b; + const uint64_t p = m_num_bits_per_super_group; + uint64_t super_group_id = offset & ((1ULL << p) - 1); + assert(super_group_id < m_string_super_groups_info.size()); + auto const& g = m_string_super_groups_info[super_group_id]; + const uint64_t q = g.num_bits_per_group; + uint64_t group_id = (offset >> p) & ((1ULL << q) - 1); + assert(group_id < g.string_groups_info.size()); + auto sgi = g.string_groups_info[group_id]; + return {(offset >> (p + q)) + sgi.group_offset, sgi}; } uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { @@ -187,179 +229,16 @@ struct endpoints // // return offset; } - std::vector> const& data() const { return m_data; } - uint64_t num_bytes() const { - uint64_t n = sizeof(uint64_t); // for std::vector::size - for (auto const& v : m_data) n += sizeof(uint64_t) + essentials::vec_bytes(v); - return n; - } - - template - void visit(Visitor& visitor) const { - visitor.visit(m_data); - } - - template - void visit(Visitor& visitor) { - visitor.visit(m_data); - } - -private: - std::vector> m_data; -}; - -/* - - If we sort the strings by increasing lengths, - we can avoid storing an offset *per string* and the - resulting locate query. - Rather, we can keep an offset *per group of lists* - having the same length. Call A such sequence. - We can then use a locate query on A to determine the - group of lists to which an offset belongs. - - The common API is, given an offset: - return (contig_id, contig_begin, contig_end). - -*/ - -struct locate_result { - uint64_t string_id, string_begin, string_end; -}; - -/* - This solution stores an array of triples, T, one triple - per group of strings having the same length: - (string length, - absolute string id of the first string in the group, - offset of group). - - We use 32-bit ints for the first two components, and - a 64-bit int for the third component. - - Additionally, we store a sequence of locate query "hints", H, - of size g, where g := next_power_of_two(U/n). - Then for a query, we do i = x >> log(g) and use this as an index - into H: H[i] indicates the position in T of the first element of T - that has its high bits equal to x >> log(g), and start scanning T - from there. -*/ -struct endpoints1 {}; - -/* - This solution stores an array of pairs, P, one pair - per group of strings having the same length: - (string length, - absolute string id of the first string in the group). - - We use 32-bit ints for both components. - - The offsets of the groups are encoded using `bits::endpoints_sequence`. -*/ -struct endpoints2 { - endpoints2() {} - - void build(std::vector const& se) { - std::vector v; - v.reserve(se.size()); - strings_groups_info.reserve(se.size()); - - assert(se.front() == 0); - uint64_t prev_len = se[1] - se[0]; - uint64_t string_id = 0; - uint64_t string_group_begin = 0; - for (uint64_t i = 1; i != se.size(); ++i) { - uint64_t curr_len = se[i] - se[i - 1]; - if (curr_len >= 1ULL << 32) { - std::cerr << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " - "string length" - << std::endl; - } - assert(curr_len >= prev_len); - if (curr_len > prev_len) { - if (string_id >= 1ULL << 32) { - std::cerr - << "More than 2^32-1 strings...a u32 is not enough to hold a string_id" - << std::endl; - } - // std::cout << "len = " << prev_len << ", string_id = " << string_id - // << ", offset = " << string_group_begin << std::endl; - strings_groups_info.push_back({static_cast(prev_len), // - static_cast(string_id)}); - v.push_back(string_group_begin); - prev_len = curr_len; - string_id = i - 1; - string_group_begin = se[i - 1]; - } + uint64_t n = + sizeof(m_num_bits_per_super_group) + sizeof(uint64_t); // for std::vector::size + for (auto const& g : m_string_super_groups_info) { + n += sizeof(uint64_t) + sizeof(g.num_bits_per_group) + + essentials::vec_bytes(g.string_groups_info); } - // std::cout << "len = " << prev_len << ", string_id = " << string_id - // << ", offset = " << string_group_begin << std::endl; - strings_groups_info.push_back({static_cast(prev_len), // - static_cast(string_id)}); - v.push_back(string_group_begin); - v.push_back(string_group_begin + prev_len); - strings_endpoints.encode(v.begin(), v.size(), v.back()); - } - - locate_result locate(const uint64_t kmer_offset) const { - auto p = strings_endpoints.locate(kmer_offset); - uint64_t i = p.first.pos; - uint64_t string_group_begin = p.first.val; - - assert(i < strings_groups_info.size()); - auto q = strings_groups_info[i]; - uint64_t string_id_relative_to_group = (kmer_offset - string_group_begin) / q.string_length; - uint64_t string_id = q.string_id + string_id_relative_to_group; - uint64_t string_begin = string_group_begin + string_id_relative_to_group * q.string_length; - uint64_t string_end = string_begin + q.string_length; - - return {string_id, string_begin, string_end}; - } - - uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = strings_endpoints.size() - 1; - assert(strings_endpoints.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = strings_endpoints.access(mid); - assert(val >= strings_groups_info[mid].string_id * (k - 1)); - uint64_t id = val - strings_groups_info[mid].string_id * (k - 1); - if (kmer_id <= id) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < strings_endpoints.size()); - for (auto it = strings_endpoints.get_iterator_at(lo); lo < hi; ++lo, it.next()) { - uint64_t val = it.value() - strings_groups_info[lo].string_id * (k - 1); - if (val > kmer_id) break; - } - assert(lo > 0); - auto const& p = strings_groups_info[lo - 1]; - uint64_t id = strings_endpoints.access(lo - 1) - p.string_id * (k - 1); - assert(id <= kmer_id); - uint64_t offset = - kmer_id + ((kmer_id - id) / (p.string_length - k + 1) + p.string_id) * (k - 1); - return offset; - } - - uint64_t num_bytes() const { - return strings_endpoints.num_bytes() + essentials::vec_bytes(strings_groups_info); + return n; } - struct string_group_info { - uint32_t string_length; // all strings in the group have the same length - uint32_t string_id; // first id in the group - }; - - bits::endpoints_sequence<> strings_endpoints; - std::vector strings_groups_info; - template void visit(Visitor& visitor) const { visit_impl(visitor, *this); @@ -370,10 +249,14 @@ struct endpoints2 { visit_impl(visitor, *this); } +private: + uint8_t m_num_bits_per_super_group; + std::vector m_string_super_groups_info; + template static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.strings_endpoints); - visitor.visit(t.strings_groups_info); + visitor.visit(t.m_num_bits_per_super_group); + visitor.visit(t.m_string_super_groups_info); } }; From 2efac6c983e17bb9c8d17d10c1aaee6026cc653c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 4 Oct 2025 17:19:11 +0200 Subject: [PATCH 032/112] clean up and implemented endpoints::id_to_offset --- include/builder/parse_file.hpp | 2 +- include/endpoints.hpp | 221 ++++++++++++++++----------------- test/check_from_file.hpp | 34 ++--- 3 files changed, 125 insertions(+), 132 deletions(-) diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index 714e670..0c543ea 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -65,7 +65,7 @@ void parse_file(std::istream& is, parse_data& data, data.strings_endpoints.reserve(num_sequences); if (build_config.sorted) { - super_group_id.reserve(1ULL << 5); + super_group_id.reserve(1ULL << 7); string_groups_info.reserve(1ULL << 16); } } diff --git a/include/endpoints.hpp b/include/endpoints.hpp index c2dd9d5..a2c78fa 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -7,24 +7,12 @@ struct endpoints // struct string_group_info { uint32_t strings_length; // all strings in the group have the same length uint32_t first_id; // absolute id of the first string in the group - uint64_t group_offset; // absolute offset where this group of strings begins + uint64_t group_offset; // where the group of strings begins }; struct string_super_group_info { uint8_t num_bits_per_group; - std::vector string_groups_info; - - template - void visit(Visitor& visitor) const { - visitor.visit(num_bits_per_group); - visitor.visit(string_groups_info); - } - - template - void visit(Visitor& visitor) { - visitor.visit(num_bits_per_group); - visitor.visit(string_groups_info); - } + uint32_t super_group_offset; // where the super group info begins }; struct builder // @@ -33,7 +21,8 @@ struct endpoints // void build_from(std::vector const& se) // { - m_string_super_groups_info.reserve(128); // reserve space for super groups + m_string_super_groups_info.reserve(1ULL << 7); + m_string_groups_info.reserve(1ULL << 16); assert(se.front() == 0); uint64_t prev_len = se[1] - se[0]; @@ -42,15 +31,12 @@ struct endpoints // uint64_t first_id = 0; uint64_t group_offset = 0; - /* Reserve space for n groups in the new super group. */ - auto new_super_group = [&](uint64_t n = 0) { - string_super_group_info ssgi; - ssgi.num_bits_per_group = 0; - ssgi.string_groups_info.reserve(n); - m_string_super_groups_info.emplace_back(ssgi); + auto new_super_group = [&]() { + m_string_super_groups_info.push_back( + {0, static_cast(m_string_groups_info.size())}); }; - new_super_group(1ULL << 15); + new_super_group(); uint64_t prev_group_offset = 0; m_num_bits_per_offset = 0; @@ -64,28 +50,31 @@ struct endpoints // // std::cout << "len = " << prev_len << ", first_id = " << first_id // << ", offset = " << group_offset << std::endl; - m_string_super_groups_info.back().string_groups_info.push_back( - {static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // + m_string_groups_info.push_back({static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // if (group_offset > 0) { // std::cout << "cumulative_len = " << (group_offset - prev_group_offset) // << std::endl; - uint64_t log2_group_offset = + assert(m_string_groups_info.size() >= + m_string_super_groups_info.back().super_group_offset); + uint64_t super_group_current_size = + m_string_groups_info.size() - + m_string_super_groups_info.back().super_group_offset; + uint64_t num_bits_per_offset = bits::util::ceil_log2_uint64(group_offset - prev_group_offset) + - (m_string_super_groups_info.back().string_groups_info.size() == 1 + (super_group_current_size == 1 ? 1 - : bits::util::ceil_log2_uint64(m_string_super_groups_info.back() - .string_groups_info.size())); - if (log2_group_offset > m_num_bits_per_offset) { - m_num_bits_per_offset = log2_group_offset; + : bits::util::ceil_log2_uint64(super_group_current_size)); + if (num_bits_per_offset > m_num_bits_per_offset) { + m_num_bits_per_offset = num_bits_per_offset; } prev_group_offset = group_offset; } if (log2_curr_len > log2_prev_len) { - new_super_group(1ULL << 15); + new_super_group(); log2_prev_len = log2_curr_len; } @@ -98,55 +87,73 @@ struct endpoints // // std::cout << "len = " << prev_len << ", first_id = " << first_id // << ", offset = " << group_offset << std::endl; - m_string_super_groups_info.back().string_groups_info.push_back( - {static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // - - if (group_offset > 0) { - // std::cout << "cumulative_len = " << (se.back() - prev_group_offset) << std::endl; - uint64_t log2_group_offset = - bits::util::ceil_log2_uint64(se.back() - prev_group_offset) + - (m_string_super_groups_info.back().string_groups_info.size() == 1 - ? 1 - : bits::util::ceil_log2_uint64( - m_string_super_groups_info.back().string_groups_info.size())); - if (log2_group_offset > m_num_bits_per_offset) { - m_num_bits_per_offset = log2_group_offset; - } - // std::cout << "log2_group_offset = " << log2_group_offset << std::endl; - } + m_string_groups_info.push_back({static_cast(prev_len), // + static_cast(first_id), // + group_offset}); // m_num_bits_per_super_group = m_string_super_groups_info.size() == 1 ? 1 : bits::util::ceil_log2_uint64(m_string_super_groups_info.size()); assert(m_num_bits_per_super_group > 0); - std::cout << "num_bits_per_super_group = " << m_num_bits_per_super_group << std::endl; + std::cout << "num_bits_per_super_group = " << int(m_num_bits_per_super_group) + << std::endl; + + /* + Push a last dummy super-group so that + super_group_size = m_string_super_groups_info[i+1].super_group_offset - + m_string_super_groups_info[i].super_group_offset; + for any super_group_id i + */ + new_super_group(); + + if (group_offset > 0) { + assert(m_string_groups_info.size() >= + m_string_super_groups_info.back().super_group_offset); + uint64_t super_group_current_size = + m_string_groups_info.size() - + m_string_super_groups_info.back().super_group_offset; + uint64_t num_bits_per_offset = + bits::util::ceil_log2_uint64(se.back() - prev_group_offset) + + (super_group_current_size == 1 + ? 1 + : bits::util::ceil_log2_uint64(super_group_current_size)); + if (num_bits_per_offset > m_num_bits_per_offset) { + m_num_bits_per_offset = num_bits_per_offset; + } + } m_num_bits_per_offset += m_num_bits_per_super_group; /* set num. bits per group for all super groups */ - for (auto& g : m_string_super_groups_info) { - g.num_bits_per_group = - g.string_groups_info.size() == 1 - ? 1 - : bits::util::ceil_log2_uint64(g.string_groups_info.size()); + for (uint64_t i = 0; i != m_string_super_groups_info.size() - 1; ++i) { + uint64_t super_group_size = m_string_super_groups_info[i + 1].super_group_offset - + m_string_super_groups_info[i].super_group_offset; + m_string_super_groups_info[i].num_bits_per_group = + super_group_size == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_size); + // std::cout << "super_group_size = " << super_group_size << " " + // << "num_bits_per_group = " + // << int(m_string_super_groups_info[i].num_bits_per_group) << std::endl; } - { - // print - for (uint64_t i = 0; i != m_string_super_groups_info.size(); ++i) { - std::cout << "super_group " << i << ":\n\t"; - auto const& g = m_string_super_groups_info[i]; - for (auto sg_info : g.string_groups_info) { - std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << "," - << sg_info.group_offset << ")" << ' '; - } - std::cout << std::endl; - std::cout << "num_bits_per_group = " << int(g.num_bits_per_group) << std::endl; - } - } + // { + // // print + // for (uint64_t i = 0; i != m_string_super_groups_info.size() - 1; ++i) { + // std::cout << "super_group " << i << ":\n\t"; + // auto const& g = m_string_super_groups_info[i]; + // std::cout << "num_bits_per_group = " << int(g.num_bits_per_group) + // << ", super_group_offset = " << g.super_group_offset << std::endl; + // uint64_t super_group_offset_end = + // m_string_super_groups_info[i + 1].super_group_offset; + // for (uint64_t j = g.super_group_offset; j != super_group_offset_end; ++j) { + // auto sg_info = m_string_groups_info[j]; + // std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << + // "," + // << sg_info.group_offset << ")" << ' '; + // } + // std::cout << std::endl; + // } + // } } uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } @@ -156,8 +163,9 @@ struct endpoints // { assert(offset >= group_offset); offset -= group_offset; // relative to beginning of group - auto const& g = m_string_super_groups_info[super_group_id]; - assert(group_id < g.string_groups_info.size()); + auto g = m_string_super_groups_info[super_group_id]; + assert(group_id < m_string_super_groups_info[super_group_id + 1].super_group_offset - + g.super_group_offset); offset <<= g.num_bits_per_group; offset += group_id; assert(super_group_id < (1ULL << m_num_bits_per_super_group)); @@ -169,11 +177,13 @@ struct endpoints // void build(endpoints& e) { std::swap(e.m_num_bits_per_super_group, m_num_bits_per_super_group); e.m_string_super_groups_info.swap(m_string_super_groups_info); + e.m_string_groups_info.swap(m_string_groups_info); } private: uint8_t m_num_bits_per_super_group; std::vector m_string_super_groups_info; + std::vector m_string_groups_info; uint64_t m_num_bits_per_offset; }; @@ -187,56 +197,37 @@ struct endpoints // const uint64_t p = m_num_bits_per_super_group; uint64_t super_group_id = offset & ((1ULL << p) - 1); assert(super_group_id < m_string_super_groups_info.size()); - auto const& g = m_string_super_groups_info[super_group_id]; + auto g = m_string_super_groups_info[super_group_id]; const uint64_t q = g.num_bits_per_group; uint64_t group_id = (offset >> p) & ((1ULL << q) - 1); - assert(group_id < g.string_groups_info.size()); - auto sgi = g.string_groups_info[group_id]; + assert(group_id < m_string_super_groups_info[super_group_id + 1].super_group_offset - + g.super_group_offset); + auto sgi = m_string_groups_info[g.super_group_offset + group_id]; return {(offset >> (p + q)) + sgi.group_offset, sgi}; } - uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { - return 0; - // TODO - - // constexpr uint64_t linear_scan_threshold = 32; - // uint64_t lo = 0; - // uint64_t hi = strings_endpoints.size() - 1; - // assert(strings_endpoints.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = strings_endpoints.access(mid); - // assert(val >= strings_groups_info[mid].string_id * (k - 1)); - // uint64_t id = val - strings_groups_info[mid].string_id * (k - 1); - // if (kmer_id <= id) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < strings_endpoints.size()); - // for (auto it = strings_endpoints.get_iterator_at(lo); lo < hi; ++lo, it.next()) { - // uint64_t val = it.value() - strings_groups_info[lo].string_id * (k - 1); - // if (val > kmer_id) break; - // } - // assert(lo > 0); - // auto const& p = strings_groups_info[lo - 1]; - // uint64_t id = strings_endpoints.access(lo - 1) - p.string_id * (k - 1); - // assert(id <= kmer_id); - // uint64_t offset = - // kmer_id + ((kmer_id - id) / (p.string_length - k + 1) + p.string_id) * (k - 1); - // return offset; + uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const // + { + auto it = + std::upper_bound(m_string_groups_info.begin(), m_string_groups_info.end(), kmer_id, + [&](const uint64_t x, string_group_info const& sgi) { + assert(sgi.group_offset >= sgi.first_id * (k - 1)); + return x < sgi.group_offset - sgi.first_id * (k - 1); + }) - + 1; + assert(it != m_string_groups_info.end()); + auto sgi = *it; + uint64_t id = sgi.group_offset - sgi.first_id * (k - 1); + assert(id <= kmer_id); + uint64_t offset = + kmer_id + ((kmer_id - id) / (sgi.strings_length - k + 1) + sgi.first_id) * (k - 1); + return offset; } uint64_t num_bytes() const { - uint64_t n = - sizeof(m_num_bits_per_super_group) + sizeof(uint64_t); // for std::vector::size - for (auto const& g : m_string_super_groups_info) { - n += sizeof(uint64_t) + sizeof(g.num_bits_per_group) + - essentials::vec_bytes(g.string_groups_info); - } - return n; + return sizeof(m_num_bits_per_super_group) + 2 * sizeof(uint64_t) // for std::vector::size + + essentials::vec_bytes(m_string_super_groups_info) + + essentials::vec_bytes(m_string_groups_info); } template @@ -252,11 +243,13 @@ struct endpoints // private: uint8_t m_num_bits_per_super_group; std::vector m_string_super_groups_info; + std::vector m_string_groups_info; template static void visit_impl(Visitor& visitor, T&& t) { visitor.visit(t.m_num_bits_per_super_group); visitor.visit(t.m_string_super_groups_info); + visitor.visit(t.m_string_groups_info); } }; diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index ba04b08..0664e97 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -36,10 +36,10 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& /* transform 50% of the read nucleotides into lower-case letters (assuming the input is upper-case): lower-case kmers must be found anyway in the index */ - // if ((num_sequences & 1) == 0) { - // std::transform(sequence.begin(), sequence.end(), sequence.begin(), - // [](char c) { return std::tolower(c); }); - // } + if ((num_sequences & 1) == 0) { + std::transform(sequence.begin(), sequence.end(), sequence.begin(), + [](char c) { return std::tolower(c); }); + } ++num_sequences; for (uint64_t i = 0; i + k <= sequence.length(); ++i) { @@ -55,10 +55,10 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& } /* transform 50% of the kmers into their reverse complements */ - // if ((num_kmers & 1) == 0) { - // uint_kmer.reverse_complement_inplace(k); - // orientation = constants::backward_orientation; - // } + if ((num_kmers & 1) == 0) { + uint_kmer.reverse_complement_inplace(k); + orientation = constants::backward_orientation; + } util::uint_kmer_to_string(uint_kmer, expected_kmer_str.data(), k); auto curr = dict.lookup(expected_kmer_str.c_str()); @@ -140,15 +140,15 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& prev = curr; // check access - // dict.access(curr.kmer_id, got_kmer_str.data()); - // kmer_t got_uint_kmer = util::string_to_uint_kmer(got_kmer_str.data(), k); - // kmer_t got_uint_kmer_rc = got_uint_kmer; - // got_uint_kmer_rc.reverse_complement_inplace(k); - // if (got_uint_kmer != uint_kmer and got_uint_kmer_rc != uint_kmer) { - // std::cout << "ERROR: got '" << got_kmer_str << "' but expected '" - // << expected_kmer_str << "'" << std::endl; - // return false; - // } + dict.access(curr.kmer_id, got_kmer_str.data()); + kmer_t got_uint_kmer = util::string_to_uint_kmer(got_kmer_str.data(), k); + kmer_t got_uint_kmer_rc = got_uint_kmer; + got_uint_kmer_rc.reverse_complement_inplace(k); + if (got_uint_kmer != uint_kmer and got_uint_kmer_rc != uint_kmer) { + std::cout << "ERROR: got '" << got_kmer_str << "' but expected '" + << expected_kmer_str << "'" << std::endl; + return false; + } ++num_kmers; } From 6e4d9aa14837c27e6602a2541a67de33d1ebe863 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 4 Oct 2025 17:34:10 +0200 Subject: [PATCH 033/112] fixed CMakeLists.txt --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c16337..df0b800 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,9 @@ endif () set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) -if (UNIX AND (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")) +if (UNIX AND (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi2 -mavx2") - if (SSHASH_USE_ARCH_NATIVE) + if (SSHASH_USE_ARCH_NATIVE AND NOT CMAKE_CROSSCOMPILING) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") endif() endif() @@ -51,7 +51,7 @@ endif() MESSAGE(STATUS "Build type: ${CMAKE_BUILD_TYPE}") MESSAGE(STATUS "Conda build: ${CONDA_BUILD}") MESSAGE(STATUS "Installation prefix: ${CMAKE_INSTALL_PREFIX}") -MESSAGE(STATUS "Compiling for processor: ${CMAKE_HOST_SYSTEM_PROCESSOR}") +MESSAGE(STATUS "Compiling for processor: ${CMAKE_SYSTEM_PROCESSOR}") MESSAGE(STATUS "Compiling with flags:${CMAKE_CXX_FLAGS}") include_directories(.) # all include paths relative to parent directory @@ -101,4 +101,4 @@ if (CONDA_BUILD) install(TARGETS sshash RUNTIME DESTINATION bin ) -endif() +endif() \ No newline at end of file From f66ed13dada16add7dce68aa0be21531522b02c6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 5 Oct 2025 15:05:28 +0200 Subject: [PATCH 034/112] fixed endpoints and parallel correctness check --- include/endpoints.hpp | 103 ++++++++++++++---------------------------- test/check.hpp | 74 ++++++++++++++++++++++-------- 2 files changed, 91 insertions(+), 86 deletions(-) diff --git a/include/endpoints.hpp b/include/endpoints.hpp index a2c78fa..4234c41 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -37,42 +37,17 @@ struct endpoints // }; new_super_group(); - uint64_t prev_group_offset = 0; - m_num_bits_per_offset = 0; for (uint64_t i = 1; i != se.size(); ++i) { uint64_t curr_len = se[i] - se[i - 1]; uint64_t log2_curr_len = bits::util::ceil_log2_uint64(curr_len); assert(curr_len >= prev_len); - if (curr_len > prev_len) // { - // std::cout << "len = " << prev_len << ", first_id = " << first_id - // << ", offset = " << group_offset << std::endl; - m_string_groups_info.push_back({static_cast(prev_len), // static_cast(first_id), // group_offset}); // - if (group_offset > 0) { - // std::cout << "cumulative_len = " << (group_offset - prev_group_offset) - // << std::endl; - assert(m_string_groups_info.size() >= - m_string_super_groups_info.back().super_group_offset); - uint64_t super_group_current_size = - m_string_groups_info.size() - - m_string_super_groups_info.back().super_group_offset; - uint64_t num_bits_per_offset = - bits::util::ceil_log2_uint64(group_offset - prev_group_offset) + - (super_group_current_size == 1 - ? 1 - : bits::util::ceil_log2_uint64(super_group_current_size)); - if (num_bits_per_offset > m_num_bits_per_offset) { - m_num_bits_per_offset = num_bits_per_offset; - } - prev_group_offset = group_offset; - } - if (log2_curr_len > log2_prev_len) { new_super_group(); log2_prev_len = log2_curr_len; @@ -84,9 +59,6 @@ struct endpoints // } } - // std::cout << "len = " << prev_len << ", first_id = " << first_id - // << ", offset = " << group_offset << std::endl; - m_string_groups_info.push_back({static_cast(prev_len), // static_cast(first_id), // group_offset}); // @@ -107,53 +79,48 @@ struct endpoints // */ new_super_group(); - if (group_offset > 0) { - assert(m_string_groups_info.size() >= - m_string_super_groups_info.back().super_group_offset); - uint64_t super_group_current_size = - m_string_groups_info.size() - - m_string_super_groups_info.back().super_group_offset; + /* set num. bits per group for all super groups */ + for (uint64_t i = 0, prev_offset = 0; i != m_string_super_groups_info.size() - 1; ++i) { + std::cout << "super_group " << i << ": "; + uint64_t begin = m_string_super_groups_info[i].super_group_offset; + uint64_t end = m_string_super_groups_info[i + 1].super_group_offset; + uint64_t super_group_size = end - begin; + m_string_super_groups_info[i].num_bits_per_group = + super_group_size == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_size); + std::cout << "super_group_size = " << super_group_size << " " + << "num_bits_per_group = " + << int(m_string_super_groups_info[i].num_bits_per_group) << " "; + + uint64_t longest_cumulative_length = 0; + for (uint64_t j = begin; j != end; ++j) // + { + uint64_t next_offset = j + 1 < m_string_groups_info.size() + ? m_string_groups_info[j + 1].group_offset + : se.back(); + assert(next_offset > prev_offset); + uint64_t cumulative_length = next_offset - prev_offset; + if (cumulative_length > longest_cumulative_length) { + longest_cumulative_length = cumulative_length; + } + prev_offset = next_offset; + } + + assert(longest_cumulative_length > 1); + uint64_t num_bits_per_relative_offset = + bits::util::ceil_log2_uint64(longest_cumulative_length); uint64_t num_bits_per_offset = - bits::util::ceil_log2_uint64(se.back() - prev_group_offset) + - (super_group_current_size == 1 - ? 1 - : bits::util::ceil_log2_uint64(super_group_current_size)); + m_string_super_groups_info[i].num_bits_per_group + num_bits_per_relative_offset; + std::cout << "num_bits_per_relative_offset = " << num_bits_per_relative_offset + << " num_bits_per_offset = " << num_bits_per_offset << std::endl; + if (num_bits_per_offset > m_num_bits_per_offset) { m_num_bits_per_offset = num_bits_per_offset; } } m_num_bits_per_offset += m_num_bits_per_super_group; - - /* set num. bits per group for all super groups */ - for (uint64_t i = 0; i != m_string_super_groups_info.size() - 1; ++i) { - uint64_t super_group_size = m_string_super_groups_info[i + 1].super_group_offset - - m_string_super_groups_info[i].super_group_offset; - m_string_super_groups_info[i].num_bits_per_group = - super_group_size == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_size); - // std::cout << "super_group_size = " << super_group_size << " " - // << "num_bits_per_group = " - // << int(m_string_super_groups_info[i].num_bits_per_group) << std::endl; - } - - // { - // // print - // for (uint64_t i = 0; i != m_string_super_groups_info.size() - 1; ++i) { - // std::cout << "super_group " << i << ":\n\t"; - // auto const& g = m_string_super_groups_info[i]; - // std::cout << "num_bits_per_group = " << int(g.num_bits_per_group) - // << ", super_group_offset = " << g.super_group_offset << std::endl; - // uint64_t super_group_offset_end = - // m_string_super_groups_info[i + 1].super_group_offset; - // for (uint64_t j = g.super_group_offset; j != super_group_offset_end; ++j) { - // auto sg_info = m_string_groups_info[j]; - // std::cout << "(" << sg_info.strings_length << "," << sg_info.first_id << - // "," - // << sg_info.group_offset << ")" << ' '; - // } - // std::cout << std::endl; - // } - // } + std::cout << "num_bits_per_offset = " << m_num_bits_per_offset << std::endl; + assert(m_num_bits_per_offset > 0); } uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } diff --git a/test/check.hpp b/test/check.hpp index 1dd216e..86f6f0e 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -1,33 +1,71 @@ #pragma once +#include + namespace sshash { template bool check_dictionary(dictionary const& dict) { const uint64_t k = dict.k(); const uint64_t n = dict.num_kmers(); - std::cout << "checking correctness of access and positive lookup..." << std::endl; - uint64_t id = 0; - std::string kmer(k, 0); - for (; id != n; ++id) { - if (id != 0 and id % 5000000 == 0) std::cout << "checked " << id << " kmers" << std::endl; - dict.access(id, kmer.data()); - uint64_t got_id = dict.lookup(kmer.c_str()).kmer_id; - if (got_id == constants::invalid_uint64) { - std::cout << "kmer '" << kmer << "' not found!" << std::endl; - return false; - } - if (got_id >= n) { - std::cout << "ERROR: id out of range " << got_id << "/" << n << std::endl; - return false; + + const uint64_t num_threads = std::thread::hardware_concurrency(); + std::cout << "checking correctness of access and positive lookup using " << num_threads + << " threads..." << std::endl; + + std::mutex print_mutex; + + auto worker = [&](uint64_t start, uint64_t end, size_t thread_id) { + std::string kmer(k, 0); + for (uint64_t id = start; id != end; ++id) // + { + uint64_t count = id - start; + if (count != 0 and count % 15'000'000 == 0) { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Checked " << count + << " kmers (local progress)" << std::endl; + } + + dict.access(id, kmer.data()); + uint64_t got_id = dict.lookup(kmer.c_str()).kmer_id; + + if (got_id == constants::invalid_uint64) { + std::lock_guard lock(print_mutex); + std::cerr << "[Thread " << thread_id << "] kmer '" << kmer << "' not found!\n"; + return; + } + if (got_id >= n) { + std::lock_guard lock(print_mutex); + std::cerr << "[Thread " << thread_id << "] ERROR: id out of range " << got_id << "/" + << n << "\n"; + return; + } + if (got_id != id) { + std::lock_guard lock(print_mutex); + std::cerr << "[Thread " << thread_id << "] expected id " << id << " but got id " + << got_id << "\n"; + return; + } } - if (got_id != id) { - std::cout << "expected id " << id << " but got id " << got_id << std::endl; - return false; + { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Finished range [" << start << ", " << end + << ")\n"; } + }; + + std::vector threads; + threads.reserve(num_threads); + for (size_t t = 0, chunk_size = (n + num_threads - 1) / num_threads; t != num_threads; ++t) { + uint64_t start = t * chunk_size; + uint64_t end = std::min(n, start + chunk_size); + threads.emplace_back(worker, start, end, t); } - std::cout << "checked " << id << " kmers" << std::endl; + + for (auto& th : threads) th.join(); + std::cout << "EVERYTHING OK!" << std::endl; + return check_correctness_negative_lookup(dict); } From 571e3d4f3c5f149b6bb406e27a415d3d3cc1ee24 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 5 Oct 2025 15:59:25 +0200 Subject: [PATCH 035/112] added bioconda badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2c8c97a..64f894b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [![Build](https://github.com/jermp/sshash/actions/workflows/build.yml/badge.svg)](https://github.com/jermp/sshash/actions/workflows/build.yml) [![CodeQL](https://github.com/jermp/sshash/actions/workflows/codeql.yml/badge.svg)](https://github.com/jermp/sshash/actions/workflows/codeql.yml) [![Anaconda-Server Badge](https://anaconda.org/bioconda/sshash/badges/platforms.svg)](https://anaconda.org/bioconda/sshash) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat)](http://bioconda.github.io/recipes/sshash/README.html) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7772316.svg)](https://doi.org/10.5281/zenodo.7772316) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7239205.svg)](https://doi.org/10.5281/zenodo.7239205) From b8f589c6397c512855bee1532256f984d0a33107 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 6 Oct 2025 21:21:59 +0200 Subject: [PATCH 036/112] implemented all miscellaneous fixes by Oleksandr Kulkov --- CMakeLists.txt | 22 +++++---- .../builder/build_sparse_and_skew_index.hpp | 16 ++++--- include/builder/parallel_sort.hpp | 45 ++++++++++--------- include/builder/parse_file.hpp | 6 +-- include/builder/util.hpp | 4 +- include/dictionary.hpp | 4 +- include/kmer.hpp | 21 ++++++++- include/util.hpp | 2 +- src/build.cpp | 9 ++-- src/info.cpp | 5 ++- tools/build.cpp | 2 +- 11 files changed, 82 insertions(+), 54 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df0b800..cea50e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,14 +54,6 @@ MESSAGE(STATUS "Installation prefix: ${CMAKE_INSTALL_PREFIX}") MESSAGE(STATUS "Compiling for processor: ${CMAKE_SYSTEM_PROCESSOR}") MESSAGE(STATUS "Compiling with flags:${CMAKE_CXX_FLAGS}") -include_directories(.) # all include paths relative to parent directory -include_directories(external/pthash/include) -include_directories(external/pthash/external/bits/include) -include_directories(external/pthash/external/fastmod) -include_directories(external/pthash/external/bits/external/essentials/include) -include_directories(external/pthash/external/xxHash) -include_directories(external/pthash/external/mm_file/include) - set(Z_LIB_SOURCES external/gz/zip_stream.cpp ) @@ -73,13 +65,27 @@ set(SSHASH_SOURCES src/info.cpp ) +set(SSHASH_INCLUDE_DIRS + external/pthash/include + external/pthash/external/bits/include + external/pthash/external/fastmod + external/pthash/external/bits/external/essentials/include + external/pthash/external/xxHash + external/pthash/external/mm_file/include + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + # Create a static lib add_library(sshash_static STATIC ${Z_LIB_SOURCES} ${SSHASH_SOURCES} ) +target_include_directories(sshash_static PUBLIC ${SSHASH_INCLUDE_DIRS}) + add_executable(sshash tools/sshash.cpp) +target_include_directories(sshash PUBLIC ${SSHASH_INCLUDE_DIRS}) target_link_libraries(sshash z ) diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index eebfdd8..e589772 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -58,9 +58,9 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } } offsets.push_back(num_super_kmers); - assert(offsets.size() == num_threads + 1); - std::vector threads_buckets_stats(num_threads); + std::vector threads_buckets_stats; + threads_buckets_stats.reserve(num_threads); auto exe = [&](const uint64_t thread_id) { assert(thread_id + 1 < offsets.size()); @@ -93,12 +93,14 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } }; - std::vector threads(num_threads); - for (uint64_t thread_id = 0; thread_id != num_threads; ++thread_id) { - threads_buckets_stats[thread_id] = - buckets_statistics(num_minimizers, num_kmers, num_minimizer_positions); - threads[thread_id] = std::thread(exe, thread_id); + std::vector threads; + threads.reserve(num_threads); + assert(offsets.size() <= num_threads + 1); + for (uint64_t thread_id = 0; thread_id + 1 < offsets.size(); ++thread_id) { + threads_buckets_stats.emplace_back(num_minimizers, num_kmers, num_minimizer_positions); + threads.emplace_back(exe, thread_id); } + for (auto& t : threads) { if (t.joinable()) t.join(); } diff --git a/include/builder/parallel_sort.hpp b/include/builder/parallel_sort.hpp index 66668e0..8605373 100644 --- a/include/builder/parallel_sort.hpp +++ b/include/builder/parallel_sort.hpp @@ -55,18 +55,18 @@ void parallel_merge(Iterator A_begin, Iterator A_end, // working memory, which must be of same size as data. */ template -void parallel_sort(std::vector& data, const uint64_t num_threads, Compare comp) // +void parallel_sort(std::vector& data, uint64_t num_threads, Compare comp) // { std::vector temp_data; temp_data.resize(data.size()); + const uint64_t data_size = data.size(); + num_threads = std::min(num_threads, data_size); if (num_threads <= 1) { std::sort(data.begin(), data.end(), comp); return; } - assert((num_threads & (num_threads - 1)) == 0); - const uint64_t data_size = data.size(); const uint64_t chunk_size = (data_size + num_threads - 1) / num_threads; const uint64_t sequential_merge_threshold = data_size / uint64_t(std::log2(num_threads)); assert(sequential_merge_threshold > 0); @@ -75,12 +75,13 @@ void parallel_sort(std::vector& data, const uint64_t num_threads, Compare com threads.reserve(num_threads); using iterator_t = typename std::vector::iterator; - std::vector> ranges(num_threads); + std::vector> ranges; + ranges.reserve(num_threads); - for (uint64_t i = 0; i != num_threads; ++i) { + for (uint64_t i = 0; i * chunk_size < data_size; ++i) { uint64_t begin = i * chunk_size; - uint64_t end = (i == num_threads - 1) ? data_size : begin + chunk_size; - ranges[i] = {data.begin() + begin, data.begin() + end}; + uint64_t end = std::min(data_size, begin + chunk_size); + ranges.emplace_back(data.begin() + begin, data.begin() + end); threads.emplace_back( [&, begin, end]() { std::sort(data.begin() + begin, data.begin() + end, comp); }); } @@ -94,27 +95,27 @@ void parallel_sort(std::vector& data, const uint64_t num_threads, Compare com while (ranges.size() != 1) // { next_ranges.clear(); - for (uint64_t i = 0; i != ranges.size(); i += 2) { + for (uint64_t i = 0; i < ranges.size(); i += 2) { + auto [begin1, end1] = ranges[i]; + auto input = data.begin(); + auto output = temp_data.begin(); + if (swap) std::swap(input, output); + uint64_t offset = std::distance(input, begin1); + auto output_iterator = output + offset; + assert(offset <= data_size); + uint64_t output_size = end1 - begin1; if (i + 1 < ranges.size()) { - auto [begin1, end1] = ranges[i]; auto [begin2, end2] = ranges[i + 1]; - uint64_t output_size = (end1 - begin1) + (end2 - begin2); - - auto input = data.begin(); - auto output = temp_data.begin(); - if (swap) std::swap(input, output); - uint64_t offset = std::distance(input, begin1); - auto output_iterator = output + offset; - assert(offset <= data_size); - + output_size += end2 - begin2; parallel_merge(begin1, end1, begin2, end2, output_iterator, comp, sequential_merge_threshold); assert(std::is_sorted(output_iterator, output_iterator + output_size, comp)); - - auto merged_begin = output_iterator; - auto merged_end = merged_begin + output_size; - next_ranges.push_back({merged_begin, merged_end}); + } else { + std::move(begin1, end1, output_iterator); } + auto merged_begin = output_iterator; + auto merged_end = merged_begin + output_size; + next_ranges.push_back({merged_begin, merged_end}); } ranges.swap(next_ranges); swap = !swap; diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index 0c543ea..e5e550e 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -201,7 +201,7 @@ void parse_file(std::istream& is, parse_data& data, uint64_t i = 0; if constexpr (kmer_t::bits_per_char == 2) { -#if !defined(SSHASH_USE_TRADITIONAL_NUCLEOTIDE_ENCODING) and defined(__x86_64__) +#if !defined(SSHASH_USE_TRADITIONAL_NUCLEOTIDE_ENCODING) and defined(__AVX2__) /* process 32 bytes at a time */ for (; i + 32 <= n; i += 32) { @@ -293,7 +293,7 @@ void parse_file(std::istream& is, parse_data& data, std::vector threads; threads.reserve(num_threads); - for (uint64_t t = 0; t != num_threads; ++t) // + for (uint64_t t = 0; t * num_sequences_per_thread < data.num_sequences; ++t) // { threads.emplace_back([&, t] { std::vector buffer; @@ -328,7 +328,7 @@ void parse_file(std::istream& is, parse_data& data, minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); - for (uint64_t i = index_begin; i != index_end; ++i) // + for (uint64_t i = index_begin; i < index_end; ++i) // { const uint64_t begin = data.strings_endpoints[i]; const uint64_t end = data.strings_endpoints[i + 1]; diff --git a/include/builder/util.hpp b/include/builder/util.hpp index 3a6f2cb..f88bd4a 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -3,7 +3,7 @@ #include #include -#if defined(__x86_64__) +#if defined(__AVX2__) #include #include #endif @@ -30,7 +30,7 @@ struct parse_runtime_error : public std::runtime_error { } } -#if defined(__x86_64__) +#if defined(__AVX2__) /* This function takes 32 bytes and packs the two bits in positions 1 and 2 (from right) of each byte into diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 406fec9..4e203f1 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -113,7 +113,9 @@ struct dictionary { // return iterator(this, begin_kmer_id, end_kmer_id); // } - bits::bit_vector const& strings() const { return m_buckets.strings; } + bits::bit_vector const& get_strings() const { return m_buckets.strings; } + buckets const& get_buckets() const { return m_buckets; } + minimizers const& get_minimizers() const { return m_minimizers; } uint64_t num_bits() const; void print_info() const; diff --git a/include/kmer.hpp b/include/kmer.hpp index 82a6111..033bfef 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -16,7 +16,7 @@ namespace sshash { template struct uint_kmer_t { - Kmer kmer; + Kmer kmer = 0; uint_kmer_t() {} uint_kmer_t(uint64_t kmer) : kmer(kmer) {} @@ -282,6 +282,25 @@ struct aa_uint_kmer_t : alpha_kmer_t { static bool is_valid(char c) { return ~char_to_aa[static_cast(c)]; } static uint64_t char_to_uint(char c) { return char_to_aa[static_cast(c)]; } + + // For proteins, there's no reverse complement, so map each character to itself + // This allows streaming_query to work with protein alphabets + static constexpr char canonicalize_basepair_reverse_map[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', + 'Z', 0, 0, 0, 0, 0, 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', + 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0}; }; // also supports bitpack<__uint128_t, 1>, std::bitset<256>, etc diff --git a/include/util.hpp b/include/util.hpp index 6b0e3ae..684ecec 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -186,7 +186,7 @@ struct build_configuration { namespace util { -static void check_version_number(essentials::version_number const& vnum) { +static inline void check_version_number(essentials::version_number const& vnum) { if (vnum.x != constants::current_version_number::x) { throw std::runtime_error("MAJOR index version mismatch: SSHash index needs rebuilding"); } diff --git a/src/build.cpp b/src/build.cpp index 5203583..24eb349 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -24,9 +24,6 @@ void dictionary::build(std::string const& filename, " but got m = " + std::to_string(build_config.m)); } if (build_config.m > build_config.k) throw std::runtime_error("m must be <= k"); - if ((build_config.num_threads & (build_config.num_threads - 1)) != 0) { - throw std::runtime_error("number of threads must be a power of 2"); - } m_k = build_config.k; m_m = build_config.m; @@ -127,11 +124,11 @@ void dictionary::build(std::string const& filename, input.read(reinterpret_cast(buffer.data()), buffer.size() * sizeof(minimizer_tuple)); const uint64_t chunk_size = (n + num_threads - 1) / num_threads; - for (uint64_t t = 0; t != num_threads; ++t) { + for (uint64_t t = 0; t * chunk_size < n; ++t) { uint64_t begin = t * chunk_size; - uint64_t end = (t == num_threads - 1) ? n : begin + chunk_size; + uint64_t end = std::min(n, begin + chunk_size); threads.emplace_back([begin, end, &buffer, &f]() { - for (uint64_t i = begin; i != end; ++i) { + for (uint64_t i = begin; i < end; ++i) { buffer[i].minimizer = f.lookup(buffer[i].minimizer); } }); diff --git a/src/info.cpp b/src/info.cpp index 64bf719..54cb432 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -2,11 +2,12 @@ namespace sshash { -double perc(uint64_t amount, uint64_t total) { return (amount * 100.0) / total; } - template void dictionary::print_space_breakdown() const { const uint64_t num_bytes = (num_bits() + 7) / 8; + + auto perc = [](uint64_t amount, uint64_t total) -> double { return (amount * 100.0) / total; }; + std::cout << "total index size: " << num_bytes << " [B] -- " << essentials::convert(num_bytes, essentials::MB) << " [MB]" << '\n'; std::cout << "SPACE BREAKDOWN:\n"; diff --git a/tools/build.cpp b/tools/build.cpp index b531316..9b29fb8 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -21,7 +21,7 @@ int build(int argc, char** argv) { parser.add("seed", "Seed for construction (default is " + std::to_string(constants::seed) + ").", "-s", false); - parser.add("t", "Number of threads (default is 1). Must be a power of 2.", "-t", false); + parser.add("t", "Number of threads (default is 1).", "-t", false); parser.add("lambda", "A (floating point) constant that trades construction speed for space effectiveness " "of minimal perfect hashing. " From eb4d1c4c2a6c2288f1df4f260b8c0bd1a4289a9b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 6 Oct 2025 21:31:20 +0200 Subject: [PATCH 037/112] updated external/pthash --- external/pthash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/pthash b/external/pthash index 6c30dca..3e2a531 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit 6c30dca229879f326fbede53e461d803e45e8c13 +Subproject commit 3e2a531f43667e55d68b8308fe61fee36418453d From ac4abe69743a2ae5017f37c7ce49da35599635be Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 7 Oct 2025 14:47:52 +0200 Subject: [PATCH 038/112] set offsets using a single thread --- .../builder/build_sparse_and_skew_index.hpp | 232 +++++++++++------- 1 file changed, 147 insertions(+), 85 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index e589772..d99fbd2 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -12,9 +12,9 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, { const uint64_t num_kmers = data.num_kmers; const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); - const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); + // const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); const uint64_t num_minimizers = data.minimizers.num_minimizers(); - const uint64_t num_threads = build_config.num_threads; + // const uint64_t num_threads = build_config.num_threads; uint64_t num_bits_per_offset = data.endpoints_builder.num_bits_per_offset(); data.endpoints_builder.build(m_buckets.strings_endpoints); @@ -34,107 +34,31 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, mm::file_source input(data.minimizers.get_minimizers_filename(), mm::advice::sequential); - minimizer_tuple const* begin = input.data(); - minimizer_tuple const* end = input.data() + input.size(); + // minimizer_tuple const* begin = input.data(); + // minimizer_tuple const* end = input.data() + input.size(); essentials::timer_type timer; - - buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); - timer.start(); - const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; - std::vector offsets; - offsets.reserve(num_threads + 1); - for (uint64_t offset = -1; offset != num_super_kmers;) { - offsets.push_back(offset + 1); - offset = std::min((offset + 1) + block_size, num_super_kmers); - minimizer_tuple const* b = begin + offset; - uint64_t curr_minimizer = (*b).minimizer; - while (b + 1 < end) { // adjust offset - uint64_t next_minimizer = (*(b + 1)).minimizer; - if (curr_minimizer != next_minimizer) break; - b += 1; - offset += 1; - } - } - offsets.push_back(num_super_kmers); - - std::vector threads_buckets_stats; - threads_buckets_stats.reserve(num_threads); - - auto exe = [&](const uint64_t thread_id) { - assert(thread_id + 1 < offsets.size()); - const uint64_t offset_begin = offsets[thread_id]; - const uint64_t offset_end = offsets[thread_id + 1]; - auto& tbs = threads_buckets_stats[thread_id]; - for (minimizers_tuples_iterator it(begin + offset_begin, begin + offset_end); // - it.has_next(); // - it.next()) // - { - const uint64_t bucket_id = it.minimizer(); - assert(bucket_id < num_minimizers); - auto bucket = it.bucket(); - const uint64_t bucket_size = bucket.size(); - tbs.add_bucket_size(bucket_size); - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { - /* - For minimizers occurring once, store a (log(N)+1)-bit - code, as follows: |offset|0|, i.e., the LSB is 0. - */ - uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(bucket_id, code); - prev_pos_in_seq = mt.pos_in_seq; - } - tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); - } - } - }; - - std::vector threads; - threads.reserve(num_threads); - assert(offsets.size() <= num_threads + 1); - for (uint64_t thread_id = 0; thread_id + 1 < offsets.size(); ++thread_id) { - threads_buckets_stats.emplace_back(num_minimizers, num_kmers, num_minimizer_positions); - threads.emplace_back(exe, thread_id); - } - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - - // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), - // data.strings_endpoints.size(), - // data.strings_endpoints.back()); - // m_buckets.strings_endpoints.build(data.strings_endpoints); - - m_buckets.strings.swap(data.strings); - - /* compute offsets2 and offsets3 */ - assert(buckets_stats.num_buckets() == num_minimizers); + buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); const uint64_t min_size = 1ULL << constants::min_l; - const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); - const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); - - std::cout << "max_bucket_size " << max_bucket_size << std::endl; - std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; uint64_t num_buckets_in_skew_index = 0; uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; - uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); // it.has_next(); it.next()) // { + const uint64_t bucket_id = it.minimizer(); + assert(bucket_id < num_minimizers); auto bucket = it.bucket(); const uint64_t bucket_size = bucket.size(); + buckets_stats.add_bucket_size(bucket_size); + if (bucket_size > 1) { if (bucket_size <= min_size) { ++num_buckets_larger_than_1_not_in_skew_index; @@ -145,8 +69,24 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); } + + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { + /* + For minimizers occurring once, store a (log(N)+1)-bit + code, as follows: |offset|0|, i.e., the LSB is 0. + */ + uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + offsets_builder.set(bucket_id, code); + prev_pos_in_seq = mt.pos_in_seq; + } + buckets_stats.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); + } } + assert(buckets_stats.num_buckets() == num_minimizers); std::cout << "num_buckets_larger_than_1_not_in_skew_index " << num_buckets_larger_than_1_not_in_skew_index << "/" << buckets_stats.num_buckets() << " (" @@ -157,6 +97,128 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; + // const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; + // std::vector offsets; + // offsets.reserve(num_threads + 1); + // for (uint64_t offset = -1; offset != num_super_kmers;) { + // offsets.push_back(offset + 1); + // offset = std::min((offset + 1) + block_size, num_super_kmers); + // minimizer_tuple const* b = begin + offset; + // uint64_t curr_minimizer = (*b).minimizer; + // while (b + 1 < end) { // adjust offset + // uint64_t next_minimizer = (*(b + 1)).minimizer; + // if (curr_minimizer != next_minimizer) break; + // b += 1; + // offset += 1; + // } + // } + // offsets.push_back(num_super_kmers); + + // std::vector threads_buckets_stats; + // threads_buckets_stats.reserve(num_threads); + + // auto exe = [&](const uint64_t thread_id) { + // assert(thread_id + 1 < offsets.size()); + // const uint64_t offset_begin = offsets[thread_id]; + // const uint64_t offset_end = offsets[thread_id + 1]; + // auto& tbs = threads_buckets_stats[thread_id]; + // for (minimizers_tuples_iterator it(begin + offset_begin, begin + offset_end); // + // it.has_next(); // + // it.next()) // + // { + // const uint64_t bucket_id = it.minimizer(); + // assert(bucket_id < num_minimizers); + // auto bucket = it.bucket(); + // const uint64_t bucket_size = bucket.size(); + // tbs.add_bucket_size(bucket_size); + // uint64_t prev_pos_in_seq = constants::invalid_uint64; + // for (auto mt : bucket) { + // if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { + // /* + // For minimizers occurring once, store a (log(N)+1)-bit + // code, as follows: |offset|0|, i.e., the LSB is 0. + // */ + // uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 + // assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + // offsets_builder.set(bucket_id, code); + // prev_pos_in_seq = mt.pos_in_seq; + // } + // tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); + // } + // } + // }; + + // std::vector threads; + // threads.reserve(num_threads); + // assert(offsets.size() <= num_threads + 1); + // for (uint64_t thread_id = 0; thread_id + 1 < offsets.size(); ++thread_id) { + // threads_buckets_stats.emplace_back(num_minimizers, num_kmers, num_minimizer_positions); + // threads.emplace_back(exe, thread_id); + // } + + // for (auto& t : threads) { + // if (t.joinable()) t.join(); + // } + // for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; + + // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), + // data.strings_endpoints.size(), + // data.strings_endpoints.back()); + // m_buckets.strings_endpoints.build(data.strings_endpoints); + + m_buckets.strings.swap(data.strings); + + /* compute offsets2 and offsets3 */ + assert(buckets_stats.num_buckets() == num_minimizers); + + // const uint64_t min_size = 1ULL << constants::min_l; + // const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); + // const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); + + // std::cout << "max_bucket_size " << max_bucket_size << std::endl; + // std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; + + // uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; + // uint64_t num_buckets_in_skew_index = 0; + // uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; + + // uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; + // uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; + + // for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); // + // it.has_next(); it.next()) // + // { + // auto bucket = it.bucket(); + // const uint64_t bucket_size = bucket.size(); + // if (bucket_size > 1) { + // if (bucket_size <= min_size) { + // ++num_buckets_larger_than_1_not_in_skew_index; + // num_minimizer_positions_of_buckets_larger_than_1 += bucket_size; + // } else { + // ++num_buckets_in_skew_index; + // num_minimizer_positions_of_buckets_in_skew_index += bucket_size; + // } + // num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); + // } + // } + + // std::cout << "num_buckets_larger_than_1_not_in_skew_index " + // << num_buckets_larger_than_1_not_in_skew_index << "/" << + // buckets_stats.num_buckets() + // << " (" + // << (num_buckets_larger_than_1_not_in_skew_index * 100.0) / + // buckets_stats.num_buckets() + // << "%)" << std::endl; + // std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" + // << buckets_stats.num_buckets() << " (" + // << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" + // << std::endl; + + const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); + const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); + std::cout << "max_bucket_size " << max_bucket_size << std::endl; + std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; + std::vector buckets; buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); std::vector tuples; // backed memory From 26f48a5bf8c7d93ebde83c5bdb1b3970b48d54e3 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 7 Oct 2025 15:41:20 +0200 Subject: [PATCH 039/112] removed unused code --- .../builder/build_sparse_and_skew_index.hpp | 114 +----------------- 1 file changed, 1 insertion(+), 113 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index d99fbd2..b93c4f6 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -12,9 +12,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, { const uint64_t num_kmers = data.num_kmers; const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); - // const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); const uint64_t num_minimizers = data.minimizers.num_minimizers(); - // const uint64_t num_threads = build_config.num_threads; + const uint64_t min_size = 1ULL << constants::min_l; uint64_t num_bits_per_offset = data.endpoints_builder.num_bits_per_offset(); data.endpoints_builder.build(m_buckets.strings_endpoints); @@ -34,16 +33,12 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, mm::file_source input(data.minimizers.get_minimizers_filename(), mm::advice::sequential); - // minimizer_tuple const* begin = input.data(); - // minimizer_tuple const* end = input.data() + input.size(); essentials::timer_type timer; timer.start(); buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); - const uint64_t min_size = 1ULL << constants::min_l; - uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; uint64_t num_buckets_in_skew_index = 0; uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; @@ -97,70 +92,6 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; - // const uint64_t block_size = (num_super_kmers + num_threads - 1) / num_threads; - // std::vector offsets; - // offsets.reserve(num_threads + 1); - // for (uint64_t offset = -1; offset != num_super_kmers;) { - // offsets.push_back(offset + 1); - // offset = std::min((offset + 1) + block_size, num_super_kmers); - // minimizer_tuple const* b = begin + offset; - // uint64_t curr_minimizer = (*b).minimizer; - // while (b + 1 < end) { // adjust offset - // uint64_t next_minimizer = (*(b + 1)).minimizer; - // if (curr_minimizer != next_minimizer) break; - // b += 1; - // offset += 1; - // } - // } - // offsets.push_back(num_super_kmers); - - // std::vector threads_buckets_stats; - // threads_buckets_stats.reserve(num_threads); - - // auto exe = [&](const uint64_t thread_id) { - // assert(thread_id + 1 < offsets.size()); - // const uint64_t offset_begin = offsets[thread_id]; - // const uint64_t offset_end = offsets[thread_id + 1]; - // auto& tbs = threads_buckets_stats[thread_id]; - // for (minimizers_tuples_iterator it(begin + offset_begin, begin + offset_end); // - // it.has_next(); // - // it.next()) // - // { - // const uint64_t bucket_id = it.minimizer(); - // assert(bucket_id < num_minimizers); - // auto bucket = it.bucket(); - // const uint64_t bucket_size = bucket.size(); - // tbs.add_bucket_size(bucket_size); - // uint64_t prev_pos_in_seq = constants::invalid_uint64; - // for (auto mt : bucket) { - // if (bucket_size == 1 and mt.pos_in_seq != prev_pos_in_seq) { - // /* - // For minimizers occurring once, store a (log(N)+1)-bit - // code, as follows: |offset|0|, i.e., the LSB is 0. - // */ - // uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 - // assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - // offsets_builder.set(bucket_id, code); - // prev_pos_in_seq = mt.pos_in_seq; - // } - // tbs.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); - // } - // } - // }; - - // std::vector threads; - // threads.reserve(num_threads); - // assert(offsets.size() <= num_threads + 1); - // for (uint64_t thread_id = 0; thread_id + 1 < offsets.size(); ++thread_id) { - // threads_buckets_stats.emplace_back(num_minimizers, num_kmers, num_minimizer_positions); - // threads.emplace_back(exe, thread_id); - // } - - // for (auto& t : threads) { - // if (t.joinable()) t.join(); - // } - // for (auto const& tbs : threads_buckets_stats) buckets_stats += tbs; - // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), // data.strings_endpoints.size(), // data.strings_endpoints.back()); @@ -171,49 +102,6 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, /* compute offsets2 and offsets3 */ assert(buckets_stats.num_buckets() == num_minimizers); - // const uint64_t min_size = 1ULL << constants::min_l; - // const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); - // const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); - - // std::cout << "max_bucket_size " << max_bucket_size << std::endl; - // std::cout << "log2_max_bucket_size " << log2_max_bucket_size << std::endl; - - // uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; - // uint64_t num_buckets_in_skew_index = 0; - // uint64_t num_super_kmers_in_buckets_larger_than_1 = 0; - - // uint64_t num_minimizer_positions_of_buckets_larger_than_1 = 0; - // uint64_t num_minimizer_positions_of_buckets_in_skew_index = 0; - - // for (minimizers_tuples_iterator it(input.data(), input.data() + input.size()); // - // it.has_next(); it.next()) // - // { - // auto bucket = it.bucket(); - // const uint64_t bucket_size = bucket.size(); - // if (bucket_size > 1) { - // if (bucket_size <= min_size) { - // ++num_buckets_larger_than_1_not_in_skew_index; - // num_minimizer_positions_of_buckets_larger_than_1 += bucket_size; - // } else { - // ++num_buckets_in_skew_index; - // num_minimizer_positions_of_buckets_in_skew_index += bucket_size; - // } - // num_super_kmers_in_buckets_larger_than_1 += bucket.num_super_kmers(); - // } - // } - - // std::cout << "num_buckets_larger_than_1_not_in_skew_index " - // << num_buckets_larger_than_1_not_in_skew_index << "/" << - // buckets_stats.num_buckets() - // << " (" - // << (num_buckets_larger_than_1_not_in_skew_index * 100.0) / - // buckets_stats.num_buckets() - // << "%)" << std::endl; - // std::cout << "num_buckets_in_skew_index " << num_buckets_in_skew_index << "/" - // << buckets_stats.num_buckets() << " (" - // << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" - // << std::endl; - const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); const uint64_t log2_max_bucket_size = std::ceil(std::log2(max_bucket_size)); std::cout << "max_bucket_size " << max_bucket_size << std::endl; From e12fc8d918ed4066df540b427d6d18afa5ebbe99 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 7 Oct 2025 22:43:39 +0200 Subject: [PATCH 040/112] minor --- include/builder/parse_file.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index e5e550e..1824526 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -238,7 +238,10 @@ void parse_file(std::istream& is, parse_data& data, /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ - bvb_strings.append_bits(0, kmer_t::uint_kmer_bits); + static_assert(kmer_t::uint_kmer_bits % 64 == 0); + for (int dummy_bits = kmer_t::uint_kmer_bits; dummy_bits; dummy_bits -= 64) { + bvb_strings.append_bits(0, 64); + } bvb_strings.build(data.strings); From d22d01dfc7506220ba0d71b3e76503721505b419 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 10 Oct 2025 23:13:41 +0200 Subject: [PATCH 041/112] back to previous scheme --- include/buckets.hpp | 426 +++++++++--------- .../builder/build_sparse_and_skew_index.hpp | 40 +- include/builder/parse_file.hpp | 147 ++---- include/dictionary.hpp | 115 +++-- include/endpoints.hpp | 223 --------- include/kmer_iterator.hpp | 9 +- include/streaming_query.hpp | 2 +- include/util.hpp | 22 +- src/build.cpp | 4 +- src/dictionary.cpp | 191 ++++---- test/check_from_file.hpp | 118 +++-- tools/build.cpp | 17 +- tools/perf.hpp | 162 +++---- tools/sort.cpp | 221 --------- tools/sshash.cpp | 26 +- 15 files changed, 590 insertions(+), 1133 deletions(-) delete mode 100644 include/endpoints.hpp delete mode 100644 tools/sort.cpp diff --git a/include/buckets.hpp b/include/buckets.hpp index bba3975..28bf18a 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -1,7 +1,7 @@ #pragma once #include "external/pthash/external/bits/include/endpoints_sequence.hpp" -#include "endpoints.hpp" +// #include "endpoints.hpp" #include "util.hpp" #include "kmer_iterator.hpp" @@ -11,29 +11,15 @@ namespace sshash { template struct buckets // { - lookup_result offset_to_id(endpoints::decoded_offset p, uint64_t pos_in_kmer, - const uint64_t k) const // + lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const // { - // auto p = strings_endpoints.locate(offset); - // uint64_t contig_id = p.first.pos; - // uint64_t contig_begin = p.first.val; - // uint64_t contig_end = p.second.val; - - /****/ - // auto [offset, p] = strings_endpoints.decode(encoded_offset); - - uint64_t offset = p.offset; - if (offset < pos_in_kmer or (offset - pos_in_kmer) < p.group_info.group_offset) { - return lookup_result(); - } - offset -= pos_in_kmer; - uint64_t string_id_relative_to_group = - (offset - p.group_info.group_offset) / p.group_info.strings_length; - uint64_t contig_id = p.group_info.first_id + string_id_relative_to_group; - uint64_t contig_begin = - p.group_info.group_offset + string_id_relative_to_group * p.group_info.strings_length; - uint64_t contig_end = contig_begin + p.group_info.strings_length; - /****/ + /* + When `strings_endpoints` is of type `bits::endpoints_sequence<>`. + */ + auto p = strings_endpoints.locate(offset); + uint64_t contig_id = p.first.pos; + uint64_t contig_begin = p.first.val; + uint64_t contig_end = p.second.val; /* The following facts hold. */ assert(offset >= contig_id * (k - 1)); @@ -54,94 +40,101 @@ struct buckets // res.contig_size = contig_size; assert(contig_begin == res.contig_begin(k)); assert(contig_end == res.contig_end(k)); - assert(offset == res.kmer_offset(k)); return res; } - // /* Return where the contig begins and ends in strings. */ - // std::pair // [begin, end) - // contig_offsets(const uint64_t contig_id) const { - // uint64_t begin = strings_endpoints.access(contig_id); - // uint64_t end = strings_endpoints.access(contig_id + 1); - // assert(end > begin); - // return {begin, end}; - // } - - // kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { - // uint64_t contig_begin = strings_endpoints.access(contig_id); - // return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); - // } - - // kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { - // uint64_t contig_end = strings_endpoints.access(contig_id + 1); - // return util::read_kmer_at(strings, k - 1, - // kmer_t::bits_per_char * (contig_end - k + 1)); - // } - - lookup_result lookup(uint64_t begin, uint64_t end, kmer_t kmer, minimizer_info mini_info, - const uint64_t k, const uint64_t m) const // + /* Return where the contig begins and ends in strings. */ + std::pair // [begin, end) + contig_offsets(const uint64_t contig_id) const { + uint64_t begin = strings_endpoints.access(contig_id); + uint64_t end = strings_endpoints.access(contig_id + 1); + assert(end > begin); + return {begin, end}; + } + + kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { + uint64_t contig_begin = strings_endpoints.access(contig_id); + return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); + } + + kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { + uint64_t contig_end = strings_endpoints.access(contig_id + 1); + return util::read_kmer_at(strings, k - 1, + kmer_t::bits_per_char * (contig_end - k + 1)); + } + + lookup_result lookup(const uint64_t begin, const uint64_t end, // + const kmer_t kmer, const minimizer_info mini_info, // + const uint64_t k, const uint64_t m) const // { /* check minimizer first */ - uint64_t offset = offsets2.access(begin); - endpoints::decoded_offset p = strings_endpoints.decode(offset); - uint64_t read_mmer = - uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t minimizer_offset = offsets2.access(begin); + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); - auto res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); - if (res.kmer_id != constants::invalid_uint64) return res; + auto res = lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); + if (res.kmer_id != constants::invalid_uint64) { + assert(is_valid(res)); + return res; + } for (uint64_t i = begin + 1; i < end; ++i) { - offset = offsets2.access(i); - p = strings_endpoints.decode(offset); - res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); - if (res.kmer_id != constants::invalid_uint64) return res; + minimizer_offset = offsets2.access(i); + res = lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); + if (res.kmer_id != constants::invalid_uint64) { + assert(is_valid(res)); + return res; + } } return lookup_result(); } - lookup_result lookup_at_offset_no_check_minimizer(endpoints::decoded_offset p, kmer_t kmer, - minimizer_info mini_info, - const uint64_t k) const // + lookup_result lookup_at_offset_no_check_minimizer(const uint64_t minimizer_offset, // + const kmer_t kmer, // + const minimizer_info mini_info, // + const uint64_t k) const // { - // auto res = offset_to_id(offset, mini_info.pos_in_kmer, k); - auto res = offset_to_id(p, mini_info.pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t offset = res.kmer_offset(k); - if (offset + k - 1 < res.contig_end(k)) { + if (minimizer_offset >= mini_info.pos_in_kmer) { + uint64_t kmer_offset = minimizer_offset - mini_info.pos_in_kmer; + auto res = offset_to_id(kmer_offset, k); + if (kmer_offset + k - 1 < res.contig_end(k)) { auto read_kmer = - util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - if (read_kmer == kmer) return res; + util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); + if (read_kmer == kmer) { + assert(is_valid(res)); + return res; + } } } return lookup_result(); } - lookup_result lookup_at_offset(const uint64_t encoded_offset, // - const kmer_t kmer, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // + lookup_result lookup_at_offset(const uint64_t minimizer_offset, // + const kmer_t kmer, // + const minimizer_info mini_info, // + const uint64_t k, // + const uint64_t m) const // { /* check minimizer first */ - endpoints::decoded_offset p = strings_endpoints.decode(encoded_offset); - uint64_t read_mmer = - uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); - return lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); + return lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); } - lookup_result lookup_canonical(uint64_t begin, uint64_t end, kmer_t kmer, kmer_t kmer_rc, - minimizer_info mini_info, const uint64_t k, - const uint64_t m) const // + lookup_result lookup_canonical(const uint64_t begin, const uint64_t end, // + const kmer_t kmer, const kmer_t kmer_rc, // + const minimizer_info mini_info, // + const uint64_t k, // + const uint64_t m) const // { /* check minimizer first */ - uint64_t offset = offsets2.access(begin); - endpoints::decoded_offset p = strings_endpoints.decode(offset); - uint64_t read_mmer = - uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t minimizer_offset = offsets2.access(begin); + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); uint64_t minimizer_rc = 0; { auto tmp = kmer_t(mini_info.minimizer); @@ -153,46 +146,53 @@ struct buckets // } auto res = lookup_canonical_at_offset_no_check_minimizer( // - p, kmer, kmer_rc, mini_info, k, m // + minimizer_offset, kmer, kmer_rc, mini_info, k, m // ); - if (res.kmer_id != constants::invalid_uint64) return res; + if (res.kmer_id != constants::invalid_uint64) { + assert(is_valid(res)); + return res; + } for (uint64_t i = begin + 1; i < end; ++i) { - offset = offsets2.access(i); - p = strings_endpoints.decode(offset); + minimizer_offset = offsets2.access(i); res = lookup_canonical_at_offset_no_check_minimizer( // - p, kmer, kmer_rc, mini_info, k, m // + minimizer_offset, kmer, kmer_rc, mini_info, k, m // ); - if (res.kmer_id != constants::invalid_uint64) return res; + if (res.kmer_id != constants::invalid_uint64) { + assert(is_valid(res)); + return res; + } } return lookup_result(); } - lookup_result lookup_canonical_at_offset_no_check_minimizer(endpoints::decoded_offset p, // + lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t minimizer_offset, // const kmer_t kmer, const kmer_t kmer_rc, // const minimizer_info mini_info, // - const uint64_t k, - const uint64_t m) const // + const uint64_t k, // + const uint64_t m) const // { uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_offset(p, pos_in_kmer, kmer, kmer_rc, k); - if (res.kmer_id != constants::invalid_uint64) return res; + auto res = check_offset(minimizer_offset, pos_in_kmer, kmer, kmer_rc, k); + if (res.kmer_id != constants::invalid_uint64) { + assert(is_valid(res)); + return res; + } pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_offset(p, pos_in_kmer, kmer, kmer_rc, k); + return check_offset(minimizer_offset, pos_in_kmer, kmer, kmer_rc, k); } - lookup_result lookup_canonical_at_offset(const uint64_t encoded_offset, // - const kmer_t kmer, // - const kmer_t kmer_rc, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // + lookup_result lookup_canonical_at_offset(const uint64_t minimizer_offset, // + const kmer_t kmer, // + const kmer_t kmer_rc, // + const minimizer_info mini_info, // + const uint64_t k, // + const uint64_t m) const // { /* check minimizer first */ - endpoints::decoded_offset p = strings_endpoints.decode(encoded_offset); - uint64_t read_mmer = - uint64_t(util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.offset)); + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); uint64_t minimizer_rc = 0; { auto tmp = kmer_t(mini_info.minimizer); @@ -202,22 +202,28 @@ struct buckets // if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { return lookup_result(false); } - return lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); + return lookup_canonical_at_offset_no_check_minimizer(minimizer_offset, kmer, kmer_rc, + mini_info, k, m); } - lookup_result check_offset(endpoints::decoded_offset p, const uint64_t pos_in_kmer, // - const kmer_t kmer, const kmer_t kmer_rc, // - const uint64_t k) const // + lookup_result check_offset(const uint64_t minimizer_offset, // + const uint64_t pos_in_kmer, // + const kmer_t kmer, const kmer_t kmer_rc, // + const uint64_t k) const // { - auto res = offset_to_id(p, pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t offset = res.kmer_offset(k); - if (offset + k - 1 < res.contig_end(k)) { + if (minimizer_offset >= pos_in_kmer) { + uint64_t kmer_offset = minimizer_offset - pos_in_kmer; + auto res = offset_to_id(kmer_offset, k); + if (kmer_offset + k - 1 < res.contig_end(k)) { auto read_kmer = - util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - if (read_kmer == kmer) return res; + util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); + if (read_kmer == kmer) { + assert(is_valid(res)); + return res; + } if (read_kmer == kmer_rc) { res.kmer_orientation = constants::backward_orientation; + assert(is_valid(res)); return res; } } @@ -225,31 +231,30 @@ struct buckets // return lookup_result(); } - uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const { - return strings_endpoints.id_to_offset(kmer_id, k); - - // constexpr uint64_t linear_scan_threshold = 32; - // uint64_t lo = 0; - // uint64_t hi = strings_endpoints.size() - 1; - // assert(strings_endpoints.access(0) == 0); - // while (hi - lo > linear_scan_threshold) { - // uint64_t mid = lo + (hi - lo) / 2; - // uint64_t val = strings_endpoints.access(mid); - // assert(val >= mid * (k - 1)); - // if (kmer_id <= val - mid * (k - 1)) { - // hi = mid; - // } else { - // lo = mid + 1; - // } - // } - // assert(lo < hi); - // assert(hi < strings_endpoints.size()); - // for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - // uint64_t val = it.value() - lo * (k - 1); - // if (val > kmer_id) break; - // } - // assert(lo > 0); - // return kmer_id + (lo - 1) * (k - 1); + uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const // + { + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = strings_endpoints.size() - 1; + assert(strings_endpoints.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = strings_endpoints.access(mid); + assert(val >= mid * (k - 1)); + if (kmer_id <= val - mid * (k - 1)) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < strings_endpoints.size()); + for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + uint64_t val = it.value() - lo * (k - 1); + if (val > kmer_id) break; + } + assert(lo > 0); + return kmer_id + (lo - 1) * (k - 1); } void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { @@ -258,72 +263,71 @@ struct buckets // util::uint_kmer_to_string(read_kmer, string_kmer, k); } - // struct iterator { - // iterator() {} - - // iterator(buckets const* ptr, // - // const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) - // const uint64_t k) - // : m_buckets(ptr) - // , m_begin_kmer_id(begin_kmer_id) - // , m_end_kmer_id(end_kmer_id) - // , m_k(k) - // , m_it(ptr->strings, m_k) // - // { - // m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - // auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); - // if (piece_end == m_offset) pos += 1; - // m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); - // next_piece(); - // m_ret.second.resize(m_k, 0); - // } - - // bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } - - // std::pair next() { - // if (m_offset == m_next_offset - m_k + 1) { - // m_offset = m_next_offset; - // next_piece(); - // } - // m_ret.first = m_begin_kmer_id; - // if (m_clear) { - // util::uint_kmer_to_string(m_it.get(), m_ret.second.data(), m_k); - // assert(kmer_t::bits_per_char * m_offset == m_it.position()); - // m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); - // } else { - // memmove(m_ret.second.data(), m_ret.second.data() + 1, m_k - 1); - // m_ret.second[m_k - 1] = kmer_t::uint64_to_char(m_it.get_next_char()); - // } - // m_clear = false; - // ++m_begin_kmer_id; - // ++m_offset; - // return m_ret; - // } - - // private: - // std::pair m_ret; - // buckets const* m_buckets; - // uint64_t m_begin_kmer_id, m_end_kmer_id; - // uint64_t m_k; - // uint64_t m_offset; - // uint64_t m_next_offset; - // kmer_iterator m_it; - // bits::endpoints_sequence<>::iterator m_strings_endpoints_it; - // bool m_clear; - - // void next_piece() { - // m_it.at(kmer_t::bits_per_char * m_offset); - // m_next_offset = m_strings_endpoints_it.value(); - // assert(m_next_offset > m_offset); - // m_clear = true; - // m_strings_endpoints_it.next(); - // } - // }; - - // iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id, const uint64_t k) const - // { - // return iterator(this, begin_kmer_id, end_kmer_id, k); - // } + struct iterator { + iterator() {} + + iterator(buckets const* ptr, // + const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) + const uint64_t k) + : m_buckets(ptr) + , m_begin_kmer_id(begin_kmer_id) + , m_end_kmer_id(end_kmer_id) + , m_k(k) + , m_it(ptr->strings, m_k) // + { + m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); + auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); + if (piece_end == m_offset) pos += 1; + m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); + next_piece(); + m_ret.second.resize(m_k, 0); + } + + bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } + + std::pair next() { + if (m_offset == m_next_offset - m_k + 1) { + m_offset = m_next_offset; + next_piece(); + } + m_ret.first = m_begin_kmer_id; + if (m_clear) { + util::uint_kmer_to_string(m_it.get(), m_ret.second.data(), m_k); + assert(kmer_t::bits_per_char * m_offset == m_it.position()); + m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); + } else { + memmove(m_ret.second.data(), m_ret.second.data() + 1, m_k - 1); + m_ret.second[m_k - 1] = kmer_t::uint64_to_char(m_it.get_next_char()); + } + m_clear = false; + ++m_begin_kmer_id; + ++m_offset; + return m_ret; + } + + private: + std::pair m_ret; + buckets const* m_buckets; + uint64_t m_begin_kmer_id, m_end_kmer_id; + uint64_t m_k; + uint64_t m_offset; + uint64_t m_next_offset; + kmer_iterator m_it; + bits::endpoints_sequence<>::iterator m_strings_endpoints_it; + bool m_clear; + + void next_piece() { + m_it.at(kmer_t::bits_per_char * m_offset); + m_next_offset = m_strings_endpoints_it.value(); + assert(m_next_offset > m_offset); + m_clear = true; + m_strings_endpoints_it.next(); + } + }; + + iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id, const uint64_t k) const { + return iterator(this, begin_kmer_id, end_kmer_id, k); + } uint64_t num_bits() const { return 8 * (strings_endpoints.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // @@ -341,8 +345,8 @@ struct buckets // visit_impl(visitor, *this); } - // bits::endpoints_sequence<> strings_endpoints; - endpoints strings_endpoints; + bits::endpoints_sequence<> strings_endpoints; + // bits::compact_vector strings_endpoints; std::vector start_lists_of_size; bits::compact_vector offsets; @@ -362,11 +366,11 @@ struct buckets // visitor.visit(t.strings); } - // bool is_valid(lookup_result res) const { - // return res.contig_size != constants::invalid_uint64 and // - // res.kmer_id_in_contig < res.contig_size and // - // res.contig_id < strings_endpoints.size(); // - // } + bool is_valid(lookup_result res) const { + return res.contig_size != constants::invalid_uint64 and // + res.kmer_id_in_contig < res.contig_size and // + res.contig_id < strings_endpoints.size(); // + } }; } // namespace sshash \ No newline at end of file diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.hpp index b93c4f6..bb5930d 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.hpp @@ -15,18 +15,14 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, const uint64_t num_minimizers = data.minimizers.num_minimizers(); const uint64_t min_size = 1ULL << constants::min_l; - uint64_t num_bits_per_offset = data.endpoints_builder.num_bits_per_offset(); - data.endpoints_builder.build(m_buckets.strings_endpoints); - - std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; - - if (!build_config.sorted) { - num_bits_per_offset = std::ceil(std::log2(data.strings.num_bits() / kmer_t::bits_per_char)); - - std::cout << "num_bits_per_offset = ceil(log2(" - << data.strings.num_bits() / kmer_t::bits_per_char - << ")) = " << num_bits_per_offset << std::endl; + uint64_t num_bits_per_offset = 0; + if (build_config.fast) { + // TODO + } else { + num_bits_per_offset = + std::ceil(std::log2(data.strings_builder.num_bits() / kmer_t::bits_per_char)); } + std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; bits::compact_vector::builder offsets_builder; offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); @@ -92,12 +88,15 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; - // m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), - // data.strings_endpoints.size(), - // data.strings_endpoints.back()); - // m_buckets.strings_endpoints.build(data.strings_endpoints); + m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), // + data.strings_endpoints.size(), // + data.strings_endpoints.back()); // + // m_buckets.strings_endpoints.build(data.strings_endpoints.begin(), // + // data.strings_endpoints.size(), // + // num_bits_per_offset); // + std::vector().swap(data.strings_endpoints); - m_buckets.strings.swap(data.strings); + data.strings_builder.build(m_buckets.strings); /* compute offsets2 and offsets3 */ assert(buckets_stats.num_buckets() == num_minimizers); @@ -384,14 +383,13 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } assert(mt.pos_in_seq >= mt.pos_in_kmer); - if (build_config.sorted) { // decode offset - auto p = m_buckets.strings_endpoints.decode(mt.pos_in_seq); - mt.pos_in_seq = p.offset; // absolute offset + if (build_config.fast) { // decode offset to obtain an absolute offset + // TODO } const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; - kmer_iterator it(m_buckets.strings, k, - kmer_t::bits_per_char * starting_pos_of_super_kmer); + kmer_iterator it( + m_buckets.strings, k, kmer_t::bits_per_char * starting_pos_of_super_kmer); for (uint64_t i = 0; i != mt.num_kmers_in_super_kmer; ++i) { auto kmer = it.get(); if (build_config.canonical) { /* take the canonical kmer */ diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.hpp index 1824526..bb0a646 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.hpp @@ -1,7 +1,5 @@ #pragma once -#include - #include "util.hpp" #include "external/gz/zip_stream.hpp" #include "include/minimizer_iterator.hpp" @@ -10,14 +8,12 @@ namespace sshash { template struct parse_data { - parse_data(build_configuration const& build_config) - : num_kmers(0), num_sequences(0), minimizers(build_config) {} + parse_data(build_configuration const& build_config) : num_kmers(0), minimizers(build_config) {} - uint64_t num_kmers, num_sequences; + uint64_t num_kmers; minimizers_tuples minimizers; std::vector strings_endpoints; - bits::bit_vector strings; - endpoints::builder endpoints_builder; + bits::bit_vector::builder strings_builder; weights::builder weights_builder; }; @@ -43,39 +39,16 @@ void parse_file(std::istream& is, parse_data& data, /* fit into the wanted number of bits */ assert(max_num_kmers_in_super_kmer < (1ULL << (sizeof(num_kmers_in_super_kmer_uint_type) * 8))); - bits::bit_vector::builder bvb_strings; - - struct _string_group_info { - uint32_t super_group_id; - uint32_t group_id; - uint64_t group_offset; // absolute offset where this group of strings begins - }; - - /* log2(string length) --> (super group id, current group id) */ - std::unordered_map> super_group_id(0); - - /* string-length --> _string_group_info */ - std::unordered_map string_groups_info(0); - { - const uint64_t num_bits = 8 * 8 * essentials::GB; // reserve 8 GB of memory - bvb_strings.reserve(num_bits); - - const uint64_t num_sequences = 100000000; + const uint64_t num_bits_for_strings = 8 * 8 * essentials::GB; // reserve 8 GB of memory + const uint64_t num_sequences = 100'000'000; + data.strings_builder.reserve(num_bits_for_strings); data.strings_endpoints.reserve(num_sequences); - - if (build_config.sorted) { - super_group_id.reserve(1ULL << 7); - string_groups_info.reserve(1ULL << 16); - } } std::string sequence; uint64_t num_bases = 0; - uint64_t prev_len = 0; - uint32_t ceil_log2_prev_len = 0; - hasher_type hasher(build_config.seed); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); @@ -154,41 +127,9 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t n = sequence.length(); assert(n >= k); - - if (build_config.sorted) // - { - uint64_t ceil_log2_len = bits::util::ceil_log2_uint64(n); - if (ceil_log2_len > ceil_log2_prev_len) { - super_group_id[ceil_log2_len] = {super_group_id.size(), 0}; - } else { - assert(ceil_log2_len == ceil_log2_prev_len); - if (n > prev_len) super_group_id[ceil_log2_len].second += 1; - } - - if (!string_groups_info.empty()) { - if (n > prev_len) { - uint64_t offset = bvb_strings.num_bits() / kmer_t::bits_per_char; - auto p = super_group_id[ceil_log2_len]; - string_groups_info[n] = {p.first, p.second, offset}; - } - } else { - auto p = super_group_id[ceil_log2_len]; - string_groups_info[n] = {p.first, p.second, 0}; - } - - prev_len = n; - ceil_log2_prev_len = ceil_log2_len; - } - - ++data.num_sequences; - if (data.num_sequences % 100000 == 0) { - std::cout << "read " << data.num_sequences << " sequences, " << num_bases << " bases, " - << data.num_kmers << " kmers" << std::endl; - } - - assert(bvb_strings.num_bits() % kmer_t::bits_per_char == 0); - data.strings_endpoints.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); - + assert(data.strings_builder.num_bits() % kmer_t::bits_per_char == 0); + data.strings_endpoints.push_back(data.strings_builder.num_bits() / kmer_t::bits_per_char); + data.num_kmers += n - k + 1; num_bases += n; if (build_config.weighted and seq_len != n) { @@ -197,7 +138,10 @@ void parse_file(std::istream& is, parse_data& data, throw std::runtime_error("file is malformed"); } - data.num_kmers += n - k + 1; + if (data.strings_endpoints.size() % 100'000 == 0) { + std::cout << "read " << data.strings_endpoints.size() << " sequences, " << num_bases + << " bases, " << data.num_kmers << " kmers" << std::endl; + } uint64_t i = 0; if constexpr (kmer_t::bits_per_char == 2) { @@ -207,72 +151,39 @@ void parse_file(std::istream& is, parse_data& data, for (; i + 32 <= n; i += 32) { __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(&sequence[i])); uint64_t word = pack2bits_shift1(v); - bvb_strings.append_bits(word, 64); + data.strings_builder.append_bits(word, 64); } #endif } for (; i < n; ++i) { - bvb_strings.append_bits(kmer_t::char_to_uint(sequence[i]), kmer_t::bits_per_char); - } - } - - if (build_config.sorted) { - /* prev_len is now the length of the longest string */ - if (prev_len >= (1ULL << 32)) { - std::cerr << "A string is longer than 2^32-1 chars...a u32 is not enough to hold a " - "string length" - << std::endl; - } - if (data.num_sequences >= (1ULL << 32)) { - std::cerr << "More than 2^32-1 strings...a u32 is not enough to hold a string id" - << std::endl; + data.strings_builder.append_bits(kmer_t::char_to_uint(sequence[i]), + kmer_t::bits_per_char); } } - /* - So strings_endpoints will be of size p+1, where p is the number of DNA sequences - in the input file. - */ - data.strings_endpoints.push_back(bvb_strings.num_bits() / kmer_t::bits_per_char); + data.strings_endpoints.push_back(data.strings_builder.num_bits() / kmer_t::bits_per_char); assert(data.strings_endpoints.front() == 0); + assert(data.strings_endpoints.size() >= 2); + const uint64_t num_sequences = data.strings_endpoints.size() - 1; /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ static_assert(kmer_t::uint_kmer_bits % 64 == 0); for (int dummy_bits = kmer_t::uint_kmer_bits; dummy_bits; dummy_bits -= 64) { - bvb_strings.append_bits(0, 64); + data.strings_builder.append_bits(0, 64); } - bvb_strings.build(data.strings); - - assert(data.strings_endpoints.front() == 0); - assert(data.strings_endpoints.size() == data.num_sequences + 1); - timer.stop(); print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding input'"); - std::cout << "read " << data.num_sequences << " sequences, " << num_bases << " bases, " + std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " << data.num_kmers << " kmers" << std::endl; std::cout << "num_kmers " << data.num_kmers << std::endl; std::cout << "cost: 2.0 + " - << static_cast(kmer_t::bits_per_char * data.num_sequences * (k - 1)) / + << static_cast(kmer_t::bits_per_char * num_sequences * (k - 1)) / data.num_kmers << " [bits/kmer]" << std::endl; - // for (auto const& p : super_group_id) { - // std::cout << "log2(string-length) = " << p.first << ": super_group_id = " << - // p.second.first - // << ", num. groups in super group = " << p.second.second + 1 << std::endl; - // } - // for (auto const& p : string_groups_info) { - // std::cout << "string-length = " << p.first - // << ": super_group_id = " << p.second.super_group_id - // << ", group id = " << p.second.group_id - // << ", group_offset = " << p.second.group_offset << std::endl; - // } - - data.endpoints_builder.build_from(data.strings_endpoints); - /* The parameter m (minimizer length) should be at least ceil(log_s(N))+1 @@ -292,11 +203,11 @@ void parse_file(std::istream& is, parse_data& data, timer.start(); const uint64_t num_threads = build_config.num_threads; - const uint64_t num_sequences_per_thread = (data.num_sequences + num_threads - 1) / num_threads; + const uint64_t num_sequences_per_thread = (num_sequences + num_threads - 1) / num_threads; std::vector threads; threads.reserve(num_threads); - for (uint64_t t = 0; t * num_sequences_per_thread < data.num_sequences; ++t) // + for (uint64_t t = 0; t * num_sequences_per_thread < num_sequences; ++t) // { threads.emplace_back([&, t] { std::vector buffer; @@ -325,9 +236,9 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t index_begin = t * num_sequences_per_thread; const uint64_t index_end = - std::min(index_begin + num_sequences_per_thread, data.num_sequences); + std::min(index_begin + num_sequences_per_thread, num_sequences); - kmer_iterator it(data.strings, k); + kmer_iterator it(data.strings_builder, k); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); @@ -364,10 +275,8 @@ void parse_file(std::istream& is, parse_data& data, } } - if (build_config.sorted) { // encode offset - auto p = string_groups_info[sequence_len]; - mini_info.pos_in_seq = data.endpoints_builder.encode( - mini_info.pos_in_seq, p.super_group_id, p.group_id, p.group_offset); + if (build_config.fast) { // encode offset + // TODO } if (prev_mini_info.minimizer == constants::invalid_uint64) { diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 4e203f1..1a1b4cb 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -36,27 +36,27 @@ struct dictionary { lookup_result lookup(char const* string_kmer, bool check_reverse_complement = true) const; lookup_result lookup_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; - // /* Return the number of kmers in contig. Since contigs do not have duplicates, - // the length of the contig is always size + k - 1. */ - // uint64_t contig_size(uint64_t contig_id) const; - - // /* Navigational queries. */ - // neighbourhood kmer_forward_neighbours(char const* string_kmer, - // bool check_reverse_complement = true) const; - // neighbourhood kmer_forward_neighbours(kmer_t uint_kmer, - // bool check_reverse_complement = true) const; - // neighbourhood kmer_backward_neighbours(char const* string_kmer, - // bool check_reverse_complement = true) const; - // neighbourhood kmer_backward_neighbours(kmer_t uint_kmer, - // bool check_reverse_complement = true) const; - - // /* forward and backward */ - // neighbourhood kmer_neighbours(char const* string_kmer, - // bool check_reverse_complement = true) const; - // neighbourhood kmer_neighbours(kmer_t uint_kmer, - // bool check_reverse_complement = true) const; - // neighbourhood contig_neighbours(uint64_t contig_id, - // bool check_reverse_complement = true) const; + /* Return the number of kmers in contig. Since contigs do not have duplicates, + the length of the contig is always size + k - 1. */ + uint64_t contig_size(uint64_t contig_id) const; + + /* Navigational queries. */ + neighbourhood kmer_forward_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_forward_neighbours(kmer_t uint_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_backward_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_backward_neighbours(kmer_t uint_kmer, + bool check_reverse_complement = true) const; + + /* forward and backward */ + neighbourhood kmer_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_neighbours(kmer_t uint_kmer, + bool check_reverse_complement = true) const; + neighbourhood contig_neighbours(uint64_t contig_id, + bool check_reverse_complement = true) const; /* Return the weight of the kmer given its id. */ uint64_t weight(uint64_t kmer_id) const; @@ -75,43 +75,42 @@ struct dictionary { streaming_query_report // streaming_query_from_file(std::string const& filename, bool multiline) const; - // struct iterator { - // iterator(dictionary const* ptr, const uint64_t begin_kmer_id, const uint64_t end_kmer_id) - // { - // m_it = ptr->m_buckets.at(begin_kmer_id, end_kmer_id, ptr->m_k); - // } - - // bool has_next() const { return m_it.has_next(); } - - // /* (kmer-id, kmer) */ - // std::pair next() { return m_it.next(); } - - // private: - // typename buckets::iterator m_it; - // }; - - // iterator begin() const { return iterator(this, 0, num_kmers()); } - - // iterator at_kmer_id(const uint64_t kmer_id) const { - // assert(kmer_id < num_kmers()); - // return iterator(this, kmer_id, num_kmers()); - // } - - // std::pair // [begin, end) - // contig_offsets(const uint64_t contig_id) const { - // return m_buckets.contig_offsets(contig_id); - // } - - // iterator at_contig_id(const uint64_t contig_id) const { - // assert(contig_id < num_strings()); - // auto [begin, end] = contig_offsets(contig_id); - // uint64_t contig_length = end - begin; // in bases - // assert(contig_length >= m_k); - // uint64_t contig_size = contig_length - m_k + 1; // in kmers - // uint64_t begin_kmer_id = begin - contig_id * (m_k - 1); - // uint64_t end_kmer_id = begin_kmer_id + contig_size; - // return iterator(this, begin_kmer_id, end_kmer_id); - // } + struct iterator { + iterator(dictionary const* ptr, const uint64_t begin_kmer_id, const uint64_t end_kmer_id) { + m_it = ptr->m_buckets.at(begin_kmer_id, end_kmer_id, ptr->m_k); + } + + bool has_next() const { return m_it.has_next(); } + + /* (kmer-id, kmer) */ + std::pair next() { return m_it.next(); } + + private: + typename buckets::iterator m_it; + }; + + iterator begin() const { return iterator(this, 0, num_kmers()); } + + iterator at_kmer_id(const uint64_t kmer_id) const { + assert(kmer_id < num_kmers()); + return iterator(this, kmer_id, num_kmers()); + } + + std::pair // [begin, end) + contig_offsets(const uint64_t contig_id) const { + return m_buckets.contig_offsets(contig_id); + } + + iterator at_contig_id(const uint64_t contig_id) const { + assert(contig_id < num_strings()); + auto [begin, end] = contig_offsets(contig_id); + uint64_t contig_length = end - begin; // in bases + assert(contig_length >= m_k); + uint64_t contig_size = contig_length - m_k + 1; // in kmers + uint64_t begin_kmer_id = begin - contig_id * (m_k - 1); + uint64_t end_kmer_id = begin_kmer_id + contig_size; + return iterator(this, begin_kmer_id, end_kmer_id); + } bits::bit_vector const& get_strings() const { return m_buckets.strings; } buckets const& get_buckets() const { return m_buckets; } diff --git a/include/endpoints.hpp b/include/endpoints.hpp deleted file mode 100644 index 4234c41..0000000 --- a/include/endpoints.hpp +++ /dev/null @@ -1,223 +0,0 @@ -#pragma once - -namespace sshash { - -struct endpoints // -{ - struct string_group_info { - uint32_t strings_length; // all strings in the group have the same length - uint32_t first_id; // absolute id of the first string in the group - uint64_t group_offset; // where the group of strings begins - }; - - struct string_super_group_info { - uint8_t num_bits_per_group; - uint32_t super_group_offset; // where the super group info begins - }; - - struct builder // - { - builder() : m_num_bits_per_super_group(0), m_num_bits_per_offset(0) {} - - void build_from(std::vector const& se) // - { - m_string_super_groups_info.reserve(1ULL << 7); - m_string_groups_info.reserve(1ULL << 16); - - assert(se.front() == 0); - uint64_t prev_len = se[1] - se[0]; - uint64_t log2_prev_len = bits::util::ceil_log2_uint64(prev_len); - - uint64_t first_id = 0; - uint64_t group_offset = 0; - - auto new_super_group = [&]() { - m_string_super_groups_info.push_back( - {0, static_cast(m_string_groups_info.size())}); - }; - - new_super_group(); - - for (uint64_t i = 1; i != se.size(); ++i) { - uint64_t curr_len = se[i] - se[i - 1]; - uint64_t log2_curr_len = bits::util::ceil_log2_uint64(curr_len); - assert(curr_len >= prev_len); - if (curr_len > prev_len) // - { - m_string_groups_info.push_back({static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // - - if (log2_curr_len > log2_prev_len) { - new_super_group(); - log2_prev_len = log2_curr_len; - } - - prev_len = curr_len; - first_id = i - 1; - group_offset = se[i - 1]; - } - } - - m_string_groups_info.push_back({static_cast(prev_len), // - static_cast(first_id), // - group_offset}); // - - m_num_bits_per_super_group = - m_string_super_groups_info.size() == 1 - ? 1 - : bits::util::ceil_log2_uint64(m_string_super_groups_info.size()); - assert(m_num_bits_per_super_group > 0); - std::cout << "num_bits_per_super_group = " << int(m_num_bits_per_super_group) - << std::endl; - - /* - Push a last dummy super-group so that - super_group_size = m_string_super_groups_info[i+1].super_group_offset - - m_string_super_groups_info[i].super_group_offset; - for any super_group_id i - */ - new_super_group(); - - /* set num. bits per group for all super groups */ - for (uint64_t i = 0, prev_offset = 0; i != m_string_super_groups_info.size() - 1; ++i) { - std::cout << "super_group " << i << ": "; - uint64_t begin = m_string_super_groups_info[i].super_group_offset; - uint64_t end = m_string_super_groups_info[i + 1].super_group_offset; - uint64_t super_group_size = end - begin; - m_string_super_groups_info[i].num_bits_per_group = - super_group_size == 1 ? 1 : bits::util::ceil_log2_uint64(super_group_size); - std::cout << "super_group_size = " << super_group_size << " " - << "num_bits_per_group = " - << int(m_string_super_groups_info[i].num_bits_per_group) << " "; - - uint64_t longest_cumulative_length = 0; - for (uint64_t j = begin; j != end; ++j) // - { - uint64_t next_offset = j + 1 < m_string_groups_info.size() - ? m_string_groups_info[j + 1].group_offset - : se.back(); - assert(next_offset > prev_offset); - uint64_t cumulative_length = next_offset - prev_offset; - if (cumulative_length > longest_cumulative_length) { - longest_cumulative_length = cumulative_length; - } - prev_offset = next_offset; - } - - assert(longest_cumulative_length > 1); - uint64_t num_bits_per_relative_offset = - bits::util::ceil_log2_uint64(longest_cumulative_length); - uint64_t num_bits_per_offset = - m_string_super_groups_info[i].num_bits_per_group + num_bits_per_relative_offset; - std::cout << "num_bits_per_relative_offset = " << num_bits_per_relative_offset - << " num_bits_per_offset = " << num_bits_per_offset << std::endl; - - if (num_bits_per_offset > m_num_bits_per_offset) { - m_num_bits_per_offset = num_bits_per_offset; - } - } - - m_num_bits_per_offset += m_num_bits_per_super_group; - std::cout << "num_bits_per_offset = " << m_num_bits_per_offset << std::endl; - assert(m_num_bits_per_offset > 0); - } - - uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } - - uint64_t encode(uint64_t offset, uint64_t super_group_id, uint64_t group_id, - uint64_t group_offset) // - { - assert(offset >= group_offset); - offset -= group_offset; // relative to beginning of group - auto g = m_string_super_groups_info[super_group_id]; - assert(group_id < m_string_super_groups_info[super_group_id + 1].super_group_offset - - g.super_group_offset); - offset <<= g.num_bits_per_group; - offset += group_id; - assert(super_group_id < (1ULL << m_num_bits_per_super_group)); - offset <<= m_num_bits_per_super_group; - offset += super_group_id; - return offset; - } - - void build(endpoints& e) { - std::swap(e.m_num_bits_per_super_group, m_num_bits_per_super_group); - e.m_string_super_groups_info.swap(m_string_super_groups_info); - e.m_string_groups_info.swap(m_string_groups_info); - } - - private: - uint8_t m_num_bits_per_super_group; - std::vector m_string_super_groups_info; - std::vector m_string_groups_info; - - uint64_t m_num_bits_per_offset; - }; - - struct decoded_offset { - uint64_t offset; // absolute offset - string_group_info group_info; - }; - decoded_offset decode(const uint64_t offset) const // - { - const uint64_t p = m_num_bits_per_super_group; - uint64_t super_group_id = offset & ((1ULL << p) - 1); - assert(super_group_id < m_string_super_groups_info.size()); - auto g = m_string_super_groups_info[super_group_id]; - const uint64_t q = g.num_bits_per_group; - uint64_t group_id = (offset >> p) & ((1ULL << q) - 1); - assert(group_id < m_string_super_groups_info[super_group_id + 1].super_group_offset - - g.super_group_offset); - auto sgi = m_string_groups_info[g.super_group_offset + group_id]; - return {(offset >> (p + q)) + sgi.group_offset, sgi}; - } - - uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const // - { - auto it = - std::upper_bound(m_string_groups_info.begin(), m_string_groups_info.end(), kmer_id, - [&](const uint64_t x, string_group_info const& sgi) { - assert(sgi.group_offset >= sgi.first_id * (k - 1)); - return x < sgi.group_offset - sgi.first_id * (k - 1); - }) - - 1; - assert(it != m_string_groups_info.end()); - auto sgi = *it; - uint64_t id = sgi.group_offset - sgi.first_id * (k - 1); - assert(id <= kmer_id); - uint64_t offset = - kmer_id + ((kmer_id - id) / (sgi.strings_length - k + 1) + sgi.first_id) * (k - 1); - return offset; - } - - uint64_t num_bytes() const { - return sizeof(m_num_bits_per_super_group) + 2 * sizeof(uint64_t) // for std::vector::size - + essentials::vec_bytes(m_string_super_groups_info) + - essentials::vec_bytes(m_string_groups_info); - } - - template - void visit(Visitor& visitor) const { - visit_impl(visitor, *this); - } - - template - void visit(Visitor& visitor) { - visit_impl(visitor, *this); - } - -private: - uint8_t m_num_bits_per_super_group; - std::vector m_string_super_groups_info; - std::vector m_string_groups_info; - - template - static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.m_num_bits_per_super_group); - visitor.visit(t.m_string_super_groups_info); - visitor.visit(t.m_string_groups_info); - } -}; - -} // namespace sshash \ No newline at end of file diff --git a/include/kmer_iterator.hpp b/include/kmer_iterator.hpp index 640e7bc..62ecaed 100644 --- a/include/kmer_iterator.hpp +++ b/include/kmer_iterator.hpp @@ -1,19 +1,18 @@ #pragma once -#include "external/pthash/external/bits/include/bit_vector.hpp" #include "util.hpp" namespace sshash { -template +template struct kmer_iterator // { kmer_iterator() {} - kmer_iterator(bits::bit_vector const& bv, const uint64_t k) + kmer_iterator(BitVector const& bv, const uint64_t k) : m_bv(&bv), m_uint_kmer_bits(kmer_t::bits_per_char * k), m_pos(0), m_avail(0), m_buff(0) {} - kmer_iterator(bits::bit_vector const& bv, const uint64_t k, const uint64_t pos) + kmer_iterator(BitVector const& bv, const uint64_t k, const uint64_t pos) : kmer_iterator(bv, k) // { at(pos); @@ -81,7 +80,7 @@ struct kmer_iterator // m_buff.pad(kmer_t::uint_kmer_bits - m_avail); } - bits::bit_vector const* m_bv; + BitVector const* m_bv; uint64_t m_uint_kmer_bits; uint64_t m_pos, m_avail; kmer_t m_buff; diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index c9aede1..c8b13d4 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -129,7 +129,7 @@ struct streaming_query { minimizer_info m_curr_mini_info_rc, m_prev_mini_info_rc; /* string state */ - kmer_iterator m_it; + kmer_iterator m_it; uint64_t m_remaining_contig_bases; /* performance counts */ diff --git a/include/util.hpp b/include/util.hpp index 684ecec..74aedd5 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -152,7 +152,7 @@ struct build_configuration { , canonical(false) , weighted(false) , verbose(true) - , sorted(false) + , fast(false) , tmp_dirname(constants::default_tmp_dirname) @@ -169,18 +169,22 @@ struct build_configuration { bool canonical; bool weighted; bool verbose; - bool sorted; + bool fast; std::string tmp_dirname; void print() const { - std::cout << "k = " << k << ", m = " << m << ", seed = " << seed - << ", num_threads = " << num_threads - << ", ram_limit_in_GiB = " << ram_limit_in_GiB << ", lambda = " << lambda - << ", canonical = " << (canonical ? "true" : "false") - << ", weighted = " << (weighted ? "true" : "false") - << ", verbose = " << (verbose ? "true" : "false") << ", tmp_dirname = '" - << tmp_dirname << "'" << std::endl; + std::cout << "k = " << k // + << ", m = " << m // + << ", seed = " << seed // + << ", num_threads = " << num_threads // + << ", ram_limit_in_GiB = " << ram_limit_in_GiB // + << ", lambda = " << lambda // + << ", canonical = " << (canonical ? "true" : "false") // + << ", weighted = " << (weighted ? "true" : "false") // + << ", verbose = " << (verbose ? "true" : "false") // + << ", fast = " << (fast ? "true" : "false") // + << ", tmp_dirname = '" << tmp_dirname << "'" << std::endl; // } }; diff --git a/src/build.cpp b/src/build.cpp index 24eb349..77bd02a 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -39,7 +39,8 @@ void dictionary::build(std::string const& filename, parse_data data(build_config); parse_file(filename, data, build_config); m_num_kmers = data.num_kmers; - m_num_strings = data.num_sequences; + assert(data.strings_endpoints.size() >= 2); + m_num_strings = data.strings_endpoints.size() - 1; if (build_config.weighted) { essentials::timer_type timer; timer.start(); @@ -160,6 +161,7 @@ void dictionary::build(std::string const& filename, /* step 3: build sparse and skew index ***/ timer.start(); auto buckets_stats = build_sparse_and_skew_index(data, m_buckets, m_skew_index, build_config); + assert(data.strings_endpoints.size() == 0); timer.stop(); timings.push_back(timer.elapsed()); print_time(timings.back(), data.num_kmers, "step 3: 'build sparse and skew index'"); diff --git a/src/dictionary.cpp b/src/dictionary.cpp index c9cc100..1fad6d5 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -24,7 +24,7 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, if (status == 0) { // minimizer occurs once uint64_t offset = code >> 1; auto res = m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); - res.list_size = 1; + // res.list_size = 1; return res; } @@ -38,7 +38,7 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; uint64_t end = begin + list_size; auto res = m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); - res.list_size = list_size; + // res.list_size = list_size; return res; } @@ -100,7 +100,7 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t auto res = m_buckets.lookup_canonical_at_offset( // offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // ); - res.list_size = 1; + // res.list_size = 1; return res; } @@ -116,7 +116,7 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t auto res = m_buckets.lookup_canonical( // begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // ); - res.list_size = list_size; + // res.list_size = list_size; return res; } @@ -186,107 +186,106 @@ uint64_t dictionary::weight(uint64_t kmer_id) const { return m_weights.weight(kmer_id); } -// template -// uint64_t dictionary::contig_size(uint64_t contig_id) const { -// assert(contig_id < num_strings()); -// auto [begin, end] = m_buckets.contig_offsets(contig_id); -// uint64_t contig_length = end - begin; -// assert(contig_length >= m_k); -// return contig_length - m_k + 1; -// } +template +uint64_t dictionary::contig_size(uint64_t contig_id) const { + assert(contig_id < num_strings()); + auto [begin, end] = m_buckets.contig_offsets(contig_id); + uint64_t contig_length = end - begin; + assert(contig_length >= m_k); + return contig_length - m_k + 1; +} -// template -// void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, -// bool check_reverse_complement) const { -// for (size_t i = 0; i < kmer_t::alphabet_size; i++) { -// kmer_t new_kmer = suffix; -// new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); -// res.forward[i] = lookup_uint(new_kmer, check_reverse_complement); -// } -// } -// template -// void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, -// bool check_reverse_complement) const { -// for (size_t i = 0; i < kmer_t::alphabet_size; i++) { -// kmer_t new_kmer = prefix; -// new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); -// res.backward[i] = lookup_uint(new_kmer, check_reverse_complement); -// } -// } +template +void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, + bool check_reverse_complement) const { + for (size_t i = 0; i < kmer_t::alphabet_size; i++) { + kmer_t new_kmer = suffix; + new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); + res.forward[i] = lookup_uint(new_kmer, check_reverse_complement); + } +} +template +void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, + bool check_reverse_complement) const { + for (size_t i = 0; i < kmer_t::alphabet_size; i++) { + kmer_t new_kmer = prefix; + new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); + res.backward[i] = lookup_uint(new_kmer, check_reverse_complement); + } +} -// template -// neighbourhood dictionary::kmer_forward_neighbours( -// char const* string_kmer, bool check_reverse_complement) const { -// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); -// return kmer_forward_neighbours(uint_kmer, check_reverse_complement); -// } +template +neighbourhood dictionary::kmer_forward_neighbours( + char const* string_kmer, bool check_reverse_complement) const { + kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + return kmer_forward_neighbours(uint_kmer, check_reverse_complement); +} -// template -// kmer_t dictionary::get_suffix(kmer_t kmer) const { -// kmer_t suffix = kmer; -// suffix.drop_char(); -// return suffix; -// } -// template -// neighbourhood dictionary::kmer_forward_neighbours( -// kmer_t uint_kmer, bool check_reverse_complement) const { -// neighbourhood res; -// forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); -// return res; -// } +template +kmer_t dictionary::get_suffix(kmer_t kmer) const { + kmer_t suffix = kmer; + suffix.drop_char(); + return suffix; +} +template +neighbourhood dictionary::kmer_forward_neighbours( + kmer_t uint_kmer, bool check_reverse_complement) const { + neighbourhood res; + forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); + return res; +} -// template -// neighbourhood dictionary::kmer_backward_neighbours( -// char const* string_kmer, bool check_reverse_complement) const { -// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); -// return kmer_backward_neighbours(uint_kmer, check_reverse_complement); -// } +template +neighbourhood dictionary::kmer_backward_neighbours( + char const* string_kmer, bool check_reverse_complement) const { + kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + return kmer_backward_neighbours(uint_kmer, check_reverse_complement); +} -// template -// kmer_t dictionary::get_prefix(kmer_t kmer) const { -// kmer_t prefix = kmer; -// prefix.pad_char(); -// prefix.take_chars(m_k); -// return prefix; -// } +template +kmer_t dictionary::get_prefix(kmer_t kmer) const { + kmer_t prefix = kmer; + prefix.pad_char(); + prefix.take_chars(m_k); + return prefix; +} -// template -// neighbourhood dictionary::kmer_backward_neighbours( -// kmer_t uint_kmer, bool check_reverse_complement) const { -// neighbourhood res; -// backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); -// return res; -// } +template +neighbourhood dictionary::kmer_backward_neighbours( + kmer_t uint_kmer, bool check_reverse_complement) const { + neighbourhood res; + backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); + return res; +} -// template -// neighbourhood dictionary::kmer_neighbours(char const* string_kmer, -// bool check_reverse_complement) const { -// kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); -// return kmer_neighbours(uint_kmer, check_reverse_complement); -// } +template +neighbourhood dictionary::kmer_neighbours(char const* string_kmer, + bool check_reverse_complement) const { + kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + return kmer_neighbours(uint_kmer, check_reverse_complement); +} -// template -// neighbourhood dictionary::kmer_neighbours(kmer_t uint_kmer, -// bool check_reverse_complement) const { -// neighbourhood res; -// forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); -// backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); -// return res; -// } +template +neighbourhood dictionary::kmer_neighbours(kmer_t uint_kmer, + bool check_reverse_complement) const { + neighbourhood res; + forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); + backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); + return res; +} -// template -// neighbourhood dictionary::contig_neighbours(uint64_t contig_id, -// bool check_reverse_complement) const -// { -// assert(contig_id < num_strings()); -// neighbourhood res; -// kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); -// forward_neighbours(suffix, res, check_reverse_complement); -// kmer_t prefix = m_buckets.contig_prefix(contig_id, m_k); -// prefix.pad_char(); -// backward_neighbours(prefix, res, check_reverse_complement); -// return res; -// } +template +neighbourhood dictionary::contig_neighbours(uint64_t contig_id, + bool check_reverse_complement) const { + assert(contig_id < num_strings()); + neighbourhood res; + kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); + forward_neighbours(suffix, res, check_reverse_complement); + kmer_t prefix = m_buckets.contig_prefix(contig_id, m_k); + prefix.pad_char(); + backward_neighbours(prefix, res, check_reverse_complement); + return res; +} template uint64_t dictionary::num_bits() const { diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index 0664e97..8a5e23b 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -130,12 +130,12 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& } /* check also contig_size() */ - // uint64_t contig_size = dict.contig_size(curr.contig_id); - // if (contig_size != curr.contig_size) { - // std::cout << "ERROR: got contig_size " << contig_size << " but expected " - // << curr.contig_size << std::endl; - // } - // assert(contig_size == curr.contig_size); + uint64_t contig_size = dict.contig_size(curr.contig_id); + if (contig_size != curr.contig_size) { + std::cout << "ERROR: got contig_size " << contig_size << " but expected " + << curr.contig_size << std::endl; + } + assert(contig_size == curr.contig_size); prev = curr; @@ -159,60 +159,58 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& return check_correctness_negative_lookup(dict); } -// template -// bool check_correctness_navigational_kmer_query(std::istream& is, dictionary const& dict) -// { -// const uint64_t k = dict.k(); -// std::string sequence; -// uint64_t num_kmers = 0; - -// std::cout << "checking correctness of navigational queries for kmers..." << std::endl; - -// while (!is.eof()) // -// { -// if constexpr (fmt == input_file_type::cf_seg) { -// std::getline(is, sequence, '\t'); // skip '\t' -// std::getline(is, sequence); // DNA sequence -// } else { -// static_assert(fmt == input_file_type::fasta); -// std::getline(is, sequence); // header sequence -// std::getline(is, sequence); // DNA sequence -// } -// for (uint64_t i = 0; i + k <= sequence.length(); ++i) { -// assert(util::is_valid(sequence.data() + i, k)); -// if (num_kmers != 0 and num_kmers % 5000000 == 0) { -// std::cout << "checked " << num_kmers << " kmers" << std::endl; -// } -// neighbourhood curr = dict.kmer_neighbours(sequence.data() + i); -// if (i + k < sequence.length()) { -// char next_nuc = sequence[i + k]; -// bool next_nuc_not_found = curr.forward[kmer_t::char_to_uint(next_nuc)].kmer_id == -// constants::invalid_uint64; -// if (next_nuc_not_found) { -// std::cout << "expected forward[" << next_nuc << "]" << std::endl; -// } -// assert(!next_nuc_not_found); -// } - -// if (i != 0) { -// char prev_nuc = sequence[i - 1]; -// bool prev_nuc_not_found = curr.backward[kmer_t::char_to_uint(prev_nuc)].kmer_id -// == -// constants::invalid_uint64; -// if (prev_nuc_not_found) { -// std::cout << "expected backward[" << prev_nuc << "]" << std::endl; -// } -// assert(!prev_nuc_not_found); -// } - -// ++num_kmers; -// } -// } -// std::cout << "checked " << num_kmers << " kmers" << std::endl; - -// std::cout << "EVERYTHING OK!" << std::endl; -// return true; -// } +template +bool check_correctness_navigational_kmer_query(std::istream& is, dictionary const& dict) { + const uint64_t k = dict.k(); + std::string sequence; + uint64_t num_kmers = 0; + + std::cout << "checking correctness of navigational queries for kmers..." << std::endl; + + while (!is.eof()) // + { + if constexpr (fmt == input_file_type::cf_seg) { + std::getline(is, sequence, '\t'); // skip '\t' + std::getline(is, sequence); // DNA sequence + } else { + static_assert(fmt == input_file_type::fasta); + std::getline(is, sequence); // header sequence + std::getline(is, sequence); // DNA sequence + } + for (uint64_t i = 0; i + k <= sequence.length(); ++i) { + assert(util::is_valid(sequence.data() + i, k)); + if (num_kmers != 0 and num_kmers % 5000000 == 0) { + std::cout << "checked " << num_kmers << " kmers" << std::endl; + } + neighbourhood curr = dict.kmer_neighbours(sequence.data() + i); + if (i + k < sequence.length()) { + char next_nuc = sequence[i + k]; + bool next_nuc_not_found = curr.forward[kmer_t::char_to_uint(next_nuc)].kmer_id == + constants::invalid_uint64; + if (next_nuc_not_found) { + std::cout << "expected forward[" << next_nuc << "]" << std::endl; + } + assert(!next_nuc_not_found); + } + + if (i != 0) { + char prev_nuc = sequence[i - 1]; + bool prev_nuc_not_found = curr.backward[kmer_t::char_to_uint(prev_nuc)].kmer_id == + constants::invalid_uint64; + if (prev_nuc_not_found) { + std::cout << "expected backward[" << prev_nuc << "]" << std::endl; + } + assert(!prev_nuc_not_found); + } + + ++num_kmers; + } + } + std::cout << "checked " << num_kmers << " kmers" << std::endl; + + std::cout << "EVERYTHING OK!" << std::endl; + return true; +} template bool check_correctness_weights(std::istream& is, dictionary const& dict) { diff --git a/tools/build.cpp b/tools/build.cpp index 9b29fb8..cafb967 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -47,8 +47,7 @@ int build(int argc, char** argv) { parser.add("check", "Check correctness after construction.", "--check", false, true); parser.add("bench", "Run performance benchmark after construction.", "--bench", false, true); parser.add("verbose", "Verbose output during construction.", "--verbose", false, true); - parser.add("sorted", "Assume that the input contains strings sorted by non-decreasing lengths.", - "--sorted", false, true); + parser.add("fast", "Increase space for faster lookup queries.", "--fast", false, true); if (!parser.parse()) return 0; @@ -67,7 +66,7 @@ int build(int argc, char** argv) { build_config.canonical = parser.get("canonical"); build_config.weighted = parser.get("weighted"); build_config.verbose = parser.get("verbose"); - build_config.sorted = parser.get("sorted"); + build_config.fast = parser.get("fast"); if (parser.parsed("tmp_dirname")) { build_config.tmp_dirname = parser.get("tmp_dirname"); essentials::create_directory(build_config.tmp_dirname); @@ -85,17 +84,17 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - // check_correctness_navigational_kmer_query(dict, input_filename); - // check_correctness_navigational_contig_query(dict); - // if (build_config.weighted) check_correctness_weights(dict, input_filename); - // check_correctness_kmer_iterator(dict); - // check_correctness_contig_iterator(dict); + check_correctness_navigational_kmer_query(dict, input_filename); + check_correctness_navigational_contig_query(dict); + if (build_config.weighted) check_correctness_weights(dict, input_filename); + check_correctness_kmer_iterator(dict); + check_correctness_contig_iterator(dict); } bool bench = parser.get("bench"); if (bench) { perf_test_lookup_access(dict); if (dict.weighted()) perf_test_lookup_weight(dict); - // perf_test_iterator(dict); + perf_test_iterator(dict); } if (parser.parsed("output_filename")) { auto output_filename = parser.get("output_filename"); diff --git a/tools/perf.hpp b/tools/perf.hpp index bb05604..417e506 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -6,94 +6,94 @@ namespace perf { using timer_type = essentials::timer; } -// template -// void perf_test_iterator(dictionary const& dict) { -// perf::timer_type t; -// t.start(); -// auto it = dict.begin(); -// while (it.has_next()) { -// auto [kmer_id, kmer] = it.next(); -// essentials::do_not_optimize_away(kmer_id); -// essentials::do_not_optimize_away(kmer[0]); -// } -// t.stop(); -// double avg_nanosec = t.elapsed() / dict.num_kmers(); -// std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; -// } - template -void perf_test_lookup_by_list_size(dictionary const& dict) { - constexpr uint64_t num_queries = 1000000; - constexpr uint64_t runs = 5; - const uint64_t k = dict.k(); - - const uint64_t min_size = 1ULL << constants::min_l; - std::vector> lookup_queries(min_size + 2); - for (auto& v : lookup_queries) v.reserve(num_queries); - { - uint64_t i = 0; - auto it = dict.begin(); - while (it.has_next()) { - auto [_, kmer] = it.next(); - auto res = dict.lookup_advanced(kmer.c_str()); - if (res.list_size == constants::invalid_uint64) { - if (lookup_queries[res.list_size + 1].size() < num_queries) { - lookup_queries[res.list_size + 1].push_back(kmer); - } - } else { - assert(res.list_size > 0 and res.list_size <= min_size); - if (lookup_queries[res.list_size].size() < num_queries) { - lookup_queries[res.list_size].push_back(kmer); - } - } - ++i; - if (i % 100000000 == 0) std::cout << i << " kmers" << std::endl; - if (i == 1000000000) break; - } +void perf_test_iterator(dictionary const& dict) { + perf::timer_type t; + t.start(); + auto it = dict.begin(); + while (it.has_next()) { + auto [kmer_id, kmer] = it.next(); + essentials::do_not_optimize_away(kmer_id); + essentials::do_not_optimize_away(kmer[0]); } + t.stop(); + double avg_nanosec = t.elapsed() / dict.num_kmers(); + std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; +} - { - std::string kmer_rc(k, 0); - for (auto& v : lookup_queries) { - std::mt19937 g(essentials::get_random_seed()); - std::shuffle(v.begin(), v.end(), g); - assert(v.size() <= num_queries); - // if (v.size() > num_queries) v.resize(num_queries); - for (uint64_t i = 1; i < v.size(); i += 2) { - /* transform 50% of the kmers into their reverse complements */ - kmer_t::compute_reverse_complement(v[i].data(), kmer_rc.data(), k); - v[i] = kmer_rc; - } - } - } +// template +// void perf_test_lookup_by_list_size(dictionary const& dict) { +// constexpr uint64_t num_queries = 1000000; +// constexpr uint64_t runs = 5; +// const uint64_t k = dict.k(); - for (uint64_t list_size = 1; list_size <= min_size + 1; ++list_size) { - if (lookup_queries[list_size].empty()) continue; - perf::timer_type t; - t.start(); - for (uint64_t r = 0; r != runs; ++r) { - for (auto const& string : lookup_queries[list_size]) { - auto res = dict.lookup(string.c_str()); - essentials::do_not_optimize_away(res.kmer_id); - } - } - t.stop(); - double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries[list_size].size()); - std::cout << "list_size "; - if (list_size <= min_size) { - std::cout << "= " << list_size; - } else { - std::cout << "> " << min_size; - } - std::cout << ": avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - std::cout << " (avg. among " << lookup_queries[list_size].size() << " queries)" - << std::endl; - } -} +// const uint64_t min_size = 1ULL << constants::min_l; +// std::vector> lookup_queries(min_size + 2); +// for (auto& v : lookup_queries) v.reserve(num_queries); +// { +// uint64_t i = 0; +// auto it = dict.begin(); +// while (it.has_next()) { +// auto [_, kmer] = it.next(); +// auto res = dict.lookup_advanced(kmer.c_str()); +// if (res.list_size == constants::invalid_uint64) { +// if (lookup_queries[res.list_size + 1].size() < num_queries) { +// lookup_queries[res.list_size + 1].push_back(kmer); +// } +// } else { +// assert(res.list_size > 0 and res.list_size <= min_size); +// if (lookup_queries[res.list_size].size() < num_queries) { +// lookup_queries[res.list_size].push_back(kmer); +// } +// } +// ++i; +// if (i % 100000000 == 0) std::cout << i << " kmers" << std::endl; +// if (i == 1000000000) break; +// } +// } + +// { +// std::string kmer_rc(k, 0); +// for (auto& v : lookup_queries) { +// std::mt19937 g(essentials::get_random_seed()); +// std::shuffle(v.begin(), v.end(), g); +// assert(v.size() <= num_queries); +// // if (v.size() > num_queries) v.resize(num_queries); +// for (uint64_t i = 1; i < v.size(); i += 2) { +// /* transform 50% of the kmers into their reverse complements */ +// kmer_t::compute_reverse_complement(v[i].data(), kmer_rc.data(), k); +// v[i] = kmer_rc; +// } +// } +// } + +// for (uint64_t list_size = 1; list_size <= min_size + 1; ++list_size) { +// if (lookup_queries[list_size].empty()) continue; +// perf::timer_type t; +// t.start(); +// for (uint64_t r = 0; r != runs; ++r) { +// for (auto const& string : lookup_queries[list_size]) { +// auto res = dict.lookup(string.c_str()); +// essentials::do_not_optimize_away(res.kmer_id); +// } +// } +// t.stop(); +// double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries[list_size].size()); +// std::cout << "list_size "; +// if (list_size <= min_size) { +// std::cout << "= " << list_size; +// } else { +// std::cout << "> " << min_size; +// } +// std::cout << ": avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; +// std::cout << " (avg. among " << lookup_queries[list_size].size() << " queries)" +// << std::endl; +// } +// } template void perf_test_lookup_access(dictionary const& dict) { - constexpr uint64_t num_queries = 1000000; + constexpr uint64_t num_queries = 1'000'000; constexpr uint64_t runs = 5; essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, essentials::get_random_seed()); diff --git a/tools/sort.cpp b/tools/sort.cpp deleted file mode 100644 index 1ea176f..0000000 --- a/tools/sort.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#pragma once - -#include "external/pthash/include/pthash.hpp" -#include "external/pthash/external/bits/external/essentials/include/essentials.hpp" -// #include "external/gz/zip_stream.hpp" -// #include "external/gz/zip_stream.cpp" -#include "include/builder/util.hpp" - -namespace sshash { - -void sort(std::istream& is, std::string const& output_filename, - std::string const& tmp_dirname) // -{ - constexpr uint64_t limit_in_bytes = 4 * essentials::GB; - constexpr uint64_t limit_in_num_sequences = 1000000; - - std::vector buffer; - buffer.reserve(limit_in_num_sequences); - - std::string run_identifier = - std::to_string(pthash::clock_type::now().time_since_epoch().count()); - - std::string sequence; - uint64_t num_sequences = 0; - uint64_t num_bases = 0; - uint64_t bytes = 0; - uint64_t num_files_to_merge = 0; - - auto get_tmp_output_filename = [&](uint64_t id) { - return tmp_dirname + "/sshash.tmp.run" + run_identifier + "." + std::to_string(id); - }; - - auto sort_and_flush = [&]() { - if (buffer.empty()) return; - - std::cout << "sorting buffer..." << std::endl; - std::sort(buffer.begin(), buffer.end(), - [&](auto const& x, auto const& y) { return x.length() < y.length(); }); - - auto tmp_output_filename = get_tmp_output_filename(num_files_to_merge); - std::cout << "saving to file '" << tmp_output_filename << "'..." << std::endl; - std::ofstream out(tmp_output_filename.c_str()); - if (!out.is_open()) throw std::runtime_error("cannot open file"); - for (auto const& s : buffer) out << s << '\n'; - out.close(); - - buffer.clear(); - bytes = 0; - num_files_to_merge += 1; - }; - - while (true) { - std::getline(is, sequence); // header sequence - std::getline(is, sequence); // DNA sequence - if (is.eof()) break; - - if (++num_sequences % 100000 == 0) { - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases" - << std::endl; - } - - const uint64_t n = sequence.size(); - num_bases += n; - - uint64_t seq_bytes = n + 16; // overhead - if (bytes + seq_bytes > limit_in_bytes or buffer.size() == limit_in_num_sequences) { - sort_and_flush(); - } - - bytes += seq_bytes; - buffer.emplace_back(sequence); - num_bases += n; - } - sort_and_flush(); - - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases" << std::endl; - - /* merge */ - { - assert(num_files_to_merge > 0); - std::cout << "files to merge = " << num_files_to_merge << std::endl; - - struct lines_iterator { - lines_iterator(uint8_t const* begin, uint8_t const* end) : m_begin(begin), m_end(end) { - advance_to_next(); - } - - void advance_to_next() { m_sequence = read_line(); } - - std::string const& sequence() const { return m_sequence; } - bool has_next() const { return !m_sequence.empty(); } - - private: - uint8_t const* m_begin; - uint8_t const* m_end; - std::string m_sequence; - - std::string read_line() { - uint8_t const* begin = m_begin; - while (m_begin != m_end and *m_begin++ != '\n') - ; - if (begin == m_begin) return std::string(""); - return std::string(reinterpret_cast(begin), m_begin - begin - 1); - } - }; - - std::vector iterators; - std::vector idx_heap; - iterators.reserve(num_files_to_merge); - idx_heap.reserve(num_files_to_merge); - std::vector> mm_files(num_files_to_merge); - - auto heap_idx_comparator = [&](uint32_t i, uint32_t j) { - return iterators[i].sequence().length() > iterators[j].sequence().length(); - }; - - auto advance_heap_head = [&]() { - auto idx = idx_heap.front(); - iterators[idx].advance_to_next(); - if (iterators[idx].has_next()) { // percolate down the head - uint64_t pos = 0; - uint64_t size = idx_heap.size(); - while (2 * pos + 1 < size) { - uint64_t i = 2 * pos + 1; - if (i + 1 < size and heap_idx_comparator(idx_heap[i], idx_heap[i + 1])) ++i; - if (heap_idx_comparator(idx_heap[i], idx_heap[pos])) break; - std::swap(idx_heap[pos], idx_heap[i]); - pos = i; - } - } else { - std::pop_heap(idx_heap.begin(), idx_heap.end(), heap_idx_comparator); - idx_heap.pop_back(); - } - }; - - /* create the input iterators and make the heap */ - for (uint64_t i = 0; i != num_files_to_merge; ++i) { - auto tmp_output_filename = get_tmp_output_filename(i); - mm_files[i].open(tmp_output_filename, mm::advice::sequential); - iterators.emplace_back(mm_files[i].data(), mm_files[i].data() + mm_files[i].size()); - idx_heap.push_back(i); - } - std::make_heap(idx_heap.begin(), idx_heap.end(), heap_idx_comparator); - - std::ofstream out(output_filename.c_str()); - if (!out.is_open()) throw std::runtime_error("cannot open file"); - - uint64_t num_written_sequences = 0; - while (!idx_heap.empty()) { - auto const& it = iterators[idx_heap.front()]; - out << '>' << '\n' << it.sequence() << '\n'; - num_written_sequences += 1; - if (num_written_sequences % 1000000 == 0) { - std::cout << "written sequences = " << num_written_sequences << "/" << num_sequences - << std::endl; - } - advance_heap_head(); - } - std::cout << "written sequences = " << num_written_sequences << "/" << num_sequences - << std::endl; - out.close(); - assert(num_written_sequences == num_sequences); - - /* remove tmp files */ - for (uint64_t i = 0; i != num_files_to_merge; ++i) { - mm_files[i].close(); - auto tmp_output_filename = get_tmp_output_filename(i); - std::remove(tmp_output_filename.c_str()); - } - } -} - -void sort(std::string const& input_filename, std::string const& output_filename, - std::string const& tmp_dirname) // -{ - std::ifstream is(input_filename.c_str()); - if (!is.good()) throw std::runtime_error("error in opening the file '" + input_filename + "'"); - std::cout << "reading file '" << input_filename << "'..." << std::endl; - if (util::ends_with(input_filename, ".gz")) { - zip_istream zis(is); - sort(zis, output_filename, tmp_dirname); - } else { - sort(is, output_filename, tmp_dirname); - } - is.close(); -} - -template -int sort(int argc, char** argv) { - cmd_line_parser::parser parser(argc, argv); - - /* Required arguments. */ - parser.add("input_filename", - "Must be a FASTA file (.fa/fasta extension) compressed with gzip (.gz) or not.", - "-i", true); - parser.add("output_filename", "Output filename.", "-o", true); - - /* Optional arguments. */ - parser.add("tmp_dirname", - "Temporary directory used for merging in external memory. Default " - "is directory '" + - constants::default_tmp_dirname + "'.", - "-d", false); - - if (!parser.parse()) return 0; - - auto input_filename = parser.get("input_filename"); - - std::string output_filename = parser.get("output_filename"); - std::string tmp_dirname = constants::default_tmp_dirname; - if (parser.parsed("tmp_dirname")) { - tmp_dirname = parser.get("tmp_dirname"); - essentials::create_directory(tmp_dirname); - } - - sort(input_filename, output_filename, tmp_dirname); - - return 0; -} - -} // namespace sshash \ No newline at end of file diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 6802381..9afc504 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -10,12 +10,10 @@ #include "src/dictionary.cpp" #include "src/query.cpp" #include "src/info.cpp" -// #include "src/statistics.cpp" #include "build.cpp" #include "query.cpp" #include "permute.cpp" -#include "sort.cpp" using namespace sshash; @@ -74,17 +72,14 @@ int help(char* arg0) { std::cout << "== SSHash: (S)parse and (S)kew (Hash)ing of k-mers =========================" << std::endl << std::endl; - std::cout - << "Usage: " << arg0 << " ...\n\n" - << "Available tools:\n" - << " build \t build a dictionary \n" - << " query \t query a dictionary \n" - << " check \t check correctness of a dictionary \n" - << " bench \t run performance tests for a dictionary \n" - << " permute \t permute a weighted input file \n" - // << " compute-statistics \t compute index statistics " << std::endl; - << " sort \t sort the strings in an input file by (non-decreasing) length " - << std::endl; + std::cout << "Usage: " << arg0 << " ...\n\n" + << "Available tools:\n" + << " build \t build a dictionary \n" + << " query \t query a dictionary \n" + << " check \t check correctness of a dictionary \n" + << " bench \t run performance tests for a dictionary \n" + << " permute \t permute a weighted input file \n" + << std::endl; return 0; } @@ -102,11 +97,6 @@ int main(int argc, char** argv) { return bench(argc - 1, argv + 1); } else if (tool == "permute") { return permute(argc - 1, argv + 1); - // } else if (tool == "compute-statistics") { - // return compute_statistics(argc - 1, argv + 1); - // } - } else if (tool == "sort") { - return sort(argc - 1, argv + 1); } std::cout << "Unsupported tool '" << tool << "'.\n" << std::endl; return help(argv[0]); From 4c07bdecb9f9d835c9804f35748329e6d5ec077a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 12 Oct 2025 00:58:53 +0200 Subject: [PATCH 042/112] more --- include/buckets.hpp | 148 +++----- ...ex.hpp => build_sparse_and_skew_index.cpp} | 42 +-- include/builder/dictionary_builder.hpp | 192 +++++++++++ .../{parse_file.hpp => parse_file.cpp} | 129 ++++--- include/dictionary.hpp | 17 +- include/endpoints.hpp | 320 ++++++++++++++++++ include/streaming_query.hpp | 11 +- include/util.hpp | 14 +- src/build.cpp | 170 +--------- src/dictionary.cpp | 113 ++++--- src/info.cpp | 8 +- src/query.cpp | 69 ++-- test/check.hpp | 26 +- test/check_from_file.hpp | 52 +-- tools/build.cpp | 2 +- tools/common.hpp | 4 +- tools/perf.hpp | 21 +- tools/query.cpp | 2 +- tools/sshash.cpp | 6 +- 19 files changed, 822 insertions(+), 524 deletions(-) rename include/builder/{build_sparse_and_skew_index.hpp => build_sparse_and_skew_index.cpp} (91%) create mode 100644 include/builder/dictionary_builder.hpp rename include/builder/{parse_file.hpp => parse_file.cpp} (74%) create mode 100644 include/endpoints.hpp diff --git a/include/buckets.hpp b/include/buckets.hpp index 28bf18a..fc218e7 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -1,49 +1,14 @@ #pragma once -#include "external/pthash/external/bits/include/endpoints_sequence.hpp" -// #include "endpoints.hpp" - #include "util.hpp" #include "kmer_iterator.hpp" +#include "endpoints.hpp" namespace sshash { -template +template struct buckets // { - lookup_result offset_to_id(const uint64_t offset, const uint64_t k) const // - { - /* - When `strings_endpoints` is of type `bits::endpoints_sequence<>`. - */ - auto p = strings_endpoints.locate(offset); - uint64_t contig_id = p.first.pos; - uint64_t contig_begin = p.first.val; - uint64_t contig_end = p.second.val; - - /* The following facts hold. */ - assert(offset >= contig_id * (k - 1)); - assert(contig_begin <= offset); - assert(offset < contig_end); - /****************************/ - - uint64_t absolute_kmer_id = offset - contig_id * (k - 1); - uint64_t relative_kmer_id = offset - contig_begin; - uint64_t contig_length = contig_end - contig_begin; - assert(contig_length >= k); - uint64_t contig_size = contig_length - k + 1; - - lookup_result res; - res.kmer_id = absolute_kmer_id; - res.kmer_id_in_contig = relative_kmer_id; - res.contig_id = contig_id; - res.contig_size = contig_size; - assert(contig_begin == res.contig_begin(k)); - assert(contig_end == res.contig_end(k)); - - return res; - } - /* Return where the contig begins and ends in strings. */ std::pair // [begin, end) contig_offsets(const uint64_t contig_id) const { @@ -70,11 +35,12 @@ struct buckets // { /* check minimizer first */ uint64_t minimizer_offset = offsets2.access(begin); + auto p = strings_endpoints.decode(minimizer_offset); uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); + util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); - auto res = lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); + auto res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; @@ -82,7 +48,8 @@ struct buckets // for (uint64_t i = begin + 1; i < end; ++i) { minimizer_offset = offsets2.access(i); - res = lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); + p = strings_endpoints.decode(minimizer_offset); + res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; @@ -92,21 +59,18 @@ struct buckets // return lookup_result(); } - lookup_result lookup_at_offset_no_check_minimizer(const uint64_t minimizer_offset, // - const kmer_t kmer, // - const minimizer_info mini_info, // - const uint64_t k) const // + lookup_result lookup_at_offset_no_check_minimizer(endpoints::decoded_offset p, // + const kmer_t kmer, // + const minimizer_info mini_info, // + const uint64_t k) const // { - if (minimizer_offset >= mini_info.pos_in_kmer) { - uint64_t kmer_offset = minimizer_offset - mini_info.pos_in_kmer; - auto res = offset_to_id(kmer_offset, k); + auto res = strings_endpoints.offset_to_id(p, mini_info.pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + uint64_t kmer_offset = res.kmer_offset(k); if (kmer_offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); - if (read_kmer == kmer) { - assert(is_valid(res)); - return res; - } + if (read_kmer == kmer) return res; } } return lookup_result(); @@ -119,10 +83,11 @@ struct buckets // const uint64_t m) const // { /* check minimizer first */ + auto p = strings_endpoints.decode(minimizer_offset); uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); + util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); if (read_mmer != mini_info.minimizer) return lookup_result(false); - return lookup_at_offset_no_check_minimizer(minimizer_offset, kmer, mini_info, k); + return lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); } lookup_result lookup_canonical(const uint64_t begin, const uint64_t end, // @@ -133,8 +98,9 @@ struct buckets // { /* check minimizer first */ uint64_t minimizer_offset = offsets2.access(begin); + auto p = strings_endpoints.decode(minimizer_offset); uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); + util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); uint64_t minimizer_rc = 0; { auto tmp = kmer_t(mini_info.minimizer); @@ -145,9 +111,7 @@ struct buckets // return lookup_result(false); } - auto res = lookup_canonical_at_offset_no_check_minimizer( // - minimizer_offset, kmer, kmer_rc, mini_info, k, m // - ); + auto res = lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; @@ -155,9 +119,8 @@ struct buckets // for (uint64_t i = begin + 1; i < end; ++i) { minimizer_offset = offsets2.access(i); - res = lookup_canonical_at_offset_no_check_minimizer( // - minimizer_offset, kmer, kmer_rc, mini_info, k, m // - ); + p = strings_endpoints.decode(minimizer_offset); + res = lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; @@ -166,7 +129,7 @@ struct buckets // return lookup_result(); } - lookup_result lookup_canonical_at_offset_no_check_minimizer(const uint64_t minimizer_offset, // + lookup_result lookup_canonical_at_offset_no_check_minimizer(endpoints::decoded_offset p, // const kmer_t kmer, const kmer_t kmer_rc, // const minimizer_info mini_info, // @@ -174,13 +137,13 @@ struct buckets // const uint64_t m) const // { uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_offset(minimizer_offset, pos_in_kmer, kmer, kmer_rc, k); + auto res = check_offset(p, pos_in_kmer, kmer, kmer_rc, k); if (res.kmer_id != constants::invalid_uint64) { assert(is_valid(res)); return res; } pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_offset(minimizer_offset, pos_in_kmer, kmer, kmer_rc, k); + return check_offset(p, pos_in_kmer, kmer, kmer_rc, k); } lookup_result lookup_canonical_at_offset(const uint64_t minimizer_offset, // @@ -191,8 +154,9 @@ struct buckets // const uint64_t m) const // { /* check minimizer first */ + auto p = strings_endpoints.decode(minimizer_offset); uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * minimizer_offset)); + util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); uint64_t minimizer_rc = 0; { auto tmp = kmer_t(mini_info.minimizer); @@ -202,28 +166,23 @@ struct buckets // if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { return lookup_result(false); } - return lookup_canonical_at_offset_no_check_minimizer(minimizer_offset, kmer, kmer_rc, - mini_info, k, m); + return lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); } - lookup_result check_offset(const uint64_t minimizer_offset, // + lookup_result check_offset(endpoints::decoded_offset p, // const uint64_t pos_in_kmer, // const kmer_t kmer, const kmer_t kmer_rc, // const uint64_t k) const // { - if (minimizer_offset >= pos_in_kmer) { - uint64_t kmer_offset = minimizer_offset - pos_in_kmer; - auto res = offset_to_id(kmer_offset, k); + auto res = strings_endpoints.offset_to_id(p, pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + uint64_t kmer_offset = res.kmer_offset(k); if (kmer_offset + k - 1 < res.contig_end(k)) { auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); - if (read_kmer == kmer) { - assert(is_valid(res)); - return res; - } + if (read_kmer == kmer) return res; if (read_kmer == kmer_rc) { res.kmer_orientation = constants::backward_orientation; - assert(is_valid(res)); return res; } } @@ -231,34 +190,8 @@ struct buckets // return lookup_result(); } - uint64_t id_to_offset(const uint64_t kmer_id, const uint64_t k) const // - { - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = strings_endpoints.size() - 1; - assert(strings_endpoints.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = strings_endpoints.access(mid); - assert(val >= mid * (k - 1)); - if (kmer_id <= val - mid * (k - 1)) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < strings_endpoints.size()); - for (auto it = strings_endpoints.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - uint64_t val = it.value() - lo * (k - 1); - if (val > kmer_id) break; - } - assert(lo > 0); - return kmer_id + (lo - 1) * (k - 1); - } - void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { - uint64_t offset = id_to_offset(kmer_id, k); + auto [_, offset] = strings_endpoints.id_to_offset(kmer_id, k); auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); util::uint_kmer_to_string(read_kmer, string_kmer, k); } @@ -275,10 +208,10 @@ struct buckets // , m_k(k) , m_it(ptr->strings, m_k) // { - m_offset = m_buckets->id_to_offset(m_begin_kmer_id, k); - auto [pos, piece_end] = m_buckets->strings_endpoints.next_geq(m_offset); - if (piece_end == m_offset) pos += 1; + auto [pos, val] = m_buckets->strings_endpoints.id_to_offset(m_begin_kmer_id, k); + m_offset = val; m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); + assert(m_strings_endpoints_it.value() > m_offset); next_piece(); m_ret.second.resize(m_k, 0); } @@ -313,7 +246,7 @@ struct buckets // uint64_t m_offset; uint64_t m_next_offset; kmer_iterator m_it; - bits::endpoints_sequence<>::iterator m_strings_endpoints_it; + typename Endpoints::iterator m_strings_endpoints_it; bool m_clear; void next_piece() { @@ -345,7 +278,8 @@ struct buckets // visit_impl(visitor, *this); } - bits::endpoints_sequence<> strings_endpoints; + Endpoints strings_endpoints; + // bits::endpoints_sequence<> strings_endpoints; // bits::compact_vector strings_endpoints; std::vector start_lists_of_size; diff --git a/include/builder/build_sparse_and_skew_index.hpp b/include/builder/build_sparse_and_skew_index.cpp similarity index 91% rename from include/builder/build_sparse_and_skew_index.hpp rename to include/builder/build_sparse_and_skew_index.cpp index bb5930d..fa81060 100644 --- a/include/builder/build_sparse_and_skew_index.hpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -1,33 +1,24 @@ -#pragma once - +#include "dictionary_builder.hpp" #include "include/buckets_statistics.hpp" namespace sshash { -template -buckets_statistics build_sparse_and_skew_index(parse_data& data, // - buckets& m_buckets, // - skew_index& m_skew_index, // - build_configuration const& build_config) // +template +buckets_statistics // +dictionary_builder::build_sparse_and_skew_index( + buckets& m_buckets, skew_index& m_skew_index) // { - const uint64_t num_kmers = data.num_kmers; - const uint64_t num_minimizer_positions = data.minimizers.num_minimizer_positions(); - const uint64_t num_minimizers = data.minimizers.num_minimizers(); + const uint64_t num_minimizer_positions = minimizers.num_minimizer_positions(); + const uint64_t num_minimizers = minimizers.num_minimizers(); const uint64_t min_size = 1ULL << constants::min_l; + const uint64_t num_bits_per_offset = strings_endpoints_builder.num_bits_per_offset(); - uint64_t num_bits_per_offset = 0; - if (build_config.fast) { - // TODO - } else { - num_bits_per_offset = - std::ceil(std::log2(data.strings_builder.num_bits() / kmer_t::bits_per_char)); - } std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; bits::compact_vector::builder offsets_builder; offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); - mm::file_source input(data.minimizers.get_minimizers_filename(), + mm::file_source input(minimizers.get_minimizers_filename(), mm::advice::sequential); essentials::timer_type timer; @@ -88,15 +79,8 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; - m_buckets.strings_endpoints.encode(data.strings_endpoints.begin(), // - data.strings_endpoints.size(), // - data.strings_endpoints.back()); // - // m_buckets.strings_endpoints.build(data.strings_endpoints.begin(), // - // data.strings_endpoints.size(), // - // num_bits_per_offset); // - std::vector().swap(data.strings_endpoints); - - data.strings_builder.build(m_buckets.strings); + strings_endpoints_builder.build(m_buckets.strings_endpoints); + strings_builder.build(m_buckets.strings); /* compute offsets2 and offsets3 */ assert(buckets_stats.num_buckets() == num_minimizers); @@ -383,9 +367,7 @@ buckets_statistics build_sparse_and_skew_index(parse_data& data, } assert(mt.pos_in_seq >= mt.pos_in_kmer); - if (build_config.fast) { // decode offset to obtain an absolute offset - // TODO - } + mt.pos_in_seq = m_buckets.strings_endpoints.decode(mt.pos_in_seq).absolute_offset; const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; kmer_iterator it( diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp new file mode 100644 index 0000000..b3efdb9 --- /dev/null +++ b/include/builder/dictionary_builder.hpp @@ -0,0 +1,192 @@ +#pragma once + +#include "include/dictionary.hpp" +#include "essentials.hpp" +#include "include/builder/util.hpp" +#include "include/buckets_statistics.hpp" + +#include // for std::accumulate + +namespace sshash { + +template +struct dictionary_builder // +{ + dictionary_builder(build_configuration const& build_config) + : build_config(build_config), num_kmers(0), minimizers(build_config) {} + + void build(dictionary& d, std::string const& filename) // + { + d.m_k = build_config.k; + d.m_m = build_config.m; + d.m_canonical = build_config.canonical; + d.m_hasher.seed(build_config.seed); + + std::vector timings; + timings.reserve(6); + essentials::timer_type timer; + + /* + step 1: parse the input file, encode sequences (1.1), and compute minimizer tuples (1.2) + */ + timer.start(); + parse_file(filename); + d.m_num_kmers = num_kmers; + assert(strings_endpoints_builder.size() >= 2); + d.m_num_strings = strings_endpoints_builder.size() - 1; + if (build_config.weighted) { + essentials::timer_type timer; + timer.start(); + weights_builder.build(d.m_weights); + timer.stop(); + print_time(timer.elapsed(), num_kmers, "step 1.3: 'build weights'"); + if (build_config.verbose) { + double entropy_weights = weights_builder.print_info(num_kmers); + double avg_bits_per_weight = + static_cast(d.m_weights.num_bits()) / num_kmers; + std::cout << "weights: " << avg_bits_per_weight << " [bits/kmer]" << std::endl; + std::cout << " (" << entropy_weights / avg_bits_per_weight + << "x smaller than the empirical entropy)" << std::endl; + } + } + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, "step 1: 'parse file'"); + timer.reset(); + /******/ + + /* step 2: merge minimizer tuples and build MPHF ***/ + { + timer.start(); + minimizers.merge(); + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, "step 2.1: 'merging minimizers tuples'"); + + std::cout << "num_minimizers = " << minimizers.num_minimizers() << std::endl; + std::cout << "num_minimizer_positions = " << minimizers.num_minimizer_positions() + << std::endl; + std::cout << "num_super_kmers = " << minimizers.num_super_kmers() << std::endl; + + timer.reset(); + + timer.start(); + const uint64_t num_minimizers = minimizers.num_minimizers(); + mm::file_source input(minimizers.get_minimizers_filename(), + mm::advice::sequential); + minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); + d.m_minimizers.build(iterator, num_minimizers, build_config); + input.close(); + assert(d.m_minimizers.size() == num_minimizers); + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, "step 2.2: 'build minimizers mphf'"); + + timer.reset(); + } + + { + if (build_config.verbose) std::cout << "re-sorting minimizer tuples..." << std::endl; + + timer.start(); + + std::string filename = minimizers.get_minimizers_filename(); + std::ifstream input(filename, std::ifstream::binary); + + auto const& f = d.m_minimizers; + const uint64_t num_threads = build_config.num_threads; + const uint64_t num_files_to_merge = minimizers.num_files_to_merge(); + + minimizers.init(); + + const uint64_t num_super_kmers = minimizers.num_super_kmers(); + const uint64_t buffer_size = num_files_to_merge == 1 + ? num_super_kmers + : ((build_config.ram_limit_in_GiB * essentials::GiB) / + (2 * sizeof(minimizer_tuple))); + const uint64_t num_blocks = (num_super_kmers + buffer_size - 1) / buffer_size; + assert(num_super_kmers > (num_blocks - 1) * buffer_size); + + std::vector threads; + threads.reserve(num_threads); + + std::vector buffer; + for (uint64_t i = 0; i != num_blocks; ++i) { + const uint64_t n = (i == num_blocks - 1) + ? num_super_kmers - (num_blocks - 1) * buffer_size + : buffer_size; + buffer.resize(n); + input.read(reinterpret_cast(buffer.data()), + buffer.size() * sizeof(minimizer_tuple)); + const uint64_t chunk_size = (n + num_threads - 1) / num_threads; + for (uint64_t t = 0; t * chunk_size < n; ++t) { + uint64_t begin = t * chunk_size; + uint64_t end = std::min(n, begin + chunk_size); + threads.emplace_back([begin, end, &buffer, &f]() { + for (uint64_t i = begin; i < end; ++i) { + buffer[i].minimizer = f.lookup(buffer[i].minimizer); + } + }); + } + for (auto& t : threads) { + if (t.joinable()) t.join(); + } + threads.clear(); + minimizers.sort_and_flush(buffer); + } + assert(buffer.empty()); + + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, + "step 2.3: 'replacing minimizer values with MPHF hashes'"); + timer.reset(); + + timer.start(); + minimizers.merge(); + input.close(); + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, "step 2.4: 'merging minimizers tuples '"); + timer.reset(); + } + /******/ + + /* step 3: build sparse and skew index ***/ + timer.start(); + auto buckets_stats = build_sparse_and_skew_index(d.m_buckets, d.m_skew_index); + assert(strings_endpoints_builder.size() == 0); + timer.stop(); + timings.push_back(timer.elapsed()); + print_time(timings.back(), num_kmers, "step 3: 'build sparse and skew index'"); + timer.reset(); + /******/ + + assert(timings.size() == 6); + double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); + print_time(total_time, num_kmers, "total_time"); + + d.print_space_breakdown(); + + if (build_config.verbose) buckets_stats.print_less(); + + minimizers.remove_tmp_file(); + } + + build_configuration build_config; + uint64_t num_kmers; + minimizers_tuples minimizers; + typename Endpoints::builder strings_endpoints_builder; + bits::bit_vector::builder strings_builder; + weights::builder weights_builder; + +private: + void parse_file(std::string const& filename); + + void parse_file(std::istream& is, const input_file_type fmt); + + buckets_statistics build_sparse_and_skew_index(buckets& buckets, + skew_index& skew_index); +}; + +} // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.hpp b/include/builder/parse_file.cpp similarity index 74% rename from include/builder/parse_file.hpp rename to include/builder/parse_file.cpp index bb0a646..cd61ad3 100644 --- a/include/builder/parse_file.hpp +++ b/include/builder/parse_file.cpp @@ -1,25 +1,13 @@ -#pragma once - +#include "dictionary_builder.hpp" #include "util.hpp" #include "external/gz/zip_stream.hpp" #include "include/minimizer_iterator.hpp" namespace sshash { -template -struct parse_data { - parse_data(build_configuration const& build_config) : num_kmers(0), minimizers(build_config) {} - - uint64_t num_kmers; - minimizers_tuples minimizers; - std::vector strings_endpoints; - bits::bit_vector::builder strings_builder; - weights::builder weights_builder; -}; - -template -void parse_file(std::istream& is, parse_data& data, - build_configuration const& build_config) // +template +void dictionary_builder::parse_file(std::istream& is, + const input_file_type fmt) // { essentials::timer_type timer; timer.start(); @@ -36,24 +24,22 @@ void parse_file(std::istream& is, parse_data& data, " bits"); } - /* fit into the wanted number of bits */ - assert(max_num_kmers_in_super_kmer < (1ULL << (sizeof(num_kmers_in_super_kmer_uint_type) * 8))); - { const uint64_t num_bits_for_strings = 8 * 8 * essentials::GB; // reserve 8 GB of memory const uint64_t num_sequences = 100'000'000; - data.strings_builder.reserve(num_bits_for_strings); - data.strings_endpoints.reserve(num_sequences); + strings_builder.reserve(num_bits_for_strings); + strings_endpoints_builder.reserve(num_sequences); } std::string sequence; uint64_t num_bases = 0; + uint64_t max_len = 0; hasher_type hasher(build_config.seed); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); uint64_t seq_len = 0; - data.weights_builder.init(); + weights_builder.init(); /* intervals of weights */ uint64_t weight_value = constants::invalid_uint64; @@ -61,10 +47,10 @@ void parse_file(std::istream& is, parse_data& data, while (true) // { - if constexpr (fmt == input_file_type::cf_seg) { - std::getline(is, sequence, '\t'); // skip until and consume '\t' + if (fmt == input_file_type::cf_seg) { + std::getline(is, sequence, '\t'); // skip until '\t' and consume it } else { - static_assert(fmt == input_file_type::fasta); + assert(fmt == input_file_type::fasta); if (build_config.weighted) { // parse header std::getline(is, sequence); // header sequence if (sequence.empty()) break; @@ -104,12 +90,12 @@ void parse_file(std::istream& is, parse_data& data, for (uint64_t j = 0; j != seq_len - k + 1; ++j) { uint64_t weight = std::strtoull(sequence.data() + i, nullptr, 10); i = sequence.find_first_of(' ', i) + 1; - data.weights_builder.eat(weight); + weights_builder.eat(weight); if (weight == weight_value) { weight_length += 1; } else { if (weight_value != constants::invalid_uint64) { - data.weights_builder.push_weight_interval(weight_value, weight_length); + weights_builder.push_weight_interval(weight_value, weight_length); } weight_value = weight; weight_length = 1; @@ -127,9 +113,10 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t n = sequence.length(); assert(n >= k); - assert(data.strings_builder.num_bits() % kmer_t::bits_per_char == 0); - data.strings_endpoints.push_back(data.strings_builder.num_bits() / kmer_t::bits_per_char); - data.num_kmers += n - k + 1; + max_len = n > max_len ? n : max_len; + assert(strings_builder.num_bits() % kmer_t::bits_per_char == 0); + strings_endpoints_builder.push_back(strings_builder.num_bits() / kmer_t::bits_per_char); + num_kmers += n - k + 1; num_bases += n; if (build_config.weighted and seq_len != n) { @@ -138,9 +125,9 @@ void parse_file(std::istream& is, parse_data& data, throw std::runtime_error("file is malformed"); } - if (data.strings_endpoints.size() % 100'000 == 0) { - std::cout << "read " << data.strings_endpoints.size() << " sequences, " << num_bases - << " bases, " << data.num_kmers << " kmers" << std::endl; + if (strings_endpoints_builder.size() % 100'000 == 0) { + std::cout << "read " << strings_endpoints_builder.size() << " sequences, " << num_bases + << " bases, " << num_kmers << " kmers" << std::endl; } uint64_t i = 0; @@ -151,37 +138,35 @@ void parse_file(std::istream& is, parse_data& data, for (; i + 32 <= n; i += 32) { __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(&sequence[i])); uint64_t word = pack2bits_shift1(v); - data.strings_builder.append_bits(word, 64); + strings_builder.append_bits(word, 64); } #endif } for (; i < n; ++i) { - data.strings_builder.append_bits(kmer_t::char_to_uint(sequence[i]), - kmer_t::bits_per_char); + strings_builder.append_bits(kmer_t::char_to_uint(sequence[i]), kmer_t::bits_per_char); } } - data.strings_endpoints.push_back(data.strings_builder.num_bits() / kmer_t::bits_per_char); - assert(data.strings_endpoints.front() == 0); - assert(data.strings_endpoints.size() >= 2); - const uint64_t num_sequences = data.strings_endpoints.size() - 1; + strings_endpoints_builder.push_back(strings_builder.num_bits() / kmer_t::bits_per_char); + assert(strings_endpoints_builder.front() == 0); + assert(strings_endpoints_builder.size() >= 2); + const uint64_t num_sequences = strings_endpoints_builder.size() - 1; /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ static_assert(kmer_t::uint_kmer_bits % 64 == 0); for (int dummy_bits = kmer_t::uint_kmer_bits; dummy_bits; dummy_bits -= 64) { - data.strings_builder.append_bits(0, 64); + strings_builder.append_bits(0, 64); } timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.1: 'encoding input'"); + print_time(timer.elapsed(), num_kmers, "step 1.1: 'encoding input'"); - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " - << data.num_kmers << " kmers" << std::endl; - std::cout << "num_kmers " << data.num_kmers << std::endl; + std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " << num_kmers + << " kmers" << std::endl; + std::cout << "num_kmers " << num_kmers << std::endl; std::cout << "cost: 2.0 + " - << static_cast(kmer_t::bits_per_char * num_sequences * (k - 1)) / - data.num_kmers + << static_cast(kmer_t::bits_per_char * num_sequences * (k - 1)) / num_kmers << " [bits/kmer]" << std::endl; /* @@ -207,6 +192,22 @@ void parse_file(std::istream& is, parse_data& data, std::vector threads; threads.reserve(num_threads); + num_bits nb; + nb.per_absolute_offset = std::ceil(std::log2(strings_endpoints_builder.back())); + nb.per_relative_offset = max_len == k ? 1 : std::ceil(std::log2(max_len - k + 1)); + nb.per_string_id = std::ceil(std::log2(num_sequences)); + + std::cout << "max_len " << max_len << std::endl; + std::cout << "num. bits per_absolute_offset " << nb.per_absolute_offset << std::endl; + std::cout << "num. bits per_relative_offset " << nb.per_relative_offset << std::endl; + std::cout << "num. bits per_string_id " << nb.per_string_id << std::endl; + + if (build_config.fast and nb.per_string_id + nb.per_relative_offset > 64) { + throw std::runtime_error("minimier offset does not fit within 64 bits"); + } + + strings_endpoints_builder.set_num_bits(nb); + for (uint64_t t = 0; t * num_sequences_per_thread < num_sequences; ++t) // { threads.emplace_back([&, t] { @@ -228,7 +229,7 @@ void parse_file(std::istream& is, parse_data& data, return; } if (buffer.size() == buffer_size) { - data.minimizers.sort_and_flush(buffer); + minimizers.sort_and_flush(buffer); buffer.clear(); } buffer.emplace_back(mini_info, num_kmers_in_super_kmer); @@ -238,14 +239,14 @@ void parse_file(std::istream& is, parse_data& data, const uint64_t index_end = std::min(index_begin + num_sequences_per_thread, num_sequences); - kmer_iterator it(data.strings_builder, k); + kmer_iterator it(strings_builder, k); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); for (uint64_t i = index_begin; i < index_end; ++i) // { - const uint64_t begin = data.strings_endpoints[i]; - const uint64_t end = data.strings_endpoints[i + 1]; + const uint64_t begin = strings_endpoints_builder[i]; + const uint64_t end = strings_endpoints_builder[i + 1]; const uint64_t sequence_len = end - begin; assert(sequence_len >= k); @@ -275,9 +276,8 @@ void parse_file(std::istream& is, parse_data& data, } } - if (build_config.fast) { // encode offset - // TODO - } + mini_info.pos_in_seq = + strings_endpoints_builder.encode(mini_info.pos_in_seq, begin, i); if (prev_mini_info.minimizer == constants::invalid_uint64) { prev_mini_info = mini_info; @@ -299,7 +299,7 @@ void parse_file(std::istream& is, parse_data& data, } /* flush leftover */ - if (!buffer.empty()) data.minimizers.sort_and_flush(buffer); + if (!buffer.empty()) minimizers.sort_and_flush(buffer); }); } @@ -308,17 +308,16 @@ void parse_file(std::istream& is, parse_data& data, } timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.2: 'computing minimizers tuples'"); + print_time(timer.elapsed(), num_kmers, "step 1.2: 'computing minimizers tuples'"); if (build_config.weighted) { - data.weights_builder.push_weight_interval(weight_value, weight_length); - data.weights_builder.finalize(data.num_kmers); + weights_builder.push_weight_interval(weight_value, weight_length); + weights_builder.finalize(num_kmers); } } -template -void parse_file(std::string const& filename, parse_data& data, - build_configuration const& build_config) // +template +void dictionary_builder::parse_file(std::string const& filename) // { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); @@ -326,15 +325,15 @@ void parse_file(std::string const& filename, parse_data& data, if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - parse_file(zis, data, build_config); + parse_file(zis, input_file_type::cf_seg); } else { - parse_file(zis, data, build_config); + parse_file(zis, input_file_type::fasta); } } else { if (util::ends_with(filename, ".cf_seg")) { - parse_file(is, data, build_config); + parse_file(is, input_file_type::cf_seg); } else { - parse_file(is, data, build_config); + parse_file(is, input_file_type::fasta); } } is.close(); diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 1a1b4cb..911cffa 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -8,8 +8,14 @@ namespace sshash { -template -struct dictionary { +template +struct dictionary // +{ + using kmer_type = kmer_t; + + template + friend struct dictionary_builder; + dictionary() : m_vnum(constants::current_version_number::x, // constants::current_version_number::y, // @@ -68,7 +74,6 @@ struct dictionary { bool is_member(char const* string_kmer, bool check_reverse_complement = true) const; bool is_member_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; - /* Streaming query. */ template friend struct streaming_query; @@ -86,7 +91,7 @@ struct dictionary { std::pair next() { return m_it.next(); } private: - typename buckets::iterator m_it; + typename buckets::iterator m_it; }; iterator begin() const { return iterator(this, 0, num_kmers()); } @@ -113,7 +118,7 @@ struct dictionary { } bits::bit_vector const& get_strings() const { return m_buckets.strings; } - buckets const& get_buckets() const { return m_buckets; } + buckets const& get_buckets() const { return m_buckets; } minimizers const& get_minimizers() const { return m_minimizers; } uint64_t num_bits() const; @@ -156,7 +161,7 @@ struct dictionary { bool m_canonical; hasher_type m_hasher; minimizers m_minimizers; - buckets m_buckets; + buckets m_buckets; skew_index m_skew_index; weights m_weights; diff --git a/include/endpoints.hpp b/include/endpoints.hpp new file mode 100644 index 0000000..27e61ba --- /dev/null +++ b/include/endpoints.hpp @@ -0,0 +1,320 @@ +#pragma once + +#include "external/pthash/external/bits/include/compact_vector.hpp" +#include "external/pthash/external/bits/include/endpoints_sequence.hpp" + +namespace sshash { + +struct num_bits { + num_bits() : per_absolute_offset(0), per_relative_offset(0), per_string_id(0) {} + uint64_t per_absolute_offset; + uint64_t per_relative_offset; + uint64_t per_string_id; +}; + +struct endpoints // +{ + struct builder { + builder() {} + + void reserve(uint64_t n) { m_v.reserve(n); } + void push_back(uint64_t val) { m_v.push_back(val); } + uint64_t operator[](uint64_t i) { + assert(i < m_v.size()); + return m_v[i]; + } + uint64_t front() const { return m_v.front(); } + uint64_t back() const { return m_v.back(); } + uint64_t size() const { return m_v.size(); } + uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } + + void set_num_bits(num_bits nb) { m_num_bits_per_offset = nb.per_absolute_offset; } + + uint64_t encode(uint64_t offset, uint64_t, uint64_t) { return offset; } + + void build(endpoints& e) { + e.m_seq.encode(m_v.begin(), m_v.size(), m_v.back()); + std::vector().swap(m_v); + } + + private: + uint64_t m_num_bits_per_offset; + std::vector m_v; + }; + + struct decoded_offset { + uint64_t absolute_offset; + }; + + decoded_offset decode(const uint64_t encoded_offset) const { return {encoded_offset}; } + + lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // + { + if (p.absolute_offset < pos_in_kmer) return lookup_result(); + + uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; + auto q = m_seq.locate(kmer_offset); + uint64_t contig_id = q.first.pos; + uint64_t contig_begin = q.first.val; + uint64_t contig_end = q.second.val; + + /* The following facts hold. */ + assert(kmer_offset >= contig_id * (k - 1)); + assert(contig_begin <= kmer_offset); + assert(kmer_offset < contig_end); + /****************************/ + + uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); + uint64_t relative_kmer_id = kmer_offset - contig_begin; + uint64_t contig_length = contig_end - contig_begin; + assert(contig_length >= k); + uint64_t contig_size = contig_length - k + 1; + + lookup_result res; + res.kmer_id = absolute_kmer_id; + res.kmer_id_in_contig = relative_kmer_id; + res.contig_id = contig_id; + res.contig_size = contig_size; + assert(contig_begin == res.contig_begin(k)); + assert(contig_end == res.contig_end(k)); + assert(kmer_offset == res.kmer_offset(k)); + + return res; + } + + std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // + { + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = m_seq.size() - 1; + assert(m_seq.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = m_seq.access(mid); + assert(val >= mid * (k - 1)); + if (kmer_id <= val - mid * (k - 1)) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < m_seq.size()); + for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { + uint64_t val = it.value() - lo * (k - 1); + if (val > kmer_id) break; + } + assert(lo > 0); + return {lo, kmer_id + (lo - 1) * (k - 1)}; + } + + uint64_t access(uint64_t i) const { + assert(i < size()); + return m_seq.access(i); + } + + uint64_t size() const { return m_seq.size(); } + + uint64_t num_bytes() const { return m_seq.num_bytes(); } + + struct iterator { + iterator() {} + iterator(endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + + uint64_t value() const { return m_it.value(); } + void next() { m_it.next(); } + + private: + bits::endpoints_sequence<>::iterator m_it; + }; + + iterator get_iterator_at(uint64_t pos) const { + assert(pos < size()); + return {this, pos}; + } + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + +private: + bits::endpoints_sequence<> m_seq; + + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.m_seq); + } +}; + +// struct _endpoints // +// { +// struct builder { +// builder() {} + +// void reserve(uint64_t n) { m_v.reserve(n); } +// void push_back(uint64_t val) { m_v.push_back(val); } +// uint64_t operator[](uint64_t i) { +// assert(i < m_v.size()); +// return m_v[i]; +// } +// uint64_t front() const { return m_v.front(); } +// uint64_t back() const { return m_v.back(); } +// uint64_t size() const { return m_v.size(); } +// uint64_t num_bits_per_offset() const { +// return m_nb.per_string_id + m_nb.per_relative_offset; +// } + +// void set_num_bits(num_bits nb) { m_nb = nb; } + +// uint64_t encode(uint64_t offset, uint64_t begin, uint64_t string_id) { +// /* encode offset as | string-id | relative offset | */ +// assert(offset >= begin); +// uint64_t relative_offset = offset - begin; +// return (string_id << m_nb.per_relative_offset) + relative_offset; +// } + +// void build(_endpoints& e) { +// e.m_seq.build(m_v.begin(), m_v.size(), m_nb.per_absolute_offset); +// m_num_bits_per_relative_offset = m_nb.per_relative_offset; +// std::vector().swap(m_v); +// } + +// private: +// num_bits m_nb; +// std::vector m_v; +// }; + +// struct decoded_offset { +// uint64_t absolute_offset; +// uint64_t relative_offset; +// uint64_t string_id; +// uint64_t string_begin; +// uint64_t string_end; +// }; + +// decoded_offset decode(const uint64_t encoded_offset) const { +// uint64_t relative_offset = encoded_offset & ((1ULL << m_num_bits_per_relative_offset) - +// 1); uint64_t string_id = encoded_offset >> m_num_bits_per_relative_offset; +// assert(string_id + 1 < m_seq.size()); +// uint64_t begin = m_seq[string_id]; +// uint64_t end = m_seq[string_id + 1]; +// return {begin + relative_offset, relative_offset, string_id, begin, end}; +// } + +// lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // +// { +// if (p.absolute_offset < pos_in_kmer) return lookup_result(); + +// uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; +// uint64_t contig_id = p.string_id; +// uint64_t contig_begin = p.string_begin; +// uint64_t contig_end = q.string_end; + +// /* The following facts hold. */ +// assert(kmer_offset >= contig_id * (k - 1)); +// assert(contig_begin <= kmer_offset); +// assert(kmer_offset < contig_end); +// /****************************/ + +// uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); +// uint64_t relative_kmer_id = kmer_offset - contig_begin; +// uint64_t contig_length = contig_end - contig_begin; +// assert(contig_length >= k); +// uint64_t contig_size = contig_length - k + 1; + +// lookup_result res; +// res.kmer_id = absolute_kmer_id; +// res.kmer_id_in_contig = relative_kmer_id; +// res.contig_id = contig_id; +// res.contig_size = contig_size; +// assert(contig_begin == res.contig_begin(k)); +// assert(contig_end == res.contig_end(k)); +// assert(kmer_offset == res.kmer_offset(k)); + +// return res; +// } + +// std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // +// { +// constexpr uint64_t linear_scan_threshold = 32; +// uint64_t lo = 0; +// uint64_t hi = m_seq.size() - 1; +// assert(m_seq.access(0) == 0); +// while (hi - lo > linear_scan_threshold) { +// uint64_t mid = lo + (hi - lo) / 2; +// uint64_t val = m_seq.access(mid); +// assert(val >= mid * (k - 1)); +// if (kmer_id <= val - mid * (k - 1)) { +// hi = mid; +// } else { +// lo = mid + 1; +// } +// } +// assert(lo < hi); +// assert(hi < m_seq.size()); +// for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { +// uint64_t val = it.value() - lo * (k - 1); +// if (val > kmer_id) break; +// } +// assert(lo > 0); +// return {lo, kmer_id + (lo - 1) * (k - 1)}; +// } + +// uint64_t access(uint64_t i) const { +// assert(i < size()); +// return m_seq.access(i); +// } + +// // std::pair next_geq(uint64_t lower_bound) const { +// // auto [pos, val] = m_seq.next_geq(lower_bound); +// // return {pos, val}; +// // } + +// uint64_t size() const { return m_seq.size(); } + +// uint64_t num_bytes() const { return m_seq.num_bytes(); } + +// struct iterator { +// iterator() {} +// iterator(endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + +// uint64_t value() const { return m_it.value(); } +// void next() { m_it.next(); } + +// private: +// bits::endpoints_sequence<>::iterator m_it; +// }; + +// iterator get_iterator_at(uint64_t pos) const { +// assert(pos < size()); +// return {this, pos}; +// } + +// template +// void visit(Visitor& visitor) const { +// visit_impl(visitor, *this); +// } + +// template +// void visit(Visitor& visitor) { +// visit_impl(visitor, *this); +// } + +// private: +// uint64_t m_num_bits_per_relative_offset; +// bits::compact_vector m_seq; + +// template +// static void visit_impl(Visitor& visitor, T&& t) { +// visitor.visit(t.m_num_bits_per_relative_offset); +// visitor.visit(t.m_seq); +// } +// }; + +} // namespace sshash \ No newline at end of file diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index c8b13d4..d8c8e52 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -6,9 +6,12 @@ namespace sshash { -template -struct streaming_query { - streaming_query(dictionary const* dict) +template +struct streaming_query // +{ + using kmer_t = typename Dict::kmer_type; + + streaming_query(Dict const* dict) : m_dict(dict) @@ -112,7 +115,7 @@ struct streaming_query { uint64_t num_invalid_lookups() const { return m_num_invalid; } private: - dictionary const* m_dict; + Dict const* m_dict; /* result */ lookup_result m_res; diff --git a/include/util.hpp b/include/util.hpp index 74aedd5..d2ef994 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -37,12 +37,12 @@ struct lookup_result { , contig_id(constants::invalid_uint64) , contig_size(constants::invalid_uint64) - /* - The kmer's minimizer occurs for `list_size` times. - If `list_size` == -1, then the minimizer is part of - the skew index. - */ - , list_size(constants::invalid_uint64) + // /* + // The kmer's minimizer occurs for `list_size` times. + // If `list_size` == -1, then the minimizer is part of + // the skew index. + // */ + // , list_size(constants::invalid_uint64) , minimizer_found(mf) {} @@ -51,7 +51,7 @@ struct lookup_result { int64_t kmer_orientation; uint64_t contig_id; uint64_t contig_size; - uint64_t list_size; + // uint64_t list_size; bool minimizer_found; diff --git a/src/build.cpp b/src/build.cpp index 77bd02a..08d5739 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -1,17 +1,13 @@ -#include "include/dictionary.hpp" -#include "essentials.hpp" -#include "include/builder/util.hpp" +#include "include/builder/dictionary_builder.hpp" -#include "include/builder/parse_file.hpp" -#include "include/builder/build_sparse_and_skew_index.hpp" - -#include // for std::accumulate +#include "include/builder/parse_file.cpp" +#include "include/builder/build_sparse_and_skew_index.cpp" namespace sshash { -template -void dictionary::build(std::string const& filename, - build_configuration const& build_config) { +template +void dictionary::build(std::string const& filename, + build_configuration const& build_config) { /* Validate the build configuration. */ if (build_config.k == 0) throw std::runtime_error("k must be > 0"); if (build_config.k > kmer_t::max_k) { @@ -25,158 +21,8 @@ void dictionary::build(std::string const& filename, } if (build_config.m > build_config.k) throw std::runtime_error("m must be <= k"); - m_k = build_config.k; - m_m = build_config.m; - m_canonical = build_config.canonical; - m_hasher.seed(build_config.seed); - - std::vector timings; - timings.reserve(6); - essentials::timer_type timer; - - /* step 1: parse the input file, encode sequences (1.1), and compute minimizer tuples (1.2) ***/ - timer.start(); - parse_data data(build_config); - parse_file(filename, data, build_config); - m_num_kmers = data.num_kmers; - assert(data.strings_endpoints.size() >= 2); - m_num_strings = data.strings_endpoints.size() - 1; - if (build_config.weighted) { - essentials::timer_type timer; - timer.start(); - data.weights_builder.build(m_weights); - timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.3: 'build weights'"); - if (build_config.verbose) { - double entropy_weights = data.weights_builder.print_info(data.num_kmers); - double avg_bits_per_weight = static_cast(m_weights.num_bits()) / data.num_kmers; - std::cout << "weights: " << avg_bits_per_weight << " [bits/kmer]" << std::endl; - std::cout << " (" << entropy_weights / avg_bits_per_weight - << "x smaller than the empirical entropy)" << std::endl; - } - } - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 1: 'parse file'"); - timer.reset(); - /******/ - - /* step 2: merge minimizer tuples and build MPHF ***/ - { - timer.start(); - data.minimizers.merge(); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.1: 'merging minimizers tuples'"); - - std::cout << "num_minimizers = " << data.minimizers.num_minimizers() << std::endl; - std::cout << "num_minimizer_positions = " << data.minimizers.num_minimizer_positions() - << std::endl; - std::cout << "num_super_kmers = " << data.minimizers.num_super_kmers() << std::endl; - - timer.reset(); - - timer.start(); - const uint64_t num_minimizers = data.minimizers.num_minimizers(); - mm::file_source input(data.minimizers.get_minimizers_filename(), - mm::advice::sequential); - minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); - m_minimizers.build(iterator, num_minimizers, build_config); - input.close(); - assert(m_minimizers.size() == num_minimizers); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.2: 'build minimizers mphf'"); - - timer.reset(); - } - - { - if (build_config.verbose) std::cout << "re-sorting minimizer tuples..." << std::endl; - - timer.start(); - - std::string filename = data.minimizers.get_minimizers_filename(); - std::ifstream input(filename, std::ifstream::binary); - - auto const& f = m_minimizers; - const uint64_t num_threads = build_config.num_threads; - const uint64_t num_files_to_merge = data.minimizers.num_files_to_merge(); - - data.minimizers.init(); - - const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); - const uint64_t buffer_size = num_files_to_merge == 1 - ? num_super_kmers - : ((build_config.ram_limit_in_GiB * essentials::GiB) / - (2 * sizeof(minimizer_tuple))); - const uint64_t num_blocks = (num_super_kmers + buffer_size - 1) / buffer_size; - assert(num_super_kmers > (num_blocks - 1) * buffer_size); - - std::vector threads; - threads.reserve(num_threads); - - std::vector buffer; - for (uint64_t i = 0; i != num_blocks; ++i) { - const uint64_t n = (i == num_blocks - 1) - ? num_super_kmers - (num_blocks - 1) * buffer_size - : buffer_size; - buffer.resize(n); - input.read(reinterpret_cast(buffer.data()), - buffer.size() * sizeof(minimizer_tuple)); - const uint64_t chunk_size = (n + num_threads - 1) / num_threads; - for (uint64_t t = 0; t * chunk_size < n; ++t) { - uint64_t begin = t * chunk_size; - uint64_t end = std::min(n, begin + chunk_size); - threads.emplace_back([begin, end, &buffer, &f]() { - for (uint64_t i = begin; i < end; ++i) { - buffer[i].minimizer = f.lookup(buffer[i].minimizer); - } - }); - } - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - threads.clear(); - data.minimizers.sort_and_flush(buffer); - } - assert(buffer.empty()); - - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, - "step 2.3: 'replacing minimizer values with MPHF hashes'"); - timer.reset(); - - timer.start(); - data.minimizers.merge(); - input.close(); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.4: 'merging minimizers tuples '"); - timer.reset(); - } - /******/ - - /* step 3: build sparse and skew index ***/ - timer.start(); - auto buckets_stats = build_sparse_and_skew_index(data, m_buckets, m_skew_index, build_config); - assert(data.strings_endpoints.size() == 0); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 3: 'build sparse and skew index'"); - timer.reset(); - /******/ - - assert(timings.size() == 6); - double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); - print_time(total_time, data.num_kmers, "total_time"); - - print_space_breakdown(); - - if (build_config.verbose) buckets_stats.print_less(); - - data.minimizers.remove_tmp_file(); + dictionary_builder builder(build_config); + builder.build(*this, filename); } } // namespace sshash diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 1fad6d5..240e55b 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -4,15 +4,15 @@ namespace sshash { -template -lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer) const { +template +lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer) const { auto mini_info = util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher); return lookup_uint_regular(uint_kmer, mini_info); } -template -lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, // - minimizer_info mini_info) const // +template +lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, // + minimizer_info mini_info) const // { assert(minimizer_info(mini_info.minimizer, mini_info.pos_in_kmer) == util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher)); @@ -63,8 +63,8 @@ lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, return res; } -template -lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer) const // +template +lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer) const // { kmer_t uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(m_k); @@ -83,9 +83,10 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer) const } } -template -lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t uint_kmer_rc, - minimizer_info mini_info) const // +template +lookup_result dictionary::lookup_uint_canonical( + kmer_t uint_kmer, kmer_t uint_kmer_rc, + minimizer_info mini_info) const // { assert(mini_info.minimizer == std::min(util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher).minimizer, @@ -134,9 +135,9 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer, kmer_t return res; } -template -lookup_result dictionary::lookup(char const* string_kmer, - bool check_reverse_complement) const { +template +lookup_result dictionary::lookup(char const* string_kmer, + bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); /* SIMD here does not help, as expected, because it is only used at the @@ -150,9 +151,9 @@ lookup_result dictionary::lookup(char const* string_kmer, // kmer_t uint_kmer(word); return lookup_uint(uint_kmer, check_reverse_complement); } -template -lookup_result dictionary::lookup_uint(kmer_t uint_kmer, - bool check_reverse_complement) const { +template +lookup_result dictionary::lookup_uint(kmer_t uint_kmer, + bool check_reverse_complement) const { if (m_canonical) return lookup_uint_canonical(uint_kmer); auto res = lookup_uint_regular(uint_kmer); assert(res.kmer_orientation == constants::forward_orientation); @@ -165,29 +166,31 @@ lookup_result dictionary::lookup_uint(kmer_t uint_kmer, return res; } -template -bool dictionary::is_member(char const* string_kmer, bool check_reverse_complement) const { +template +bool dictionary::is_member(char const* string_kmer, + bool check_reverse_complement) const { return lookup(string_kmer, check_reverse_complement) != constants::invalid_uint64; } -template -bool dictionary::is_member_uint(kmer_t uint_kmer, bool check_reverse_complement) const { +template +bool dictionary::is_member_uint(kmer_t uint_kmer, + bool check_reverse_complement) const { return lookup_uint(uint_kmer, check_reverse_complement) != constants::invalid_uint64; } -template -void dictionary::access(uint64_t kmer_id, char* string_kmer) const { +template +void dictionary::access(uint64_t kmer_id, char* string_kmer) const { assert(kmer_id < num_kmers()); m_buckets.access(kmer_id, string_kmer, m_k); } -template -uint64_t dictionary::weight(uint64_t kmer_id) const { +template +uint64_t dictionary::weight(uint64_t kmer_id) const { assert(kmer_id < num_kmers()); return m_weights.weight(kmer_id); } -template -uint64_t dictionary::contig_size(uint64_t contig_id) const { +template +uint64_t dictionary::contig_size(uint64_t contig_id) const { assert(contig_id < num_strings()); auto [begin, end] = m_buckets.contig_offsets(contig_id); uint64_t contig_length = end - begin; @@ -195,18 +198,18 @@ uint64_t dictionary::contig_size(uint64_t contig_id) const { return contig_length - m_k + 1; } -template -void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, - bool check_reverse_complement) const { +template +void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, + bool check_reverse_complement) const { for (size_t i = 0; i < kmer_t::alphabet_size; i++) { kmer_t new_kmer = suffix; new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); res.forward[i] = lookup_uint(new_kmer, check_reverse_complement); } } -template -void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, - bool check_reverse_complement) const { +template +void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, + bool check_reverse_complement) const { for (size_t i = 0; i < kmer_t::alphabet_size; i++) { kmer_t new_kmer = prefix; new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); @@ -214,69 +217,69 @@ void dictionary::backward_neighbours(kmer_t prefix, neighbourhood -neighbourhood dictionary::kmer_forward_neighbours( +template +neighbourhood dictionary::kmer_forward_neighbours( char const* string_kmer, bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_forward_neighbours(uint_kmer, check_reverse_complement); } -template -kmer_t dictionary::get_suffix(kmer_t kmer) const { +template +kmer_t dictionary::get_suffix(kmer_t kmer) const { kmer_t suffix = kmer; suffix.drop_char(); return suffix; } -template -neighbourhood dictionary::kmer_forward_neighbours( +template +neighbourhood dictionary::kmer_forward_neighbours( kmer_t uint_kmer, bool check_reverse_complement) const { neighbourhood res; forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::kmer_backward_neighbours( +template +neighbourhood dictionary::kmer_backward_neighbours( char const* string_kmer, bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_backward_neighbours(uint_kmer, check_reverse_complement); } -template -kmer_t dictionary::get_prefix(kmer_t kmer) const { +template +kmer_t dictionary::get_prefix(kmer_t kmer) const { kmer_t prefix = kmer; prefix.pad_char(); prefix.take_chars(m_k); return prefix; } -template -neighbourhood dictionary::kmer_backward_neighbours( +template +neighbourhood dictionary::kmer_backward_neighbours( kmer_t uint_kmer, bool check_reverse_complement) const { neighbourhood res; backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::kmer_neighbours(char const* string_kmer, - bool check_reverse_complement) const { +template +neighbourhood dictionary::kmer_neighbours( + char const* string_kmer, bool check_reverse_complement) const { kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_neighbours(uint_kmer, check_reverse_complement); } -template -neighbourhood dictionary::kmer_neighbours(kmer_t uint_kmer, - bool check_reverse_complement) const { +template +neighbourhood dictionary::kmer_neighbours( + kmer_t uint_kmer, bool check_reverse_complement) const { neighbourhood res; forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::contig_neighbours(uint64_t contig_id, - bool check_reverse_complement) const { +template +neighbourhood dictionary::contig_neighbours( + uint64_t contig_id, bool check_reverse_complement) const { assert(contig_id < num_strings()); neighbourhood res; kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); @@ -287,8 +290,8 @@ neighbourhood dictionary::contig_neighbours(uint64_t contig_id, return res; } -template -uint64_t dictionary::num_bits() const { +template +uint64_t dictionary::num_bits() const { return 8 * (sizeof(m_vnum) + sizeof(m_num_kmers) + sizeof(m_num_strings) + sizeof(m_hasher) + sizeof(m_k) + sizeof(m_m) + sizeof(m_canonical)) + m_minimizers.num_bits() + m_buckets.num_bits() + m_skew_index.num_bits() + diff --git a/src/info.cpp b/src/info.cpp index 54cb432..de91a10 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -2,8 +2,8 @@ namespace sshash { -template -void dictionary::print_space_breakdown() const { +template +void dictionary::print_space_breakdown() const { const uint64_t num_bytes = (num_bits() + 7) / 8; auto perc = [](uint64_t amount, uint64_t total) -> double { return (amount * 100.0) / total; }; @@ -45,8 +45,8 @@ void dictionary::print_space_breakdown() const { << std::endl; } -template -void dictionary::print_info() const { +template +void dictionary::print_info() const { std::cout << "=== dictionary info:\n"; std::cout << "version number = " << m_vnum.to_string() << '\n'; std::cout << "num_kmers = " << num_kmers() << '\n'; diff --git a/src/query.cpp b/src/query.cpp index 8f8a3b3..b32a696 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -6,9 +6,10 @@ namespace sshash { -template -streaming_query_report streaming_query_from_fasta_file_multiline(dictionary const* dict, - std::istream& is) { +template +streaming_query_report streaming_query_from_fasta_file_multiline(Dict const* dict, + std::istream& is) // +{ streaming_query_report report; buffered_lines_iterator it(is); std::string buffer; @@ -44,9 +45,9 @@ streaming_query_report streaming_query_from_fasta_file_multiline(dictionary -streaming_query_report streaming_query_from_fasta_file(dictionary const* dict, - std::istream& is) { +template +streaming_query_report streaming_query_from_fasta_file(Dict const* dict, std::istream& is) // +{ streaming_query_report report; std::string line; const uint64_t k = dict->k(); @@ -73,9 +74,8 @@ streaming_query_report streaming_query_from_fasta_file(dictionary const* return report; } -template -streaming_query_report streaming_query_from_fastq_file(dictionary const* dict, - std::istream& is) { +template +streaming_query_report streaming_query_from_fastq_file(Dict const* dict, std::istream& is) { streaming_query_report report; std::string line; const uint64_t k = dict->k(); @@ -106,16 +106,23 @@ streaming_query_report streaming_query_from_fastq_file(dictionary const* return report; } -template -streaming_query_report streaming_query_from_fasta_file(dictionary const* dict, - std::istream& is, bool multiline) { - if (multiline) return streaming_query_from_fasta_file_multiline(dict, is); - return streaming_query_from_fasta_file(dict, is); +template +streaming_query_report streaming_query_from_fasta_file(Dict const* dict, std::istream& is, + bool multiline) // +{ + if (multiline) return streaming_query_from_fasta_file_multiline(dict, is); + return streaming_query_from_fasta_file(dict, is); } -template -streaming_query_report dictionary::streaming_query_from_file(std::string const& filename, - bool multiline) const { +template +streaming_query_report // +dictionary::streaming_query_from_file(std::string const& filename, + bool multiline) const // +{ + using dictionary_type = dictionary; + using regular_query = streaming_query; + using canonical_query = streaming_query; + std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); streaming_query_report report; @@ -124,11 +131,11 @@ streaming_query_report dictionary::streaming_query_from_file(std::string zip_istream zis(is); if (canonical()) { - report = streaming_query_from_fasta_file>( - this, zis, multiline); + report = streaming_query_from_fasta_file(this, zis, + multiline); } else { - report = streaming_query_from_fasta_file>( - this, zis, multiline); + report = streaming_query_from_fasta_file(this, zis, + multiline); } } else if (util::ends_with(filename, ".fq.gz") or util::ends_with(filename, ".fastq.gz")) { if (multiline) { @@ -137,19 +144,17 @@ streaming_query_report dictionary::streaming_query_from_file(std::string } zip_istream zis(is); if (canonical()) { - report = - streaming_query_from_fastq_file>(this, zis); + report = streaming_query_from_fastq_file(this, zis); } else { - report = - streaming_query_from_fastq_file>(this, zis); + report = streaming_query_from_fastq_file(this, zis); } } else if (util::ends_with(filename, ".fa") or util::ends_with(filename, ".fasta")) { if (canonical()) { - report = streaming_query_from_fasta_file>( - this, is, multiline); + report = streaming_query_from_fasta_file(this, is, + multiline); } else { - report = streaming_query_from_fasta_file>( - this, is, multiline); + report = streaming_query_from_fasta_file(this, is, + multiline); } } else if (util::ends_with(filename, ".fq") or util::ends_with(filename, ".fastq")) { if (multiline) { @@ -157,11 +162,9 @@ streaming_query_report dictionary::streaming_query_from_file(std::string << std::endl; } if (canonical()) { - report = - streaming_query_from_fastq_file>(this, is); + report = streaming_query_from_fastq_file(this, is); } else { - report = - streaming_query_from_fastq_file>(this, is); + report = streaming_query_from_fastq_file(this, is); } } else { std::cerr << "unsupported query file format" << std::endl; diff --git a/test/check.hpp b/test/check.hpp index 86f6f0e..24c8e3d 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -4,8 +4,8 @@ namespace sshash { -template -bool check_dictionary(dictionary const& dict) { +template +bool check_dictionary(Dict const& dict) { const uint64_t k = dict.k(); const uint64_t n = dict.num_kmers(); @@ -69,8 +69,8 @@ bool check_dictionary(dictionary const& dict) { return check_correctness_negative_lookup(dict); } -template -bool check_correctness_negative_lookup(dictionary const& dict) { +template +bool check_correctness_negative_lookup(Dict const& dict) { std::cout << "checking correctness of negative lookup with random kmers..." << std::endl; const uint64_t num_lookups = std::min(1000000, dict.num_kmers()); std::string kmer(dict.k(), 0); @@ -89,9 +89,11 @@ bool check_correctness_negative_lookup(dictionary const& dict) { return true; } -template -bool check_correctness_navigational_contig_query(dictionary const& dict) { +template +bool check_correctness_navigational_contig_query(Dict const& dict) // +{ std::cout << "checking correctness of navigational queries for contigs..." << std::endl; + using kmer_t = typename Dict::kmer_type; const uint64_t num_strings = dict.num_strings(); const uint64_t k = dict.k(); uint64_t kmer_id = 0; @@ -125,15 +127,15 @@ bool check_correctness_navigational_contig_query(dictionary const& dict) return true; } -template -bool check_correctness_kmer_iterator(dictionary const& dict) { +template +bool check_correctness_kmer_iterator(Dict const& dict) { std::cout << "checking correctness of kmer iterator..." << std::endl; std::string expected_kmer(dict.k(), 0); - constexpr uint64_t runs = 3; + constexpr uint64_t runs = 4; essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, essentials::get_random_seed()); for (uint64_t run = 0; run != runs; ++run) { - uint64_t from_kmer_id = distr.gen(); + uint64_t from_kmer_id = run == 0 ? 0 : distr.gen(); auto it = dict.at_kmer_id(from_kmer_id); while (it.has_next()) { auto [kmer_id, kmer] = it.next(); @@ -153,8 +155,8 @@ bool check_correctness_kmer_iterator(dictionary const& dict) { return true; } -template -bool check_correctness_contig_iterator(dictionary const& dict) { +template +bool check_correctness_contig_iterator(Dict const& dict) { std::cout << "checking correctness of contig iterator..." << std::endl; std::string expected_kmer(dict.k(), 0); for (uint64_t contig_id = 0; contig_id != dict.num_strings(); ++contig_id) { diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index 8a5e23b..35512ff 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -6,8 +6,10 @@ namespace sshash { -template -bool check_correctness_lookup_access(std::istream& is, dictionary const& dict) { +template +bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // +{ + using kmer_t = typename Dict::kmer_type; const uint64_t k = dict.k(); std::string sequence; uint64_t num_kmers = 0; @@ -159,8 +161,10 @@ bool check_correctness_lookup_access(std::istream& is, dictionary const& return check_correctness_negative_lookup(dict); } -template -bool check_correctness_navigational_kmer_query(std::istream& is, dictionary const& dict) { +template +bool check_correctness_navigational_kmer_query(std::istream& is, Dict const& dict) // +{ + using kmer_t = typename Dict::kmer_type; const uint64_t k = dict.k(); std::string sequence; uint64_t num_kmers = 0; @@ -212,8 +216,8 @@ bool check_correctness_navigational_kmer_query(std::istream& is, dictionary -bool check_correctness_weights(std::istream& is, dictionary const& dict) { +template +bool check_correctness_weights(std::istream& is, Dict const& dict) { uint64_t k = dict.k(); std::string line; uint64_t kmer_id = 0; @@ -268,23 +272,24 @@ bool check_correctness_weights(std::istream& is, dictionary const& dict) The input file must be the one the index was built from. Throughout the code, we assume the input does not contain any duplicate. */ -template -bool check_correctness_lookup_access(dictionary const& dict, std::string const& filename) { +template +bool check_correctness_lookup_access(Dict const& dict, std::string const& filename) // +{ std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); bool good = true; if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - good = check_correctness_lookup_access(zis, dict); + good = check_correctness_lookup_access(zis, dict); } else { - good = check_correctness_lookup_access(zis, dict); + good = check_correctness_lookup_access(zis, dict); } } else { if (util::ends_with(filename, ".cf_seg")) { - good = check_correctness_lookup_access(is, dict); + good = check_correctness_lookup_access(is, dict); } else { - good = check_correctness_lookup_access(is, dict); + good = check_correctness_lookup_access(is, dict); } } is.close(); @@ -295,28 +300,27 @@ bool check_correctness_lookup_access(dictionary const& dict, std::string The input file must be the one the index was built from. Throughout the code, we assume the input does not contain any duplicate. */ -template -bool check_correctness_navigational_kmer_query(dictionary const& dict, - std::string const& filename) { +template +bool check_correctness_navigational_kmer_query(Dict const& dict, std::string const& filename) { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); bool good = true; if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - good = check_correctness_navigational_kmer_query(zis, - dict); + good = + check_correctness_navigational_kmer_query(zis, dict); } else { - good = check_correctness_navigational_kmer_query(zis, - dict); + good = + check_correctness_navigational_kmer_query(zis, dict); } } else { if (util::ends_with(filename, ".cf_seg")) { - good = check_correctness_navigational_kmer_query(is, - dict); + good = + check_correctness_navigational_kmer_query(is, dict); } else { good = - check_correctness_navigational_kmer_query(is, dict); + check_correctness_navigational_kmer_query(is, dict); } } is.close(); @@ -327,8 +331,8 @@ bool check_correctness_navigational_kmer_query(dictionary const& dict, The input file must be the one the index was built from. Only for FASTA files since CUTTLEFISH does not store kmer weights. */ -template -bool check_correctness_weights(dictionary const& dict, std::string const& filename) { +template +bool check_correctness_weights(Dict const& dict, std::string const& filename) { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); bool good = true; diff --git a/tools/build.cpp b/tools/build.cpp index cafb967..f2d3de7 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -55,7 +55,7 @@ int build(int argc, char** argv) { auto k = parser.get("k"); auto m = parser.get("m"); - dictionary dict; + dictionary dict; build_configuration build_config; build_config.k = k; diff --git a/tools/common.hpp b/tools/common.hpp index 98bc926..10302a5 100644 --- a/tools/common.hpp +++ b/tools/common.hpp @@ -11,8 +11,8 @@ void random_kmer(char* kmer, uint64_t k) { for (uint64_t i = 0; i != k; ++i) kmer[i] = "ACGT"[rand() % 4]; } -template -void load_dictionary(dictionary& dict, std::string const& index_filename, bool verbose) { +template +void load_dictionary(Dict& dict, std::string const& index_filename, bool verbose) { const uint64_t num_bytes_read = essentials::load(dict, index_filename.c_str()); if (verbose) { std::cout << "total index size: " << num_bytes_read << " [B] -- " diff --git a/tools/perf.hpp b/tools/perf.hpp index 417e506..36bd1bd 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -6,8 +6,8 @@ namespace perf { using timer_type = essentials::timer; } -template -void perf_test_iterator(dictionary const& dict) { +template +void perf_test_iterator(Dict const& dict) { perf::timer_type t; t.start(); auto it = dict.begin(); @@ -21,8 +21,8 @@ void perf_test_iterator(dictionary const& dict) { std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; } -// template -// void perf_test_lookup_by_list_size(dictionary const& dict) { +// template +// void perf_test_lookup_by_list_size(Dict const& dict) { // constexpr uint64_t num_queries = 1000000; // constexpr uint64_t runs = 5; // const uint64_t k = dict.k(); @@ -91,8 +91,10 @@ void perf_test_iterator(dictionary const& dict) { // } // } -template -void perf_test_lookup_access(dictionary const& dict) { +template +void perf_test_lookup_access(Dict const& dict) // +{ + using kmer_t = typename Dict::kmer_type; constexpr uint64_t num_queries = 1'000'000; constexpr uint64_t runs = 5; essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, @@ -266,8 +268,11 @@ void perf_test_lookup_access(dictionary const& dict) { } // namespace sshash -template -void perf_test_lookup_weight(dictionary const& dict) { +template +void perf_test_lookup_weight(Dict const& dict) // +{ + using kmer_t = typename Dict::kmer_type; + if (!dict.weighted()) { std::cerr << "ERROR: the dictionary does not store weights" << std::endl; return; diff --git a/tools/query.cpp b/tools/query.cpp index 0127907..29a5d1a 100644 --- a/tools/query.cpp +++ b/tools/query.cpp @@ -23,7 +23,7 @@ int query(int argc, char** argv) { bool verbose = parser.get("verbose"); bool multiline = parser.get("multiline"); - dictionary dict; + dictionary dict; load_dictionary(dict, index_filename, verbose); essentials::logger("performing queries from file '" + query_filename + "'..."); diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 9afc504..9514251 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -25,7 +25,7 @@ int check(int argc, char** argv) { if (!parser.parse()) return 0; auto index_filename = parser.get("index_filename"); bool verbose = parser.get("verbose"); - dictionary dict; + dictionary dict; load_dictionary(dict, index_filename, verbose); check_dictionary(dict); // check_correctness_navigational_contig_query(dict); @@ -42,7 +42,7 @@ int bench(int argc, char** argv) { if (!parser.parse()) return 0; auto index_filename = parser.get("index_filename"); bool verbose = parser.get("verbose"); - dictionary dict; + dictionary dict; load_dictionary(dict, index_filename, verbose); // perf_test_lookup_by_list_size(dict); @@ -62,7 +62,7 @@ int compute_statistics(int argc, char** argv) { if (!parser.parse()) return 0; auto index_filename = parser.get("index_filename"); bool verbose = parser.get("verbose"); - dictionary dict; + dictionary dict; load_dictionary(dict, index_filename, verbose); dict.compute_statistics(); return 0; From 91677e76e19720d447a1cb99242dc56ed58cf979 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 12 Oct 2025 12:34:15 +0200 Subject: [PATCH 043/112] more (needs fixing) --- include/buckets.hpp | 38 ++--- include/dictionary.hpp | 5 +- include/dictionary_types.hpp | 12 ++ include/endpoints.hpp | 323 +++++++++++++++++------------------ test/check.hpp | 18 +- tools/build.cpp | 6 +- tools/common.hpp | 2 +- tools/perf.hpp | 1 - tools/permute.cpp | 11 +- tools/query.cpp | 3 +- tools/sshash.cpp | 38 ++--- 11 files changed, 226 insertions(+), 231 deletions(-) create mode 100644 include/dictionary_types.hpp diff --git a/include/buckets.hpp b/include/buckets.hpp index fc218e7..9dc33f5 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -59,10 +59,10 @@ struct buckets // return lookup_result(); } - lookup_result lookup_at_offset_no_check_minimizer(endpoints::decoded_offset p, // - const kmer_t kmer, // - const minimizer_info mini_info, // - const uint64_t k) const // + lookup_result lookup_at_offset_no_check_minimizer(typename Endpoints::decoded_offset p, // + const kmer_t kmer, // + const minimizer_info mini_info, // + const uint64_t k) const // { auto res = strings_endpoints.offset_to_id(p, mini_info.pos_in_kmer, k); if (res.kmer_id != constants::invalid_uint64) { @@ -129,12 +129,13 @@ struct buckets // return lookup_result(); } - lookup_result lookup_canonical_at_offset_no_check_minimizer(endpoints::decoded_offset p, // - const kmer_t kmer, - const kmer_t kmer_rc, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // + lookup_result lookup_canonical_at_offset_no_check_minimizer( + typename Endpoints::decoded_offset p, // + const kmer_t kmer, + const kmer_t kmer_rc, // + const minimizer_info mini_info, // + const uint64_t k, // + const uint64_t m) const // { uint64_t pos_in_kmer = mini_info.pos_in_kmer; auto res = check_offset(p, pos_in_kmer, kmer, kmer_rc, k); @@ -169,7 +170,7 @@ struct buckets // return lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); } - lookup_result check_offset(endpoints::decoded_offset p, // + lookup_result check_offset(typename Endpoints::decoded_offset p, // const uint64_t pos_in_kmer, // const kmer_t kmer, const kmer_t kmer_rc, // const uint64_t k) const // @@ -213,24 +214,24 @@ struct buckets // m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); assert(m_strings_endpoints_it.value() > m_offset); next_piece(); - m_ret.second.resize(m_k, 0); } bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } - std::pair next() { + std::pair // (kmer-id, encoded kmer) + next() { if (m_offset == m_next_offset - m_k + 1) { m_offset = m_next_offset; next_piece(); } m_ret.first = m_begin_kmer_id; if (m_clear) { - util::uint_kmer_to_string(m_it.get(), m_ret.second.data(), m_k); + m_ret.second = m_it.get(); assert(kmer_t::bits_per_char * m_offset == m_it.position()); m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); } else { - memmove(m_ret.second.data(), m_ret.second.data() + 1, m_k - 1); - m_ret.second[m_k - 1] = kmer_t::uint64_to_char(m_it.get_next_char()); + m_ret.second.drop_char(); + m_ret.second.set(m_k - 1, m_it.get_next_char()); } m_clear = false; ++m_begin_kmer_id; @@ -239,12 +240,11 @@ struct buckets // } private: - std::pair m_ret; + std::pair m_ret; buckets const* m_buckets; uint64_t m_begin_kmer_id, m_end_kmer_id; uint64_t m_k; - uint64_t m_offset; - uint64_t m_next_offset; + uint64_t m_offset, m_next_offset; kmer_iterator m_it; typename Endpoints::iterator m_strings_endpoints_it; bool m_clear; diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 911cffa..f57e3e2 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -87,8 +87,8 @@ struct dictionary // bool has_next() const { return m_it.has_next(); } - /* (kmer-id, kmer) */ - std::pair next() { return m_it.next(); } + /* (kmer-id, encoded kmer) */ + std::pair next() { return m_it.next(); } private: typename buckets::iterator m_it; @@ -124,7 +124,6 @@ struct dictionary // uint64_t num_bits() const; void print_info() const; void print_space_breakdown() const; - void compute_statistics() const; template void visit(Visitor& visitor) const { diff --git a/include/dictionary_types.hpp b/include/dictionary_types.hpp new file mode 100644 index 0000000..27c12c2 --- /dev/null +++ b/include/dictionary_types.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include "dictionary.hpp" +#include "endpoints.hpp" +#include "kmer.hpp" + +namespace sshash { + +// using dictionary_type = dictionary; +using dictionary_type = dictionary; + +} // namespace sshash \ No newline at end of file diff --git a/include/endpoints.hpp b/include/endpoints.hpp index 27e61ba..e6c58c8 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -152,169 +152,164 @@ struct endpoints // } }; -// struct _endpoints // -// { -// struct builder { -// builder() {} - -// void reserve(uint64_t n) { m_v.reserve(n); } -// void push_back(uint64_t val) { m_v.push_back(val); } -// uint64_t operator[](uint64_t i) { -// assert(i < m_v.size()); -// return m_v[i]; -// } -// uint64_t front() const { return m_v.front(); } -// uint64_t back() const { return m_v.back(); } -// uint64_t size() const { return m_v.size(); } -// uint64_t num_bits_per_offset() const { -// return m_nb.per_string_id + m_nb.per_relative_offset; -// } - -// void set_num_bits(num_bits nb) { m_nb = nb; } - -// uint64_t encode(uint64_t offset, uint64_t begin, uint64_t string_id) { -// /* encode offset as | string-id | relative offset | */ -// assert(offset >= begin); -// uint64_t relative_offset = offset - begin; -// return (string_id << m_nb.per_relative_offset) + relative_offset; -// } - -// void build(_endpoints& e) { -// e.m_seq.build(m_v.begin(), m_v.size(), m_nb.per_absolute_offset); -// m_num_bits_per_relative_offset = m_nb.per_relative_offset; -// std::vector().swap(m_v); -// } - -// private: -// num_bits m_nb; -// std::vector m_v; -// }; - -// struct decoded_offset { -// uint64_t absolute_offset; -// uint64_t relative_offset; -// uint64_t string_id; -// uint64_t string_begin; -// uint64_t string_end; -// }; - -// decoded_offset decode(const uint64_t encoded_offset) const { -// uint64_t relative_offset = encoded_offset & ((1ULL << m_num_bits_per_relative_offset) - -// 1); uint64_t string_id = encoded_offset >> m_num_bits_per_relative_offset; -// assert(string_id + 1 < m_seq.size()); -// uint64_t begin = m_seq[string_id]; -// uint64_t end = m_seq[string_id + 1]; -// return {begin + relative_offset, relative_offset, string_id, begin, end}; -// } - -// lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // -// { -// if (p.absolute_offset < pos_in_kmer) return lookup_result(); - -// uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; -// uint64_t contig_id = p.string_id; -// uint64_t contig_begin = p.string_begin; -// uint64_t contig_end = q.string_end; - -// /* The following facts hold. */ -// assert(kmer_offset >= contig_id * (k - 1)); -// assert(contig_begin <= kmer_offset); -// assert(kmer_offset < contig_end); -// /****************************/ - -// uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); -// uint64_t relative_kmer_id = kmer_offset - contig_begin; -// uint64_t contig_length = contig_end - contig_begin; -// assert(contig_length >= k); -// uint64_t contig_size = contig_length - k + 1; - -// lookup_result res; -// res.kmer_id = absolute_kmer_id; -// res.kmer_id_in_contig = relative_kmer_id; -// res.contig_id = contig_id; -// res.contig_size = contig_size; -// assert(contig_begin == res.contig_begin(k)); -// assert(contig_end == res.contig_end(k)); -// assert(kmer_offset == res.kmer_offset(k)); - -// return res; -// } - -// std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // -// { -// constexpr uint64_t linear_scan_threshold = 32; -// uint64_t lo = 0; -// uint64_t hi = m_seq.size() - 1; -// assert(m_seq.access(0) == 0); -// while (hi - lo > linear_scan_threshold) { -// uint64_t mid = lo + (hi - lo) / 2; -// uint64_t val = m_seq.access(mid); -// assert(val >= mid * (k - 1)); -// if (kmer_id <= val - mid * (k - 1)) { -// hi = mid; -// } else { -// lo = mid + 1; -// } -// } -// assert(lo < hi); -// assert(hi < m_seq.size()); -// for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { -// uint64_t val = it.value() - lo * (k - 1); -// if (val > kmer_id) break; -// } -// assert(lo > 0); -// return {lo, kmer_id + (lo - 1) * (k - 1)}; -// } - -// uint64_t access(uint64_t i) const { -// assert(i < size()); -// return m_seq.access(i); -// } - -// // std::pair next_geq(uint64_t lower_bound) const { -// // auto [pos, val] = m_seq.next_geq(lower_bound); -// // return {pos, val}; -// // } - -// uint64_t size() const { return m_seq.size(); } - -// uint64_t num_bytes() const { return m_seq.num_bytes(); } - -// struct iterator { -// iterator() {} -// iterator(endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } - -// uint64_t value() const { return m_it.value(); } -// void next() { m_it.next(); } - -// private: -// bits::endpoints_sequence<>::iterator m_it; -// }; - -// iterator get_iterator_at(uint64_t pos) const { -// assert(pos < size()); -// return {this, pos}; -// } - -// template -// void visit(Visitor& visitor) const { -// visit_impl(visitor, *this); -// } - -// template -// void visit(Visitor& visitor) { -// visit_impl(visitor, *this); -// } - -// private: -// uint64_t m_num_bits_per_relative_offset; -// bits::compact_vector m_seq; - -// template -// static void visit_impl(Visitor& visitor, T&& t) { -// visitor.visit(t.m_num_bits_per_relative_offset); -// visitor.visit(t.m_seq); -// } -// }; +struct _endpoints // +{ + struct builder { + builder() {} + + void reserve(uint64_t n) { m_v.reserve(n); } + void push_back(uint64_t val) { m_v.push_back(val); } + uint64_t operator[](uint64_t i) { + assert(i < m_v.size()); + return m_v[i]; + } + uint64_t front() const { return m_v.front(); } + uint64_t back() const { return m_v.back(); } + uint64_t size() const { return m_v.size(); } + uint64_t num_bits_per_offset() const { + return m_nb.per_string_id + m_nb.per_relative_offset; + } + + void set_num_bits(num_bits nb) { m_nb = nb; } + + uint64_t encode(uint64_t offset, uint64_t begin, uint64_t string_id) { + /* encode offset as | string-id | relative offset | */ + assert(offset >= begin); + uint64_t relative_offset = offset - begin; + return (string_id << m_nb.per_relative_offset) + relative_offset; + } + + void build(_endpoints& e) { + e.m_seq.build(m_v.begin(), m_v.size(), m_nb.per_absolute_offset); + e.m_num_bits_per_relative_offset = m_nb.per_relative_offset; + std::vector().swap(m_v); + } + + private: + num_bits m_nb; + std::vector m_v; + }; + + struct decoded_offset { + uint64_t absolute_offset; + uint64_t relative_offset; + uint64_t string_id; + uint64_t string_begin; + uint64_t string_end; + }; + + decoded_offset decode(const uint64_t encoded_offset) const { + uint64_t relative_offset = encoded_offset & ((1ULL << m_num_bits_per_relative_offset) - 1); + uint64_t string_id = encoded_offset >> m_num_bits_per_relative_offset; + assert(string_id + 1 < m_seq.size()); + uint64_t begin = m_seq[string_id]; + uint64_t end = m_seq[string_id + 1]; + return {begin + relative_offset, relative_offset, string_id, begin, end}; + } + + lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // + { + if (p.absolute_offset < pos_in_kmer) return lookup_result(); + + uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; + uint64_t contig_id = p.string_id; + uint64_t contig_begin = p.string_begin; + uint64_t contig_end = p.string_end; + + /* The following facts hold. */ + assert(kmer_offset >= contig_id * (k - 1)); + assert(contig_begin <= kmer_offset); + assert(kmer_offset < contig_end); + /****************************/ + + uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); + uint64_t relative_kmer_id = kmer_offset - contig_begin; + uint64_t contig_length = contig_end - contig_begin; + assert(contig_length >= k); + uint64_t contig_size = contig_length - k + 1; + + lookup_result res; + res.kmer_id = absolute_kmer_id; + res.kmer_id_in_contig = relative_kmer_id; + res.contig_id = contig_id; + res.contig_size = contig_size; + assert(contig_begin == res.contig_begin(k)); + assert(contig_end == res.contig_end(k)); + assert(kmer_offset == res.kmer_offset(k)); + + return res; + } + + std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // + { + constexpr uint64_t linear_scan_threshold = 32; + uint64_t lo = 0; + uint64_t hi = m_seq.size() - 1; + assert(m_seq.access(0) == 0); + while (hi - lo > linear_scan_threshold) { + uint64_t mid = lo + (hi - lo) / 2; + uint64_t val = m_seq.access(mid); + assert(val >= mid * (k - 1)); + if (kmer_id <= val - mid * (k - 1)) { + hi = mid; + } else { + lo = mid + 1; + } + } + assert(lo < hi); + assert(hi < m_seq.size()); + for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + uint64_t val = *it - lo * (k - 1); + if (val > kmer_id) break; + } + assert(lo > 0); + return {lo, kmer_id + (lo - 1) * (k - 1)}; + } + + uint64_t access(uint64_t i) const { + assert(i < size()); + return m_seq.access(i); + } + + uint64_t size() const { return m_seq.size(); } + + uint64_t num_bytes() const { return m_seq.num_bytes(); } + + struct iterator { + iterator() {} + iterator(_endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + + uint64_t value() const { return *m_it; } + void next() { ++m_it; } + + private: + bits::compact_vector::iterator m_it; + }; + + iterator get_iterator_at(uint64_t pos) const { + assert(pos < size()); + return {this, pos}; + } + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + +private: + uint64_t m_num_bits_per_relative_offset; + bits::compact_vector m_seq; + + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.m_num_bits_per_relative_offset); + visitor.visit(t.m_seq); + } +}; } // namespace sshash \ No newline at end of file diff --git a/test/check.hpp b/test/check.hpp index 24c8e3d..9c1f722 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -130,7 +130,9 @@ bool check_correctness_navigational_contig_query(Dict const& dict) // template bool check_correctness_kmer_iterator(Dict const& dict) { std::cout << "checking correctness of kmer iterator..." << std::endl; - std::string expected_kmer(dict.k(), 0); + const uint64_t k = dict.k(); + std::string read_kmer(k, 0); + std::string expected_kmer(k, 0); constexpr uint64_t runs = 4; essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, essentials::get_random_seed()); @@ -139,9 +141,10 @@ bool check_correctness_kmer_iterator(Dict const& dict) { auto it = dict.at_kmer_id(from_kmer_id); while (it.has_next()) { auto [kmer_id, kmer] = it.next(); + util::uint_kmer_to_string(kmer, read_kmer.data(), k); dict.access(kmer_id, expected_kmer.data()); - if (kmer != expected_kmer or kmer_id != from_kmer_id) { - std::cout << "got (" << kmer_id << ",'" << kmer << "')"; + if (read_kmer != expected_kmer or kmer_id != from_kmer_id) { + std::cout << "got (" << kmer_id << ",'" << read_kmer << "')"; std::cout << " but "; std::cout << "expected (" << from_kmer_id << ",'" << expected_kmer << "')" << std::endl; @@ -158,16 +161,19 @@ bool check_correctness_kmer_iterator(Dict const& dict) { template bool check_correctness_contig_iterator(Dict const& dict) { std::cout << "checking correctness of contig iterator..." << std::endl; - std::string expected_kmer(dict.k(), 0); + const uint64_t k = dict.k(); + std::string read_kmer(k, 0); + std::string expected_kmer(k, 0); for (uint64_t contig_id = 0; contig_id != dict.num_strings(); ++contig_id) { auto [begin, _] = dict.contig_offsets(contig_id); uint64_t from_kmer_id = begin - contig_id * (dict.k() - 1); auto it = dict.at_contig_id(contig_id); while (it.has_next()) { auto [kmer_id, kmer] = it.next(); + util::uint_kmer_to_string(kmer, read_kmer.data(), k); dict.access(kmer_id, expected_kmer.data()); - if (kmer != expected_kmer or kmer_id != from_kmer_id) { - std::cout << "got (" << kmer_id << ",'" << kmer << "')"; + if (read_kmer != expected_kmer or kmer_id != from_kmer_id) { + std::cout << "got (" << kmer_id << ",'" << read_kmer << "')"; std::cout << " but "; std::cout << "expected (" << from_kmer_id << ",'" << expected_kmer << "')" << std::endl; diff --git a/tools/build.cpp b/tools/build.cpp index f2d3de7..45a163f 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -1,6 +1,5 @@ using namespace sshash; -template int build(int argc, char** argv) { cmd_line_parser::parser parser(argc, argv); @@ -14,7 +13,8 @@ int build(int argc, char** argv) { "\t- one DNA sequence per line.\n" "\tFor example, it could be the de Bruijn graph topology output by BCALM or CUTTLEFISH.", "-i", true); - parser.add("k", "K-mer length (must be <= " + std::to_string(kmer_t::max_k) + ").", "-k", true); + parser.add("k", "K-mer length (must be <= " + std::to_string(default_kmer_t::max_k) + ").", + "-k", true); parser.add("m", "Minimizer length (must be < k).", "-m", true); /* Optional arguments. */ @@ -55,7 +55,7 @@ int build(int argc, char** argv) { auto k = parser.get("k"); auto m = parser.get("m"); - dictionary dict; + dictionary_type dict; build_configuration build_config; build_config.k = k; diff --git a/tools/common.hpp b/tools/common.hpp index 10302a5..1f86a37 100644 --- a/tools/common.hpp +++ b/tools/common.hpp @@ -1,7 +1,7 @@ #pragma once #include "external/pthash/external/cmd_line_parser/include/parser.hpp" -#include "include/dictionary.hpp" +#include "include/dictionary_types.hpp" #include diff --git a/tools/perf.hpp b/tools/perf.hpp index 36bd1bd..a3f622b 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -14,7 +14,6 @@ void perf_test_iterator(Dict const& dict) { while (it.has_next()) { auto [kmer_id, kmer] = it.next(); essentials::do_not_optimize_away(kmer_id); - essentials::do_not_optimize_away(kmer[0]); } t.stop(); double avg_nanosec = t.elapsed() / dict.num_kmers(); diff --git a/tools/permute.cpp b/tools/permute.cpp index 659ebf1..5dd1b1a 100644 --- a/tools/permute.cpp +++ b/tools/permute.cpp @@ -3,7 +3,6 @@ using namespace sshash; -template int permute(int argc, char** argv) { cmd_line_parser::parser parser(argc, argv); @@ -17,7 +16,8 @@ int permute(int argc, char** argv) { "\tFor example, it could be the de Bruijn graph topology output " "by BCALM.", "-i", true); - parser.add("k", "K-mer length (must be <= " + std::to_string(kmer_t::max_k) + ").", "-k", true); + parser.add("k", "K-mer length (must be <= " + std::to_string(default_kmer_t::max_k) + ").", + "-k", true); /* Optional arguments. */ parser.add("output_filename", "Output file where the permuted collection will be written.", @@ -38,8 +38,8 @@ int permute(int argc, char** argv) { std::cerr << "k must be > 0" << std::endl; return 1; } - if (k > kmer_t::max_k) { - std::cerr << "k must be less <= " + std::to_string(kmer_t::max_k) + + if (k > default_kmer_t::max_k) { + std::cerr << "k must be less <= " + std::to_string(default_kmer_t::max_k) + " but got k = " + std::to_string(k) << std::endl; return 1; @@ -94,7 +94,8 @@ int permute(int argc, char** argv) { } /* permute and save to output file */ - permute_and_write(input_filename, output_filename, tmp_dirname, permutation, signs, k); + permute_and_write(input_filename, output_filename, tmp_dirname, permutation, + signs, k); std::remove(permutation_filename.c_str()); return 0; diff --git a/tools/query.cpp b/tools/query.cpp index 29a5d1a..a8a4279 100644 --- a/tools/query.cpp +++ b/tools/query.cpp @@ -3,7 +3,6 @@ using namespace sshash; -template int query(int argc, char** argv) { cmd_line_parser::parser parser(argc, argv); parser.add("index_filename", "Must be a file generated with the tool 'build'.", "-i", true); @@ -23,7 +22,7 @@ int query(int argc, char** argv) { bool verbose = parser.get("verbose"); bool multiline = parser.get("multiline"); - dictionary dict; + dictionary_type dict; load_dictionary(dict, index_filename, verbose); essentials::logger("performing queries from file '" + query_filename + "'..."); diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 9514251..188d83b 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -17,7 +17,6 @@ using namespace sshash; -template int check(int argc, char** argv) { cmd_line_parser::parser parser(argc, argv); parser.add("index_filename", "Must be a file generated with the tool 'build'.", "-i", true); @@ -25,16 +24,15 @@ int check(int argc, char** argv) { if (!parser.parse()) return 0; auto index_filename = parser.get("index_filename"); bool verbose = parser.get("verbose"); - dictionary dict; + dictionary_type dict; load_dictionary(dict, index_filename, verbose); check_dictionary(dict); - // check_correctness_navigational_contig_query(dict); - // check_correctness_kmer_iterator(dict); - // check_correctness_contig_iterator(dict); + check_correctness_navigational_contig_query(dict); + check_correctness_kmer_iterator(dict); + check_correctness_contig_iterator(dict); return 0; } -template int bench(int argc, char** argv) { cmd_line_parser::parser parser(argc, argv); parser.add("index_filename", "Must be a file generated with the tool 'build'.", "-i", true); @@ -42,32 +40,18 @@ int bench(int argc, char** argv) { if (!parser.parse()) return 0; auto index_filename = parser.get("index_filename"); bool verbose = parser.get("verbose"); - dictionary dict; + dictionary_type dict; load_dictionary(dict, index_filename, verbose); // perf_test_lookup_by_list_size(dict); perf_test_lookup_access(dict); // if (dict.weighted()) perf_test_lookup_weight(dict); - // perf_test_iterator(dict); + perf_test_iterator(dict); return 0; } -template -int compute_statistics(int argc, char** argv) { - cmd_line_parser::parser parser(argc, argv); - parser.add("index_filename", "Must be a file generated with the tool 'build'.", "-i", true); - parser.add("verbose", "Verbose output.", "--verbose", false, true); - if (!parser.parse()) return 0; - auto index_filename = parser.get("index_filename"); - bool verbose = parser.get("verbose"); - dictionary dict; - load_dictionary(dict, index_filename, verbose); - dict.compute_statistics(); - return 0; -} - int help(char* arg0) { std::cout << "== SSHash: (S)parse and (S)kew (Hash)ing of k-mers =========================" << std::endl @@ -88,15 +72,15 @@ int main(int argc, char** argv) { if (argc < 2) return help(argv[0]); auto tool = std::string(argv[1]); if (tool == "build") { - return build(argc - 1, argv + 1); + return build(argc - 1, argv + 1); } else if (tool == "query") { - return query(argc - 1, argv + 1); + return query(argc - 1, argv + 1); } else if (tool == "check") { - return check(argc - 1, argv + 1); + return check(argc - 1, argv + 1); } else if (tool == "bench") { - return bench(argc - 1, argv + 1); + return bench(argc - 1, argv + 1); } else if (tool == "permute") { - return permute(argc - 1, argv + 1); + return permute(argc - 1, argv + 1); } std::cout << "Unsupported tool '" << tool << "'.\n" << std::endl; return help(argv[0]); From 14c832f6ee4867b52442b1d71c503e036aa79d66 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 12 Oct 2025 15:24:32 +0200 Subject: [PATCH 044/112] fix --- external/pthash | 2 +- include/buckets.hpp | 2 -- include/builder/parse_file.cpp | 2 +- include/dictionary_types.hpp | 4 ++-- include/endpoints.hpp | 26 +++++++++++++++++--------- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/external/pthash b/external/pthash index 3e2a531..217917b 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit 3e2a531f43667e55d68b8308fe61fee36418453d +Subproject commit 217917b98c7e921bc231a38e1585966b48a96f49 diff --git a/include/buckets.hpp b/include/buckets.hpp index 9dc33f5..45c5816 100644 --- a/include/buckets.hpp +++ b/include/buckets.hpp @@ -279,8 +279,6 @@ struct buckets // } Endpoints strings_endpoints; - // bits::endpoints_sequence<> strings_endpoints; - // bits::compact_vector strings_endpoints; std::vector start_lists_of_size; bits::compact_vector offsets; diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index cd61ad3..3258b8c 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -194,7 +194,7 @@ void dictionary_builder::parse_file(std::istream& is, num_bits nb; nb.per_absolute_offset = std::ceil(std::log2(strings_endpoints_builder.back())); - nb.per_relative_offset = max_len == k ? 1 : std::ceil(std::log2(max_len - k + 1)); + nb.per_relative_offset = std::ceil(std::log2(max_len - m + 1)); nb.per_string_id = std::ceil(std::log2(num_sequences)); std::cout << "max_len " << max_len << std::endl; diff --git a/include/dictionary_types.hpp b/include/dictionary_types.hpp index 27c12c2..f4645ab 100644 --- a/include/dictionary_types.hpp +++ b/include/dictionary_types.hpp @@ -6,7 +6,7 @@ namespace sshash { -// using dictionary_type = dictionary; -using dictionary_type = dictionary; +using dictionary_type = dictionary; +// using dictionary_type = dictionary; } // namespace sshash \ No newline at end of file diff --git a/include/endpoints.hpp b/include/endpoints.hpp index e6c58c8..0951178 100644 --- a/include/endpoints.hpp +++ b/include/endpoints.hpp @@ -12,7 +12,7 @@ struct num_bits { uint64_t per_string_id; }; -struct endpoints // +struct decoded_offsets // { struct builder { builder() {} @@ -32,7 +32,8 @@ struct endpoints // uint64_t encode(uint64_t offset, uint64_t, uint64_t) { return offset; } - void build(endpoints& e) { + void build(decoded_offsets& e) { + assert(std::is_sorted(m_v.begin(), m_v.end())); e.m_seq.encode(m_v.begin(), m_v.size(), m_v.back()); std::vector().swap(m_v); } @@ -119,7 +120,7 @@ struct endpoints // struct iterator { iterator() {} - iterator(endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + iterator(decoded_offsets const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } uint64_t value() const { return m_it.value(); } void next() { m_it.next(); } @@ -152,7 +153,7 @@ struct endpoints // } }; -struct _endpoints // +struct encoded_offsets // { struct builder { builder() {} @@ -174,12 +175,15 @@ struct _endpoints // uint64_t encode(uint64_t offset, uint64_t begin, uint64_t string_id) { /* encode offset as | string-id | relative offset | */ + assert(string_id < m_v.size()); assert(offset >= begin); + assert((offset - begin) < (1ULL << m_nb.per_relative_offset)); uint64_t relative_offset = offset - begin; return (string_id << m_nb.per_relative_offset) + relative_offset; } - void build(_endpoints& e) { + void build(encoded_offsets& e) { + assert(std::is_sorted(m_v.begin(), m_v.end())); e.m_seq.build(m_v.begin(), m_v.size(), m_nb.per_absolute_offset); e.m_num_bits_per_relative_offset = m_nb.per_relative_offset; std::vector().swap(m_v); @@ -202,14 +206,18 @@ struct _endpoints // uint64_t relative_offset = encoded_offset & ((1ULL << m_num_bits_per_relative_offset) - 1); uint64_t string_id = encoded_offset >> m_num_bits_per_relative_offset; assert(string_id + 1 < m_seq.size()); - uint64_t begin = m_seq[string_id]; - uint64_t end = m_seq[string_id + 1]; + uint64_t begin = m_seq.access(string_id); + uint64_t end = m_seq.access(string_id + 1); return {begin + relative_offset, relative_offset, string_id, begin, end}; } lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // { - if (p.absolute_offset < pos_in_kmer) return lookup_result(); + if (p.absolute_offset < pos_in_kmer or // + p.absolute_offset - pos_in_kmer < p.string_begin) // + { + return lookup_result(); + } uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; uint64_t contig_id = p.string_id; @@ -277,7 +285,7 @@ struct _endpoints // struct iterator { iterator() {} - iterator(_endpoints const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + iterator(encoded_offsets const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } uint64_t value() const { return *m_it; } void next() { ++m_it; } From 4733dae399697e97d7f3ad2a1c604d32d9aff973 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 12 Oct 2025 15:37:45 +0200 Subject: [PATCH 045/112] fix perf test iterator --- tools/perf.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/perf.hpp b/tools/perf.hpp index a3f622b..fbf97b2 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -14,6 +14,7 @@ void perf_test_iterator(Dict const& dict) { while (it.has_next()) { auto [kmer_id, kmer] = it.next(); essentials::do_not_optimize_away(kmer_id); + essentials::do_not_optimize_away(kmer.at(0)); } t.stop(); double avg_nanosec = t.elapsed() / dict.num_kmers(); From a9055e267a34f4e54b316dd4a8566819ac9f14e3 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 15 Oct 2025 21:35:14 +0200 Subject: [PATCH 046/112] big refactoring --- .clang-format | 2 - include/buckets.hpp | 308 ------------------ .../builder/build_sparse_and_skew_index.cpp | 65 ++-- include/builder/dictionary_builder.hpp | 33 +- include/builder/parse_file.cpp | 74 ++--- include/dictionary.hpp | 109 +++---- include/dictionary_types.hpp | 2 +- include/hash_util.hpp | 26 +- include/kmer_iterator.hpp | 47 ++- include/minimizer_iterator.hpp | 24 +- ...imizers.hpp => minimizers_control_map.hpp} | 35 +- include/{endpoints.hpp => offsets.hpp} | 81 +++-- include/skew_index.hpp | 20 +- include/sparse_and_skew_index.hpp | 99 ++++++ include/spectrum_preserving_string_set.hpp | 265 +++++++++++++++ include/streaming_query.hpp | 22 +- include/util.hpp | 62 ++-- src/build.cpp | 17 +- src/dictionary.cpp | 274 ++++++---------- src/info.cpp | 57 ++-- test/check.hpp | 34 +- test/check_from_file.hpp | 106 +++--- tools/build.cpp | 6 +- tools/sshash.cpp | 4 +- 24 files changed, 888 insertions(+), 884 deletions(-) delete mode 100644 include/buckets.hpp rename include/{minimizers.hpp => minimizers_control_map.hpp} (61%) rename include/{endpoints.hpp => offsets.hpp} (80%) create mode 100644 include/sparse_and_skew_index.hpp create mode 100644 include/spectrum_preserving_string_set.hpp diff --git a/.clang-format b/.clang-format index 548733d..5f8f5ca 100644 --- a/.clang-format +++ b/.clang-format @@ -148,5 +148,3 @@ StatementMacros: TabWidth: 8 UseTab: Never ... - - diff --git a/include/buckets.hpp b/include/buckets.hpp deleted file mode 100644 index 45c5816..0000000 --- a/include/buckets.hpp +++ /dev/null @@ -1,308 +0,0 @@ -#pragma once - -#include "util.hpp" -#include "kmer_iterator.hpp" -#include "endpoints.hpp" - -namespace sshash { - -template -struct buckets // -{ - /* Return where the contig begins and ends in strings. */ - std::pair // [begin, end) - contig_offsets(const uint64_t contig_id) const { - uint64_t begin = strings_endpoints.access(contig_id); - uint64_t end = strings_endpoints.access(contig_id + 1); - assert(end > begin); - return {begin, end}; - } - - kmer_t contig_prefix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_begin = strings_endpoints.access(contig_id); - return util::read_kmer_at(strings, k - 1, kmer_t::bits_per_char * contig_begin); - } - - kmer_t contig_suffix(const uint64_t contig_id, const uint64_t k) const { - uint64_t contig_end = strings_endpoints.access(contig_id + 1); - return util::read_kmer_at(strings, k - 1, - kmer_t::bits_per_char * (contig_end - k + 1)); - } - - lookup_result lookup(const uint64_t begin, const uint64_t end, // - const kmer_t kmer, const minimizer_info mini_info, // - const uint64_t k, const uint64_t m) const // - { - /* check minimizer first */ - uint64_t minimizer_offset = offsets2.access(begin); - auto p = strings_endpoints.decode(minimizer_offset); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); - if (read_mmer != mini_info.minimizer) return lookup_result(false); - - auto res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); - if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); - return res; - } - - for (uint64_t i = begin + 1; i < end; ++i) { - minimizer_offset = offsets2.access(i); - p = strings_endpoints.decode(minimizer_offset); - res = lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); - if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); - return res; - } - } - - return lookup_result(); - } - - lookup_result lookup_at_offset_no_check_minimizer(typename Endpoints::decoded_offset p, // - const kmer_t kmer, // - const minimizer_info mini_info, // - const uint64_t k) const // - { - auto res = strings_endpoints.offset_to_id(p, mini_info.pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t kmer_offset = res.kmer_offset(k); - if (kmer_offset + k - 1 < res.contig_end(k)) { - auto read_kmer = - util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); - if (read_kmer == kmer) return res; - } - } - return lookup_result(); - } - - lookup_result lookup_at_offset(const uint64_t minimizer_offset, // - const kmer_t kmer, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // - { - /* check minimizer first */ - auto p = strings_endpoints.decode(minimizer_offset); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); - if (read_mmer != mini_info.minimizer) return lookup_result(false); - return lookup_at_offset_no_check_minimizer(p, kmer, mini_info, k); - } - - lookup_result lookup_canonical(const uint64_t begin, const uint64_t end, // - const kmer_t kmer, const kmer_t kmer_rc, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // - { - /* check minimizer first */ - uint64_t minimizer_offset = offsets2.access(begin); - auto p = strings_endpoints.decode(minimizer_offset); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); - uint64_t minimizer_rc = 0; - { - auto tmp = kmer_t(mini_info.minimizer); - tmp.reverse_complement_inplace(m); - minimizer_rc = uint64_t(tmp); - } - if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { - return lookup_result(false); - } - - auto res = lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); - if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); - return res; - } - - for (uint64_t i = begin + 1; i < end; ++i) { - minimizer_offset = offsets2.access(i); - p = strings_endpoints.decode(minimizer_offset); - res = lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); - if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); - return res; - } - } - return lookup_result(); - } - - lookup_result lookup_canonical_at_offset_no_check_minimizer( - typename Endpoints::decoded_offset p, // - const kmer_t kmer, - const kmer_t kmer_rc, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // - { - uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = check_offset(p, pos_in_kmer, kmer, kmer_rc, k); - if (res.kmer_id != constants::invalid_uint64) { - assert(is_valid(res)); - return res; - } - pos_in_kmer = k - m - mini_info.pos_in_kmer; - return check_offset(p, pos_in_kmer, kmer, kmer_rc, k); - } - - lookup_result lookup_canonical_at_offset(const uint64_t minimizer_offset, // - const kmer_t kmer, // - const kmer_t kmer_rc, // - const minimizer_info mini_info, // - const uint64_t k, // - const uint64_t m) const // - { - /* check minimizer first */ - auto p = strings_endpoints.decode(minimizer_offset); - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, kmer_t::bits_per_char * p.absolute_offset)); - uint64_t minimizer_rc = 0; - { - auto tmp = kmer_t(mini_info.minimizer); - tmp.reverse_complement_inplace(m); - minimizer_rc = uint64_t(tmp); - } - if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { - return lookup_result(false); - } - return lookup_canonical_at_offset_no_check_minimizer(p, kmer, kmer_rc, mini_info, k, m); - } - - lookup_result check_offset(typename Endpoints::decoded_offset p, // - const uint64_t pos_in_kmer, // - const kmer_t kmer, const kmer_t kmer_rc, // - const uint64_t k) const // - { - auto res = strings_endpoints.offset_to_id(p, pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t kmer_offset = res.kmer_offset(k); - if (kmer_offset + k - 1 < res.contig_end(k)) { - auto read_kmer = - util::read_kmer_at(strings, k, kmer_t::bits_per_char * kmer_offset); - if (read_kmer == kmer) return res; - if (read_kmer == kmer_rc) { - res.kmer_orientation = constants::backward_orientation; - return res; - } - } - } - return lookup_result(); - } - - void access(const uint64_t kmer_id, char* string_kmer, const uint64_t k) const { - auto [_, offset] = strings_endpoints.id_to_offset(kmer_id, k); - auto read_kmer = util::read_kmer_at(strings, k, kmer_t::bits_per_char * offset); - util::uint_kmer_to_string(read_kmer, string_kmer, k); - } - - struct iterator { - iterator() {} - - iterator(buckets const* ptr, // - const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) - const uint64_t k) - : m_buckets(ptr) - , m_begin_kmer_id(begin_kmer_id) - , m_end_kmer_id(end_kmer_id) - , m_k(k) - , m_it(ptr->strings, m_k) // - { - auto [pos, val] = m_buckets->strings_endpoints.id_to_offset(m_begin_kmer_id, k); - m_offset = val; - m_strings_endpoints_it = m_buckets->strings_endpoints.get_iterator_at(pos); - assert(m_strings_endpoints_it.value() > m_offset); - next_piece(); - } - - bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } - - std::pair // (kmer-id, encoded kmer) - next() { - if (m_offset == m_next_offset - m_k + 1) { - m_offset = m_next_offset; - next_piece(); - } - m_ret.first = m_begin_kmer_id; - if (m_clear) { - m_ret.second = m_it.get(); - assert(kmer_t::bits_per_char * m_offset == m_it.position()); - m_it.at(kmer_t::bits_per_char * (m_offset + m_k)); - } else { - m_ret.second.drop_char(); - m_ret.second.set(m_k - 1, m_it.get_next_char()); - } - m_clear = false; - ++m_begin_kmer_id; - ++m_offset; - return m_ret; - } - - private: - std::pair m_ret; - buckets const* m_buckets; - uint64_t m_begin_kmer_id, m_end_kmer_id; - uint64_t m_k; - uint64_t m_offset, m_next_offset; - kmer_iterator m_it; - typename Endpoints::iterator m_strings_endpoints_it; - bool m_clear; - - void next_piece() { - m_it.at(kmer_t::bits_per_char * m_offset); - m_next_offset = m_strings_endpoints_it.value(); - assert(m_next_offset > m_offset); - m_clear = true; - m_strings_endpoints_it.next(); - } - }; - - iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id, const uint64_t k) const { - return iterator(this, begin_kmer_id, end_kmer_id, k); - } - - uint64_t num_bits() const { - return 8 * (strings_endpoints.num_bytes() + essentials::vec_bytes(start_lists_of_size) + // - offsets.num_bytes() + offsets2.num_bytes() + offsets3.num_bytes() + // - strings.num_bytes()); // - } - - template - void visit(Visitor& visitor) const { - visit_impl(visitor, *this); - } - - template - void visit(Visitor& visitor) { - visit_impl(visitor, *this); - } - - Endpoints strings_endpoints; - - std::vector start_lists_of_size; - bits::compact_vector offsets; - bits::compact_vector offsets2; - bits::compact_vector offsets3; - - bits::bit_vector strings; - -private: - template - static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.strings_endpoints); - visitor.visit(t.start_lists_of_size); - visitor.visit(t.offsets); - visitor.visit(t.offsets2); - visitor.visit(t.offsets3); - visitor.visit(t.strings); - } - - bool is_valid(lookup_result res) const { - return res.contig_size != constants::invalid_uint64 and // - res.kmer_id_in_contig < res.contig_size and // - res.contig_id < strings_endpoints.size(); // - } -}; - -} // namespace sshash \ No newline at end of file diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index fa81060..df03692 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -3,20 +3,19 @@ namespace sshash { -template -buckets_statistics // -dictionary_builder::build_sparse_and_skew_index( - buckets& m_buckets, skew_index& m_skew_index) // +template +buckets_statistics // +dictionary_builder::build_sparse_and_skew_index(dictionary& d) // { const uint64_t num_minimizer_positions = minimizers.num_minimizer_positions(); const uint64_t num_minimizers = minimizers.num_minimizers(); const uint64_t min_size = 1ULL << constants::min_l; - const uint64_t num_bits_per_offset = strings_endpoints_builder.num_bits_per_offset(); + const uint64_t num_bits_per_offset = strings_offsets_builder.num_bits_per_offset(); std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; - bits::compact_vector::builder offsets_builder; - offsets_builder.resize(num_minimizers, num_bits_per_offset + 1); + bits::compact_vector::builder control_codewords_builder; + control_codewords_builder.resize(num_minimizers, num_bits_per_offset + 1); mm::file_source input(minimizers.get_minimizers_filename(), mm::advice::sequential); @@ -61,7 +60,7 @@ dictionary_builder::build_sparse_and_skew_index( */ uint64_t code = mt.pos_in_seq << 1; // first LS bit encodes status code: 0 assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(bucket_id, code); + control_codewords_builder.set(bucket_id, code); prev_pos_in_seq = mt.pos_in_seq; } buckets_stats.add_num_kmers_in_super_kmer(bucket_size, mt.num_kmers_in_super_kmer); @@ -79,8 +78,8 @@ dictionary_builder::build_sparse_and_skew_index( << (num_buckets_in_skew_index * 100.0) / buckets_stats.num_buckets() << "%)" << std::endl; - strings_endpoints_builder.build(m_buckets.strings_endpoints); - strings_builder.build(m_buckets.strings); + strings_offsets_builder.build(d.m_spss.strings_offsets); + strings_builder.build(d.m_spss.strings); /* compute offsets2 and offsets3 */ assert(buckets_stats.num_buckets() == num_minimizers); @@ -136,15 +135,17 @@ dictionary_builder::build_sparse_and_skew_index( num_minimizer_positions << "%)" << std::endl; - bits::compact_vector::builder offsets2_builder; - bits::compact_vector::builder offsets3_builder; - offsets2_builder.resize(num_minimizer_positions_of_buckets_larger_than_1, num_bits_per_offset); - offsets3_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, num_bits_per_offset); + bits::compact_vector::builder mid_load_buckets_builder; + bits::compact_vector::builder heavy_load_buckets_builder; + mid_load_buckets_builder.resize(num_minimizer_positions_of_buckets_larger_than_1, + num_bits_per_offset); + heavy_load_buckets_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, + num_bits_per_offset); uint64_t curr_bucket_size = 2; uint64_t list_id = 0; - m_buckets.start_lists_of_size.resize(min_size + 1, 0); + d.m_ssi.begin_buckets_of_size.resize(min_size + 1, 0); uint64_t offsets2_curr_size = 0; uint64_t offsets3_curr_size = 0; @@ -159,7 +160,7 @@ dictionary_builder::build_sparse_and_skew_index( if (bucket_size > curr_bucket_size) { while (bucket_size > curr_bucket_size) ++curr_bucket_size; if (curr_bucket_size <= min_size) { - m_buckets.start_lists_of_size[curr_bucket_size] = offsets2_curr_size; + d.m_ssi.begin_buckets_of_size[curr_bucket_size] = offsets2_curr_size; } else { while (curr_bucket_size > upper) { lower = upper; @@ -178,10 +179,10 @@ dictionary_builder::build_sparse_and_skew_index( uint64_t p = (list_id << constants::min_l) | (curr_bucket_size - 2); uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(mt.minimizer, code); + control_codewords_builder.set(mt.minimizer, code); } if (mt.pos_in_seq != prev_pos_in_seq) { - offsets2_builder.push_back(mt.pos_in_seq); + mid_load_buckets_builder.push_back(mt.pos_in_seq); prev_pos_in_seq = mt.pos_in_seq; offsets2_curr_size += 1; } @@ -195,10 +196,10 @@ dictionary_builder::build_sparse_and_skew_index( uint64_t p = (offsets3_curr_size << 3) | partition_id; uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - offsets_builder.set(mt.minimizer, code); + control_codewords_builder.set(mt.minimizer, code); } if (mt.pos_in_seq != prev_pos_in_seq) { - offsets3_builder.push_back(mt.pos_in_seq); + heavy_load_buckets_builder.push_back(mt.pos_in_seq); prev_pos_in_seq = mt.pos_in_seq; offsets3_curr_size += 1; } @@ -206,9 +207,9 @@ dictionary_builder::build_sparse_and_skew_index( } } - offsets_builder.build(m_buckets.offsets); - offsets2_builder.build(m_buckets.offsets2); - offsets3_builder.build(m_buckets.offsets3); + control_codewords_builder.build(d.m_ssi.codewords.control_codewords); + mid_load_buckets_builder.build(d.m_ssi.mid_load_buckets); + heavy_load_buckets_builder.build(d.m_ssi.m_skew_index.heavy_load_buckets); timer.stop(); std::cout << "computing minimizers offsets: " << timer.elapsed() / 1000000 << " [sec]" @@ -221,8 +222,8 @@ dictionary_builder::build_sparse_and_skew_index( /* build skew index */ timer.start(); std::vector num_kmers_in_partition(num_partitions, 0); - m_skew_index.mphfs.resize(num_partitions); - m_skew_index.positions.resize(num_partitions); + d.m_ssi.m_skew_index.mphfs.resize(num_partitions); + d.m_ssi.m_skew_index.positions.resize(num_partitions); { std::cout << "computing sizes of partitions..." << std::endl; @@ -282,7 +283,7 @@ dictionary_builder::build_sparse_and_skew_index( uint64_t num_bits_per_pos = constants::min_l + 1; /* Temporary storage for kmers and positions within a partition. */ - std::vector kmers; + std::vector kmers; std::vector positions_in_bucket; bits::compact_vector::builder cvb_positions; kmers.reserve(num_kmers_in_partition[partition_id]); @@ -314,7 +315,7 @@ dictionary_builder::build_sparse_and_skew_index( << ")..." << std::endl; } - auto& mphf = m_skew_index.mphfs[partition_id]; + auto& mphf = d.m_ssi.m_skew_index.mphfs[partition_id]; mphf.build_in_internal_memory(kmers.begin(), kmers.size(), mphf_build_config); std::cout << " built mphs[" << partition_id << "] for " << kmers.size() @@ -323,12 +324,12 @@ dictionary_builder::build_sparse_and_skew_index( << std::endl; for (uint64_t i = 0; i != kmers.size(); ++i) { - kmer_t kmer = kmers[i]; + Kmer kmer = kmers[i]; uint64_t pos = mphf(kmer); uint32_t pos_in_bucket = positions_in_bucket[i]; cvb_positions.set(pos, pos_in_bucket); } - auto& positions = m_skew_index.positions[partition_id]; + auto& positions = d.m_ssi.m_skew_index.positions[partition_id]; cvb_positions.build(positions); std::cout << " built positions[" << partition_id << "] for " @@ -367,11 +368,11 @@ dictionary_builder::build_sparse_and_skew_index( } assert(mt.pos_in_seq >= mt.pos_in_kmer); - mt.pos_in_seq = m_buckets.strings_endpoints.decode(mt.pos_in_seq).absolute_offset; + mt.pos_in_seq = d.m_spss.strings_offsets.decode(mt.pos_in_seq).absolute_offset; const uint64_t starting_pos_of_super_kmer = mt.pos_in_seq - mt.pos_in_kmer; - kmer_iterator it( - m_buckets.strings, k, kmer_t::bits_per_char * starting_pos_of_super_kmer); + kmer_iterator it( + d.m_spss.strings, k, Kmer::bits_per_char * starting_pos_of_super_kmer); for (uint64_t i = 0; i != mt.num_kmers_in_super_kmer; ++i) { auto kmer = it.get(); if (build_config.canonical) { /* take the canonical kmer */ diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index b3efdb9..bb37bc4 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -1,7 +1,8 @@ #pragma once -#include "include/dictionary.hpp" #include "essentials.hpp" +#include "include/dictionary.hpp" +#include "include/offsets.hpp" #include "include/builder/util.hpp" #include "include/buckets_statistics.hpp" @@ -9,16 +10,18 @@ namespace sshash { -template +template struct dictionary_builder // { dictionary_builder(build_configuration const& build_config) : build_config(build_config), num_kmers(0), minimizers(build_config) {} - void build(dictionary& d, std::string const& filename) // + void build(dictionary& d, std::string const& filename) // { d.m_k = build_config.k; d.m_m = build_config.m; + d.m_spss.k = build_config.k; + d.m_spss.m = build_config.m; d.m_canonical = build_config.canonical; d.m_hasher.seed(build_config.seed); @@ -32,8 +35,8 @@ struct dictionary_builder // timer.start(); parse_file(filename); d.m_num_kmers = num_kmers; - assert(strings_endpoints_builder.size() >= 2); - d.m_num_strings = strings_endpoints_builder.size() - 1; + assert(strings_offsets_builder.size() >= 2); + d.m_num_strings = strings_offsets_builder.size() - 1; if (build_config.weighted) { essentials::timer_type timer; timer.start(); @@ -75,9 +78,9 @@ struct dictionary_builder // mm::file_source input(minimizers.get_minimizers_filename(), mm::advice::sequential); minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); - d.m_minimizers.build(iterator, num_minimizers, build_config); + d.m_ssi.codewords.build(iterator, num_minimizers, build_config); input.close(); - assert(d.m_minimizers.size() == num_minimizers); + assert(d.m_ssi.codewords.size() == num_minimizers); timer.stop(); timings.push_back(timer.elapsed()); print_time(timings.back(), num_kmers, "step 2.2: 'build minimizers mphf'"); @@ -93,7 +96,7 @@ struct dictionary_builder // std::string filename = minimizers.get_minimizers_filename(); std::ifstream input(filename, std::ifstream::binary); - auto const& f = d.m_minimizers; + auto const& f = d.m_ssi.codewords.mphf; const uint64_t num_threads = build_config.num_threads; const uint64_t num_files_to_merge = minimizers.num_files_to_merge(); @@ -124,7 +127,7 @@ struct dictionary_builder // uint64_t end = std::min(n, begin + chunk_size); threads.emplace_back([begin, end, &buffer, &f]() { for (uint64_t i = begin; i < end; ++i) { - buffer[i].minimizer = f.lookup(buffer[i].minimizer); + buffer[i].minimizer = f(buffer[i].minimizer); } }); } @@ -154,8 +157,8 @@ struct dictionary_builder // /* step 3: build sparse and skew index ***/ timer.start(); - auto buckets_stats = build_sparse_and_skew_index(d.m_buckets, d.m_skew_index); - assert(strings_endpoints_builder.size() == 0); + auto buckets_stats = build_sparse_and_skew_index(d); + assert(strings_offsets_builder.size() == 0); timer.stop(); timings.push_back(timer.elapsed()); print_time(timings.back(), num_kmers, "step 3: 'build sparse and skew index'"); @@ -176,17 +179,15 @@ struct dictionary_builder // build_configuration build_config; uint64_t num_kmers; minimizers_tuples minimizers; - typename Endpoints::builder strings_endpoints_builder; + typename Offsets::builder strings_offsets_builder; bits::bit_vector::builder strings_builder; weights::builder weights_builder; private: void parse_file(std::string const& filename); + void parse_file(std::istream& is, const input_file_t fmt); - void parse_file(std::istream& is, const input_file_type fmt); - - buckets_statistics build_sparse_and_skew_index(buckets& buckets, - skew_index& skew_index); + buckets_statistics build_sparse_and_skew_index(dictionary& d); }; } // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index 3258b8c..a642d67 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -5,9 +5,9 @@ namespace sshash { -template -void dictionary_builder::parse_file(std::istream& is, - const input_file_type fmt) // +template +void dictionary_builder::parse_file(std::istream& is, + const input_file_t fmt) // { essentials::timer_type timer; timer.start(); @@ -28,7 +28,7 @@ void dictionary_builder::parse_file(std::istream& is, const uint64_t num_bits_for_strings = 8 * 8 * essentials::GB; // reserve 8 GB of memory const uint64_t num_sequences = 100'000'000; strings_builder.reserve(num_bits_for_strings); - strings_endpoints_builder.reserve(num_sequences); + strings_offsets_builder.reserve(num_sequences); } std::string sequence; @@ -36,8 +36,8 @@ void dictionary_builder::parse_file(std::istream& is, uint64_t max_len = 0; hasher_type hasher(build_config.seed); - minimizer_iterator minimizer_it(k, m, hasher); - minimizer_iterator_rc minimizer_it_rc(k, m, hasher); + minimizer_iterator minimizer_it(k, m, hasher); + minimizer_iterator_rc minimizer_it_rc(k, m, hasher); uint64_t seq_len = 0; weights_builder.init(); @@ -47,10 +47,10 @@ void dictionary_builder::parse_file(std::istream& is, while (true) // { - if (fmt == input_file_type::cf_seg) { + if (fmt == input_file_t::cf_seg) { std::getline(is, sequence, '\t'); // skip until '\t' and consume it } else { - assert(fmt == input_file_type::fasta); + assert(fmt == input_file_t::fasta); if (build_config.weighted) { // parse header std::getline(is, sequence); // header sequence if (sequence.empty()) break; @@ -114,8 +114,8 @@ void dictionary_builder::parse_file(std::istream& is, const uint64_t n = sequence.length(); assert(n >= k); max_len = n > max_len ? n : max_len; - assert(strings_builder.num_bits() % kmer_t::bits_per_char == 0); - strings_endpoints_builder.push_back(strings_builder.num_bits() / kmer_t::bits_per_char); + assert(strings_builder.num_bits() % Kmer::bits_per_char == 0); + strings_offsets_builder.push_back(strings_builder.num_bits() / Kmer::bits_per_char); num_kmers += n - k + 1; num_bases += n; @@ -125,13 +125,13 @@ void dictionary_builder::parse_file(std::istream& is, throw std::runtime_error("file is malformed"); } - if (strings_endpoints_builder.size() % 100'000 == 0) { - std::cout << "read " << strings_endpoints_builder.size() << " sequences, " << num_bases + if (strings_offsets_builder.size() % 100'000 == 0) { + std::cout << "read " << strings_offsets_builder.size() << " sequences, " << num_bases << " bases, " << num_kmers << " kmers" << std::endl; } uint64_t i = 0; - if constexpr (kmer_t::bits_per_char == 2) { + if constexpr (Kmer::bits_per_char == 2) { #if !defined(SSHASH_USE_TRADITIONAL_NUCLEOTIDE_ENCODING) and defined(__AVX2__) /* process 32 bytes at a time */ @@ -143,19 +143,19 @@ void dictionary_builder::parse_file(std::istream& is, #endif } for (; i < n; ++i) { - strings_builder.append_bits(kmer_t::char_to_uint(sequence[i]), kmer_t::bits_per_char); + strings_builder.append_bits(Kmer::char_to_uint(sequence[i]), Kmer::bits_per_char); } } - strings_endpoints_builder.push_back(strings_builder.num_bits() / kmer_t::bits_per_char); - assert(strings_endpoints_builder.front() == 0); - assert(strings_endpoints_builder.size() >= 2); - const uint64_t num_sequences = strings_endpoints_builder.size() - 1; + strings_offsets_builder.push_back(strings_builder.num_bits() / Kmer::bits_per_char); + assert(strings_offsets_builder.front() == 0); + assert(strings_offsets_builder.size() >= 2); + const uint64_t num_sequences = strings_offsets_builder.size() - 1; /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ - static_assert(kmer_t::uint_kmer_bits % 64 == 0); - for (int dummy_bits = kmer_t::uint_kmer_bits; dummy_bits; dummy_bits -= 64) { + static_assert(Kmer::uint_kmer_bits % 64 == 0); + for (int dummy_bits = Kmer::uint_kmer_bits; dummy_bits; dummy_bits -= 64) { strings_builder.append_bits(0, 64); } @@ -166,7 +166,7 @@ void dictionary_builder::parse_file(std::istream& is, << " kmers" << std::endl; std::cout << "num_kmers " << num_kmers << std::endl; std::cout << "cost: 2.0 + " - << static_cast(kmer_t::bits_per_char * num_sequences * (k - 1)) / num_kmers + << static_cast(Kmer::bits_per_char * num_sequences * (k - 1)) / num_kmers << " [bits/kmer]" << std::endl; /* @@ -175,7 +175,7 @@ void dictionary_builder::parse_file(std::istream& is, where N is the number of nucleotides in the input and s is the alphabet size. We warn the user if the used m is less than this lower bound. */ - const uint64_t s = uint64_t(1) << kmer_t::bits_per_char; + const uint64_t s = uint64_t(1) << Kmer::bits_per_char; const uint64_t lower_bound_on_m = std::ceil(std::log(num_bases) / std::log(s)) + 1; if (m < lower_bound_on_m) { std::cout << "\n--> WARNING: using minimizer length " << m @@ -193,7 +193,7 @@ void dictionary_builder::parse_file(std::istream& is, threads.reserve(num_threads); num_bits nb; - nb.per_absolute_offset = std::ceil(std::log2(strings_endpoints_builder.back())); + nb.per_absolute_offset = std::ceil(std::log2(strings_offsets_builder.back())); nb.per_relative_offset = std::ceil(std::log2(max_len - m + 1)); nb.per_string_id = std::ceil(std::log2(num_sequences)); @@ -206,7 +206,7 @@ void dictionary_builder::parse_file(std::istream& is, throw std::runtime_error("minimier offset does not fit within 64 bits"); } - strings_endpoints_builder.set_num_bits(nb); + strings_offsets_builder.set_num_bits(nb); for (uint64_t t = 0; t * num_sequences_per_thread < num_sequences; ++t) // { @@ -239,14 +239,14 @@ void dictionary_builder::parse_file(std::istream& is, const uint64_t index_end = std::min(index_begin + num_sequences_per_thread, num_sequences); - kmer_iterator it(strings_builder, k); - minimizer_iterator minimizer_it(k, m, hasher); - minimizer_iterator_rc minimizer_it_rc(k, m, hasher); + kmer_iterator it(strings_builder, k); + minimizer_iterator minimizer_it(k, m, hasher); + minimizer_iterator_rc minimizer_it_rc(k, m, hasher); for (uint64_t i = index_begin; i < index_end; ++i) // { - const uint64_t begin = strings_endpoints_builder[i]; - const uint64_t end = strings_endpoints_builder[i + 1]; + const uint64_t begin = strings_offsets_builder[i]; + const uint64_t end = strings_offsets_builder[i + 1]; const uint64_t sequence_len = end - begin; assert(sequence_len >= k); @@ -254,7 +254,7 @@ void dictionary_builder::parse_file(std::istream& is, assert(prev_mini_info.minimizer == constants::invalid_uint64); uint64_t num_kmers_in_super_kmer = 0; - it.at(kmer_t::bits_per_char * begin); + it.at(Kmer::bits_per_char * begin); minimizer_it.set_position(begin); minimizer_it_rc.set_position(begin); @@ -277,7 +277,7 @@ void dictionary_builder::parse_file(std::istream& is, } mini_info.pos_in_seq = - strings_endpoints_builder.encode(mini_info.pos_in_seq, begin, i); + strings_offsets_builder.encode(mini_info.pos_in_seq, begin, i); if (prev_mini_info.minimizer == constants::invalid_uint64) { prev_mini_info = mini_info; @@ -316,8 +316,8 @@ void dictionary_builder::parse_file(std::istream& is, } } -template -void dictionary_builder::parse_file(std::string const& filename) // +template +void dictionary_builder::parse_file(std::string const& filename) // { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); @@ -325,15 +325,15 @@ void dictionary_builder::parse_file(std::string const& filena if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - parse_file(zis, input_file_type::cf_seg); + parse_file(zis, input_file_t::cf_seg); } else { - parse_file(zis, input_file_type::fasta); + parse_file(zis, input_file_t::fasta); } } else { if (util::ends_with(filename, ".cf_seg")) { - parse_file(is, input_file_type::cf_seg); + parse_file(is, input_file_t::cf_seg); } else { - parse_file(is, input_file_type::fasta); + parse_file(is, input_file_t::fasta); } } is.close(); diff --git a/include/dictionary.hpp b/include/dictionary.hpp index f57e3e2..a73d2f6 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -1,19 +1,18 @@ #pragma once #include "util.hpp" -#include "minimizers.hpp" -#include "buckets.hpp" -#include "skew_index.hpp" +#include "spectrum_preserving_string_set.hpp" +#include "sparse_and_skew_index.hpp" #include "weights.hpp" namespace sshash { -template +template struct dictionary // { - using kmer_type = kmer_t; + using kmer_type = Kmer; - template + template friend struct dictionary_builder; dictionary() @@ -40,29 +39,28 @@ struct dictionary // /* Lookup queries. */ lookup_result lookup(char const* string_kmer, bool check_reverse_complement = true) const; - lookup_result lookup_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; + lookup_result lookup_uint(Kmer uint_kmer, bool check_reverse_complement = true) const; - /* Return the number of kmers in contig. Since contigs do not have duplicates, - the length of the contig is always size + k - 1. */ - uint64_t contig_size(uint64_t contig_id) const; + /* Return the number of kmers in string. Since strings do not have duplicates, + the length of the string is always size + k - 1. */ + uint64_t string_size(uint64_t string_id) const; /* Navigational queries. */ - neighbourhood kmer_forward_neighbours(char const* string_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_forward_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_backward_neighbours(char const* string_kmer, - bool check_reverse_complement = true) const; - neighbourhood kmer_backward_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; + neighbourhood kmer_forward_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_forward_neighbours(Kmer uint_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_backward_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_backward_neighbours(Kmer uint_kmer, + bool check_reverse_complement = true) const; /* forward and backward */ - neighbourhood kmer_neighbours(char const* string_kmer, + neighbourhood kmer_neighbours(char const* string_kmer, + bool check_reverse_complement = true) const; + neighbourhood kmer_neighbours(Kmer uint_kmer, bool check_reverse_complement = true) const; + neighbourhood string_neighbours(uint64_t string_id, bool check_reverse_complement = true) const; - neighbourhood kmer_neighbours(kmer_t uint_kmer, - bool check_reverse_complement = true) const; - neighbourhood contig_neighbours(uint64_t contig_id, - bool check_reverse_complement = true) const; /* Return the weight of the kmer given its id. */ uint64_t weight(uint64_t kmer_id) const; @@ -72,9 +70,9 @@ struct dictionary // /* Membership queries. */ bool is_member(char const* string_kmer, bool check_reverse_complement = true) const; - bool is_member_uint(kmer_t uint_kmer, bool check_reverse_complement = true) const; + bool is_member_uint(Kmer uint_kmer, bool check_reverse_complement = true) const; - template + template friend struct streaming_query; streaming_query_report // @@ -82,16 +80,16 @@ struct dictionary // struct iterator { iterator(dictionary const* ptr, const uint64_t begin_kmer_id, const uint64_t end_kmer_id) { - m_it = ptr->m_buckets.at(begin_kmer_id, end_kmer_id, ptr->m_k); + m_it = ptr->m_spss.at(begin_kmer_id, end_kmer_id); } bool has_next() const { return m_it.has_next(); } /* (kmer-id, encoded kmer) */ - std::pair next() { return m_it.next(); } + std::pair next() { return m_it.next(); } private: - typename buckets::iterator m_it; + typename spectrum_preserving_string_set::iterator m_it; }; iterator begin() const { return iterator(this, 0, num_kmers()); } @@ -102,24 +100,25 @@ struct dictionary // } std::pair // [begin, end) - contig_offsets(const uint64_t contig_id) const { - return m_buckets.contig_offsets(contig_id); + string_offsets(const uint64_t string_id) const { + return m_spss.string_offsets(string_id); } - iterator at_contig_id(const uint64_t contig_id) const { - assert(contig_id < num_strings()); - auto [begin, end] = contig_offsets(contig_id); - uint64_t contig_length = end - begin; // in bases - assert(contig_length >= m_k); - uint64_t contig_size = contig_length - m_k + 1; // in kmers - uint64_t begin_kmer_id = begin - contig_id * (m_k - 1); - uint64_t end_kmer_id = begin_kmer_id + contig_size; + iterator at_string_id(const uint64_t string_id) const { + assert(string_id < num_strings()); + auto [begin, end] = string_offsets(string_id); + uint64_t string_length = end - begin; // in bases + assert(string_length >= m_k); + uint64_t string_size = string_length - m_k + 1; // in kmers + uint64_t begin_kmer_id = begin - string_id * (m_k - 1); + uint64_t end_kmer_id = begin_kmer_id + string_size; return iterator(this, begin_kmer_id, end_kmer_id); } - bits::bit_vector const& get_strings() const { return m_buckets.strings; } - buckets const& get_buckets() const { return m_buckets; } - minimizers const& get_minimizers() const { return m_minimizers; } + // FIXME: are they needed by our users? + // bits::bit_vector const& get_strings() const { return m_buckets.strings; } + // buckets const& get_buckets() const { return m_buckets; } + // minimizers const& get_minimizers() const { return m_minimizers; } uint64_t num_bits() const; void print_info() const; @@ -146,9 +145,8 @@ struct dictionary // visitor.visit(t.m_m); visitor.visit(t.m_canonical); visitor.visit(t.m_hasher); - visitor.visit(t.m_minimizers); - visitor.visit(t.m_buckets); - visitor.visit(t.m_skew_index); + visitor.visit(t.m_spss); + visitor.visit(t.m_ssi); visitor.visit(t.m_weights); } @@ -159,25 +157,26 @@ struct dictionary // uint16_t m_m; bool m_canonical; hasher_type m_hasher; - minimizers m_minimizers; - buckets m_buckets; - skew_index m_skew_index; + + spectrum_preserving_string_set m_spss; + sparse_and_skew_index m_ssi; + weights m_weights; - lookup_result lookup_uint_regular(kmer_t uint_kmer) const; - lookup_result lookup_uint_regular(kmer_t uint_kmer, minimizer_info mini_info) const; + lookup_result lookup_uint_regular(Kmer uint_kmer) const; + lookup_result lookup_uint_regular(Kmer uint_kmer, minimizer_info mini_info) const; - lookup_result lookup_uint_canonical(kmer_t uint_kmer) const; - lookup_result lookup_uint_canonical(kmer_t uint_kmer, kmer_t uint_kmer_rc, + lookup_result lookup_uint_canonical(Kmer uint_kmer) const; + lookup_result lookup_uint_canonical(Kmer uint_kmer, Kmer uint_kmer_rc, minimizer_info mini_info) const; - void forward_neighbours(kmer_t suffix, neighbourhood& res, + void forward_neighbours(Kmer suffix, neighbourhood& res, bool check_reverse_complement) const; - void backward_neighbours(kmer_t prefix, neighbourhood& res, + void backward_neighbours(Kmer prefix, neighbourhood& res, bool check_reverse_complement) const; - kmer_t get_prefix(kmer_t kmer) const; - kmer_t get_suffix(kmer_t kmer) const; + Kmer get_prefix(Kmer kmer) const; + Kmer get_suffix(Kmer kmer) const; }; } // namespace sshash diff --git a/include/dictionary_types.hpp b/include/dictionary_types.hpp index f4645ab..ef77ca0 100644 --- a/include/dictionary_types.hpp +++ b/include/dictionary_types.hpp @@ -1,7 +1,7 @@ #pragma once #include "dictionary.hpp" -#include "endpoints.hpp" +#include "offsets.hpp" #include "kmer.hpp" namespace sshash { diff --git a/include/hash_util.hpp b/include/hash_util.hpp index 688af49..668b548 100644 --- a/include/hash_util.hpp +++ b/include/hash_util.hpp @@ -14,26 +14,26 @@ using minimizers_pthash_type = // true // minimal output >; // -template +template struct kmers_pthash_hasher_128 { typedef pthash::hash128 hash_type; - /* specialization for kmer_t */ - static inline pthash::hash128 hash(kmer_t x, uint64_t seed) { + /* specialization for Kmer */ + static inline pthash::hash128 hash(Kmer x, uint64_t seed) { return pthash::xxhash_128::hash(x.begin(), x.end(), seed); } }; -template -using kmers_base_hasher_type = kmers_pthash_hasher_128; -template -using kmers_pthash_type = // - pthash::partitioned_phf< // - kmers_base_hasher_type, // base hasher - pthash::opt_bucketer, // bucketer type - pthash::compact, // encoder type - true // minimal output - >; // +template +using kmers_base_hasher_type = kmers_pthash_hasher_128; +template +using kmers_pthash_type = // + pthash::partitioned_phf< // + kmers_base_hasher_type, // base hasher + pthash::opt_bucketer, // bucketer type + pthash::compact, // encoder type + true // minimal output + >; // struct mixer_64 { mixer_64() { seed(0); } diff --git a/include/kmer_iterator.hpp b/include/kmer_iterator.hpp index 62ecaed..0c07485 100644 --- a/include/kmer_iterator.hpp +++ b/include/kmer_iterator.hpp @@ -4,13 +4,13 @@ namespace sshash { -template +template struct kmer_iterator // { kmer_iterator() {} kmer_iterator(BitVector const& bv, const uint64_t k) - : m_bv(&bv), m_uint_kmer_bits(kmer_t::bits_per_char * k), m_pos(0), m_avail(0), m_buff(0) {} + : m_bv(&bv), m_uint_kmer_bits(Kmer::bits_per_char * k), m_pos(0), m_avail(0), m_buff(0) {} kmer_iterator(BitVector const& bv, const uint64_t k, const uint64_t pos) : kmer_iterator(bv, k) // @@ -24,38 +24,38 @@ struct kmer_iterator // m_buff = 0; } - kmer_t get() { + Kmer get() { if (m_avail < m_uint_kmer_bits) fill_buff(); auto kmer = m_buff; kmer.take(m_uint_kmer_bits); return kmer; } - kmer_t get_reverse() { + Kmer get_reverse() { if (m_avail < m_uint_kmer_bits) fill_buff_reverse(); auto kmer = m_buff; - kmer.drop(kmer_t::uint_kmer_bits - m_uint_kmer_bits); + kmer.drop(Kmer::uint_kmer_bits - m_uint_kmer_bits); return kmer; } void next() { - if (m_avail < kmer_t::bits_per_char) fill_buff(); + if (m_avail < Kmer::bits_per_char) fill_buff(); m_buff.drop_char(); - m_avail -= kmer_t::bits_per_char; - m_pos += kmer_t::bits_per_char; + m_avail -= Kmer::bits_per_char; + m_pos += Kmer::bits_per_char; } void next_reverse() { - if (m_avail < kmer_t::bits_per_char) fill_buff_reverse(); + if (m_avail < Kmer::bits_per_char) fill_buff_reverse(); m_buff.pad_char(); - m_avail -= kmer_t::bits_per_char; - m_pos -= kmer_t::bits_per_char; + m_avail -= Kmer::bits_per_char; + m_pos -= Kmer::bits_per_char; } inline uint64_t get_next_char() { - if (m_avail < kmer_t::bits_per_char) fill_buff(); - m_avail -= kmer_t::bits_per_char; - m_pos += kmer_t::bits_per_char; + if (m_avail < Kmer::bits_per_char) fill_buff(); + m_avail -= Kmer::bits_per_char; + m_pos += Kmer::bits_per_char; return m_buff.pop_char(); } @@ -63,27 +63,26 @@ struct kmer_iterator // private: inline void fill_buff() { - static_assert(kmer_t::uint_kmer_bits % 64 == 0); - for (int i = kmer_t::uint_kmer_bits - 64; i >= 0; i -= 64) { + static_assert(Kmer::uint_kmer_bits % 64 == 0); + for (int i = Kmer::uint_kmer_bits - 64; i >= 0; i -= 64) { m_buff.append64(m_bv->get_word64(m_pos + i)); } - m_avail = kmer_t::uint_kmer_bits; + m_avail = Kmer::uint_kmer_bits; } inline void fill_buff_reverse() { - static_assert(kmer_t::uint_kmer_bits % 64 == 0); - for (int i = kmer_t::uint_kmer_bits; i > 0; i -= 64) { - m_buff.append64( - m_bv->get_word64(std::max(m_pos, kmer_t::uint_kmer_bits) - i)); + static_assert(Kmer::uint_kmer_bits % 64 == 0); + for (int i = Kmer::uint_kmer_bits; i > 0; i -= 64) { + m_buff.append64(m_bv->get_word64(std::max(m_pos, Kmer::uint_kmer_bits) - i)); } - m_avail = std::min(m_pos, kmer_t::uint_kmer_bits); - m_buff.pad(kmer_t::uint_kmer_bits - m_avail); + m_avail = std::min(m_pos, Kmer::uint_kmer_bits); + m_buff.pad(Kmer::uint_kmer_bits - m_avail); } BitVector const* m_bv; uint64_t m_uint_kmer_bits; uint64_t m_pos, m_avail; - kmer_t m_buff; + Kmer m_buff; }; } // namespace sshash \ No newline at end of file diff --git a/include/minimizer_iterator.hpp b/include/minimizer_iterator.hpp index 0672a37..c350940 100644 --- a/include/minimizer_iterator.hpp +++ b/include/minimizer_iterator.hpp @@ -7,7 +7,7 @@ namespace sshash { /* "Re-scan" method. */ -template +template struct minimizer_iterator { minimizer_iterator() {} @@ -32,14 +32,14 @@ struct minimizer_iterator { m_min_position = m_position - 1; } - minimizer_info next(kmer_t kmer) { + minimizer_info next(Kmer kmer) { if (m_min_pos_in_kmer == 0) { /* min leaves the window: re-scan to compute the new min */ m_position = m_min_position + 1; rescan(kmer); } else { m_position += 1; - kmer_t mmer = kmer; + Kmer mmer = kmer; mmer.drop_chars(m_k - m_m); uint64_t hash = m_hasher.hash(uint64_t(mmer)); if (hash < m_min_hash) { @@ -54,7 +54,7 @@ struct minimizer_iterator { } assert(minimizer_info(m_min_value, m_min_pos_in_kmer) == - util::compute_minimizer(kmer, m_k, m_m, m_hasher)); + util::compute_minimizer(kmer, m_k, m_m, m_hasher)); return {m_min_value, m_min_position, m_min_pos_in_kmer}; } @@ -65,13 +65,13 @@ struct minimizer_iterator { uint64_t m_min_value, m_min_position, m_min_hash; hasher_type m_hasher; - void rescan(kmer_t kmer) { + void rescan(Kmer kmer) { m_min_hash = constants::invalid_uint64; m_min_value = constants::invalid_uint64; m_min_pos_in_kmer = 0; uint64_t begin = m_position; for (uint64_t i = 0; i != m_k - m_m + 1; ++i, ++m_position) { - kmer_t mmer = kmer; + Kmer mmer = kmer; kmer.drop_char(); mmer.take_chars(m_m); uint64_t hash = m_hasher.hash(uint64_t(mmer)); @@ -89,7 +89,7 @@ struct minimizer_iterator { /* "Re-scan" method. */ -template +template struct minimizer_iterator_rc { minimizer_iterator_rc() {} @@ -114,14 +114,14 @@ struct minimizer_iterator_rc { m_min_position = m_position - 1; } - minimizer_info next(kmer_t kmer) { + minimizer_info next(Kmer kmer) { if (m_min_pos_in_kmer == m_k - m_m) { /* min leaves the window: re-scan to compute the new min */ m_position = m_min_position + 1; rescan(kmer); } else { m_position += 1; - kmer_t mmer = kmer; + Kmer mmer = kmer; mmer.take_chars(m_m); uint64_t hash = m_hasher.hash(uint64_t(mmer)); if (hash <= m_min_hash) { @@ -136,7 +136,7 @@ struct minimizer_iterator_rc { } assert(minimizer_info(m_min_value, m_min_pos_in_kmer) == - util::compute_minimizer(kmer, m_k, m_m, m_hasher)); + util::compute_minimizer(kmer, m_k, m_m, m_hasher)); return {m_min_value, m_min_position, m_min_pos_in_kmer}; } @@ -147,13 +147,13 @@ struct minimizer_iterator_rc { uint64_t m_min_value, m_min_position, m_min_hash; hasher_type m_hasher; - void rescan(kmer_t kmer) { + void rescan(Kmer kmer) { m_min_hash = constants::invalid_uint64; m_min_value = constants::invalid_uint64; m_min_pos_in_kmer = 0; uint64_t begin = m_position; for (int64_t i = m_k - m_m; i >= 0; --i, ++m_position) { - kmer_t mmer = kmer; + Kmer mmer = kmer; mmer.drop_chars(i); mmer.take_chars(m_m); uint64_t hash = m_hasher.hash(uint64_t(mmer)); diff --git a/include/minimizers.hpp b/include/minimizers_control_map.hpp similarity index 61% rename from include/minimizers.hpp rename to include/minimizers_control_map.hpp index 657f2a4..914df86 100644 --- a/include/minimizers.hpp +++ b/include/minimizers_control_map.hpp @@ -1,12 +1,12 @@ #pragma once -#include "util.hpp" - namespace sshash { -struct minimizers { +struct minimizers_control_map // +{ template - void build(ForwardIterator begin, uint64_t size, build_configuration const& build_config) // + void build(ForwardIterator begin, const uint64_t size, // + build_configuration const& build_config) // { pthash::build_configuration mphf_build_config; mphf_build_config.lambda = build_config.lambda; @@ -30,26 +30,37 @@ struct minimizers { << std::endl; } - m_mphf.build_in_external_memory(begin, size, mphf_build_config); + mphf.build_in_external_memory(begin, size, mphf_build_config); + } + + uint64_t lookup(uint64_t minimizer) const { + uint64_t minimizer_id = mphf(minimizer); + return control_codewords.access(minimizer_id); } - uint64_t lookup(uint64_t uint64_minimizer) const { return m_mphf(uint64_minimizer); } + uint64_t size() const { return mphf.num_keys(); } - uint64_t size() const { return m_mphf.num_keys(); } - uint64_t num_bits() const { return m_mphf.num_bits(); } + uint64_t num_bits() const { return mphf.num_bits() + 8 * control_codewords.num_bytes(); } template void visit(Visitor& visitor) const { - visitor.visit(m_mphf); + visit_impl(visitor, *this); } template void visit(Visitor& visitor) { - visitor.visit(m_mphf); + visit_impl(visitor, *this); } + minimizers_pthash_type mphf; + bits::compact_vector control_codewords; + private: - minimizers_pthash_type m_mphf; + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.mphf); + visitor.visit(t.control_codewords); + } }; -} // namespace sshash +} // namespace sshash \ No newline at end of file diff --git a/include/endpoints.hpp b/include/offsets.hpp similarity index 80% rename from include/endpoints.hpp rename to include/offsets.hpp index 0951178..3d464ba 100644 --- a/include/endpoints.hpp +++ b/include/offsets.hpp @@ -55,29 +55,34 @@ struct decoded_offsets // uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; auto q = m_seq.locate(kmer_offset); - uint64_t contig_id = q.first.pos; - uint64_t contig_begin = q.first.val; - uint64_t contig_end = q.second.val; + uint64_t string_id = q.first.pos; + uint64_t string_begin = q.first.val; + uint64_t string_end = q.second.val; /* The following facts hold. */ - assert(kmer_offset >= contig_id * (k - 1)); - assert(contig_begin <= kmer_offset); - assert(kmer_offset < contig_end); + assert(kmer_offset >= string_id * (k - 1)); + assert(string_begin <= kmer_offset); + assert(kmer_offset < string_end); /****************************/ - uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); - uint64_t relative_kmer_id = kmer_offset - contig_begin; - uint64_t contig_length = contig_end - contig_begin; - assert(contig_length >= k); - uint64_t contig_size = contig_length - k + 1; + if (kmer_offset >= string_end - k + 1) return lookup_result(); + + uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); + uint64_t relative_kmer_id = kmer_offset - string_begin; + uint64_t string_length = string_end - string_begin; + assert(string_length >= k); + uint64_t string_size = string_length - k + 1; lookup_result res; res.kmer_id = absolute_kmer_id; - res.kmer_id_in_contig = relative_kmer_id; - res.contig_id = contig_id; - res.contig_size = contig_size; - assert(contig_begin == res.contig_begin(k)); - assert(contig_end == res.contig_end(k)); + res.kmer_id_in_string = relative_kmer_id; + res.string_id = string_id; + res.string_size = string_size; + + assert(res.kmer_id_in_string < res.string_size); + assert(res.string_id < m_seq.size()); + assert(string_begin == res.string_begin(k)); + assert(string_end == res.string_end(k)); assert(kmer_offset == res.kmer_offset(k)); return res; @@ -213,36 +218,40 @@ struct encoded_offsets // lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // { - if (p.absolute_offset < pos_in_kmer or // - p.absolute_offset - pos_in_kmer < p.string_begin) // + if (p.absolute_offset < pos_in_kmer or // + p.absolute_offset - pos_in_kmer < p.string_begin or // + p.absolute_offset - pos_in_kmer >= p.string_end - k + 1) // { return lookup_result(); } uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; - uint64_t contig_id = p.string_id; - uint64_t contig_begin = p.string_begin; - uint64_t contig_end = p.string_end; + uint64_t string_id = p.string_id; + uint64_t string_begin = p.string_begin; + uint64_t string_end = p.string_end; /* The following facts hold. */ - assert(kmer_offset >= contig_id * (k - 1)); - assert(contig_begin <= kmer_offset); - assert(kmer_offset < contig_end); + assert(kmer_offset >= string_id * (k - 1)); + assert(string_begin <= kmer_offset); + assert(kmer_offset < string_end); /****************************/ - uint64_t absolute_kmer_id = kmer_offset - contig_id * (k - 1); - uint64_t relative_kmer_id = kmer_offset - contig_begin; - uint64_t contig_length = contig_end - contig_begin; - assert(contig_length >= k); - uint64_t contig_size = contig_length - k + 1; + uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); + uint64_t relative_kmer_id = kmer_offset - string_begin; + uint64_t string_length = string_end - string_begin; + assert(string_length >= k); + uint64_t string_size = string_length - k + 1; lookup_result res; res.kmer_id = absolute_kmer_id; - res.kmer_id_in_contig = relative_kmer_id; - res.contig_id = contig_id; - res.contig_size = contig_size; - assert(contig_begin == res.contig_begin(k)); - assert(contig_end == res.contig_end(k)); + res.kmer_id_in_string = relative_kmer_id; + res.string_id = string_id; + res.string_size = string_size; + + assert(res.kmer_id_in_string < res.string_size); + assert(res.string_id < m_seq.size()); + assert(string_begin == res.string_begin(k)); + assert(string_end == res.string_end(k)); assert(kmer_offset == res.kmer_offset(k)); return res; @@ -281,7 +290,9 @@ struct encoded_offsets // uint64_t size() const { return m_seq.size(); } - uint64_t num_bytes() const { return m_seq.num_bytes(); } + uint64_t num_bytes() const { + return sizeof(m_num_bits_per_relative_offset) + m_seq.num_bytes(); + } struct iterator { iterator() {} diff --git a/include/skew_index.hpp b/include/skew_index.hpp index 23d2434..01e3382 100644 --- a/include/skew_index.hpp +++ b/include/skew_index.hpp @@ -4,8 +4,9 @@ namespace sshash { -template -struct skew_index { +template +struct skew_index // +{ skew_index() { mphfs.resize(0); positions.resize(0); @@ -32,11 +33,16 @@ struct skew_index { return num_kmers_in_skew_index; } - uint64_t lookup(kmer_t uint_kmer, uint64_t partition_id) const { + uint64_t lookup(const Kmer uint_kmer, uint64_t code) const { + code >>= 2; + uint64_t partition_id = code & 7; + uint64_t begin = code >> 3; assert(partition_id < mphfs.size()); auto const& f = mphfs[partition_id]; auto const& p = positions[partition_id]; - return p.access(f(uint_kmer)); + uint64_t pos_in_bucket = p.access(f(uint_kmer)); + uint64_t offset = heavy_load_buckets.access(begin + pos_in_bucket); + return offset; } uint64_t num_bits() const { @@ -46,7 +52,7 @@ struct skew_index { auto const& p = positions[partition_id]; n += f.num_bits() + p.num_bytes() * 8; } - return n; + return n + 8 * heavy_load_buckets.num_bytes(); } template @@ -59,14 +65,16 @@ struct skew_index { visit_impl(visitor, *this); } - std::vector> mphfs; + std::vector> mphfs; std::vector positions; + bits::compact_vector heavy_load_buckets; private: template static void visit_impl(Visitor& visitor, T&& t) { visitor.visit(t.mphfs); visitor.visit(t.positions); + visitor.visit(t.heavy_load_buckets); } }; diff --git a/include/sparse_and_skew_index.hpp b/include/sparse_and_skew_index.hpp new file mode 100644 index 0000000..6a78246 --- /dev/null +++ b/include/sparse_and_skew_index.hpp @@ -0,0 +1,99 @@ +#pragma once + +#include "minimizers_control_map.hpp" +#include "skew_index.hpp" + +namespace sshash { + +template +struct sparse_and_skew_index // +{ + struct bucket_iterator { + bucket_iterator(sparse_and_skew_index const* ssi, uint64_t pos, uint64_t size, + bucket_t bucket_type) + : m_size(size) + , m_offset(constants::invalid_uint64) + , m_bucket_type(bucket_type) // + { + assert(size > 0); + if (size == 1) { + m_offset = pos; + } else { + m_it = ssi->mid_load_buckets.get_iterator_at(pos); + } + } + + uint64_t operator*() const { return m_size == 1 ? m_offset : *m_it; } + void operator++() { + if (m_size != 1) ++m_it; + } + + uint64_t size() const { return m_size; } + bucket_t bucket_type() const { return m_bucket_type; } + + private: + uint64_t m_size; + uint64_t m_offset; + bucket_t m_bucket_type; + bits::compact_vector::iterator m_it; + }; + + bucket_iterator lookup(const Kmer uint_kmer, const minimizer_info mini_info) const // + { + uint64_t code = codewords.lookup(mini_info.minimizer); + + uint64_t status = code & 1; + if (status == bucket_t::SINGLETON) { // minimizer occurs once + uint64_t offset = code >> 1; + return {this, offset, 1, bucket_t::SINGLETON}; + } + + status = code & 3; + if (status == bucket_t::MIDLOAD) { // minimizer occurs more than once, but is not part of + // the skew index + constexpr uint64_t mask = (uint64_t(1) << constants::min_l) - 1; + code >>= 2; + uint64_t bucket_size = (code & mask) + 2; + uint64_t bucket_id = code >> constants::min_l; + assert(bucket_size < begin_buckets_of_size.size()); + uint64_t begin = begin_buckets_of_size[bucket_size] + bucket_id * bucket_size; + return {this, begin, bucket_size, bucket_t::MIDLOAD}; + } + + assert(status == bucket_t::HEAVYLOAD); // minimizer is part of the skew index + uint64_t offset = m_skew_index.lookup(uint_kmer, code); + return {this, offset, 1, bucket_t::HEAVYLOAD}; + } + + uint64_t num_bits() const { + return codewords.num_bits() + + 8 * (essentials::vec_bytes(begin_buckets_of_size) + mid_load_buckets.num_bytes()) + + m_skew_index.num_bits(); + } + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + + minimizers_control_map codewords; + std::vector begin_buckets_of_size; + bits::compact_vector mid_load_buckets; + skew_index m_skew_index; + +private: + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.codewords); + visitor.visit(t.begin_buckets_of_size); + visitor.visit(t.mid_load_buckets); + visitor.visit(t.m_skew_index); + } +}; + +} // namespace sshash \ No newline at end of file diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp new file mode 100644 index 0000000..6c78665 --- /dev/null +++ b/include/spectrum_preserving_string_set.hpp @@ -0,0 +1,265 @@ +#pragma once + +#include "kmer_iterator.hpp" + +namespace sshash { + +template +struct spectrum_preserving_string_set // +{ + /* Return where the string begins and ends in `strings`. */ + std::pair // [begin, end) + string_offsets(const uint64_t string_id) const { + uint64_t begin = strings_offsets.access(string_id); + uint64_t end = strings_offsets.access(string_id + 1); + assert(end > begin); + return {begin, end}; + } + + Kmer string_prefix(const uint64_t string_id) const { + uint64_t string_begin = strings_offsets.access(string_id); + return util::read_kmer_at(strings, k - 1, Kmer::bits_per_char * string_begin); + } + + Kmer string_suffix(const uint64_t string_id) const { + uint64_t string_end = strings_offsets.access(string_id + 1); + return util::read_kmer_at(strings, k - 1, Kmer::bits_per_char * (string_end - k + 1)); + } + + template + lookup_result lookup_regular(Iterator it, // + const Kmer kmer, // + const minimizer_info mini_info) const // + { + const uint64_t size = it.size(); + assert(size > 0); + + uint64_t minimizer_offset = *it; + auto p = strings_offsets.decode(minimizer_offset); + + { + /* check minimizer first */ + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, Kmer::bits_per_char * p.absolute_offset)); + if (read_mmer != mini_info.minimizer) // + { + /* + The function `lookup_regular` determines if the minimizer is found at the + offset `Kmer::bits_per_char * p.absolute_offset`, not whether the minimizer + does not appear at all. In fact, it can happen that the minimizer appear but + not at the specified offset, so it would be wrong to set `res.minimizer_found` + to `false`. This can happen for HEAVYLOAD buckets only because their lookup is + resolved via the skew index and `pos_in_bucket` might be larger than the size + of the bucket (which we do not know for a HEAVYLOAD bucket). Since for streaming + queries we keep track of the presence of minimizers (i.e., whether they appear + in the index or not), only in this special case we set + `res.minimizer_found` to `true` to indicate that we do not know whether the + minimizer appears in the index or not. + */ + return lookup_result(it.bucket_type() != bucket_t::HEAVYLOAD ? false : true); + } + } + + auto res = _lookup_regular(p, kmer, mini_info); + if (res.kmer_id != constants::invalid_uint64) return res; + + for (uint64_t i = 1; i != size; ++i) { + ++it; + minimizer_offset = *it; + p = strings_offsets.decode(minimizer_offset); + res = _lookup_regular(p, kmer, mini_info); + if (res.kmer_id != constants::invalid_uint64) return res; + } + + return lookup_result(); + } + + template + lookup_result lookup_canonical(Iterator it, // + const Kmer kmer, const Kmer kmer_rc, // + const minimizer_info mini_info) const // + { + const uint64_t size = it.size(); + assert(size > 0); + + uint64_t minimizer_offset = *it; + auto p = strings_offsets.decode(minimizer_offset); + + { + /* check minimizer first */ + uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, Kmer::bits_per_char * p.absolute_offset)); + auto tmp = Kmer(mini_info.minimizer); + tmp.reverse_complement_inplace(m); + uint64_t minimizer_rc = uint64_t(tmp); + if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { + /* Same note as for the function `lookup_regular`. */ + return lookup_result(it.bucket_type() != bucket_t::HEAVYLOAD ? false : true); + } + } + + auto res = _lookup_canonical(p, kmer, kmer_rc, mini_info); + if (res.kmer_id != constants::invalid_uint64) return res; + + for (uint64_t i = 1; i != size; ++i) { + ++it; + minimizer_offset = *it; + p = strings_offsets.decode(minimizer_offset); + res = _lookup_canonical(p, kmer, kmer_rc, mini_info); + if (res.kmer_id != constants::invalid_uint64) return res; + } + + return lookup_result(); + } + + void access(const uint64_t kmer_id, char* string_kmer) const { + auto [_, offset] = strings_offsets.id_to_offset(kmer_id, k); + auto read_kmer = util::read_kmer_at(strings, k, Kmer::bits_per_char * offset); + util::uint_kmer_to_string(read_kmer, string_kmer, k); + } + + struct iterator { + iterator() {} + + iterator(spectrum_preserving_string_set const* ptr, // + const uint64_t begin_kmer_id, const uint64_t end_kmer_id, // [begin,end) + const uint64_t k) + : m_ptr(ptr) + , m_begin_kmer_id(begin_kmer_id) + , m_end_kmer_id(end_kmer_id) + , k(k) + , m_it(ptr->strings, k) // + { + auto [pos, val] = m_ptr->strings_offsets.id_to_offset(m_begin_kmer_id, k); + m_offset = val; + m_strings_offsets_it = m_ptr->strings_offsets.get_iterator_at(pos); + assert(m_strings_offsets_it.value() > m_offset); + next_piece(); + } + + bool has_next() const { return m_begin_kmer_id != m_end_kmer_id; } + + std::pair // (kmer-id, encoded kmer) + next() { + if (m_offset == m_next_offset - k + 1) { + m_offset = m_next_offset; + next_piece(); + } + m_ret.first = m_begin_kmer_id; + if (m_clear) { + m_ret.second = m_it.get(); + assert(Kmer::bits_per_char * m_offset == m_it.position()); + m_it.at(Kmer::bits_per_char * (m_offset + k)); + } else { + m_ret.second.drop_char(); + m_ret.second.set(k - 1, m_it.get_next_char()); + } + m_clear = false; + ++m_begin_kmer_id; + ++m_offset; + return m_ret; + } + + private: + std::pair m_ret; + spectrum_preserving_string_set const* m_ptr; + uint64_t m_begin_kmer_id, m_end_kmer_id; + uint64_t k; + uint64_t m_offset, m_next_offset; + kmer_iterator m_it; + typename Offsets::iterator m_strings_offsets_it; + bool m_clear; + + void next_piece() { + m_it.at(Kmer::bits_per_char * m_offset); + m_next_offset = m_strings_offsets_it.value(); + assert(m_next_offset > m_offset); + m_clear = true; + m_strings_offsets_it.next(); + } + }; + + iterator at(const uint64_t begin_kmer_id, const uint64_t end_kmer_id) const { + return iterator(this, begin_kmer_id, end_kmer_id, k); + } + + uint64_t num_bits() const { + return 8 * (sizeof(k) + sizeof(m) + strings_offsets.num_bytes() + strings.num_bytes()); + } + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + + uint16_t k; + uint16_t m; + Offsets strings_offsets; + bits::bit_vector strings; + +private: + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.k); + visitor.visit(t.m); + visitor.visit(t.strings_offsets); + visitor.visit(t.strings); + } + + lookup_result _lookup_regular(typename Offsets::decoded_offset p, // + const Kmer kmer, // + const minimizer_info mini_info) const // + { + auto res = strings_offsets.offset_to_id(p, mini_info.pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + uint64_t kmer_offset = res.kmer_offset(k); + auto read_kmer = + util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); + if (read_kmer == kmer) return res; + } + return lookup_result(); + } + + lookup_result _lookup_canonical(typename Offsets::decoded_offset p, // + const Kmer kmer, // + const Kmer kmer_rc, // + const minimizer_info mini_info) const // + { + // TODO: maybe we can optimize this logic. + // Because `pos_in_kmer` and `k - m - mini_info.pos_in_kmer` are close + // and most of the time they should belong to the same string, so it would + // be good to avoid accessing the strings_offsets again. + + uint64_t pos_in_kmer = mini_info.pos_in_kmer; + auto res = __lookup_canonical(p, kmer, kmer_rc, pos_in_kmer); + if (res.kmer_id != constants::invalid_uint64) return res; + pos_in_kmer = k - m - mini_info.pos_in_kmer; + return __lookup_canonical(p, kmer, kmer_rc, pos_in_kmer); + } + + lookup_result __lookup_canonical(typename Offsets::decoded_offset p, // + const Kmer kmer, // + const Kmer kmer_rc, // + const uint64_t pos_in_kmer) const // + { + auto res = strings_offsets.offset_to_id(p, pos_in_kmer, k); + if (res.kmer_id != constants::invalid_uint64) { + uint64_t kmer_offset = res.kmer_offset(k); + auto read_kmer = + util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); + if (read_kmer == kmer) return res; + if (read_kmer == kmer_rc) { + res.kmer_orientation = constants::backward_orientation; + return res; + } + } + return lookup_result(); + } +}; + +} // namespace sshash \ No newline at end of file diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index d8c8e52..5907339 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -28,8 +28,8 @@ struct streaming_query // , m_curr_mini_info_rc() , m_prev_mini_info_rc() - , m_it(dict->m_buckets.strings, m_k) - , m_remaining_contig_bases(0) + , m_it(dict->m_spss.strings, m_k) + , m_remaining_string_bases(0) , m_num_searches(0) , m_num_extensions(0) @@ -47,7 +47,7 @@ struct streaming_query // void reset() { m_start = true; - m_remaining_contig_bases = 0; + m_remaining_string_bases = 0; m_res = lookup_result(); m_minimizer_it.reset(); m_minimizer_it_rc.reset(); @@ -83,7 +83,7 @@ struct streaming_query // m_curr_mini_info_rc = m_minimizer_it_rc.next(m_kmer_rc); /* 3. compute result */ - if (m_remaining_contig_bases == 0) { + if (m_remaining_string_bases == 0) { seed(); } else { auto expected_kmer = (m_res.kmer_orientation == constants::forward_orientation) @@ -92,8 +92,8 @@ struct streaming_query // if ((expected_kmer == m_kmer) or (expected_kmer == m_kmer_rc)) { ++m_num_extensions; m_res.kmer_id += m_res.kmer_orientation; - m_res.kmer_id_in_contig += m_res.kmer_orientation; - m_remaining_contig_bases -= 1; + m_res.kmer_id_in_string += m_res.kmer_orientation; + m_remaining_string_bases -= 1; } else { seed(); } @@ -133,7 +133,7 @@ struct streaming_query // /* string state */ kmer_iterator m_it; - uint64_t m_remaining_contig_bases; + uint64_t m_remaining_string_bases; /* performance counts */ uint64_t m_num_searches; @@ -143,7 +143,7 @@ struct streaming_query // void seed() // { - m_remaining_contig_bases = 0; + m_remaining_string_bases = 0; /* if minimizer does not change and previous minimizer was not found, surely any kmer having the same minimizer cannot be found as well */ @@ -186,11 +186,11 @@ struct streaming_query // assert(m_res.minimizer_found == true); m_num_searches += 1; - uint64_t kmer_offset = 2 * (m_res.kmer_id + m_res.contig_id * (m_k - 1)); - m_remaining_contig_bases = (m_res.contig_size - 1) - m_res.kmer_id_in_contig; + uint64_t kmer_offset = 2 * (m_res.kmer_id + m_res.string_id * (m_k - 1)); + m_remaining_string_bases = (m_res.string_size - 1) - m_res.kmer_id_in_string; if (m_res.kmer_orientation == constants::backward_orientation) { kmer_offset += 2 * m_k; - m_remaining_contig_bases = m_res.kmer_id_in_contig; + m_remaining_string_bases = m_res.kmer_id_in_string; } m_it.at(kmer_offset); } diff --git a/include/util.hpp b/include/util.hpp index d2ef994..8b0983e 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -10,7 +10,13 @@ namespace sshash { -enum input_file_type { fasta, cf_seg }; +enum bucket_t : int { + SINGLETON = 0, // minimizer appears only once + MIDLOAD = 1, // minimizer appears > 1 but < 2^l times + HEAVYLOAD = 3 // minimizer appears >= 2^l times +}; + +enum input_file_t { fasta, cf_seg }; struct streaming_query_report { streaming_query_report() @@ -32,48 +38,38 @@ struct streaming_query_report { struct lookup_result { lookup_result(bool mf = true) : kmer_id(constants::invalid_uint64) - , kmer_id_in_contig(constants::invalid_uint64) + , kmer_id_in_string(constants::invalid_uint64) , kmer_orientation(constants::forward_orientation) - , contig_id(constants::invalid_uint64) - , contig_size(constants::invalid_uint64) - - // /* - // The kmer's minimizer occurs for `list_size` times. - // If `list_size` == -1, then the minimizer is part of - // the skew index. - // */ - // , list_size(constants::invalid_uint64) - + , string_id(constants::invalid_uint64) + , string_size(constants::invalid_uint64) , minimizer_found(mf) {} uint64_t kmer_id; // "absolute" kmer-id - uint64_t kmer_id_in_contig; // "relative" kmer-id: 0 <= kmer_id_in_contig < contig_size + uint64_t kmer_id_in_string; // "relative" kmer-id: 0 <= kmer_id_in_string < string_size int64_t kmer_orientation; - uint64_t contig_id; - uint64_t contig_size; - // uint64_t list_size; - + uint64_t string_id; + uint64_t string_size; bool minimizer_found; uint64_t kmer_offset(const uint64_t k) const { // - return kmer_id + contig_id * (k - 1); + return kmer_id + string_id * (k - 1); } - uint64_t contig_begin(const uint64_t k) const { // - return kmer_offset(k) - kmer_id_in_contig; + uint64_t string_begin(const uint64_t k) const { // + return kmer_offset(k) - kmer_id_in_string; } - uint64_t contig_end(const uint64_t k) const { // - return contig_begin(k) + contig_size + k - 1; + uint64_t string_end(const uint64_t k) const { // + return string_begin(k) + string_size + k - 1; } }; inline std::ostream& operator<<(std::ostream& os, lookup_result const& res) { os << " == kmer_id = " << res.kmer_id << '\n'; - os << " == kmer_id_in_contig = " << res.kmer_id_in_contig << '\n'; + os << " == kmer_id_in_string = " << res.kmer_id_in_string << '\n'; os << " == kmer_orientation = " << res.kmer_orientation << '\n'; - os << " == contig_id = " << res.contig_id << '\n'; - os << " == contig_size = " << res.contig_size << '\n'; + os << " == string_id = " << res.string_id << '\n'; + os << " == string_size = " << res.string_size << '\n'; os << " == minimizer_found = " << (res.minimizer_found ? "true" : "false") << '\n'; return os; } @@ -115,9 +111,9 @@ struct minimizer_info { << std::endl; good = false; } - if (expected.kmer_id_in_contig != got.kmer_id_in_contig) { - std::cout << "expected kmer_id_in_contig " << expected.kmer_id_in_contig << " but got " - << got.kmer_id_in_contig << std::endl; + if (expected.kmer_id_in_string != got.kmer_id_in_string) { + std::cout << "expected kmer_id_in_string " << expected.kmer_id_in_string << " but got " + << got.kmer_id_in_string << std::endl; good = false; } if (got.kmer_id != constants::invalid_uint64 and @@ -126,14 +122,14 @@ struct minimizer_info { << got.kmer_orientation << std::endl; good = false; } - if (expected.contig_id != got.contig_id) { - std::cout << "expected contig_id " << expected.contig_id << " but got " << got.contig_id + if (expected.string_id != got.string_id) { + std::cout << "expected string_id " << expected.string_id << " but got " << got.string_id << std::endl; good = false; } - if (expected.contig_size != got.contig_size) { - std::cout << "expected contig_size " << expected.contig_size << " but got " - << got.contig_size << std::endl; + if (expected.string_size != got.string_size) { + std::cout << "expected string_size " << expected.string_size << " but got " + << got.string_size << std::endl; good = false; } return good; diff --git a/src/build.cpp b/src/build.cpp index 08d5739..5180e07 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -5,23 +5,24 @@ namespace sshash { -template -void dictionary::build(std::string const& filename, - build_configuration const& build_config) { +template +void dictionary::build(std::string const& filename, + build_configuration const& build_config) // +{ /* Validate the build configuration. */ if (build_config.k == 0) throw std::runtime_error("k must be > 0"); - if (build_config.k > kmer_t::max_k) { - throw std::runtime_error("k must be less <= " + std::to_string(kmer_t::max_k) + + if (build_config.k > Kmer::max_k) { + throw std::runtime_error("k must be less <= " + std::to_string(Kmer::max_k) + " but got k = " + std::to_string(build_config.k)); } if (build_config.m == 0) throw std::runtime_error("m must be > 0"); - if (build_config.m > kmer_t::max_m) { - throw std::runtime_error("m must be less <= " + std::to_string(kmer_t::max_m) + + if (build_config.m > Kmer::max_m) { + throw std::runtime_error("m must be less <= " + std::to_string(Kmer::max_m) + " but got m = " + std::to_string(build_config.m)); } if (build_config.m > build_config.k) throw std::runtime_error("m must be <= k"); - dictionary_builder builder(build_config); + dictionary_builder builder(build_config); builder.build(*this, filename); } diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 240e55b..5c52cab 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -4,69 +4,28 @@ namespace sshash { -template -lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer) const { +template +lookup_result dictionary::lookup_uint_regular(const Kmer uint_kmer) const { auto mini_info = util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher); return lookup_uint_regular(uint_kmer, mini_info); } -template -lookup_result dictionary::lookup_uint_regular(kmer_t uint_kmer, // - minimizer_info mini_info) const // +template +lookup_result dictionary::lookup_uint_regular( + const Kmer uint_kmer, // + const minimizer_info mini_info) const // { assert(minimizer_info(mini_info.minimizer, mini_info.pos_in_kmer) == util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher)); - const uint64_t minimizer_id = m_minimizers.lookup(mini_info.minimizer); - - uint64_t code = m_buckets.offsets.access(minimizer_id); - uint64_t status = code & 1; - if (status == 0) { // minimizer occurs once - uint64_t offset = code >> 1; - auto res = m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); - // res.list_size = 1; - return res; - } - - status = code & 3; - code >>= 2; - if (status == 1) { // minimizer occurs more than once, but is not part of the skew index - constexpr uint64_t mask = (uint64_t(1) << constants::min_l) - 1; - uint64_t list_size = (code & mask) + 2; - uint64_t list_id = code >> constants::min_l; - assert(list_size < m_buckets.start_lists_of_size.size()); - uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; - uint64_t end = begin + list_size; - auto res = m_buckets.lookup(begin, end, uint_kmer, mini_info, m_k, m_m); - // res.list_size = list_size; - return res; - } - - // minimizer is part of the skew index - assert(status == 3); - uint64_t partition_id = code & 7; - uint64_t begin = code >> 3; - uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer, partition_id); - uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); - auto res = m_buckets.lookup_at_offset(offset, uint_kmer, mini_info, m_k, m_m); - /* - The function `lookup_at_offset` determines if the minimizer is found at the given - `offset`, not whether the minimizer does not appear at all. - It can happen that the `mini_info.minimizer` appears somewhere but not at the - computed `offset` because `pos_in_bucket` might be larger than the size of - the bucket (which we do not know for minimizers in the skew index). - Since for streaming queries we keep track of the presence - of minimizers, only in this special case we set `res.minimizer_found` to true - to indicate that we do not know whether the minimizer appears in the index or not. - */ - res.minimizer_found = true; - return res; + auto it = m_ssi.lookup(uint_kmer, mini_info); + return m_spss.lookup_regular(it, uint_kmer, mini_info); } -template -lookup_result dictionary::lookup_uint_canonical(kmer_t uint_kmer) const // +template +lookup_result dictionary::lookup_uint_canonical(Kmer uint_kmer) const // { - kmer_t uint_kmer_rc = uint_kmer; + Kmer uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(m_k); auto mini_info = util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher); auto mini_info_rc = util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher); @@ -83,62 +42,25 @@ lookup_result dictionary::lookup_uint_canonical(kmer_t uint_k } } -template -lookup_result dictionary::lookup_uint_canonical( - kmer_t uint_kmer, kmer_t uint_kmer_rc, - minimizer_info mini_info) const // +template +lookup_result dictionary::lookup_uint_canonical( + const Kmer uint_kmer, // + const Kmer uint_kmer_rc, // + const minimizer_info mini_info) const // { assert(mini_info.minimizer == std::min(util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher).minimizer, util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher).minimizer)); - const uint64_t minimizer_id = m_minimizers.lookup(mini_info.minimizer); - - uint64_t code = m_buckets.offsets.access(minimizer_id); - uint64_t status = code & 1; - if (status == 0) { // minimizer occurs once - uint64_t offset = code >> 1; - auto res = m_buckets.lookup_canonical_at_offset( // - offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // - ); - // res.list_size = 1; - return res; - } - - status = code & 3; - code >>= 2; - if (status == 1) { // minimizer occurs more than once, but is not part of the skew index - constexpr uint64_t mask = (uint64_t(1) << constants::min_l) - 1; - uint64_t list_size = (code & mask) + 2; - uint64_t list_id = code >> constants::min_l; - assert(list_size < m_buckets.start_lists_of_size.size()); - uint64_t begin = m_buckets.start_lists_of_size[list_size] + list_id * list_size; - uint64_t end = begin + list_size; - auto res = m_buckets.lookup_canonical( // - begin, end, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // - ); - // res.list_size = list_size; - return res; - } - - // minimizer is part of the skew index - assert(status == 3); - uint64_t partition_id = code & 7; - uint64_t begin = code >> 3; - const auto uint_kmer_canon = std::min(uint_kmer, uint_kmer_rc); - uint64_t pos_in_bucket = m_skew_index.lookup(uint_kmer_canon, partition_id); - uint64_t offset = m_buckets.offsets3.access(begin + pos_in_bucket); - auto res = m_buckets.lookup_canonical_at_offset( // - offset, uint_kmer, uint_kmer_rc, mini_info, m_k, m_m // - ); - res.minimizer_found = true; // see note above in the function `lookup_uint_regular` - return res; + const Kmer uint_kmer_canon = std::min(uint_kmer, uint_kmer_rc); + auto it = m_ssi.lookup(uint_kmer_canon, mini_info); + return m_spss.lookup_canonical(it, uint_kmer, uint_kmer_rc, mini_info); } -template -lookup_result dictionary::lookup(char const* string_kmer, - bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); +template +lookup_result dictionary::lookup(char const* string_kmer, + bool check_reverse_complement) const { + Kmer uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); /* SIMD here does not help, as expected, because it is only used at the beginning of each query. To be useful, we would need to process a @@ -148,17 +70,18 @@ lookup_result dictionary::lookup(char const* string_kmer, */ // __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(string_kmer)); // uint64_t word = pack2bits_shift1(v); - // kmer_t uint_kmer(word); + // Kmer uint_kmer(word); return lookup_uint(uint_kmer, check_reverse_complement); } -template -lookup_result dictionary::lookup_uint(kmer_t uint_kmer, - bool check_reverse_complement) const { +template +lookup_result dictionary::lookup_uint(Kmer uint_kmer, + bool check_reverse_complement) const // +{ if (m_canonical) return lookup_uint_canonical(uint_kmer); auto res = lookup_uint_regular(uint_kmer); assert(res.kmer_orientation == constants::forward_orientation); if (check_reverse_complement and res.kmer_id == constants::invalid_uint64) { - kmer_t uint_kmer_rc = uint_kmer; + Kmer uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(m_k); res = lookup_uint_regular(uint_kmer_rc); res.kmer_orientation = constants::backward_orientation; @@ -166,136 +89,135 @@ lookup_result dictionary::lookup_uint(kmer_t uint_kmer, return res; } -template -bool dictionary::is_member(char const* string_kmer, - bool check_reverse_complement) const { +template +bool dictionary::is_member(char const* string_kmer, + bool check_reverse_complement) const { return lookup(string_kmer, check_reverse_complement) != constants::invalid_uint64; } -template -bool dictionary::is_member_uint(kmer_t uint_kmer, - bool check_reverse_complement) const { +template +bool dictionary::is_member_uint(Kmer uint_kmer, + bool check_reverse_complement) const { return lookup_uint(uint_kmer, check_reverse_complement) != constants::invalid_uint64; } -template -void dictionary::access(uint64_t kmer_id, char* string_kmer) const { +template +void dictionary::access(uint64_t kmer_id, char* string_kmer) const { assert(kmer_id < num_kmers()); - m_buckets.access(kmer_id, string_kmer, m_k); + m_spss.access(kmer_id, string_kmer); } -template -uint64_t dictionary::weight(uint64_t kmer_id) const { +template +uint64_t dictionary::weight(uint64_t kmer_id) const { assert(kmer_id < num_kmers()); return m_weights.weight(kmer_id); } -template -uint64_t dictionary::contig_size(uint64_t contig_id) const { - assert(contig_id < num_strings()); - auto [begin, end] = m_buckets.contig_offsets(contig_id); - uint64_t contig_length = end - begin; - assert(contig_length >= m_k); - return contig_length - m_k + 1; +template +uint64_t dictionary::string_size(uint64_t string_id) const { + assert(string_id < num_strings()); + auto [begin, end] = m_spss.string_offsets(string_id); + uint64_t string_length = end - begin; + assert(string_length >= m_k); + return string_length - m_k + 1; } -template -void dictionary::forward_neighbours(kmer_t suffix, neighbourhood& res, - bool check_reverse_complement) const { - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - kmer_t new_kmer = suffix; - new_kmer.set(m_k - 1, kmer_t::char_to_uint(kmer_t::alphabet[i])); +template +void dictionary::forward_neighbours(Kmer suffix, neighbourhood& res, + bool check_reverse_complement) const { + for (size_t i = 0; i < Kmer::alphabet_size; i++) { + Kmer new_kmer = suffix; + new_kmer.set(m_k - 1, Kmer::char_to_uint(Kmer::alphabet[i])); res.forward[i] = lookup_uint(new_kmer, check_reverse_complement); } } -template -void dictionary::backward_neighbours(kmer_t prefix, neighbourhood& res, - bool check_reverse_complement) const { - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - kmer_t new_kmer = prefix; - new_kmer.set(0, kmer_t::char_to_uint(kmer_t::alphabet[i])); +template +void dictionary::backward_neighbours(Kmer prefix, neighbourhood& res, + bool check_reverse_complement) const { + for (size_t i = 0; i < Kmer::alphabet_size; i++) { + Kmer new_kmer = prefix; + new_kmer.set(0, Kmer::char_to_uint(Kmer::alphabet[i])); res.backward[i] = lookup_uint(new_kmer, check_reverse_complement); } } -template -neighbourhood dictionary::kmer_forward_neighbours( +template +neighbourhood dictionary::kmer_forward_neighbours( char const* string_kmer, bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + Kmer uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_forward_neighbours(uint_kmer, check_reverse_complement); } -template -kmer_t dictionary::get_suffix(kmer_t kmer) const { - kmer_t suffix = kmer; +template +Kmer dictionary::get_suffix(Kmer kmer) const { + Kmer suffix = kmer; suffix.drop_char(); return suffix; } -template -neighbourhood dictionary::kmer_forward_neighbours( - kmer_t uint_kmer, bool check_reverse_complement) const { - neighbourhood res; +template +neighbourhood dictionary::kmer_forward_neighbours( + Kmer uint_kmer, bool check_reverse_complement) const { + neighbourhood res; forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::kmer_backward_neighbours( +template +neighbourhood dictionary::kmer_backward_neighbours( char const* string_kmer, bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + Kmer uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_backward_neighbours(uint_kmer, check_reverse_complement); } -template -kmer_t dictionary::get_prefix(kmer_t kmer) const { - kmer_t prefix = kmer; +template +Kmer dictionary::get_prefix(Kmer kmer) const { + Kmer prefix = kmer; prefix.pad_char(); prefix.take_chars(m_k); return prefix; } -template -neighbourhood dictionary::kmer_backward_neighbours( - kmer_t uint_kmer, bool check_reverse_complement) const { - neighbourhood res; +template +neighbourhood dictionary::kmer_backward_neighbours( + Kmer uint_kmer, bool check_reverse_complement) const { + neighbourhood res; backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::kmer_neighbours( +template +neighbourhood dictionary::kmer_neighbours( char const* string_kmer, bool check_reverse_complement) const { - kmer_t uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); + Kmer uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); return kmer_neighbours(uint_kmer, check_reverse_complement); } -template -neighbourhood dictionary::kmer_neighbours( - kmer_t uint_kmer, bool check_reverse_complement) const { - neighbourhood res; +template +neighbourhood dictionary::kmer_neighbours( + Kmer uint_kmer, bool check_reverse_complement) const { + neighbourhood res; forward_neighbours(get_suffix(uint_kmer), res, check_reverse_complement); backward_neighbours(get_prefix(uint_kmer), res, check_reverse_complement); return res; } -template -neighbourhood dictionary::contig_neighbours( - uint64_t contig_id, bool check_reverse_complement) const { - assert(contig_id < num_strings()); - neighbourhood res; - kmer_t suffix = m_buckets.contig_suffix(contig_id, m_k); +template +neighbourhood dictionary::string_neighbours( + uint64_t string_id, bool check_reverse_complement) const { + assert(string_id < num_strings()); + neighbourhood res; + Kmer suffix = m_spss.string_suffix(string_id); forward_neighbours(suffix, res, check_reverse_complement); - kmer_t prefix = m_buckets.contig_prefix(contig_id, m_k); + Kmer prefix = m_spss.string_prefix(string_id); prefix.pad_char(); backward_neighbours(prefix, res, check_reverse_complement); return res; } -template -uint64_t dictionary::num_bits() const { - return 8 * (sizeof(m_vnum) + sizeof(m_num_kmers) + sizeof(m_num_strings) + sizeof(m_hasher) + - sizeof(m_k) + sizeof(m_m) + sizeof(m_canonical)) + - m_minimizers.num_bits() + m_buckets.num_bits() + m_skew_index.num_bits() + - m_weights.num_bits(); +template +uint64_t dictionary::num_bits() const { + return 8 * (sizeof(m_vnum) + sizeof(m_num_kmers) + sizeof(m_num_strings) + sizeof(m_k) + + sizeof(m_m) + sizeof(m_canonical) + sizeof(m_hasher)) + + m_spss.num_bits() + m_ssi.num_bits() + m_weights.num_bits(); } } // namespace sshash diff --git a/src/info.cpp b/src/info.cpp index de91a10..9f71781 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -2,8 +2,8 @@ namespace sshash { -template -void dictionary::print_space_breakdown() const { +template +void dictionary::print_space_breakdown() const { const uint64_t num_bytes = (num_bits() + 7) / 8; auto perc = [](uint64_t amount, uint64_t total) -> double { return (amount * 100.0) / total; }; @@ -11,32 +11,37 @@ void dictionary::print_space_breakdown() const { std::cout << "total index size: " << num_bytes << " [B] -- " << essentials::convert(num_bytes, essentials::MB) << " [MB]" << '\n'; std::cout << "SPACE BREAKDOWN:\n"; - std::cout << " minimizers: " << static_cast(m_minimizers.num_bits()) / num_kmers() + std::cout << " mphf: " << static_cast(m_ssi.codewords.mphf.num_bits()) / num_kmers() << " [bits/kmer] (" - << static_cast(m_minimizers.num_bits()) / m_minimizers.size() - << " [bits/key]) -- " << perc(m_minimizers.num_bits(), num_bits()) << "%\n"; - std::cout << " strings_endpoints: " - << (8.0 * m_buckets.strings_endpoints.num_bytes()) / num_kmers() << " [bits/kmer] -- " - << perc(m_buckets.strings_endpoints.num_bytes() * 8, num_bits()) << "%\n"; - - std::cout << " offsets: " << (8.0 * m_buckets.offsets.num_bytes()) / num_kmers() - << " [bits/kmer] -- " << perc(8 * m_buckets.offsets.num_bytes(), num_bits()) << "%\n"; - std::cout << " offsets2: " << (8.0 * m_buckets.offsets2.num_bytes()) / num_kmers() - << " [bits/kmer] -- " << perc(8 * m_buckets.offsets2.num_bytes(), num_bits()) + << static_cast(m_ssi.codewords.mphf.num_bits()) / + m_ssi.codewords.mphf.num_keys() + << " [bits/key]) -- " << perc(m_ssi.codewords.mphf.num_bits(), num_bits()) << "%\n"; + std::cout << " strings_offsets: " << (8.0 * m_spss.strings_offsets.num_bytes()) / num_kmers() + << " [bits/kmer] -- " << perc(m_spss.strings_offsets.num_bytes() * 8, num_bits()) << "%\n"; - std::cout << " offsets3: " << (8.0 * m_buckets.offsets3.num_bytes()) / num_kmers() - << " [bits/kmer] -- " << perc(8 * m_buckets.offsets3.num_bytes(), num_bits()) - << "%\n"; - std::cout << " start_lists_of_size: " - << (8.0 * essentials::vec_bytes(m_buckets.start_lists_of_size)) / num_kmers() + + std::cout << " control_codewords: " + << (8.0 * m_ssi.codewords.control_codewords.num_bytes()) / num_kmers() << " [bits/kmer] -- " - << perc(8 * essentials::vec_bytes(m_buckets.start_lists_of_size), num_bits()) + << perc(8 * m_ssi.codewords.control_codewords.num_bytes(), num_bits()) << "%\n"; + std::cout << " mid_load_buckets: " << (8.0 * m_ssi.mid_load_buckets.num_bytes()) / num_kmers() + << " [bits/kmer] -- " << perc(8 * m_ssi.mid_load_buckets.num_bytes(), num_bits()) << "%\n"; + // std::cout << " heavy_load_buckets: " << (8.0 * + // m_ssi.m_skew_index.heavy_load_buckets.num_bytes()) / num_kmers() + // << " [bits/kmer] -- " << perc(8 * + // m_ssi.m_skew_index.heavy_load_buckets.num_bytes(), num_bits()) + // << "%\n"; + std::cout << " begin_buckets_of_size: " + << (8.0 * essentials::vec_bytes(m_ssi.begin_buckets_of_size)) / num_kmers() + << " [bits/kmer] -- " + << perc(8 * essentials::vec_bytes(m_ssi.begin_buckets_of_size), num_bits()) << "%\n"; - std::cout << " strings: " << (8.0 * m_buckets.strings.num_bytes()) / num_kmers() - << " [bits/kmer] -- " << perc(8 * m_buckets.strings.num_bytes(), num_bits()) << "%\n"; - std::cout << " skew_index: " << static_cast(m_skew_index.num_bits()) / num_kmers() - << " [bits/kmer] -- " << perc(m_skew_index.num_bits(), num_bits()) << "%\n"; + std::cout << " strings: " << (8.0 * m_spss.strings.num_bytes()) / num_kmers() + << " [bits/kmer] -- " << perc(8 * m_spss.strings.num_bytes(), num_bits()) << "%\n"; + std::cout << " skew_index: " + << static_cast(m_ssi.m_skew_index.num_bits()) / num_kmers() + << " [bits/kmer] -- " << perc(m_ssi.m_skew_index.num_bits(), num_bits()) << "%\n"; std::cout << " weights: " << static_cast(m_weights.num_bits()) / num_kmers() << " [bits/kmer] -- " << perc(m_weights.num_bits(), num_bits()) << "%\n"; if (weighted()) m_weights.print_space_breakdown(num_kmers()); @@ -45,14 +50,14 @@ void dictionary::print_space_breakdown() const { << std::endl; } -template -void dictionary::print_info() const { +template +void dictionary::print_info() const { std::cout << "=== dictionary info:\n"; std::cout << "version number = " << m_vnum.to_string() << '\n'; std::cout << "num_kmers = " << num_kmers() << '\n'; std::cout << "num_strings = " << num_strings() << '\n'; std::cout << "k = " << k() << '\n'; - std::cout << "num_minimizers = " << m_minimizers.size() << std::endl; + std::cout << "num_minimizers = " << m_ssi.codewords.size() << std::endl; std::cout << "m = " << m() << '\n'; std::cout << "canonical = " << (canonical() ? "true" : "false") << '\n'; std::cout << "weighted = " << (weighted() ? "true" : "false") << '\n'; diff --git a/test/check.hpp b/test/check.hpp index 9c1f722..11774ad 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -90,22 +90,22 @@ bool check_correctness_negative_lookup(Dict const& dict) { } template -bool check_correctness_navigational_contig_query(Dict const& dict) // +bool check_correctness_navigational_string_query(Dict const& dict) // { - std::cout << "checking correctness of navigational queries for contigs..." << std::endl; + std::cout << "checking correctness of navigational queries for strings..." << std::endl; using kmer_t = typename Dict::kmer_type; const uint64_t num_strings = dict.num_strings(); const uint64_t k = dict.k(); uint64_t kmer_id = 0; std::string kmer(k, 0); - uint64_t contig_id = 0; - for (; contig_id != num_strings; ++contig_id) { - if (contig_id != 0 and contig_id % 1000000 == 0) { - std::cout << "checked " << contig_id << "/" << num_strings << " contigs" << std::endl; + uint64_t string_id = 0; + for (; string_id != num_strings; ++string_id) { + if (string_id != 0 and string_id % 1'000'000 == 0) { + std::cout << "checked " << string_id << "/" << num_strings << " strings" << std::endl; } - auto res = dict.contig_neighbours(contig_id); - uint64_t contig_size = dict.contig_size(contig_id); + auto res = dict.string_neighbours(string_id); + uint64_t string_size = dict.string_size(string_id); uint64_t begin_kmer_id = kmer_id; dict.access(begin_kmer_id, kmer.data()); @@ -114,15 +114,15 @@ bool check_correctness_navigational_contig_query(Dict const& dict) // equal_lookup_result(backward.backward[i], res.backward[i]); } - uint64_t end_kmer_id = kmer_id + contig_size - 1; + uint64_t end_kmer_id = kmer_id + string_size - 1; dict.access(end_kmer_id, kmer.data()); auto forward = dict.kmer_forward_neighbours(kmer.data()); for (size_t i = 0; i < kmer_t::alphabet_size; i++) { equal_lookup_result(forward.forward[i], res.forward[i]); } - kmer_id += contig_size; + kmer_id += string_size; } - std::cout << "checked " << contig_id << " contigs" << std::endl; + std::cout << "checked " << string_id << " strings" << std::endl; std::cout << "EVERYTHING OK!" << std::endl; return true; } @@ -159,15 +159,15 @@ bool check_correctness_kmer_iterator(Dict const& dict) { } template -bool check_correctness_contig_iterator(Dict const& dict) { - std::cout << "checking correctness of contig iterator..." << std::endl; +bool check_correctness_string_iterator(Dict const& dict) { + std::cout << "checking correctness of string iterator..." << std::endl; const uint64_t k = dict.k(); std::string read_kmer(k, 0); std::string expected_kmer(k, 0); - for (uint64_t contig_id = 0; contig_id != dict.num_strings(); ++contig_id) { - auto [begin, _] = dict.contig_offsets(contig_id); - uint64_t from_kmer_id = begin - contig_id * (dict.k() - 1); - auto it = dict.at_contig_id(contig_id); + for (uint64_t string_id = 0; string_id != dict.num_strings(); ++string_id) { + auto [begin, _] = dict.string_offsets(string_id); + uint64_t from_kmer_id = begin - string_id * (dict.k() - 1); + auto it = dict.at_string_id(string_id); while (it.has_next()) { auto [kmer_id, kmer] = it.next(); util::uint_kmer_to_string(kmer, read_kmer.data(), k); diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index 35512ff..10dcf48 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -6,7 +6,7 @@ namespace sshash { -template +template bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // { using kmer_t = typename Dict::kmer_type; @@ -15,7 +15,7 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // uint64_t num_kmers = 0; uint64_t num_sequences = 0; lookup_result prev; - prev.contig_id = 0; + prev.string_id = 0; std::string got_kmer_str(k, 0); std::string expected_kmer_str(k, 0); @@ -24,11 +24,11 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // while (!is.eof()) // { - if constexpr (fmt == input_file_type::cf_seg) { + if constexpr (fmt == input_file_t::cf_seg) { std::getline(is, sequence, '\t'); // skip '\t' std::getline(is, sequence); // DNA sequence } else { - static_assert(fmt == input_file_type::fasta); + static_assert(fmt == input_file_t::fasta); std::getline(is, sequence); // header sequence std::getline(is, sequence); // DNA sequence } @@ -83,10 +83,10 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // assert(curr.kmer_orientation == orientation); if (num_kmers == 0) { - if (curr.contig_id != 0) { - std::cout << "contig_id " << curr.contig_id << " but expected 0" << std::endl; + if (curr.string_id != 0) { + std::cout << "string_id " << curr.string_id << " but expected 0" << std::endl; } - assert(curr.contig_id == 0); // at the beginning, contig_id must be 0 + assert(curr.string_id == 0); // at the beginning, string_id must be 0 } else { if (curr.kmer_id != prev.kmer_id + 1) { std::cout << "ERROR: got curr.kmer_id " << curr.kmer_id << " but expected " @@ -94,50 +94,50 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // } assert(curr.kmer_id == prev.kmer_id + 1); // kmer_id must be sequential - if (curr.kmer_id_in_contig >= curr.contig_size) { - std::cout << "ERROR: got curr.kmer_id_in_contig " << curr.kmer_id_in_contig - << " but expected something < " << curr.contig_size << std::endl; + if (curr.kmer_id_in_string >= curr.string_size) { + std::cout << "ERROR: got curr.kmer_id_in_string " << curr.kmer_id_in_string + << " but expected something < " << curr.string_size << std::endl; } - assert(curr.kmer_id_in_contig < - curr.contig_size); // kmer_id_in_contig must always be < contig_size - - if (curr.contig_id == prev.contig_id) { - /* same contig */ - if (curr.contig_size != prev.contig_size) { - std::cout << "ERROR: got curr.contig_size " << curr.contig_size - << " but expected " << prev.contig_size << std::endl; + assert(curr.kmer_id_in_string < + curr.string_size); // kmer_id_in_string must always be < string_size + + if (curr.string_id == prev.string_id) { + /* same string */ + if (curr.string_size != prev.string_size) { + std::cout << "ERROR: got curr.string_size " << curr.string_size + << " but expected " << prev.string_size << std::endl; } - assert(curr.contig_size == prev.contig_size); // contig_size must be same - if (curr.kmer_id_in_contig != prev.kmer_id_in_contig + 1) { - std::cout << "ERROR: got curr.kmer_id_in_contig " << curr.kmer_id_in_contig - << " but expected " << prev.kmer_id_in_contig + 1 << std::endl; + assert(curr.string_size == prev.string_size); // string_size must be same + if (curr.kmer_id_in_string != prev.kmer_id_in_string + 1) { + std::cout << "ERROR: got curr.kmer_id_in_string " << curr.kmer_id_in_string + << " but expected " << prev.kmer_id_in_string + 1 << std::endl; } - assert(curr.kmer_id_in_contig == - prev.kmer_id_in_contig + 1); // kmer_id_in_contig must be sequential + assert(curr.kmer_id_in_string == + prev.kmer_id_in_string + 1); // kmer_id_in_string must be sequential } else { - /* we have changed contig */ - if (curr.contig_id != prev.contig_id + 1) { - std::cout << "ERROR: got curr.contig_id " << curr.contig_id - << " but expected " << prev.contig_id + 1 << std::endl; + /* we have changed string */ + if (curr.string_id != prev.string_id + 1) { + std::cout << "ERROR: got curr.string_id " << curr.string_id + << " but expected " << prev.string_id + 1 << std::endl; } - assert(curr.contig_id == - prev.contig_id + 1); // contig_id must be sequential since we stream - if (curr.kmer_id_in_contig != 0) { - std::cout << "ERROR: got curr.kmer_id_in_contig " << curr.kmer_id_in_contig + assert(curr.string_id == + prev.string_id + 1); // string_id must be sequential since we stream + if (curr.kmer_id_in_string != 0) { + std::cout << "ERROR: got curr.kmer_id_in_string " << curr.kmer_id_in_string << " but expected 0" << std::endl; } - assert(curr.kmer_id_in_contig == - 0); // kmer_id_in_contig must be 0 when we change contig + assert(curr.kmer_id_in_string == + 0); // kmer_id_in_string must be 0 when we change string } } - /* check also contig_size() */ - uint64_t contig_size = dict.contig_size(curr.contig_id); - if (contig_size != curr.contig_size) { - std::cout << "ERROR: got contig_size " << contig_size << " but expected " - << curr.contig_size << std::endl; + /* check also string_size() */ + uint64_t string_size = dict.string_size(curr.string_id); + if (string_size != curr.string_size) { + std::cout << "ERROR: got string_size " << string_size << " but expected " + << curr.string_size << std::endl; } - assert(contig_size == curr.contig_size); + assert(string_size == curr.string_size); prev = curr; @@ -161,7 +161,7 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // return check_correctness_negative_lookup(dict); } -template +template bool check_correctness_navigational_kmer_query(std::istream& is, Dict const& dict) // { using kmer_t = typename Dict::kmer_type; @@ -173,11 +173,11 @@ bool check_correctness_navigational_kmer_query(std::istream& is, Dict const& dic while (!is.eof()) // { - if constexpr (fmt == input_file_type::cf_seg) { + if constexpr (fmt == input_file_t::cf_seg) { std::getline(is, sequence, '\t'); // skip '\t' std::getline(is, sequence); // DNA sequence } else { - static_assert(fmt == input_file_type::fasta); + static_assert(fmt == input_file_t::fasta); std::getline(is, sequence); // header sequence std::getline(is, sequence); // DNA sequence } @@ -281,15 +281,15 @@ bool check_correctness_lookup_access(Dict const& dict, std::string const& filena if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - good = check_correctness_lookup_access(zis, dict); + good = check_correctness_lookup_access(zis, dict); } else { - good = check_correctness_lookup_access(zis, dict); + good = check_correctness_lookup_access(zis, dict); } } else { if (util::ends_with(filename, ".cf_seg")) { - good = check_correctness_lookup_access(is, dict); + good = check_correctness_lookup_access(is, dict); } else { - good = check_correctness_lookup_access(is, dict); + good = check_correctness_lookup_access(is, dict); } } is.close(); @@ -308,19 +308,15 @@ bool check_correctness_navigational_kmer_query(Dict const& dict, std::string con if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - good = - check_correctness_navigational_kmer_query(zis, dict); + good = check_correctness_navigational_kmer_query(zis, dict); } else { - good = - check_correctness_navigational_kmer_query(zis, dict); + good = check_correctness_navigational_kmer_query(zis, dict); } } else { if (util::ends_with(filename, ".cf_seg")) { - good = - check_correctness_navigational_kmer_query(is, dict); + good = check_correctness_navigational_kmer_query(is, dict); } else { - good = - check_correctness_navigational_kmer_query(is, dict); + good = check_correctness_navigational_kmer_query(is, dict); } } is.close(); diff --git a/tools/build.cpp b/tools/build.cpp index 45a163f..336a160 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -84,11 +84,11 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - check_correctness_navigational_kmer_query(dict, input_filename); - check_correctness_navigational_contig_query(dict); + // check_correctness_navigational_kmer_query(dict, input_filename); + // check_correctness_navigational_string_query(dict); if (build_config.weighted) check_correctness_weights(dict, input_filename); check_correctness_kmer_iterator(dict); - check_correctness_contig_iterator(dict); + check_correctness_string_iterator(dict); } bool bench = parser.get("bench"); if (bench) { diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 188d83b..53fb8f5 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -27,9 +27,9 @@ int check(int argc, char** argv) { dictionary_type dict; load_dictionary(dict, index_filename, verbose); check_dictionary(dict); - check_correctness_navigational_contig_query(dict); + check_correctness_navigational_string_query(dict); check_correctness_kmer_iterator(dict); - check_correctness_contig_iterator(dict); + check_correctness_string_iterator(dict); return 0; } From 0f317766fbae6788ca001eeda4f11dac4779c0e9 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 15 Oct 2025 21:45:08 +0200 Subject: [PATCH 047/112] minor --- tools/build.cpp | 4 ++-- tools/sshash.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/build.cpp b/tools/build.cpp index 336a160..b43d986 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -84,8 +84,8 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - // check_correctness_navigational_kmer_query(dict, input_filename); - // check_correctness_navigational_string_query(dict); + check_correctness_navigational_kmer_query(dict, input_filename); + check_correctness_navigational_string_query(dict); if (build_config.weighted) check_correctness_weights(dict, input_filename); check_correctness_kmer_iterator(dict); check_correctness_string_iterator(dict); diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 53fb8f5..b46ba0b 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -46,7 +46,7 @@ int bench(int argc, char** argv) { // perf_test_lookup_by_list_size(dict); perf_test_lookup_access(dict); - // if (dict.weighted()) perf_test_lookup_weight(dict); + if (dict.weighted()) perf_test_lookup_weight(dict); perf_test_iterator(dict); return 0; From 13360a4f00564c1dcab065f8ddc1557e46fb7b0c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 16 Oct 2025 12:25:51 +0200 Subject: [PATCH 048/112] optimized num. locate queries --- include/offsets.hpp | 133 +++++++++++---------- include/spectrum_preserving_string_set.hpp | 91 +++++++------- include/streaming_query.hpp | 3 +- include/util.hpp | 49 +++++--- src/info.cpp | 5 - test/check_from_file.hpp | 38 +++--- tools/build.cpp | 10 +- 7 files changed, 178 insertions(+), 151 deletions(-) diff --git a/include/offsets.hpp b/include/offsets.hpp index 3d464ba..68b60ff 100644 --- a/include/offsets.hpp +++ b/include/offsets.hpp @@ -49,43 +49,45 @@ struct decoded_offsets // decoded_offset decode(const uint64_t encoded_offset) const { return {encoded_offset}; } - lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // + void offset_to_id(lookup_result& res, decoded_offset p, const uint64_t k) const // { - if (p.absolute_offset < pos_in_kmer) return lookup_result(); + assert(res.kmer_offset != constants::invalid_uint64); - uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; - auto q = m_seq.locate(kmer_offset); - uint64_t string_id = q.first.pos; - uint64_t string_begin = q.first.val; - uint64_t string_end = q.second.val; + auto q = m_seq.locate(res.kmer_offset); + res.string_id = q.first.pos; + res.string_begin = q.first.val; + res.string_end = q.second.val; + assert(res.string_id < m_seq.size()); + assert(res.string_begin < res.string_end); + + // std::cout << res << std::endl; /* The following facts hold. */ - assert(kmer_offset >= string_id * (k - 1)); - assert(string_begin <= kmer_offset); - assert(kmer_offset < string_end); + assert(res.kmer_offset >= res.string_id * (k - 1)); + assert(res.string_begin <= res.kmer_offset); + assert(res.kmer_offset < res.string_end); /****************************/ - if (kmer_offset >= string_end - k + 1) return lookup_result(); + // if (res.kmer_offset >= res.string_end - k + 1) return false; - uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); - uint64_t relative_kmer_id = kmer_offset - string_begin; - uint64_t string_length = string_end - string_begin; - assert(string_length >= k); - uint64_t string_size = string_length - k + 1; + // uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); + // uint64_t relative_kmer_id = kmer_offset - string_begin; + // uint64_t string_length = string_end - string_begin; + // assert(string_length >= k); + // uint64_t string_size = string_length - k + 1; - lookup_result res; - res.kmer_id = absolute_kmer_id; - res.kmer_id_in_string = relative_kmer_id; - res.string_id = string_id; - res.string_size = string_size; + // lookup_result res; + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + // res.string_id = string_id; + // res.string_size = string_size; - assert(res.kmer_id_in_string < res.string_size); - assert(res.string_id < m_seq.size()); - assert(string_begin == res.string_begin(k)); - assert(string_end == res.string_end(k)); - assert(kmer_offset == res.kmer_offset(k)); + // assert(res.kmer_id_in_string < res.string_end - res.string_begin - k + 1); - return res; + // assert(res.string_id < m_seq.size()); + // assert(string_begin == res.string_begin(k)); + // assert(string_end == res.string_end(k)); + // assert(kmer_offset == res.kmer_offset(k)); } std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // @@ -216,45 +218,46 @@ struct encoded_offsets // return {begin + relative_offset, relative_offset, string_id, begin, end}; } - lookup_result offset_to_id(decoded_offset p, uint64_t pos_in_kmer, const uint64_t k) const // + bool offset_to_id(lookup_result& res, decoded_offset p, uint64_t pos_in_kmer, + const uint64_t k) const // { - if (p.absolute_offset < pos_in_kmer or // - p.absolute_offset - pos_in_kmer < p.string_begin or // - p.absolute_offset - pos_in_kmer >= p.string_end - k + 1) // - { - return lookup_result(); - } - - uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; - uint64_t string_id = p.string_id; - uint64_t string_begin = p.string_begin; - uint64_t string_end = p.string_end; - - /* The following facts hold. */ - assert(kmer_offset >= string_id * (k - 1)); - assert(string_begin <= kmer_offset); - assert(kmer_offset < string_end); - /****************************/ - - uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); - uint64_t relative_kmer_id = kmer_offset - string_begin; - uint64_t string_length = string_end - string_begin; - assert(string_length >= k); - uint64_t string_size = string_length - k + 1; - - lookup_result res; - res.kmer_id = absolute_kmer_id; - res.kmer_id_in_string = relative_kmer_id; - res.string_id = string_id; - res.string_size = string_size; - - assert(res.kmer_id_in_string < res.string_size); - assert(res.string_id < m_seq.size()); - assert(string_begin == res.string_begin(k)); - assert(string_end == res.string_end(k)); - assert(kmer_offset == res.kmer_offset(k)); - - return res; + // if (p.absolute_offset < pos_in_kmer or // + // p.absolute_offset - pos_in_kmer < p.string_begin or // + // p.absolute_offset - pos_in_kmer >= p.string_end - k + 1) // + // { + // return lookup_result(); + // } + + // uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; + // uint64_t string_id = p.string_id; + // uint64_t string_begin = p.string_begin; + // uint64_t string_end = p.string_end; + + // /* The following facts hold. */ + // assert(kmer_offset >= string_id * (k - 1)); + // assert(string_begin <= kmer_offset); + // assert(kmer_offset < string_end); + // /****************************/ + + // uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); + // uint64_t relative_kmer_id = kmer_offset - string_begin; + // uint64_t string_length = string_end - string_begin; + // assert(string_length >= k); + // uint64_t string_size = string_length - k + 1; + + // lookup_result res; + // res.kmer_id = absolute_kmer_id; + // res.kmer_id_in_string = relative_kmer_id; + // res.string_id = string_id; + // res.string_size = string_size; + + // assert(res.kmer_id_in_string < res.string_size); + // assert(res.string_id < m_seq.size()); + // assert(string_begin == res.string_begin(k)); + // assert(string_end == res.string_end(k)); + // assert(kmer_offset == res.kmer_offset(k)); + + return true; } std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 6c78665..427df51 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -60,15 +60,14 @@ struct spectrum_preserving_string_set // } } - auto res = _lookup_regular(p, kmer, mini_info); - if (res.kmer_id != constants::invalid_uint64) return res; + lookup_result res; + if (_lookup_regular(res, p, kmer, mini_info)) return res; for (uint64_t i = 1; i != size; ++i) { ++it; minimizer_offset = *it; p = strings_offsets.decode(minimizer_offset); - res = _lookup_regular(p, kmer, mini_info); - if (res.kmer_id != constants::invalid_uint64) return res; + if (_lookup_regular(res, p, kmer, mini_info)) return res; } return lookup_result(); @@ -98,15 +97,14 @@ struct spectrum_preserving_string_set // } } - auto res = _lookup_canonical(p, kmer, kmer_rc, mini_info); - if (res.kmer_id != constants::invalid_uint64) return res; + lookup_result res; + if (_lookup_canonical(res, p, kmer, kmer_rc, mini_info)) return res; for (uint64_t i = 1; i != size; ++i) { ++it; minimizer_offset = *it; p = strings_offsets.decode(minimizer_offset); - res = _lookup_canonical(p, kmer, kmer_rc, mini_info); - if (res.kmer_id != constants::invalid_uint64) return res; + if (_lookup_canonical(res, p, kmer, kmer_rc, mini_info)) return res; } return lookup_result(); @@ -211,24 +209,36 @@ struct spectrum_preserving_string_set // visitor.visit(t.strings); } - lookup_result _lookup_regular(typename Offsets::decoded_offset p, // - const Kmer kmer, // - const minimizer_info mini_info) const // + bool _lookup_regular(lookup_result& res, // + typename Offsets::decoded_offset p, // + const Kmer kmer, // + const minimizer_info mini_info) const // { - auto res = strings_offsets.offset_to_id(p, mini_info.pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t kmer_offset = res.kmer_offset(k); - auto read_kmer = - util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); - if (read_kmer == kmer) return res; + if (p.absolute_offset < mini_info.pos_in_kmer) return false; + + res.kmer_offset = p.absolute_offset - mini_info.pos_in_kmer; + + if (res.kmer_offset >= res.string_begin and res.kmer_offset < res.string_end) { + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + } else { + strings_offsets.offset_to_id(res, p, k); } - return lookup_result(); + + if (res.kmer_offset < res.string_end - k + 1 and // + kmer == util::read_kmer_at(strings, k, Kmer::bits_per_char * res.kmer_offset)) // + { + return true; + } + + return false; } - lookup_result _lookup_canonical(typename Offsets::decoded_offset p, // - const Kmer kmer, // - const Kmer kmer_rc, // - const minimizer_info mini_info) const // + bool _lookup_canonical(lookup_result& res, // + typename Offsets::decoded_offset p, // + const Kmer kmer, // + const Kmer kmer_rc, // + const minimizer_info mini_info) const // { // TODO: maybe we can optimize this logic. // Because `pos_in_kmer` and `k - m - mini_info.pos_in_kmer` are close @@ -236,29 +246,28 @@ struct spectrum_preserving_string_set // // be good to avoid accessing the strings_offsets again. uint64_t pos_in_kmer = mini_info.pos_in_kmer; - auto res = __lookup_canonical(p, kmer, kmer_rc, pos_in_kmer); - if (res.kmer_id != constants::invalid_uint64) return res; + if (__lookup_canonical(res, p, kmer, kmer_rc, pos_in_kmer)) return true; pos_in_kmer = k - m - mini_info.pos_in_kmer; - return __lookup_canonical(p, kmer, kmer_rc, pos_in_kmer); + return __lookup_canonical(res, p, kmer, kmer_rc, pos_in_kmer); } - lookup_result __lookup_canonical(typename Offsets::decoded_offset p, // - const Kmer kmer, // - const Kmer kmer_rc, // - const uint64_t pos_in_kmer) const // + bool __lookup_canonical(lookup_result& res, // + typename Offsets::decoded_offset p, // + const Kmer kmer, // + const Kmer kmer_rc, // + const uint64_t pos_in_kmer) const // { - auto res = strings_offsets.offset_to_id(p, pos_in_kmer, k); - if (res.kmer_id != constants::invalid_uint64) { - uint64_t kmer_offset = res.kmer_offset(k); - auto read_kmer = - util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); - if (read_kmer == kmer) return res; - if (read_kmer == kmer_rc) { - res.kmer_orientation = constants::backward_orientation; - return res; - } - } - return lookup_result(); + // if (strings_offsets.offset_to_id(res, p, pos_in_kmer, k)) { + // uint64_t kmer_offset = res.kmer_offset(k); + // auto read_kmer = + // util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); + // if (read_kmer == kmer) return true; + // if (read_kmer == kmer_rc) { + // res.kmer_orientation = constants::backward_orientation; + // return true; + // } + // } + return false; } }; diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index 5907339..8b4d63d 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -187,7 +187,8 @@ struct streaming_query // assert(m_res.minimizer_found == true); m_num_searches += 1; uint64_t kmer_offset = 2 * (m_res.kmer_id + m_res.string_id * (m_k - 1)); - m_remaining_string_bases = (m_res.string_size - 1) - m_res.kmer_id_in_string; + m_remaining_string_bases = + (m_res.string_end - m_res.string_begin - m_k) - m_res.kmer_id_in_string; if (m_res.kmer_orientation == constants::backward_orientation) { kmer_offset += 2 * m_k; m_remaining_string_bases = m_res.kmer_id_in_string; diff --git a/include/util.hpp b/include/util.hpp index 8b0983e..c807f02 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -39,37 +39,49 @@ struct lookup_result { lookup_result(bool mf = true) : kmer_id(constants::invalid_uint64) , kmer_id_in_string(constants::invalid_uint64) + , kmer_offset(constants::invalid_uint64) , kmer_orientation(constants::forward_orientation) + , string_id(constants::invalid_uint64) - , string_size(constants::invalid_uint64) + , string_begin(constants::invalid_uint64) + , string_end(constants::invalid_uint64) + , minimizer_found(mf) {} uint64_t kmer_id; // "absolute" kmer-id - uint64_t kmer_id_in_string; // "relative" kmer-id: 0 <= kmer_id_in_string < string_size + uint64_t kmer_id_in_string; // "relative" kmer-id: 0 <= kmer_id_in_string < string_size, + // where string_size = string_end - string_begin - k + 1 + uint64_t kmer_offset; int64_t kmer_orientation; + uint64_t string_id; - uint64_t string_size; + uint64_t string_begin; + uint64_t string_end; + bool minimizer_found; - uint64_t kmer_offset(const uint64_t k) const { // - return kmer_id + string_id * (k - 1); - } + // uint64_t kmer_offset(const uint64_t k) const { // + // return kmer_id + string_id * (k - 1); + // } - uint64_t string_begin(const uint64_t k) const { // - return kmer_offset(k) - kmer_id_in_string; - } + // uint64_t string_begin(const uint64_t k) const { // + // return kmer_offset(k) - kmer_id_in_string; + // } - uint64_t string_end(const uint64_t k) const { // - return string_begin(k) + string_size + k - 1; - } + // uint64_t string_end(const uint64_t k) const { // + // return string_begin(k) + string_size + k - 1; + // } }; inline std::ostream& operator<<(std::ostream& os, lookup_result const& res) { os << " == kmer_id = " << res.kmer_id << '\n'; os << " == kmer_id_in_string = " << res.kmer_id_in_string << '\n'; + os << " == kmer_offset = " << res.kmer_offset << '\n'; os << " == kmer_orientation = " << res.kmer_orientation << '\n'; os << " == string_id = " << res.string_id << '\n'; - os << " == string_size = " << res.string_size << '\n'; + os << " == string_begin = " << res.string_begin << '\n'; + os << " == string_end = " << res.string_end << '\n'; + os << " == string_length = " << (res.string_end - res.string_begin) << '\n'; os << " == minimizer_found = " << (res.minimizer_found ? "true" : "false") << '\n'; return os; } @@ -127,9 +139,14 @@ struct minimizer_info { << std::endl; good = false; } - if (expected.string_size != got.string_size) { - std::cout << "expected string_size " << expected.string_size << " but got " - << got.string_size << std::endl; + if (expected.string_begin != got.string_begin) { + std::cout << "expected string_begin " << expected.string_begin << " but got " + << got.string_begin << std::endl; + good = false; + } + if (expected.string_end != got.string_end) { + std::cout << "expected string_end " << expected.string_end << " but got " << got.string_end + << std::endl; good = false; } return good; diff --git a/src/info.cpp b/src/info.cpp index 9f71781..8000e36 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -27,11 +27,6 @@ void dictionary::print_space_breakdown() const { std::cout << " mid_load_buckets: " << (8.0 * m_ssi.mid_load_buckets.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_ssi.mid_load_buckets.num_bytes(), num_bits()) << "%\n"; - // std::cout << " heavy_load_buckets: " << (8.0 * - // m_ssi.m_skew_index.heavy_load_buckets.num_bytes()) / num_kmers() - // << " [bits/kmer] -- " << perc(8 * - // m_ssi.m_skew_index.heavy_load_buckets.num_bytes(), num_bits()) - // << "%\n"; std::cout << " begin_buckets_of_size: " << (8.0 * essentials::vec_bytes(m_ssi.begin_buckets_of_size)) / num_kmers() << " [bits/kmer] -- " diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index 10dcf48..affbac9 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -38,10 +38,10 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // /* transform 50% of the read nucleotides into lower-case letters (assuming the input is upper-case): lower-case kmers must be found anyway in the index */ - if ((num_sequences & 1) == 0) { - std::transform(sequence.begin(), sequence.end(), sequence.begin(), - [](char c) { return std::tolower(c); }); - } + // if ((num_sequences & 1) == 0) { + // std::transform(sequence.begin(), sequence.end(), sequence.begin(), + // [](char c) { return std::tolower(c); }); + // } ++num_sequences; for (uint64_t i = 0; i + k <= sequence.length(); ++i) { @@ -57,10 +57,10 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // } /* transform 50% of the kmers into their reverse complements */ - if ((num_kmers & 1) == 0) { - uint_kmer.reverse_complement_inplace(k); - orientation = constants::backward_orientation; - } + // if ((num_kmers & 1) == 0) { + // uint_kmer.reverse_complement_inplace(k); + // orientation = constants::backward_orientation; + // } util::uint_kmer_to_string(uint_kmer, expected_kmer_str.data(), k); auto curr = dict.lookup(expected_kmer_str.c_str()); @@ -82,6 +82,8 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // } assert(curr.kmer_orientation == orientation); + uint64_t curr_string_size = curr.string_end - curr.string_begin - k + 1; + if (num_kmers == 0) { if (curr.string_id != 0) { std::cout << "string_id " << curr.string_id << " but expected 0" << std::endl; @@ -94,20 +96,20 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // } assert(curr.kmer_id == prev.kmer_id + 1); // kmer_id must be sequential - if (curr.kmer_id_in_string >= curr.string_size) { + if (curr.kmer_id_in_string >= curr_string_size) { std::cout << "ERROR: got curr.kmer_id_in_string " << curr.kmer_id_in_string - << " but expected something < " << curr.string_size << std::endl; + << " but expected something < " << curr_string_size << std::endl; } assert(curr.kmer_id_in_string < - curr.string_size); // kmer_id_in_string must always be < string_size + curr_string_size); // kmer_id_in_string must always be < string_size if (curr.string_id == prev.string_id) { /* same string */ - if (curr.string_size != prev.string_size) { - std::cout << "ERROR: got curr.string_size " << curr.string_size - << " but expected " << prev.string_size << std::endl; + uint64_t prev_string_size = prev.string_end - prev.string_begin - k + 1; + if (curr_string_size != prev_string_size) { + std::cout << "ERROR: got curr_string_size " << curr_string_size + << " but expected " << prev_string_size << std::endl; } - assert(curr.string_size == prev.string_size); // string_size must be same if (curr.kmer_id_in_string != prev.kmer_id_in_string + 1) { std::cout << "ERROR: got curr.kmer_id_in_string " << curr.kmer_id_in_string << " but expected " << prev.kmer_id_in_string + 1 << std::endl; @@ -133,11 +135,11 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // /* check also string_size() */ uint64_t string_size = dict.string_size(curr.string_id); - if (string_size != curr.string_size) { + if (string_size != curr_string_size) { std::cout << "ERROR: got string_size " << string_size << " but expected " - << curr.string_size << std::endl; + << curr_string_size << std::endl; } - assert(string_size == curr.string_size); + assert(string_size == curr_string_size); prev = curr; diff --git a/tools/build.cpp b/tools/build.cpp index b43d986..ff617e2 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -84,11 +84,11 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - check_correctness_navigational_kmer_query(dict, input_filename); - check_correctness_navigational_string_query(dict); - if (build_config.weighted) check_correctness_weights(dict, input_filename); - check_correctness_kmer_iterator(dict); - check_correctness_string_iterator(dict); + // check_correctness_navigational_kmer_query(dict, input_filename); + // check_correctness_navigational_string_query(dict); + // if (build_config.weighted) check_correctness_weights(dict, input_filename); + // check_correctness_kmer_iterator(dict); + // check_correctness_string_iterator(dict); } bool bench = parser.get("bench"); if (bench) { From 858e71b8262bfcd8e856c0815837cea04d7b7d9e Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 16 Oct 2025 15:33:19 +0200 Subject: [PATCH 049/112] optimized num. locate queries --- include/offsets.hpp | 81 ++++------------------ include/spectrum_preserving_string_set.hpp | 39 ++++++----- include/util.hpp | 12 ---- test/check_from_file.hpp | 16 ++--- tools/build.cpp | 10 +-- 5 files changed, 51 insertions(+), 107 deletions(-) diff --git a/include/offsets.hpp b/include/offsets.hpp index 68b60ff..0b5648c 100644 --- a/include/offsets.hpp +++ b/include/offsets.hpp @@ -49,7 +49,7 @@ struct decoded_offsets // decoded_offset decode(const uint64_t encoded_offset) const { return {encoded_offset}; } - void offset_to_id(lookup_result& res, decoded_offset p, const uint64_t k) const // + void offset_to_id(lookup_result& res, decoded_offset /* p */, const uint64_t k) const // { assert(res.kmer_offset != constants::invalid_uint64); @@ -57,37 +57,14 @@ struct decoded_offsets // res.string_id = q.first.pos; res.string_begin = q.first.val; res.string_end = q.second.val; + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + assert(res.string_id < m_seq.size()); assert(res.string_begin < res.string_end); - - // std::cout << res << std::endl; - - /* The following facts hold. */ assert(res.kmer_offset >= res.string_id * (k - 1)); assert(res.string_begin <= res.kmer_offset); assert(res.kmer_offset < res.string_end); - /****************************/ - - // if (res.kmer_offset >= res.string_end - k + 1) return false; - - // uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); - // uint64_t relative_kmer_id = kmer_offset - string_begin; - // uint64_t string_length = string_end - string_begin; - // assert(string_length >= k); - // uint64_t string_size = string_length - k + 1; - - // lookup_result res; - res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id - res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id - // res.string_id = string_id; - // res.string_size = string_size; - - // assert(res.kmer_id_in_string < res.string_end - res.string_begin - k + 1); - - // assert(res.string_id < m_seq.size()); - // assert(string_begin == res.string_begin(k)); - // assert(string_end == res.string_end(k)); - // assert(kmer_offset == res.kmer_offset(k)); } std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // @@ -218,46 +195,18 @@ struct encoded_offsets // return {begin + relative_offset, relative_offset, string_id, begin, end}; } - bool offset_to_id(lookup_result& res, decoded_offset p, uint64_t pos_in_kmer, - const uint64_t k) const // + void offset_to_id(lookup_result& res, decoded_offset p, const uint64_t k) const // { - // if (p.absolute_offset < pos_in_kmer or // - // p.absolute_offset - pos_in_kmer < p.string_begin or // - // p.absolute_offset - pos_in_kmer >= p.string_end - k + 1) // - // { - // return lookup_result(); - // } - - // uint64_t kmer_offset = p.absolute_offset - pos_in_kmer; - // uint64_t string_id = p.string_id; - // uint64_t string_begin = p.string_begin; - // uint64_t string_end = p.string_end; - - // /* The following facts hold. */ - // assert(kmer_offset >= string_id * (k - 1)); - // assert(string_begin <= kmer_offset); - // assert(kmer_offset < string_end); - // /****************************/ - - // uint64_t absolute_kmer_id = kmer_offset - string_id * (k - 1); - // uint64_t relative_kmer_id = kmer_offset - string_begin; - // uint64_t string_length = string_end - string_begin; - // assert(string_length >= k); - // uint64_t string_size = string_length - k + 1; - - // lookup_result res; - // res.kmer_id = absolute_kmer_id; - // res.kmer_id_in_string = relative_kmer_id; - // res.string_id = string_id; - // res.string_size = string_size; - - // assert(res.kmer_id_in_string < res.string_size); - // assert(res.string_id < m_seq.size()); - // assert(string_begin == res.string_begin(k)); - // assert(string_end == res.string_end(k)); - // assert(kmer_offset == res.kmer_offset(k)); - - return true; + assert(res.kmer_offset != constants::invalid_uint64); + + res.string_id = p.string_id; + res.string_begin = p.string_begin; + res.string_end = p.string_end; + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + + assert(res.string_id < m_seq.size()); + assert(res.string_begin < res.string_end); } std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 427df51..7e06c43 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -225,7 +225,7 @@ struct spectrum_preserving_string_set // strings_offsets.offset_to_id(res, p, k); } - if (res.kmer_offset < res.string_end - k + 1 and // + if (res.kmer_offset >= res.string_begin and res.kmer_offset < res.string_end - k + 1 and // kmer == util::read_kmer_at(strings, k, Kmer::bits_per_char * res.kmer_offset)) // { return true; @@ -240,11 +240,6 @@ struct spectrum_preserving_string_set // const Kmer kmer_rc, // const minimizer_info mini_info) const // { - // TODO: maybe we can optimize this logic. - // Because `pos_in_kmer` and `k - m - mini_info.pos_in_kmer` are close - // and most of the time they should belong to the same string, so it would - // be good to avoid accessing the strings_offsets again. - uint64_t pos_in_kmer = mini_info.pos_in_kmer; if (__lookup_canonical(res, p, kmer, kmer_rc, pos_in_kmer)) return true; pos_in_kmer = k - m - mini_info.pos_in_kmer; @@ -257,16 +252,28 @@ struct spectrum_preserving_string_set // const Kmer kmer_rc, // const uint64_t pos_in_kmer) const // { - // if (strings_offsets.offset_to_id(res, p, pos_in_kmer, k)) { - // uint64_t kmer_offset = res.kmer_offset(k); - // auto read_kmer = - // util::read_kmer_at(strings, k, Kmer::bits_per_char * kmer_offset); - // if (read_kmer == kmer) return true; - // if (read_kmer == kmer_rc) { - // res.kmer_orientation = constants::backward_orientation; - // return true; - // } - // } + if (p.absolute_offset < pos_in_kmer) return false; + + res.kmer_offset = p.absolute_offset - pos_in_kmer; + + if (res.kmer_offset >= res.string_begin and res.kmer_offset < res.string_end) { + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + } else { + strings_offsets.offset_to_id(res, p, k); + } + + if (res.kmer_offset >= res.string_begin and res.kmer_offset < res.string_end - k + 1) // + { + auto read_kmer = + util::read_kmer_at(strings, k, Kmer::bits_per_char * res.kmer_offset); + if (read_kmer == kmer) return true; + if (read_kmer == kmer_rc) { + res.kmer_orientation = constants::backward_orientation; + return true; + } + } + return false; } }; diff --git a/include/util.hpp b/include/util.hpp index c807f02..941d2f3 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -59,18 +59,6 @@ struct lookup_result { uint64_t string_end; bool minimizer_found; - - // uint64_t kmer_offset(const uint64_t k) const { // - // return kmer_id + string_id * (k - 1); - // } - - // uint64_t string_begin(const uint64_t k) const { // - // return kmer_offset(k) - kmer_id_in_string; - // } - - // uint64_t string_end(const uint64_t k) const { // - // return string_begin(k) + string_size + k - 1; - // } }; inline std::ostream& operator<<(std::ostream& os, lookup_result const& res) { diff --git a/test/check_from_file.hpp b/test/check_from_file.hpp index affbac9..8c78e42 100644 --- a/test/check_from_file.hpp +++ b/test/check_from_file.hpp @@ -38,10 +38,10 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // /* transform 50% of the read nucleotides into lower-case letters (assuming the input is upper-case): lower-case kmers must be found anyway in the index */ - // if ((num_sequences & 1) == 0) { - // std::transform(sequence.begin(), sequence.end(), sequence.begin(), - // [](char c) { return std::tolower(c); }); - // } + if ((num_sequences & 1) == 0) { + std::transform(sequence.begin(), sequence.end(), sequence.begin(), + [](char c) { return std::tolower(c); }); + } ++num_sequences; for (uint64_t i = 0; i + k <= sequence.length(); ++i) { @@ -57,10 +57,10 @@ bool check_correctness_lookup_access(std::istream& is, Dict const& dict) // } /* transform 50% of the kmers into their reverse complements */ - // if ((num_kmers & 1) == 0) { - // uint_kmer.reverse_complement_inplace(k); - // orientation = constants::backward_orientation; - // } + if ((num_kmers & 1) == 0) { + uint_kmer.reverse_complement_inplace(k); + orientation = constants::backward_orientation; + } util::uint_kmer_to_string(uint_kmer, expected_kmer_str.data(), k); auto curr = dict.lookup(expected_kmer_str.c_str()); diff --git a/tools/build.cpp b/tools/build.cpp index ff617e2..b43d986 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -84,11 +84,11 @@ int build(int argc, char** argv) { bool check = parser.get("check"); if (check) { check_correctness_lookup_access(dict, input_filename); - // check_correctness_navigational_kmer_query(dict, input_filename); - // check_correctness_navigational_string_query(dict); - // if (build_config.weighted) check_correctness_weights(dict, input_filename); - // check_correctness_kmer_iterator(dict); - // check_correctness_string_iterator(dict); + check_correctness_navigational_kmer_query(dict, input_filename); + check_correctness_navigational_string_query(dict); + if (build_config.weighted) check_correctness_weights(dict, input_filename); + check_correctness_kmer_iterator(dict); + check_correctness_string_iterator(dict); } bool bench = parser.get("bench"); if (bench) { From 127ca0475c6a193a17cb5de831aab6b95159fac2 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 16 Oct 2025 15:52:56 +0200 Subject: [PATCH 050/112] minor --- include/builder/build_sparse_and_skew_index.cpp | 10 +++++----- include/sparse_and_skew_index.hpp | 8 ++++---- src/info.cpp | 7 ++++--- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index df03692..d73f6c9 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -209,7 +209,7 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary num_kmers_in_partition(num_partitions, 0); - d.m_ssi.m_skew_index.mphfs.resize(num_partitions); - d.m_ssi.m_skew_index.positions.resize(num_partitions); + d.m_ssi.skew_index.mphfs.resize(num_partitions); + d.m_ssi.skew_index.positions.resize(num_partitions); { std::cout << "computing sizes of partitions..." << std::endl; @@ -315,7 +315,7 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary @@ -84,7 +84,7 @@ struct sparse_and_skew_index // minimizers_control_map codewords; std::vector begin_buckets_of_size; bits::compact_vector mid_load_buckets; - skew_index m_skew_index; + skew_index skew_index; private: template @@ -92,7 +92,7 @@ struct sparse_and_skew_index // visitor.visit(t.codewords); visitor.visit(t.begin_buckets_of_size); visitor.visit(t.mid_load_buckets); - visitor.visit(t.m_skew_index); + visitor.visit(t.skew_index); } }; diff --git a/src/info.cpp b/src/info.cpp index 8000e36..3d42c59 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -34,12 +34,13 @@ void dictionary::print_space_breakdown() const { std::cout << " strings: " << (8.0 * m_spss.strings.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_spss.strings.num_bytes(), num_bits()) << "%\n"; - std::cout << " skew_index: " - << static_cast(m_ssi.m_skew_index.num_bits()) / num_kmers() - << " [bits/kmer] -- " << perc(m_ssi.m_skew_index.num_bits(), num_bits()) << "%\n"; + std::cout << " skew_index: " << static_cast(m_ssi.skew_index.num_bits()) / num_kmers() + << " [bits/kmer] -- " << perc(m_ssi.skew_index.num_bits(), num_bits()) << "%\n"; std::cout << " weights: " << static_cast(m_weights.num_bits()) / num_kmers() << " [bits/kmer] -- " << perc(m_weights.num_bits(), num_bits()) << "%\n"; + if (weighted()) m_weights.print_space_breakdown(num_kmers()); + std::cout << " --------------\n"; std::cout << " total: " << static_cast(num_bits()) / num_kmers() << " [bits/kmer]" << std::endl; From 091f24426952009e2e5a8929620e6389e55d3d73 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 16 Oct 2025 16:02:56 +0200 Subject: [PATCH 051/112] minor --- include/builder/build_sparse_and_skew_index.cpp | 10 +++++----- include/sparse_and_skew_index.hpp | 8 ++++---- src/info.cpp | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index d73f6c9..530eaa6 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -209,7 +209,7 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary num_kmers_in_partition(num_partitions, 0); - d.m_ssi.skew_index.mphfs.resize(num_partitions); - d.m_ssi.skew_index.positions.resize(num_partitions); + d.m_ssi.ski.mphfs.resize(num_partitions); + d.m_ssi.ski.positions.resize(num_partitions); { std::cout << "computing sizes of partitions..." << std::endl; @@ -315,7 +315,7 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary @@ -84,7 +84,7 @@ struct sparse_and_skew_index // minimizers_control_map codewords; std::vector begin_buckets_of_size; bits::compact_vector mid_load_buckets; - skew_index skew_index; + skew_index ski; private: template @@ -92,7 +92,7 @@ struct sparse_and_skew_index // visitor.visit(t.codewords); visitor.visit(t.begin_buckets_of_size); visitor.visit(t.mid_load_buckets); - visitor.visit(t.skew_index); + visitor.visit(t.ski); } }; diff --git a/src/info.cpp b/src/info.cpp index 3d42c59..cf214fc 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -34,8 +34,8 @@ void dictionary::print_space_breakdown() const { std::cout << " strings: " << (8.0 * m_spss.strings.num_bytes()) / num_kmers() << " [bits/kmer] -- " << perc(8 * m_spss.strings.num_bytes(), num_bits()) << "%\n"; - std::cout << " skew_index: " << static_cast(m_ssi.skew_index.num_bits()) / num_kmers() - << " [bits/kmer] -- " << perc(m_ssi.skew_index.num_bits(), num_bits()) << "%\n"; + std::cout << " skew_index: " << static_cast(m_ssi.ski.num_bits()) / num_kmers() + << " [bits/kmer] -- " << perc(m_ssi.ski.num_bits(), num_bits()) << "%\n"; std::cout << " weights: " << static_cast(m_weights.num_bits()) / num_kmers() << " [bits/kmer] -- " << perc(m_weights.num_bits(), num_bits()) << "%\n"; From 64c8443d09d5c8ab156a4e1e09899293200ca3dd Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 18 Oct 2025 20:46:09 +0200 Subject: [PATCH 052/112] XXH128 does not work on AMD processor: rewritten hashers for minimizers and kmers; updated external/pthash --- CMakeLists.txt | 2 +- external/pthash | 2 +- include/hash_util.hpp | 25 +++++++++++++++++++++---- include/kmer.hpp | 35 ++++++++++++++++------------------- test/check.cpp | 6 +++--- 5 files changed, 42 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cea50e0..126d55e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ if (UNIX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-missing-braces -Wno-unknown-attributes -Wno-unused-function") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wno-missing-braces -Wno-unknown-attributes -Wno-unused-function") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") if (SSHASH_USE_SANITIZERS) diff --git a/external/pthash b/external/pthash index 217917b..304378a 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit 217917b98c7e921bc231a38e1585966b48a96f49 +Subproject commit 304378a7045eb0982fad92e32cfaff9fc63291ff diff --git a/include/hash_util.hpp b/include/hash_util.hpp index 668b548..fd21fc3 100644 --- a/include/hash_util.hpp +++ b/include/hash_util.hpp @@ -5,7 +5,22 @@ namespace sshash { -using minimizers_base_hasher_type = pthash::xxhash_128; +struct minimizers_pthash_hasher_128 { + typedef pthash::hash128 hash_type; + + static inline pthash::hash128 hash(uint64_t const minimizer, uint64_t seed) { + /* + Cannot use XXH128 directly because on some processors (e.g., AMD) + it just does not work. + */ + uint8_t const* begin = reinterpret_cast(&minimizer); + uint8_t const* end = begin + sizeof(minimizer); + return {XXH64(begin, end - begin, seed), XXH64(begin, end - begin, ~seed)}; + } +}; + +using minimizers_base_hasher_type = minimizers_pthash_hasher_128; + using minimizers_pthash_type = // pthash::partitioned_phf< // minimizers_base_hasher_type, // base hasher @@ -18,14 +33,16 @@ template struct kmers_pthash_hasher_128 { typedef pthash::hash128 hash_type; - /* specialization for Kmer */ - static inline pthash::hash128 hash(Kmer x, uint64_t seed) { - return pthash::xxhash_128::hash(x.begin(), x.end(), seed); + static inline pthash::hash128 hash(Kmer const x, uint64_t seed) { + uint8_t const* begin = reinterpret_cast(&(x.bits)); + uint8_t const* end = begin + sizeof(x.bits); + return {XXH64(begin, end - begin, seed), XXH64(begin, end - begin, ~seed)}; } }; template using kmers_base_hasher_type = kmers_pthash_hasher_128; + template using kmers_pthash_type = // pthash::partitioned_phf< // diff --git a/include/kmer.hpp b/include/kmer.hpp index 033bfef..6fe1520 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -16,35 +16,32 @@ namespace sshash { template struct uint_kmer_t { - Kmer kmer = 0; + Kmer bits = 0; uint_kmer_t() {} - uint_kmer_t(uint64_t kmer) : kmer(kmer) {} - - uint8_t const* begin() const { return reinterpret_cast(&kmer); } - uint8_t const* end() const { return begin() + sizeof(kmer); } + uint_kmer_t(uint64_t bits) : bits(bits) {} virtual ~uint_kmer_t() = default; explicit operator uint64_t() const { if constexpr (std::is_constructible_v) { - return static_cast(kmer); + return static_cast(bits); } else { // std::bitset? - return (kmer & Kmer(uint64_t(-1))).to_ulong(); + return (bits & Kmer(uint64_t(-1))).to_ulong(); } } - bool operator==(uint_kmer_t const& t) const { return kmer == t.kmer; } - bool operator!=(uint_kmer_t const& t) const { return kmer != t.kmer; } - bool operator<(uint_kmer_t const& t) const { return kmer < t.kmer; } + bool operator==(uint_kmer_t const& t) const { return bits == t.bits; } + bool operator!=(uint_kmer_t const& t) const { return bits != t.bits; } + bool operator<(uint_kmer_t const& t) const { return bits < t.bits; } - void pad(uint16_t b) { kmer <<= b; } + void pad(uint16_t b) { bits <<= b; } void pad_char() { pad(bits_per_char); } - void drop(uint16_t b) { kmer >>= b; } + void drop(uint16_t b) { bits >>= b; } void drop64() { if constexpr (uint_kmer_bits == 64) { - kmer = 0; + bits = 0; } else { drop(64); } @@ -52,8 +49,8 @@ struct uint_kmer_t { void drop_char() { drop(bits_per_char); } void drop_chars(uint16_t k) { drop(k * bits_per_char); } - void take(uint16_t b) { kmer &= ~(~Kmer(0) << b); } - void take64() { kmer &= Kmer(uint64_t(-1)); } + void take(uint16_t b) { bits &= ~(~Kmer(0) << b); } + void take64() { bits &= Kmer(uint64_t(-1)); } void take_char() { take(bits_per_char); } void take_chars(uint16_t k) { take(k * bits_per_char); } @@ -71,20 +68,20 @@ struct uint_kmer_t { void append64(uint64_t n) { if constexpr (uint_kmer_bits == 64) { - kmer = n; + bits = n; } else { assert(64 < uint_kmer_bits); - kmer = (kmer << 64) | Kmer(n); + bits = (bits << 64) | Kmer(n); } } /* Set the char at position i to c, assuming that the position is empty. */ - void set(uint16_t i, uint64_t c) { kmer |= Kmer(c) << (i * bits_per_char); } + void set(uint16_t i, uint64_t c) { bits |= Kmer(c) << (i * bits_per_char); } /* Returns the char at position i. */ uint64_t at(uint16_t i) const { - return (kmer >> (i * bits_per_char)) & ((uint64_t(1) << bits_per_char) - 1); + return (bits >> (i * bits_per_char)) & ((uint64_t(1) << bits_per_char) - 1); } static constexpr uint16_t uint_kmer_bits = 8 * sizeof(Kmer); diff --git a/test/check.cpp b/test/check.cpp index 9a3f1c6..cdcf3cd 100644 --- a/test/check.cpp +++ b/test/check.cpp @@ -37,7 +37,7 @@ std::unordered_set parse_file(std::istream& is, const uint64_t k) { assert(util::is_valid(kmer, k)); kmer_type uint_kmer = util::string_to_uint_kmer(kmer, k); - kmers.insert(uint_kmer.kmer); + kmers.insert(uint_kmer.bits); ++num_kmers; } @@ -77,12 +77,12 @@ void query_from_fastq_file(std::string const& query_filename, if (util::is_valid(kmer, k)) // { kmer_type uint_kmer = util::string_to_uint_kmer(kmer, k); - if (auto it = kmers.find(uint_kmer.kmer); it != kmers.end()) { + if (auto it = kmers.find(uint_kmer.bits); it != kmers.end()) { num_positive_kmers += 1; } kmer_type uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(k); - if (auto it = kmers.find(uint_kmer_rc.kmer); it != kmers.end()) { + if (auto it = kmers.find(uint_kmer_rc.bits); it != kmers.end()) { num_positive_kmers += 1; } } From f5215effac39090f1fa85d8f2edc8650531c57b2 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 19 Oct 2025 16:04:41 +0200 Subject: [PATCH 053/112] added cityhash --- external/cityhash/cityhash.cpp | 445 +++++++++++++++++++++++++++++++++ external/cityhash/cityhash.hpp | 115 +++++++++ include/hash_util.hpp | 39 ++- 3 files changed, 594 insertions(+), 5 deletions(-) create mode 100644 external/cityhash/cityhash.cpp create mode 100644 external/cityhash/cityhash.hpp diff --git a/external/cityhash/cityhash.cpp b/external/cityhash/cityhash.cpp new file mode 100644 index 0000000..50cafc5 --- /dev/null +++ b/external/cityhash/cityhash.cpp @@ -0,0 +1,445 @@ +// Taken from: https://github.com/aappleby/smhasher/blob/master/src/City.cpp + +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides CityHash64() and related functions. +// +// It's probably possible to create even faster hash functions by +// writing a program that systematically explores some of the space of +// possible hash functions, by using SIMD instructions, or by +// compromising on hash quality. + +#include "cityhash.hpp" + +#include +#include // for memcpy and memset + +using namespace std; + +static uint64 UNALIGNED_LOAD64(const char* p) { + uint64 result; + memcpy(&result, p, sizeof(result)); + return result; +} + +static uint32 UNALIGNED_LOAD32(const char* p) { + uint32 result; + memcpy(&result, p, sizeof(result)); + return result; +} + +#ifndef __BIG_ENDIAN__ + +#define uint32_in_expected_order(x) (x) +#define uint64_in_expected_order(x) (x) + +#else + +#ifdef _MSC_VER +#include +#define bswap_32(x) _byteswap_ulong(x) +#define bswap_64(x) _byteswap_uint64(x) + +#elif defined(__APPLE__) +// Mac OS X / Darwin features +#include +#define bswap_32(x) OSSwapInt32(x) +#define bswap_64(x) OSSwapInt64(x) + +#else +#include +#endif + +#define uint32_in_expected_order(x) (bswap_32(x)) +#define uint64_in_expected_order(x) (bswap_64(x)) + +#endif // __BIG_ENDIAN__ + +#if !defined(LIKELY) +#if defined(__GNUC__) || defined(__INTEL_COMPILER) +#define LIKELY(x) (__builtin_expect(!!(x), 1)) +#else +#define LIKELY(x) (x) +#endif +#endif + +static uint64 Fetch64(const char* p) { return uint64_in_expected_order(UNALIGNED_LOAD64(p)); } + +static uint32 Fetch32(const char* p) { return uint32_in_expected_order(UNALIGNED_LOAD32(p)); } + +// Some primes between 2^63 and 2^64 for various uses. +static const uint64 k0 = 0xc3a5c85c97cb3127ULL; +static const uint64 k1 = 0xb492b66fbe98f273ULL; +static const uint64 k2 = 0x9ae16a3b2f90404fULL; +static const uint64 k3 = 0xc949d7c7509e6557ULL; + +// Bitwise right rotate. Normally this will compile to a single +// instruction, especially if the shift is a manifest constant. +static uint64 Rotate(uint64 val, int shift) { + // Avoid shifting by 64: doing so yields an undefined result. + return shift == 0 ? val : ((val >> shift) | (val << (64 - shift))); +} + +// Equivalent to Rotate(), but requires the second arg to be non-zero. +// On x86-64, and probably others, it's possible for this to compile +// to a single instruction if both args are already in registers. +static uint64 RotateByAtLeast1(uint64 val, int shift) { + return (val >> shift) | (val << (64 - shift)); +} + +static uint64 ShiftMix(uint64 val) { return val ^ (val >> 47); } + +static uint64 HashLen16(uint64 u, uint64 v) { return Hash128to64(uint128(u, v)); } + +static uint64 HashLen0to16(const char* s, size_t len) { + if (len > 8) { + uint64 a = Fetch64(s); + uint64 b = Fetch64(s + len - 8); + return HashLen16(a, RotateByAtLeast1(b + len, len)) ^ b; + } + if (len >= 4) { + uint64 a = Fetch32(s); + return HashLen16(len + (a << 3), Fetch32(s + len - 4)); + } + if (len > 0) { + uint8 a = s[0]; + uint8 b = s[len >> 1]; + uint8 c = s[len - 1]; + uint32 y = static_cast(a) + (static_cast(b) << 8); + uint32 z = len + (static_cast(c) << 2); + return ShiftMix(y * k2 ^ z * k3) * k2; + } + return k2; +} + +// This probably works well for 16-byte strings as well, but it may be overkill +// in that case. +static uint64 HashLen17to32(const char* s, size_t len) { + uint64 a = Fetch64(s) * k1; + uint64 b = Fetch64(s + 8); + uint64 c = Fetch64(s + len - 8) * k2; + uint64 d = Fetch64(s + len - 16) * k0; + return HashLen16(Rotate(a - b, 43) + Rotate(c, 30) + d, a + Rotate(b ^ k3, 20) - c + len); +} + +// Return a 16-byte hash for 48 bytes. Quick and dirty. +// Callers do best to use "random-looking" values for a and b. +static pair WeakHashLen32WithSeeds(uint64 w, uint64 x, uint64 y, uint64 z, uint64 a, + uint64 b) { + a += w; + b = Rotate(b + a + z, 21); + uint64 c = a; + a += x; + a += y; + b += Rotate(a, 44); + return make_pair(a + z, b + c); +} + +// Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. +static pair WeakHashLen32WithSeeds(const char* s, uint64 a, uint64 b) { + return WeakHashLen32WithSeeds(Fetch64(s), Fetch64(s + 8), Fetch64(s + 16), Fetch64(s + 24), a, + b); +} + +// Return an 8-byte hash for 33 to 64 bytes. +static uint64 HashLen33to64(const char* s, size_t len) { + uint64 z = Fetch64(s + 24); + uint64 a = Fetch64(s) + (len + Fetch64(s + len - 16)) * k0; + uint64 b = Rotate(a + z, 52); + uint64 c = Rotate(a, 37); + a += Fetch64(s + 8); + c += Rotate(a, 7); + a += Fetch64(s + 16); + uint64 vf = a + z; + uint64 vs = b + Rotate(a, 31) + c; + a = Fetch64(s + 16) + Fetch64(s + len - 32); + z = Fetch64(s + len - 8); + b = Rotate(a + z, 52); + c = Rotate(a, 37); + a += Fetch64(s + len - 24); + c += Rotate(a, 7); + a += Fetch64(s + len - 16); + uint64 wf = a + z; + uint64 ws = b + Rotate(a, 31) + c; + uint64 r = ShiftMix((vf + ws) * k2 + (wf + vs) * k0); + return ShiftMix(r * k0 + vs) * k2; +} + +uint64 CityHash64(const char* s, size_t len) { + if (len <= 32) { + if (len <= 16) { + return HashLen0to16(s, len); + } else { + return HashLen17to32(s, len); + } + } else if (len <= 64) { + return HashLen33to64(s, len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + uint64 x = Fetch64(s + len - 40); + uint64 y = Fetch64(s + len - 16) + Fetch64(s + len - 56); + uint64 z = HashLen16(Fetch64(s + len - 48) + len, Fetch64(s + len - 24)); + pair v = WeakHashLen32WithSeeds(s + len - 64, len, z); + pair w = WeakHashLen32WithSeeds(s + len - 32, y + k1, x); + x = x * k1 + Fetch64(s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + len = (len - 1) & ~static_cast(63); + do { + x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; + x ^= w.second; + y += v.first + Fetch64(s + 40); + z = Rotate(z + w.first, 33) * k1; + v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); + w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16)); + std::swap(z, x); + s += 64; + len -= 64; + } while (len != 0); + return HashLen16(HashLen16(v.first, w.first) + ShiftMix(y) * k1 + z, + HashLen16(v.second, w.second) + x); +} + +uint64 CityHash64WithSeed(const char* s, size_t len, uint64 seed) { + return CityHash64WithSeeds(s, len, k2, seed); +} + +uint64 CityHash64WithSeeds(const char* s, size_t len, uint64 seed0, uint64 seed1) { + return HashLen16(CityHash64(s, len) - seed0, seed1); +} + +// A subroutine for CityHash128(). Returns a decent 128-bit hash for strings +// of any length representable in signed long. Based on City and Murmur. +static uint128 CityMurmur(const char* s, size_t len, uint128 seed) { + uint64 a = Uint128Low64(seed); + uint64 b = Uint128High64(seed); + uint64 c = 0; + uint64 d = 0; + signed long l = len - 16; + if (l <= 0) { // len <= 16 + a = ShiftMix(a * k1) * k1; + c = b * k1 + HashLen0to16(s, len); + d = ShiftMix(a + (len >= 8 ? Fetch64(s) : c)); + } else { // len > 16 + c = HashLen16(Fetch64(s + len - 8) + k1, a); + d = HashLen16(b + len, c + Fetch64(s + len - 16)); + a += d; + do { + a ^= ShiftMix(Fetch64(s) * k1) * k1; + a *= k1; + b ^= a; + c ^= ShiftMix(Fetch64(s + 8) * k1) * k1; + c *= k1; + d ^= c; + s += 16; + l -= 16; + } while (l > 0); + } + a = HashLen16(a, c); + b = HashLen16(d, b); + return uint128(a ^ b, HashLen16(b, a)); +} + +uint128 CityHash128WithSeed(const char* s, size_t len, uint128 seed) { + if (len < 128) { return CityMurmur(s, len, seed); } + + // We expect len >= 128 to be the common case. Keep 56 bytes of state: + // v, w, x, y, and z. + pair v, w; + uint64 x = Uint128Low64(seed); + uint64 y = Uint128High64(seed); + uint64 z = len * k1; + v.first = Rotate(y ^ k1, 49) * k1 + Fetch64(s); + v.second = Rotate(v.first, 42) * k1 + Fetch64(s + 8); + w.first = Rotate(y + z, 35) * k1 + x; + w.second = Rotate(x + Fetch64(s + 88), 53) * k1; + + // This is the same inner loop as CityHash64(), manually unrolled. + do { + x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; + x ^= w.second; + y += v.first + Fetch64(s + 40); + z = Rotate(z + w.first, 33) * k1; + v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); + w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16)); + std::swap(z, x); + s += 64; + x = Rotate(x + y + v.first + Fetch64(s + 8), 37) * k1; + y = Rotate(y + v.second + Fetch64(s + 48), 42) * k1; + x ^= w.second; + y += v.first + Fetch64(s + 40); + z = Rotate(z + w.first, 33) * k1; + v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first); + w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch64(s + 16)); + std::swap(z, x); + s += 64; + len -= 128; + } while (LIKELY(len >= 128)); + x += Rotate(v.first + z, 49) * k0; + z += Rotate(w.first, 37) * k0; + // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of s. + for (size_t tail_done = 0; tail_done < len;) { + tail_done += 32; + y = Rotate(x + y, 42) * k0 + v.second; + w.first += Fetch64(s + len - tail_done + 16); + x = x * k0 + w.first; + z += w.second + Fetch64(s + len - tail_done); + w.second += v.first; + v = WeakHashLen32WithSeeds(s + len - tail_done, v.first + z, v.second); + } + // At this point our 56 bytes of state should contain more than + // enough information for a strong 128-bit hash. We use two + // different 56-byte-to-8-byte hashes to get a 16-byte final result. + x = HashLen16(x, v.first); + y = HashLen16(y + z, w.first); + return uint128(HashLen16(x + v.second, w.second) + y, HashLen16(x + w.second, y + v.second)); +} + +uint128 CityHash128(const char* s, size_t len) { + if (len >= 16) { + return CityHash128WithSeed(s + 16, len - 16, uint128(Fetch64(s) ^ k3, Fetch64(s + 8))); + } else if (len >= 8) { + return CityHash128WithSeed(NULL, 0, + uint128(Fetch64(s) ^ (len * k0), Fetch64(s + len - 8) ^ k1)); + } else { + return CityHash128WithSeed(s, len, uint128(k0, k1)); + } +} + +#if defined(__SSE4_2__) && defined(__x86_64__) +#include + +// Requires len >= 240. +static void CityHashCrc256Long(const char* s, size_t len, uint32 seed, uint64* result) { + uint64 a = Fetch64(s + 56) + k0; + uint64 b = Fetch64(s + 96) + k0; + uint64 c = result[0] = HashLen16(b, len); + uint64 d = result[1] = Fetch64(s + 120) * k0 + len; + uint64 e = Fetch64(s + 184) + seed; + uint64 f = seed; + uint64 g = 0; + uint64 h = 0; + uint64 i = 0; + uint64 j = 0; + uint64 t = c + d; + + // 240 bytes of input per iter. + size_t iters = len / 240; + len -= iters * 240; + do { +#define CHUNK(multiplier, z) \ + { \ + uint64 old_a = a; \ + a = Rotate(b, 41 ^ z) * multiplier + Fetch64(s); \ + b = Rotate(c, 27 ^ z) * multiplier + Fetch64(s + 8); \ + c = Rotate(d, 41 ^ z) * multiplier + Fetch64(s + 16); \ + d = Rotate(e, 33 ^ z) * multiplier + Fetch64(s + 24); \ + e = Rotate(t, 25 ^ z) * multiplier + Fetch64(s + 32); \ + t = old_a; \ + } \ + f = _mm_crc32_u64(f, a); \ + g = _mm_crc32_u64(g, b); \ + h = _mm_crc32_u64(h, c); \ + i = _mm_crc32_u64(i, d); \ + j = _mm_crc32_u64(j, e); \ + s += 40 + + CHUNK(1, 1); + CHUNK(k0, 0); + CHUNK(1, 1); + CHUNK(k0, 0); + CHUNK(1, 1); + CHUNK(k0, 0); + } while (--iters > 0); + + while (len >= 40) { + CHUNK(k0, 0); + len -= 40; + } + if (len > 0) { + s = s + len - 40; + CHUNK(k0, 0); + } + j += i << 32; + a = HashLen16(a, j); + h += g << 32; + b += h; + c = HashLen16(c, f) + i; + d = HashLen16(d, e + result[0]); + j += e; + i += HashLen16(h, t); + e = HashLen16(a, d) + j; + f = HashLen16(b, c) + a; + g = HashLen16(j, i) + c; + result[0] = e + f + g + h; + a = ShiftMix((a + g) * k0) * k0 + b; + result[1] += a + result[0]; + a = ShiftMix(a * k0) * k0 + c; + result[2] = a + result[1]; + a = ShiftMix((a + e) * k0) * k0; + result[3] = a + result[2]; +} + +// Requires len < 240. +static void CityHashCrc256Short(const char* s, size_t len, uint64* result) { + char buf[240]; + memcpy(buf, s, len); + memset(buf + len, 0, 240 - len); + CityHashCrc256Long(buf, 240, ~static_cast(len), result); +} + +void CityHashCrc256(const char* s, size_t len, uint64* result) { + if (LIKELY(len >= 240)) { + CityHashCrc256Long(s, len, 0, result); + } else { + CityHashCrc256Short(s, len, result); + } +} + +uint128 CityHashCrc128WithSeed(const char* s, size_t len, uint128 seed) { + if (len <= 900) { + return CityHash128WithSeed(s, len, seed); + } else { + uint64 result[4]; + CityHashCrc256(s, len, result); + uint64 u = Uint128High64(seed) + result[0]; + uint64 v = Uint128Low64(seed) + result[1]; + return uint128(HashLen16(u, v + result[2]), HashLen16(Rotate(v, 32), u * k0 + result[3])); + } +} + +uint128 CityHashCrc128(const char* s, size_t len) { + if (len <= 900) { + return CityHash128(s, len); + } else { + uint64 result[4]; + CityHashCrc256(s, len, result); + return uint128(result[2], result[3]); + } +} + +#endif \ No newline at end of file diff --git a/external/cityhash/cityhash.hpp b/external/cityhash/cityhash.hpp new file mode 100644 index 0000000..23fb877 --- /dev/null +++ b/external/cityhash/cityhash.hpp @@ -0,0 +1,115 @@ +// Taken from: https://github.com/aappleby/smhasher/blob/master/src/City.h + +// Copyright (c) 2011 Google, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// CityHash, by Geoff Pike and Jyrki Alakuijala +// +// This file provides a few functions for hashing strings. On x86-64 +// hardware in 2011, CityHash64() is faster than other high-quality +// hash functions, such as Murmur. This is largely due to higher +// instruction-level parallelism. CityHash64() and CityHash128() also perform +// well on hash-quality tests. +// +// CityHash128() is optimized for relatively long strings and returns +// a 128-bit hash. For strings more than about 2000 bytes it can be +// faster than CityHash64(). +// +// Functions in the CityHash family are not suitable for cryptography. +// +// WARNING: This code has not been tested on big-endian platforms! +// It is known to work well on little-endian platforms that have a small penalty +// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs. +// +// By the way, for some hash functions, given strings a and b, the hash +// of a+b is easily derived from the hashes of a and b. This property +// doesn't hold for any hash functions in this file. + +#ifndef CITY_HASH_H_ +#define CITY_HASH_H_ + +#include // for size_t. +#include + +// Microsoft Visual Studio may not have stdint.h. +#if defined(_MSC_VER) && (_MSC_VER < 1600) +typedef unsigned char uint8_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +#else // defined(_MSC_VER) +#include +#endif // !defined(_MSC_VER) + +typedef uint8_t uint8; +typedef uint32_t uint32; +typedef uint64_t uint64; +typedef std::pair uint128; + +inline uint64 Uint128Low64(const uint128& x) { return x.first; } +inline uint64 Uint128High64(const uint128& x) { return x.second; } + +// Hash function for a byte array. +uint64 CityHash64(const char* buf, size_t len); + +// Hash function for a byte array. For convenience, a 64-bit seed is also +// hashed into the result. +uint64 CityHash64WithSeed(const char* buf, size_t len, uint64 seed); + +// Hash function for a byte array. For convenience, two seeds are also +// hashed into the result. +uint64 CityHash64WithSeeds(const char* buf, size_t len, uint64 seed0, uint64 seed1); + +// Hash function for a byte array. +uint128 CityHash128(const char* s, size_t len); + +// Hash function for a byte array. For convenience, a 128-bit seed is also +// hashed into the result. +uint128 CityHash128WithSeed(const char* s, size_t len, uint128 seed); + +// Hash 128 input bits down to 64 bits of output. +// This is intended to be a reasonably good hash function. +inline uint64 Hash128to64(const uint128& x) { + // Murmur-inspired hashing. + const uint64 kMul = 0x9ddfea08eb382d69ULL; + uint64 a = (Uint128Low64(x) ^ Uint128High64(x)) * kMul; + a ^= (a >> 47); + uint64 b = (Uint128High64(x) ^ a) * kMul; + b ^= (b >> 47); + b *= kMul; + return b; +} + +// Conditionally include declarations for versions of City that require SSE4.2 +// instructions to be available. +#if defined(__SSE4_2__) && defined(__x86_64__) + +// Hash function for a byte array. +uint128 CityHashCrc128(const char* s, size_t len); + +// Hash function for a byte array. For convenience, a 128-bit seed is also +// hashed into the result. +uint128 CityHashCrc128WithSeed(const char* s, size_t len, uint128 seed); + +// Hash function for a byte array. Sets result[0] ... result[3]. +void CityHashCrc256(const char* s, size_t len, uint64* result); + +#endif // __SSE4_2__ + +#endif // CITY_HASH_H_ \ No newline at end of file diff --git a/include/hash_util.hpp b/include/hash_util.hpp index fd21fc3..d6b4fbc 100644 --- a/include/hash_util.hpp +++ b/include/hash_util.hpp @@ -1,17 +1,31 @@ #pragma once #include "external/pthash/include/pthash.hpp" +#include "external/cityhash/cityhash.cpp" #include "constants.hpp" namespace sshash { -struct minimizers_pthash_hasher_128 { +struct minimizers_city_hasher_128 { + typedef pthash::hash128 hash_type; + + static inline pthash::hash128 hash(uint64_t const minimizer, uint64_t seed) { + auto ret = CityMurmur(reinterpret_cast(&minimizer), // + sizeof(minimizer), {seed, ~seed}); + return {ret.first, ret.second}; + } +}; + +struct minimizers_xx_hasher_128 { typedef pthash::hash128 hash_type; static inline pthash::hash128 hash(uint64_t const minimizer, uint64_t seed) { /* Cannot use XXH128 directly because on some processors (e.g., AMD) - it just does not work. + it just does not work in Release mode, e.g., when compiling *without* + sanitizers: -fsanitize=address -fno-omit-frame-pointer. + We therefore rely on XXH64 that produces 64-bit hashes but does not + seem to have any issue. */ uint8_t const* begin = reinterpret_cast(&minimizer); uint8_t const* end = begin + sizeof(minimizer); @@ -19,7 +33,8 @@ struct minimizers_pthash_hasher_128 { } }; -using minimizers_base_hasher_type = minimizers_pthash_hasher_128; +// using minimizers_base_hasher_type = minimizers_xx_hasher_128; +using minimizers_base_hasher_type = minimizers_city_hasher_128; using minimizers_pthash_type = // pthash::partitioned_phf< // @@ -30,7 +45,7 @@ using minimizers_pthash_type = // >; // template -struct kmers_pthash_hasher_128 { +struct kmers_xx_hasher_128 { typedef pthash::hash128 hash_type; static inline pthash::hash128 hash(Kmer const x, uint64_t seed) { @@ -41,7 +56,21 @@ struct kmers_pthash_hasher_128 { }; template -using kmers_base_hasher_type = kmers_pthash_hasher_128; +struct kmers_city_hasher_128 { + typedef pthash::hash128 hash_type; + + static inline pthash::hash128 hash(Kmer const x, uint64_t seed) { + auto ret = CityMurmur(reinterpret_cast(&(x.bits)), // + sizeof(x.bits), {seed, ~seed}); + return {ret.first, ret.second}; + } +}; + +// template +// using kmers_base_hasher_type = kmers_xx_hasher_128; + +template +using kmers_base_hasher_type = kmers_city_hasher_128; template using kmers_pthash_type = // From 09244aaf0b03e25704acd60c5d812363473e7869 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 21 Oct 2025 14:07:38 +0200 Subject: [PATCH 054/112] parallel checks --- test/check.hpp | 226 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 164 insertions(+), 62 deletions(-) diff --git a/test/check.hpp b/test/check.hpp index 11774ad..e529f1a 100644 --- a/test/check.hpp +++ b/test/check.hpp @@ -15,7 +15,7 @@ bool check_dictionary(Dict const& dict) { std::mutex print_mutex; - auto worker = [&](uint64_t start, uint64_t end, size_t thread_id) { + auto worker = [&](uint64_t start, uint64_t end, uint64_t thread_id) { std::string kmer(k, 0); for (uint64_t id = start; id != end; ++id) // { @@ -56,7 +56,7 @@ bool check_dictionary(Dict const& dict) { std::vector threads; threads.reserve(num_threads); - for (size_t t = 0, chunk_size = (n + num_threads - 1) / num_threads; t != num_threads; ++t) { + for (uint64_t t = 0, chunk_size = (n + num_threads - 1) / num_threads; t != num_threads; ++t) { uint64_t start = t * chunk_size; uint64_t end = std::min(n, start + chunk_size); threads.emplace_back(worker, start, end, t); @@ -92,96 +92,198 @@ bool check_correctness_negative_lookup(Dict const& dict) { template bool check_correctness_navigational_string_query(Dict const& dict) // { - std::cout << "checking correctness of navigational queries for strings..." << std::endl; using kmer_t = typename Dict::kmer_type; const uint64_t num_strings = dict.num_strings(); const uint64_t k = dict.k(); - uint64_t kmer_id = 0; - std::string kmer(k, 0); - uint64_t string_id = 0; - for (; string_id != num_strings; ++string_id) { - if (string_id != 0 and string_id % 1'000'000 == 0) { - std::cout << "checked " << string_id << "/" << num_strings << " strings" << std::endl; - } - auto res = dict.string_neighbours(string_id); - uint64_t string_size = dict.string_size(string_id); + const uint64_t num_threads = std::thread::hardware_concurrency(); + std::cout << "checking correctness of navigational queries for strings using " << num_threads + << " threads ..." << std::endl; - uint64_t begin_kmer_id = kmer_id; - dict.access(begin_kmer_id, kmer.data()); - auto backward = dict.kmer_backward_neighbours(kmer.data()); - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - equal_lookup_result(backward.backward[i], res.backward[i]); - } + std::mutex print_mutex; + + auto worker = [&](uint64_t start, uint64_t end, uint64_t start_kmer_id, uint64_t thread_id) { + std::string kmer(k, 0); + uint64_t kmer_id = start_kmer_id; - uint64_t end_kmer_id = kmer_id + string_size - 1; - dict.access(end_kmer_id, kmer.data()); - auto forward = dict.kmer_forward_neighbours(kmer.data()); - for (size_t i = 0; i < kmer_t::alphabet_size; i++) { - equal_lookup_result(forward.forward[i], res.forward[i]); + for (uint64_t string_id = start; string_id < end; ++string_id) { + if (string_id != start && (string_id - start) % 1'000'000 == 0) { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] checked " << (string_id - start) + << " strings (local progress)\n"; + } + + auto res = dict.string_neighbours(string_id); + uint64_t string_size = dict.string_size(string_id); + + // Check backward neighbours at beginning k-mer + uint64_t begin_kmer_id = kmer_id; + dict.access(begin_kmer_id, kmer.data()); + auto backward = dict.kmer_backward_neighbours(kmer.data()); + for (uint64_t i = 0; i < kmer_t::alphabet_size; i++) { + equal_lookup_result(backward.backward[i], res.backward[i]); + } + + // Check forward neighbours at end k-mer + uint64_t end_kmer_id = kmer_id + string_size - 1; + dict.access(end_kmer_id, kmer.data()); + auto forward = dict.kmer_forward_neighbours(kmer.data()); + for (uint64_t i = 0; i < kmer_t::alphabet_size; i++) { + equal_lookup_result(forward.forward[i], res.forward[i]); + } + + kmer_id += string_size; + } + { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Finished range [" << start << ", " << end + << ")\n"; } - kmer_id += string_size; + }; + + std::vector threads; + threads.reserve(num_threads); + + for (uint64_t t = 0, current_start = 0, current_kmer_id = 0, + chunk_size = (num_strings + num_threads - 1) / num_threads; + t < num_threads && current_start < num_strings; ++t) // + { + uint64_t start = current_start; + uint64_t end = std::min(num_strings, start + chunk_size); + + // compute starting kmer_id for this thread + uint64_t start_kmer_id = current_kmer_id; + for (uint64_t i = start; i < end; ++i) current_kmer_id += dict.string_size(i); + + threads.emplace_back(worker, start, end, start_kmer_id, t); + current_start = end; } - std::cout << "checked " << string_id << " strings" << std::endl; + + for (auto& th : threads) th.join(); + + std::cout << "checked " << num_strings << " strings" << std::endl; std::cout << "EVERYTHING OK!" << std::endl; + return true; } template -bool check_correctness_kmer_iterator(Dict const& dict) { - std::cout << "checking correctness of kmer iterator..." << std::endl; +bool check_correctness_kmer_iterator(Dict const& dict) // +{ + const uint64_t num_kmers = dict.num_kmers(); const uint64_t k = dict.k(); - std::string read_kmer(k, 0); - std::string expected_kmer(k, 0); - constexpr uint64_t runs = 4; - essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, - essentials::get_random_seed()); - for (uint64_t run = 0; run != runs; ++run) { - uint64_t from_kmer_id = run == 0 ? 0 : distr.gen(); - auto it = dict.at_kmer_id(from_kmer_id); - while (it.has_next()) { + const uint64_t num_threads = std::thread::hardware_concurrency(); + std::cout << "checking correctness of kmer iterator using " << num_threads << " threads ..." + << std::endl; + + std::mutex print_mutex; + + auto worker = [&](uint64_t start, uint64_t end, uint64_t thread_id) { + assert(end > start); + std::string read_kmer(k, 0); + std::string expected_kmer(k, 0); + for (auto it = dict.at_kmer_id(start); start != end; ++start) { + uint64_t count = end - start; + if (count != 0 and count % 100'000'000 == 0) { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Checked " << count + << " kmers (local progress)" << std::endl; + } auto [kmer_id, kmer] = it.next(); util::uint_kmer_to_string(kmer, read_kmer.data(), k); dict.access(kmer_id, expected_kmer.data()); - if (read_kmer != expected_kmer or kmer_id != from_kmer_id) { - std::cout << "got (" << kmer_id << ",'" << read_kmer << "')"; - std::cout << " but "; - std::cout << "expected (" << from_kmer_id << ",'" << expected_kmer << "')" - << std::endl; - return false; + if (read_kmer != expected_kmer or kmer_id != start) { + std::lock_guard lock(print_mutex); + std::cerr << "[Thread " << thread_id << "] "; + std::cerr << "got (" << kmer_id << ",'" << read_kmer << "')"; + std::cerr << " but "; + std::cerr << "expected (" << start << ",'" << expected_kmer << "')" << std::endl; + return; } - ++from_kmer_id; } - assert(from_kmer_id == dict.num_kmers()); + { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Finished range [" << start << ", " << end + << ")\n"; + } + }; + + std::vector threads; + threads.reserve(num_threads); + for (uint64_t t = 0, chunk_size = (num_kmers + num_threads - 1) / num_threads; t != num_threads; + ++t) { + uint64_t start = t * chunk_size; + uint64_t end = std::min(num_kmers, start + chunk_size); + threads.emplace_back(worker, start, end, t); } + + for (auto& th : threads) th.join(); + std::cout << "EVERYTHING OK!" << std::endl; + return true; } template bool check_correctness_string_iterator(Dict const& dict) { - std::cout << "checking correctness of string iterator..." << std::endl; const uint64_t k = dict.k(); - std::string read_kmer(k, 0); - std::string expected_kmer(k, 0); - for (uint64_t string_id = 0; string_id != dict.num_strings(); ++string_id) { - auto [begin, _] = dict.string_offsets(string_id); - uint64_t from_kmer_id = begin - string_id * (dict.k() - 1); - auto it = dict.at_string_id(string_id); - while (it.has_next()) { - auto [kmer_id, kmer] = it.next(); - util::uint_kmer_to_string(kmer, read_kmer.data(), k); - dict.access(kmer_id, expected_kmer.data()); - if (read_kmer != expected_kmer or kmer_id != from_kmer_id) { - std::cout << "got (" << kmer_id << ",'" << read_kmer << "')"; - std::cout << " but "; - std::cout << "expected (" << from_kmer_id << ",'" << expected_kmer << "')" - << std::endl; - return false; + const uint64_t num_strings = dict.num_strings(); + + const uint64_t num_threads = std::thread::hardware_concurrency(); + std::cout << "checking correctness of string iterator using " << num_threads << " threads..." + << std::endl; + + std::mutex print_mutex; + + auto worker = [&](uint64_t start, uint64_t end, uint64_t thread_id) { + std::string read_kmer(k, 0); + std::string expected_kmer(k, 0); + + for (uint64_t string_id = start; string_id < end; ++string_id) { + auto [begin, _] = dict.string_offsets(string_id); + uint64_t from_kmer_id = begin - string_id * (dict.k() - 1); + auto it = dict.at_string_id(string_id); + + while (it.has_next()) { + auto [kmer_id, kmer] = it.next(); + util::uint_kmer_to_string(kmer, read_kmer.data(), k); + dict.access(kmer_id, expected_kmer.data()); + + if (read_kmer != expected_kmer || kmer_id != from_kmer_id) { + std::lock_guard lock(print_mutex); + std::cerr << "[Thread " << thread_id << "] ERROR at string_id " << string_id + << ": got (" << kmer_id << ", '" << read_kmer << "') but expected (" + << from_kmer_id << ", '" << expected_kmer << "')\n"; + return; + } + ++from_kmer_id; + } + + if ((string_id - start) % 1'000'000 == 0 && string_id != start) { + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] checked " << (string_id - start) + << " strings (local progress)\n"; } - ++from_kmer_id; } + + std::lock_guard lock(print_mutex); + std::cout << "[Thread " << thread_id << "] Finished range [" << start << ", " << end + << ")\n"; + }; + + std::vector threads; + threads.reserve(num_threads); + for (uint64_t t = 0, chunk_size = (num_strings + num_threads - 1) / num_threads; + t < num_threads; ++t) // + { + uint64_t start = t * chunk_size; + uint64_t end = std::min(num_strings, start + chunk_size); + if (start >= end) break; + threads.emplace_back(worker, start, end, t); } + + for (auto& th : threads) th.join(); + std::cout << "EVERYTHING OK!" << std::endl; return true; } From 5bb6ef3fa7d1dcb805d76cbbadb0d8297f683358 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 21 Oct 2025 14:39:29 +0200 Subject: [PATCH 055/112] print cmd; build and bench scripts updated --- script/bench.sh | 71 ++++++++++++++++++++++++++++++++++++++---------- script/build.sh | 39 ++++++++++++++++---------- tools/common.hpp | 5 ++++ tools/sshash.cpp | 1 + 4 files changed, 87 insertions(+), 29 deletions(-) diff --git a/script/bench.sh b/script/bench.sh index f8f519d..4bd06e6 100644 --- a/script/bench.sh +++ b/script/bench.sh @@ -2,24 +2,67 @@ echo "output log file =" $1 -### regular indexes +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off +make -j -./sshash bench -i cod.k31.sshash >> $1.regular.bench_log -# ./sshash bench -i cod.k63.sshash >> $1.regular.bench_log +mkdir results-$1 +mkdir results-$1/k31 results-$1/k63 -./sshash bench -i kestrel.k31.sshash >> $1.regular.bench_log -# ./sshash bench -i kestrel.k63.sshash >> $1.regular.bench_log -./sshash bench -i human.k31.sshash >> $1.regular.bench_log -# ./sshash bench -i human.k63.sshash >> $1.regular.bench_log +for i in {1..3}; do + ./sshash bench -i cod.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i kestrel.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i human.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i hprc.k31.sshash >> results-$1/k31/regular-bench.log +done -### canonical indexes +for i in {1..3}; do + ./sshash bench -i cod.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i kestrel.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i human.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i hprc.k31.canon.sshash >> results-$1/k31/canon-bench.log +done -./sshash bench -i cod.k31.canon.sshash >> $1.canon.bench_log -# ./sshash bench -i cod.k63.canon.sshash >> $1.canon.bench_log +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On +make -j -./sshash bench -i kestrel.k31.canon.sshash >> $1.canon.bench_log -# ./sshash bench -i kestrel.k63.canon.sshash >> $1.canon.bench_log +for i in {1..3}; do + ./sshash bench -i cod.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i kestrel.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i human.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i hprc.k63.sshash >> results-$1/k63/regular-bench.log +done -./sshash bench -i human.k31.canon.sshash >> $1.canon.bench_log -# ./sshash bench -i human.k63.canon.sshash >> $1.canon.bench_log \ No newline at end of file +for i in {1..3}; do + ./sshash bench -i cod.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i kestrel.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i human.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i hprc.k63.canon.sshash >> results-$1/k63/canon-bench.log +done + +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off +make -j diff --git a/script/build.sh b/script/build.sh index 48db484..6fa35f0 100644 --- a/script/build.sh +++ b/script/build.sh @@ -1,26 +1,35 @@ #!/bin/bash - echo "output log file =" $1 -### regular indexes +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off +make -j -./sshash build -i ~/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 -g 16 --verbose -o cod.k31.sshash -d tmp_dir >> $1.regular.build_log -# ./sshash build -i ~/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz -k 63 -m 24 -t 8 -g 16 --verbose -o cod.k63.sshash -d tmp_dir >> $1.regular.build_log +mkdir results-$1 +mkdir results-$1/k31 results-$1/k63 -./sshash build -i ~/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 -g 16 --verbose -o kestrel.k31.sshash -d tmp_dir >> $1.regular.build_log -# ./sshash build -i ~/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz -k 63 -m 24 -t 8 -g 16 --verbose -o kestrel.k63.sshash -d tmp_dir >> $1.regular.build_log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash >> results-$1/k31/regular-build.log -./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 21 -t 8 -g 16 --verbose -o human.k31.sshash -d tmp_dir >> $1.regular.build_log -# ./sshash build -i ~/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz -k 63 -m 25 -t 8 -g 16 --verbose -o human.k63.sshash -d tmp_dir >> $1.regular.build_log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log -### canonical indexes +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On +make -j -./sshash build -i ~/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz -k 31 -m 19 -t 8 -g 16 --canonical --verbose -o cod.k31.canon.sshash -d tmp_dir >> $1.canon.build_log -# ./sshash build -i ~/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz -k 63 -m 23 -t 8 -g 16 --canonical --verbose -o cod.k63.canon.sshash -d tmp_dir >> $1.canon.build_log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log -./sshash build -i ~/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz -k 31 -m 19 -t 8 -g 16 --canonical --verbose -o kestrel.k31.canon.sshash -d tmp_dir >> $1.canon.build_log -# ./sshash build -i ~/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz -k 63 -m 23 -t 8 -g 16 --canonical --verbose -o kestrel.k63.canon.sshash -d tmp_dir >> $1.canon.build_log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log -./sshash build -i ~/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz -k 31 -m 20 -t 8 -g 16 --canonical --verbose -o human.k31.canon.sshash -d tmp_dir >> $1.canon.build_log -# ./sshash build -i ~/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz -k 63 -m 24 -t 8 -g 16 --canonical --verbose -o human.k63.canon.sshash -d tmp_dir >> $1.canon.build_log \ No newline at end of file +cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off +make -j diff --git a/tools/common.hpp b/tools/common.hpp index 1f86a37..42acb52 100644 --- a/tools/common.hpp +++ b/tools/common.hpp @@ -7,6 +7,11 @@ namespace sshash { +void print_cmd(int argc, char** argv) { + for (int i = 0; i != argc; ++i) std::cout << argv[i] << ' '; + std::cout << std::endl; +} + void random_kmer(char* kmer, uint64_t k) { for (uint64_t i = 0; i != k; ++i) kmer[i] = "ACGT"[rand() % 4]; } diff --git a/tools/sshash.cpp b/tools/sshash.cpp index b46ba0b..8b424db 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -70,6 +70,7 @@ int help(char* arg0) { int main(int argc, char** argv) { if (argc < 2) return help(argv[0]); + print_cmd(argc, argv); auto tool = std::string(argv[1]); if (tool == "build") { return build(argc - 1, argv + 1); From d5987b2c85b118747caf26b0ccd330c27ce52997 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 21 Oct 2025 21:37:04 +0200 Subject: [PATCH 056/112] build and bench scripts updated --- script/bench.sh | 24 ++++++++++++++++++++++++ script/build.sh | 8 ++++++++ 2 files changed, 32 insertions(+) diff --git a/script/bench.sh b/script/bench.sh index 4bd06e6..db98722 100644 --- a/script/bench.sh +++ b/script/bench.sh @@ -21,6 +21,12 @@ done for i in {1..3}; do ./sshash bench -i hprc.k31.sshash >> results-$1/k31/regular-bench.log done +for i in {1..3}; do + ./sshash bench -i ec.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i se.k31.sshash >> results-$1/k31/regular-bench.log +done for i in {1..3}; do ./sshash bench -i cod.k31.canon.sshash >> results-$1/k31/canon-bench.log @@ -34,6 +40,12 @@ done for i in {1..3}; do ./sshash bench -i hprc.k31.canon.sshash >> results-$1/k31/canon-bench.log done +for i in {1..3}; do + ./sshash bench -i ec.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i se.k31.canon.sshash >> results-$1/k31/canon-bench.log +done cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j @@ -50,6 +62,12 @@ done for i in {1..3}; do ./sshash bench -i hprc.k63.sshash >> results-$1/k63/regular-bench.log done +for i in {1..3}; do + ./sshash bench -i ec.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i se.k63.sshash >> results-$1/k63/regular-bench.log +done for i in {1..3}; do ./sshash bench -i cod.k63.canon.sshash >> results-$1/k63/canon-bench.log @@ -63,6 +81,12 @@ done for i in {1..3}; do ./sshash bench -i hprc.k63.canon.sshash >> results-$1/k63/canon-bench.log done +for i in {1..3}; do + ./sshash bench -i ec.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i se.k63.canon.sshash >> results-$1/k63/canon-bench.log +done cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j diff --git a/script/build.sh b/script/build.sh index 6fa35f0..8aca172 100644 --- a/script/build.sh +++ b/script/build.sh @@ -12,11 +12,15 @@ rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulerti rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j @@ -25,11 +29,15 @@ rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulerti rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 31 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 31 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 31 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 31 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash >> results-$1/k63/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From 46d21180dd7d818d34e7e9885becd1ff93430c52 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 22 Oct 2025 13:23:16 +0200 Subject: [PATCH 057/112] new benchmarks logs: 21/10/25 --- .../results-21-10-25/k31/canon-bench.log | 60 + .../results-21-10-25/k31/canon-build.log | 1512 +++++++++++++++++ .../results-21-10-25/k31/regular-bench.log | 60 + .../results-21-10-25/k31/regular-build.log | 1473 ++++++++++++++++ .../results-21-10-25/k63/canon-bench.log | 60 + .../results-21-10-25/k63/canon-build.log | 1358 +++++++++++++++ .../results-21-10-25/k63/regular-bench.log | 60 + .../results-21-10-25/k63/regular-build.log | 1339 +++++++++++++++ 8 files changed, 5922 insertions(+) create mode 100644 benchmarks/results-21-10-25/k31/canon-bench.log create mode 100644 benchmarks/results-21-10-25/k31/canon-build.log create mode 100644 benchmarks/results-21-10-25/k31/regular-bench.log create mode 100644 benchmarks/results-21-10-25/k31/regular-build.log create mode 100644 benchmarks/results-21-10-25/k63/canon-bench.log create mode 100644 benchmarks/results-21-10-25/k63/canon-build.log create mode 100644 benchmarks/results-21-10-25/k63/regular-bench.log create mode 100644 benchmarks/results-21-10-25/k63/regular-build.log diff --git a/benchmarks/results-21-10-25/k31/canon-bench.log b/benchmarks/results-21-10-25/k31/canon-bench.log new file mode 100644 index 0000000..a418396 --- /dev/null +++ b/benchmarks/results-21-10-25/k31/canon-bench.log @@ -0,0 +1,60 @@ +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 493.626 +avg_nanosec_per_negative_lookup 385.292 +avg_nanosec_per_access 281.621 +iterator: avg_nanosec_per_kmer 2.63384 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 501.748 +avg_nanosec_per_negative_lookup 373.86 +avg_nanosec_per_access 291.295 +iterator: avg_nanosec_per_kmer 2.61373 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 500.88 +avg_nanosec_per_negative_lookup 367.389 +avg_nanosec_per_access 293.958 +iterator: avg_nanosec_per_kmer 2.62232 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 484.986 +avg_nanosec_per_negative_lookup 399.162 +avg_nanosec_per_access 293.428 +iterator: avg_nanosec_per_kmer 2.67223 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 457.164 +avg_nanosec_per_negative_lookup 416.709 +avg_nanosec_per_access 282.156 +iterator: avg_nanosec_per_kmer 2.67729 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 474.531 +avg_nanosec_per_negative_lookup 408.218 +avg_nanosec_per_access 284.635 +iterator: avg_nanosec_per_kmer 2.6488 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 655.503 +avg_nanosec_per_negative_lookup 451.126 +avg_nanosec_per_access 359.515 +iterator: avg_nanosec_per_kmer 2.65759 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 668.818 +avg_nanosec_per_negative_lookup 455.108 +avg_nanosec_per_access 357.84 +iterator: avg_nanosec_per_kmer 2.64798 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 688.694 +avg_nanosec_per_negative_lookup 453.546 +avg_nanosec_per_access 357.927 +iterator: avg_nanosec_per_kmer 2.64782 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 914.137 +avg_nanosec_per_negative_lookup 482.048 +avg_nanosec_per_access 584.089 +iterator: avg_nanosec_per_kmer 2.5831 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 905.911 +avg_nanosec_per_negative_lookup 488.805 +avg_nanosec_per_access 565.096 +iterator: avg_nanosec_per_kmer 2.58853 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 900.103 +avg_nanosec_per_negative_lookup 489.907 +avg_nanosec_per_access 594.617 +iterator: avg_nanosec_per_kmer 2.58483 diff --git a/benchmarks/results-21-10-25/k31/canon-build.log b/benchmarks/results-21-10-25/k31/canon-build.log new file mode 100644 index 0000000..72e5d57 --- /dev/null +++ b/benchmarks/results-21-10-25/k31/canon-build.log @@ -0,0 +1,1512 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash +k = 31, m = 19, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.495 [sec] (2.97533 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.72095 [sec] (1.43483 [ns/kmer]) +=== step 1: 'parse file' 2.21604 [sec] (4.41034 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 6.54638 [sec] (13.0285 [ns/kmer]) +num_minimizers = 79426371 +num_minimizer_positions = 88526066 +num_super_kmers = 92154774 +building minimizers MPHF with 64 threads and 27 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.51905 [sec] (7.00358 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.38993 [sec] (6.7466 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.87132 [sec] (3.72429 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 3197650/79426371 (4.02593%) +num_buckets_in_skew_index 6880/79426371 (0.00866211%) +max_bucket_size 147214 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 10752816/88526066 (12.1465%) +num_minimizer_positions_of_buckets_in_skew_index 1551409/88526066 (1.75249%) +computing minimizers offsets: 1.1424 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2182228 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1371921 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1169036 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 902499 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 639097 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 421119 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 427767 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147214: 794079 +num_kmers_in_skew_index 7907746 (1.57379%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2182228 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2182228)... + built mphs[0] for 2182228 kmers; bits/key = 2.56006 + built positions[0] for 2182228 kmers; bits/key = 7.00017 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1371921 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1371921)... + built mphs[1] for 1371921 kmers; bits/key = 2.41774 + built positions[1] for 1371921 kmers; bits/key = 8.00027 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1169036 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1169036)... + built mphs[2] for 1169036 kmers; bits/key = 2.41802 + built positions[2] for 1169036 kmers; bits/key = 9.00029 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 902499 + building MPHF with 64 threads and 1 partitions (avg. partition size = 902499)... + built mphs[3] for 902499 kmers; bits/key = 2.56144 + built positions[3] for 902499 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 639097 + building MPHF with 64 threads and 1 partitions (avg. partition size = 639097)... + built mphs[4] for 639097 kmers; bits/key = 2.41949 + built positions[4] for 639097 kmers; bits/key = 11.0005 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 421119 + building MPHF with 64 threads and 1 partitions (avg. partition size = 421119)... + built mphs[5] for 421119 kmers; bits/key = 2.56399 + built positions[5] for 421119 kmers; bits/key = 12.0008 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 427767 + building MPHF with 64 threads and 1 partitions (avg. partition size = 427767)... + built mphs[6] for 427767 kmers; bits/key = 2.42113 + built positions[6] for 427767 kmers; bits/key = 13.0009 + lower = 8192; upper = 147214; num_bits_per_pos = 18; num_kmers_in_partition = 794079 + building MPHF with 64 threads and 1 partitions (avg. partition size = 794079)... + built mphs[7] for 794079 kmers; bits/key = 2.56168 + built positions[7] for 794079 kmers; bits/key = 18.0004 +computing skew index took: 4.43997 [sec] +=== step 3: 'build sparse and skew index' 5.70242 [sec] (11.3489 [ns/kmer]) +=== total_time 23.2451 [sec] (46.2622 [ns/kmer]) +total index size: 544657921 [B] -- 544.658 [MB] +SPACE BREAKDOWN: + mphf: 0.452783 [bits/kmer] (2.86438 [bits/key]) -- 5.22134% + strings_offsets: 0.144419 [bits/kmer] -- 1.66539% + control_codewords: 4.90028 [bits/kmer] -- 56.5084% + mid_load_buckets: 0.642004 [bits/kmer] -- 7.40338% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.92052e-05% + strings: 2.24566 [bits/kmer] -- 25.8962% + skew_index: 0.286624 [bits/kmer] -- 3.30525% + weights: 2.92956e-06 [bits/kmer] -- 3.37827e-05% + -------------- + total: 8.67177 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9654% +buckets with 2 minimizer positions = 2.53925% +buckets with 3 minimizer positions = 0.675583% +buckets with 4 minimizer positions = 0.28192% +buckets with 5 minimizer positions = 0.149202% +buckets with 6 minimizer positions = 0.0892487% +buckets with 7 minimizer positions = 0.058988% +buckets with 8 minimizer positions = 0.041485% +buckets with 9 minimizer positions = 0.0300794% +buckets with 10 minimizer positions = 0.0233059% +buckets with 11 minimizer positions = 0.0180872% +buckets with 12 minimizer positions = 0.0147483% +buckets with 13 minimizer positions = 0.0122642% +buckets with 14 minimizer positions = 0.0100269% +buckets with 15 minimizer positions = 0.00859412% +buckets with 16 minimizer positions = 0.00724822% +max_bucket_size 147214 +2025-10-21 14:46:55: saving data structure to disk... +2025-10-21 14:46:55: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash +k = 31, m = 19, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.71437 [sec] (2.3595 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.34791 [sec] (1.17169 [ns/kmer]) +=== step 1: 'parse file' 4.06241 [sec] (3.5313 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 14.7371 [sec] (12.8104 [ns/kmer]) +num_minimizers = 193802281 +num_minimizer_positions = 200203180 +num_super_kmers = 208893778 +building minimizers MPHF with 64 threads and 65 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 8.37286 [sec] (7.27822 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.93344 [sec] (6.89625 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 6.09755 [sec] (5.30037 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 3847381/193802281 (1.98521%) +num_buckets_in_skew_index 3359/193802281 (0.00173321%) +max_bucket_size 3537 +log2_max_bucket_size 12 +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 9765802/200203180 (4.87795%) +num_minimizer_positions_of_buckets_in_skew_index 485837/200203180 (0.242672%) +computing minimizers offsets: 1.95079 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1156188 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 794276 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 431933 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 210507 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 155247 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3537: 79585 +num_kmers_in_skew_index 2827736 (0.245805%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1156188 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1156188)... + built mphs[0] for 1156188 kmers; bits/key = 2.41808 + built positions[0] for 1156188 kmers; bits/key = 7.00033 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 794276 + building MPHF with 64 threads and 1 partitions (avg. partition size = 794276)... + built mphs[1] for 794276 kmers; bits/key = 2.56179 + built positions[1] for 794276 kmers; bits/key = 8.00044 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 431933 + building MPHF with 64 threads and 1 partitions (avg. partition size = 431933)... + built mphs[2] for 431933 kmers; bits/key = 2.42104 + built positions[2] for 431933 kmers; bits/key = 9.0008 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 210507 + building MPHF with 64 threads and 1 partitions (avg. partition size = 210507)... + built mphs[3] for 210507 kmers; bits/key = 2.56934 + built positions[3] for 210507 kmers; bits/key = 10.0016 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 155247 + building MPHF with 64 threads and 1 partitions (avg. partition size = 155247)... + built mphs[4] for 155247 kmers; bits/key = 2.42999 + built positions[4] for 155247 kmers; bits/key = 11.0024 + lower = 2048; upper = 3537; num_bits_per_pos = 12; num_kmers_in_partition = 79585 + building MPHF with 64 threads and 1 partitions (avg. partition size = 79585)... + built mphs[5] for 79585 kmers; bits/key = 2.44287 + built positions[5] for 79585 kmers; bits/key = 12.0047 +computing skew index took: 1.57572 [sec] +=== step 3: 'build sparse and skew index' 3.80209 [sec] (3.30502 [ns/kmer]) +=== total_time 45.0054 [sec] (39.1216 [ns/kmer]) +total index size: 1193798175 [B] -- 1193.8 [MB] +SPACE BREAKDOWN: + mphf: 0.478076 [bits/kmer] (2.83783 [bits/key]) -- 5.75871% + strings_offsets: 0.100021 [bits/kmer] -- 1.20481% + control_codewords: 5.39089 [bits/kmer] -- 64.9364% + mid_load_buckets: 0.263161 [bits/kmer] -- 3.16993% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.24494e-05% + strings: 2.0304 [bits/kmer] -- 24.4573% + skew_index: 0.0392517 [bits/kmer] -- 0.472809% + weights: 1.27956e-06 [bits/kmer] -- 1.5413e-05% + -------------- + total: 8.3018 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 98.0131% +buckets with 2 minimizer positions = 1.66716% +buckets with 3 minimizer positions = 0.165207% +buckets with 4 minimizer positions = 0.0541841% +buckets with 5 minimizer positions = 0.0274011% +buckets with 6 minimizer positions = 0.0165545% +buckets with 7 minimizer positions = 0.0109854% +buckets with 8 minimizer positions = 0.00783015% +buckets with 9 minimizer positions = 0.0058312% +buckets with 10 minimizer positions = 0.00442048% +buckets with 11 minimizer positions = 0.00347622% +buckets with 12 minimizer positions = 0.00275281% +buckets with 13 minimizer positions = 0.00227964% +buckets with 14 minimizer positions = 0.00191742% +buckets with 15 minimizer positions = 0.00159286% +buckets with 16 minimizer positions = 0.00138234% +max_bucket_size 3537 +2025-10-21 14:47:41: saving data structure to disk... +2025-10-21 14:47:41: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.4621 [sec] (2.97807 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.82.bin'... +=== step 1.2: 'computing minimizers tuples' 3.26857 [sec] (1.30447 [ns/kmer]) +=== step 1: 'parse file' 10.7308 [sec] (4.28258 [ns/kmer]) + == files to merge = 83 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.1: 'merging minimizers tuples' 38.4114 [sec] (15.3297 [ns/kmer]) +num_minimizers = 417581788 +num_minimizer_positions = 472564790 +num_super_kmers = 491650762 +building minimizers MPHF with 64 threads and 140 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 20.127 [sec] (8.03257 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 18.1536 [sec] (7.245 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +=== step 2.4: 'merging minimizers tuples ' 25.1065 [sec] (10.0198 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 16645723/417581788 (3.98622%) +num_buckets_in_skew_index 69819/417581788 (0.0167198%) +max_bucket_size 28572 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 59127954/472564790 (12.5121%) +num_minimizer_positions_of_buckets_in_skew_index 12570590/472564790 (2.66008%) +computing minimizers offsets: 6.13112 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18311376 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14093331 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 9943202 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6883204 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4459079 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2331974 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1374707 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 28572: 1246991 +num_kmers_in_skew_index 58643864 (2.34044%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18311376 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[0] for 18311376 kmers; bits/key = 2.66379 + built positions[0] for 18311376 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14093331 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[1] for 14093331 kmers; bits/key = 2.54555 + built positions[1] for 14093331 kmers; bits/key = 8.00003 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 9943202 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[2] for 9943202 kmers; bits/key = 2.65828 + built positions[2] for 9943202 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6883204 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6883204 kmers; bits/key = 2.78306 + built positions[3] for 6883204 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4459079 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4459079 kmers; bits/key = 2.72379 + built positions[4] for 4459079 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2331974 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2331974)... + built mphs[5] for 2331974 kmers; bits/key = 2.56 + built positions[5] for 2331974 kmers; bits/key = 12.0002 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1374707 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1374707)... + built mphs[6] for 1374707 kmers; bits/key = 2.56063 + built positions[6] for 1374707 kmers; bits/key = 13.0003 + lower = 8192; upper = 28572; num_bits_per_pos = 15; num_kmers_in_partition = 1246991 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1246991)... + built mphs[7] for 1246991 kmers; bits/key = 2.41795 + built positions[7] for 1246991 kmers; bits/key = 15.0003 +computing skew index took: 9.93495 [sec] +=== step 3: 'build sparse and skew index' 16.7772 [sec] (6.69567 [ns/kmer]) +=== total_time 129.307 [sec] (51.6054 [ns/kmer]) +total index size: 2992410434 [B] -- 2992.41 [MB] +SPACE BREAKDOWN: + mphf: 0.473665 [bits/kmer] (2.84221 [bits/key]) -- 4.95776% + strings_offsets: 0.153147 [bits/kmer] -- 1.60296% + control_codewords: 5.49959 [bits/kmer] -- 57.5631% + mid_load_buckets: 0.755123 [bits/kmer] -- 7.90372% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.95599e-06% + strings: 2.24545 [bits/kmer] -- 23.5027% + skew_index: 0.427034 [bits/kmer] -- 4.46969% + weights: 5.87466e-07 [bits/kmer] -- 6.14889e-06% + -------------- + total: 9.55401 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9971% +buckets with 2 minimizer positions = 2.58951% +buckets with 3 minimizer positions = 0.57957% +buckets with 4 minimizer positions = 0.249566% +buckets with 5 minimizer positions = 0.139449% +buckets with 6 minimizer positions = 0.0886526% +buckets with 7 minimizer positions = 0.0610177% +buckets with 8 minimizer positions = 0.0445565% +buckets with 9 minimizer positions = 0.0338573% +buckets with 10 minimizer positions = 0.0265459% +buckets with 11 minimizer positions = 0.021249% +buckets with 12 minimizer positions = 0.0173949% +buckets with 13 minimizer positions = 0.0145279% +buckets with 14 minimizer positions = 0.0123581% +buckets with 15 minimizer positions = 0.0105172% +buckets with 16 minimizer positions = 0.00905643% +max_bucket_size 28572 +2025-10-21 14:49:53: saving data structure to disk... +2025-10-21 14:49:54: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.466 [sec] (4.69754 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.113.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.114.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.115.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.116.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.117.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.118.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.119.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.120.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.121.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.122.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.123.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.124.bin'... +=== step 1.2: 'computing minimizers tuples' 9.26741 [sec] (2.4925 [ns/kmer]) +=== step 1: 'parse file' 26.7336 [sec] (7.19007 [ns/kmer]) + == files to merge = 125 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +=== step 2.1: 'merging minimizers tuples' 60.9427 [sec] (16.3907 [ns/kmer]) +num_minimizers = 553041851 +num_minimizer_positions = 734186748 +num_super_kmers = 761111664 +building minimizers MPHF with 64 threads and 185 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 23.0843 [sec] (6.20861 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 25.8549 [sec] (6.95377 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +=== step 2.4: 'merging minimizers tuples ' 40.6889 [sec] (10.9434 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 82029767/553041851 (14.8325%) +num_buckets_in_skew_index 169162/553041851 (0.0305876%) +max_bucket_size 111238 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 230030103/734186748 (31.3313%) +num_minimizer_positions_of_buckets_in_skew_index 33313723/734186748 (4.5375%) +computing minimizers offsets: 15.453 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 42246613 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 33148891 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 25299495 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17873655 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 11858924 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 7965543 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5764491 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 111238: 6866438 +num_kmers_in_skew_index 151024050 (4.06184%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 42246613 + building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... + built mphs[0] for 42246613 kmers; bits/key = 2.54722 + built positions[0] for 42246613 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 33148891 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[1] for 33148891 kmers; bits/key = 2.58892 + built positions[1] for 33148891 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 25299495 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[2] for 25299495 kmers; bits/key = 2.55132 + built positions[2] for 25299495 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17873655 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[3] for 17873655 kmers; bits/key = 2.57485 + built positions[3] for 17873655 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 11858924 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[4] for 11858924 kmers; bits/key = 2.54906 + built positions[4] for 11858924 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 7965543 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[5] for 7965543 kmers; bits/key = 2.67668 + built positions[5] for 7965543 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5764491 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 5764491 kmers; bits/key = 2.57296 + built positions[6] for 5764491 kmers; bits/key = 13.0001 + lower = 8192; upper = 111238; num_bits_per_pos = 17; num_kmers_in_partition = 6866438 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[7] for 6866438 kmers; bits/key = 2.78884 + built positions[7] for 6866438 kmers; bits/key = 17.0001 +computing skew index took: 22.3991 [sec] +=== step 3: 'build sparse and skew index' 39.1337 [sec] (10.5251 [ns/kmer]) +=== total_time 216.438 [sec] (58.2117 [ns/kmer]) +total index size: 5337366354 [B] -- 5337.37 [MB] +SPACE BREAKDOWN: + mphf: 0.421212 [bits/kmer] (2.83182 [bits/key]) -- 3.66781% + strings_offsets: 0.300083 [bits/kmer] -- 2.61305% + control_codewords: 5.05724 [bits/kmer] -- 44.0372% + mid_load_buckets: 2.04162 [bits/kmer] -- 17.7779% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.0212e-06% + strings: 2.8909 [bits/kmer] -- 25.1732% + skew_index: 0.772955 [bits/kmer] -- 6.73071% + weights: 3.95899e-07 [bits/kmer] -- 3.44739e-06% + -------------- + total: 11.484 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 85.1369% +buckets with 2 minimizer positions = 11.3164% +buckets with 3 minimizer positions = 1.94211% +buckets with 4 minimizer positions = 0.566909% +buckets with 5 minimizer positions = 0.267343% +buckets with 6 minimizer positions = 0.159787% +buckets with 7 minimizer positions = 0.106973% +buckets with 8 minimizer positions = 0.0766779% +buckets with 9 minimizer positions = 0.0576396% +buckets with 10 minimizer positions = 0.0450601% +buckets with 11 minimizer positions = 0.035992% +buckets with 12 minimizer positions = 0.0292114% +buckets with 13 minimizer positions = 0.0242584% +buckets with 14 minimizer positions = 0.0205086% +buckets with 15 minimizer positions = 0.0175954% +buckets with 16 minimizer positions = 0.0151079% +max_bucket_size 111238 +2025-10-21 14:53:33: saving data structure to disk... +2025-10-21 14:53:36: DONE diff --git a/benchmarks/results-21-10-25/k31/regular-bench.log b/benchmarks/results-21-10-25/k31/regular-bench.log new file mode 100644 index 0000000..1a2e994 --- /dev/null +++ b/benchmarks/results-21-10-25/k31/regular-bench.log @@ -0,0 +1,60 @@ +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 653.685 +avg_nanosec_per_negative_lookup 706.219 +avg_nanosec_per_access 278.818 +iterator: avg_nanosec_per_kmer 2.64226 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 632.57 +avg_nanosec_per_negative_lookup 702.513 +avg_nanosec_per_access 293.313 +iterator: avg_nanosec_per_kmer 2.62006 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 653.451 +avg_nanosec_per_negative_lookup 703.665 +avg_nanosec_per_access 278.433 +iterator: avg_nanosec_per_kmer 2.6177 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 628.015 +avg_nanosec_per_negative_lookup 763.91 +avg_nanosec_per_access 292.017 +iterator: avg_nanosec_per_kmer 2.62204 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 631.261 +avg_nanosec_per_negative_lookup 762.701 +avg_nanosec_per_access 287.12 +iterator: avg_nanosec_per_kmer 2.66403 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 624.861 +avg_nanosec_per_negative_lookup 761.346 +avg_nanosec_per_access 286.968 +iterator: avg_nanosec_per_kmer 2.65551 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 880.11 +avg_nanosec_per_negative_lookup 828.219 +avg_nanosec_per_access 356.447 +iterator: avg_nanosec_per_kmer 2.6528 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 888.85 +avg_nanosec_per_negative_lookup 836.238 +avg_nanosec_per_access 377.639 +iterator: avg_nanosec_per_kmer 2.64126 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 892.655 +avg_nanosec_per_negative_lookup 837.356 +avg_nanosec_per_access 360.707 +iterator: avg_nanosec_per_kmer 2.67303 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1149.97 +avg_nanosec_per_negative_lookup 906.528 +avg_nanosec_per_access 581.879 +iterator: avg_nanosec_per_kmer 2.58061 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1135.41 +avg_nanosec_per_negative_lookup 898.131 +avg_nanosec_per_access 587.958 +iterator: avg_nanosec_per_kmer 2.59557 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1126.64 +avg_nanosec_per_negative_lookup 893.839 +avg_nanosec_per_access 587.36 +iterator: avg_nanosec_per_kmer 2.57272 diff --git a/benchmarks/results-21-10-25/k31/regular-build.log b/benchmarks/results-21-10-25/k31/regular-build.log new file mode 100644 index 0000000..8cc2114 --- /dev/null +++ b/benchmarks/results-21-10-25/k31/regular-build.log @@ -0,0 +1,1473 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.50637 [sec] (2.99795 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.584493 [sec] (1.16325 [ns/kmer]) +=== step 1: 'parse file' 2.09095 [sec] (4.16138 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.6288 [sec] (11.2024 [ns/kmer]) +num_minimizers = 72381146 +num_minimizer_positions = 78455681 +num_super_kmers = 78455681 +building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.20004 [sec] (6.36867 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.88284 [sec] (5.73738 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.86003 [sec] (3.70181 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) +num_buckets_in_skew_index 4215/72381146 (0.00582334%) +max_bucket_size 70346 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) +num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) +computing minimizers offsets: 0.874378 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 +num_kmers_in_skew_index 4740893 (0.943527%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... + built mphs[0] for 1260546 kmers; bits/key = 2.56076 + built positions[0] for 1260546 kmers; bits/key = 7.00029 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 + building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... + built mphs[1] for 994175 kmers; bits/key = 2.41831 + built positions[1] for 994175 kmers; bits/key = 8.00033 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... + built mphs[2] for 665719 kmers; bits/key = 2.41938 + built positions[2] for 665719 kmers; bits/key = 9.00051 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 + building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... + built mphs[3] for 408608 kmers; bits/key = 2.42149 + built positions[3] for 408608 kmers; bits/key = 10.0008 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 + building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... + built mphs[4] for 423234 kmers; bits/key = 2.56407 + built positions[4] for 423234 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 + building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... + built mphs[5] for 271419 kmers; bits/key = 2.42412 + built positions[5] for 271419 kmers; bits/key = 12.0014 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 + building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... + built mphs[6] for 288814 kmers; bits/key = 2.42387 + built positions[6] for 288814 kmers; bits/key = 13.0013 + lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 + building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... + built mphs[7] for 428378 kmers; bits/key = 2.56398 + built positions[7] for 428378 kmers; bits/key = 17.0008 +computing skew index took: 2.6436 [sec] +=== step 3: 'build sparse and skew index' 3.62623 [sec] (7.21687 [ns/kmer]) +=== total_time 19.2889 [sec] (38.3885 [ns/kmer]) +total index size: 495332369 [B] -- 495.332 [MB] +SPACE BREAKDOWN: + mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 5.30379% + strings_offsets: 0.144419 [bits/kmer] -- 1.83123% + control_codewords: 4.46561 [bits/kmer] -- 56.624% + mid_load_buckets: 0.439286 [bits/kmer] -- 5.57015% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 5.41051e-05% + strings: 2.24566 [bits/kmer] -- 28.4749% + skew_index: 0.173169 [bits/kmer] -- 2.19578% + weights: 2.92956e-06 [bits/kmer] -- 3.71468e-05% + -------------- + total: 7.88643 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.8721% +buckets with 2 minimizer positions = 2.00417% +buckets with 3 minimizer positions = 0.51765% +buckets with 4 minimizer positions = 0.211311% +buckets with 5 minimizer positions = 0.109826% +buckets with 6 minimizer positions = 0.0661802% +buckets with 7 minimizer positions = 0.0437061% +buckets with 8 minimizer positions = 0.0308464% +buckets with 9 minimizer positions = 0.0235614% +buckets with 10 minimizer positions = 0.0177228% +buckets with 11 minimizer positions = 0.0139967% +buckets with 12 minimizer positions = 0.0112902% +buckets with 13 minimizer positions = 0.00931044% +buckets with 14 minimizer positions = 0.00771748% +buckets with 15 minimizer positions = 0.00632347% +buckets with 16 minimizer positions = 0.00528591% +max_bucket_size 70346 +2025-10-21 14:40:47: saving data structure to disk... +2025-10-21 14:40:47: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.74263 [sec] (2.38407 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.14784 [sec] (0.997776 [ns/kmer]) +=== step 1: 'parse file' 3.89059 [sec] (3.38195 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.4548 [sec] (10.8265 [ns/kmer]) +num_minimizers = 173258591 +num_minimizer_positions = 175959772 +num_super_kmers = 175959772 +building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 7.10969 [sec] (6.18019 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.62701 [sec] (5.76062 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 4.21109 [sec] (3.66055 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) +num_buckets_in_skew_index 1541/173258591 (0.000889422%) +max_bucket_size 3747 +log2_max_bucket_size 12 +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) +num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) +computing minimizers offsets: 1.34162 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 +num_kmers_in_skew_index 1185367 (0.10304%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 + building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... + built mphs[0] for 559507 kmers; bits/key = 2.41999 + built positions[0] for 559507 kmers; bits/key = 7.00068 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 + building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... + built mphs[1] for 317132 kmers; bits/key = 2.42276 + built positions[1] for 317132 kmers; bits/key = 8.00111 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 + building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... + built mphs[2] for 144139 kmers; bits/key = 2.43099 + built positions[2] for 144139 kmers; bits/key = 9.00242 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... + built mphs[3] for 106543 kmers; bits/key = 2.43597 + built positions[3] for 106543 kmers; bits/key = 10.0034 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 + building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... + built mphs[4] for 21308 kmers; bits/key = 2.51323 + built positions[4] for 21308 kmers; bits/key = 11.0171 + lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 + building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... + built mphs[5] for 36738 kmers; bits/key = 2.4746 + built positions[5] for 36738 kmers; bits/key = 12.0098 +computing skew index took: 0.677349 [sec] +=== step 3: 'build sparse and skew index' 2.24693 [sec] (1.95317 [ns/kmer]) +=== total_time 36.5402 [sec] (31.763 [ns/kmer]) +total index size: 1077792931 [B] -- 1077.79 [MB] +SPACE BREAKDOWN: + mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.68775% + strings_offsets: 0.100021 [bits/kmer] -- 1.33448% + control_codewords: 4.81944 [bits/kmer] -- 64.3013% + mid_load_buckets: 0.102577 [bits/kmer] -- 1.36859% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.48656e-05% + strings: 2.0304 [bits/kmer] -- 27.0897% + skew_index: 0.0163494 [bits/kmer] -- 0.218135% + weights: 1.27956e-06 [bits/kmer] -- 1.70719e-05% + -------------- + total: 7.49509 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.2421% +buckets with 2 minimizer positions = 0.571193% +buckets with 3 minimizer positions = 0.0840564% +buckets with 4 minimizer positions = 0.0345576% +buckets with 5 minimizer positions = 0.0184735% +buckets with 6 minimizer positions = 0.011514% +buckets with 7 minimizer positions = 0.00772718% +buckets with 8 minimizer positions = 0.00537809% +buckets with 9 minimizer positions = 0.00392246% +buckets with 10 minimizer positions = 0.00304862% +buckets with 11 minimizer positions = 0.00236583% +buckets with 12 minimizer positions = 0.0019139% +buckets with 13 minimizer positions = 0.00156356% +buckets with 14 minimizer positions = 0.00127613% +buckets with 15 minimizer positions = 0.00105276% +buckets with 16 minimizer positions = 0.000939636% +max_bucket_size 3747 +2025-10-21 14:41:25: saving data structure to disk... +2025-10-21 14:41:27: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.63075 [sec] (3.04538 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.72.bin'... +=== step 1.2: 'computing minimizers tuples' 2.63305 [sec] (1.05083 [ns/kmer]) +=== step 1: 'parse file' 10.2639 [sec] (4.09626 [ns/kmer]) + == files to merge = 73 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 35.422 [sec] (14.1367 [ns/kmer]) +num_minimizers = 386687326 +num_minimizer_positions = 423023926 +num_super_kmers = 423023926 +building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 17.0605 [sec] (6.80875 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 15.7585 [sec] (6.28913 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 8.17596 [sec] (3.26297 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) +num_buckets_in_skew_index 42372/386687326 (0.0109577%) +max_bucket_size 22972 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) +num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) +computing minimizers offsets: 4.73824 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 +num_kmers_in_skew_index 32063746 (1.27964%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11807213 kmers; bits/key = 2.55841 + built positions[0] for 11807213 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8389556 kmers; bits/key = 2.61352 + built positions[1] for 8389556 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5343660 kmers; bits/key = 2.66261 + built positions[2] for 5343660 kmers; bits/key = 9.00007 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3076413 kmers; bits/key = 3.34298 + built positions[3] for 3076413 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... + built mphs[4] for 1855446 kmers; bits/key = 2.56022 + built positions[4] for 1855446 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... + built mphs[5] for 1008178 kmers; bits/key = 2.41829 + built positions[5] for 1008178 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... + built mphs[6] for 375770 kmers; bits/key = 2.42182 + built positions[6] for 375770 kmers; bits/key = 13.001 + lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 + building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... + built mphs[7] for 207510 kmers; bits/key = 2.42618 + built positions[7] for 207510 kmers; bits/key = 15.0018 +computing skew index took: 7.2995 [sec] +=== step 3: 'build sparse and skew index' 12.626 [sec] (5.03895 [ns/kmer]) +=== total_time 99.3069 [sec] (39.6328 [ns/kmer]) +total index size: 2716053216 [B] -- 2716.05 [MB] +SPACE BREAKDOWN: + mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 5.03015% + strings_offsets: 0.153147 [bits/kmer] -- 1.76606% + control_codewords: 5.0927 [bits/kmer] -- 58.7281% + mid_load_buckets: 0.516242 [bits/kmer] -- 5.95319% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 9.86726e-06% + strings: 2.24545 [bits/kmer] -- 25.8941% + skew_index: 0.227926 [bits/kmer] -- 2.6284% + weights: 5.87466e-07 [bits/kmer] -- 6.77454e-06% + -------------- + total: 8.67167 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1918% +buckets with 2 minimizer positions = 1.69205% +buckets with 3 minimizer positions = 0.442612% +buckets with 4 minimizer positions = 0.201662% +buckets with 5 minimizer positions = 0.114623% +buckets with 6 minimizer positions = 0.0734475% +buckets with 7 minimizer positions = 0.0506719% +buckets with 8 minimizer positions = 0.0368406% +buckets with 9 minimizer positions = 0.0280203% +buckets with 10 minimizer positions = 0.0218197% +buckets with 11 minimizer positions = 0.0175108% +buckets with 12 minimizer positions = 0.0142045% +buckets with 13 minimizer positions = 0.0116337% +buckets with 14 minimizer positions = 0.00980818% +buckets with 15 minimizer positions = 0.00832637% +buckets with 16 minimizer positions = 0.00717712% +max_bucket_size 22972 +2025-10-21 14:43:08: saving data structure to disk... +2025-10-21 14:43:12: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.4683 [sec] (4.69816 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.113.bin'... +=== step 1.2: 'computing minimizers tuples' 6.7069 [sec] (1.80384 [ns/kmer]) +=== step 1: 'parse file' 24.1754 [sec] (6.50203 [ns/kmer]) + == files to merge = 114 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.1: 'merging minimizers tuples' 52.4673 [sec] (14.1112 [ns/kmer]) +num_minimizers = 544808214 +num_minimizer_positions = 661139039 +num_super_kmers = 661139039 +building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 22.4277 [sec] (6.032 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 23.2325 [sec] (6.24844 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.4: 'merging minimizers tuples ' 38.2339 [sec] (10.2831 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) +num_buckets_in_skew_index 108291/544808214 (0.0198769%) +max_bucket_size 81171 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) +num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) +computing minimizers offsets: 11.0043 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 +num_kmers_in_skew_index 88257432 (2.37371%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28872109 kmers; bits/key = 2.53953 + built positions[0] for 28872109 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21161002 kmers; bits/key = 2.665 + built positions[1] for 21161002 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 14619521 kmers; bits/key = 2.58618 + built positions[2] for 14619521 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 8967010 kmers; bits/key = 2.51981 + built positions[3] for 8967010 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 5825185 kmers; bits/key = 2.55049 + built positions[4] for 5825185 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3889571 kmers; bits/key = 2.9515 + built positions[5] for 3889571 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... + built mphs[6] for 2412718 kmers; bits/key = 2.41709 + built positions[6] for 2412718 kmers; bits/key = 13.0002 + lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... + built mphs[7] for 2510316 kmers; bits/key = 2.55991 + built positions[7] for 2510316 kmers; bits/key = 17.0001 +computing skew index took: 15.7677 [sec] +=== step 3: 'build sparse and skew index' 27.8448 [sec] (7.48895 [ns/kmer]) +=== total_time 188.382 [sec] (50.6658 [ns/kmer]) +total index size: 4810783158 [B] -- 4810.78 [MB] +SPACE BREAKDOWN: + mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 4.01359% + strings_offsets: 0.300083 [bits/kmer] -- 2.89907% + control_codewords: 4.98195 [bits/kmer] -- 48.1301% + mid_load_buckets: 1.32295 [bits/kmer] -- 12.7809% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.57082e-06% + strings: 2.8909 [bits/kmer] -- 27.9287% + skew_index: 0.439676 [bits/kmer] -- 4.24766% + weights: 3.95899e-07 [bits/kmer] -- 3.82474e-06% + -------------- + total: 10.351 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 90.4966% +buckets with 2 minimizer positions = 7.33042% +buckets with 3 minimizer positions = 1.04104% +buckets with 4 minimizer positions = 0.358078% +buckets with 5 minimizer positions = 0.190444% +buckets with 6 minimizer positions = 0.119606% +buckets with 7 minimizer positions = 0.0815559% +buckets with 8 minimizer positions = 0.059031% +buckets with 9 minimizer positions = 0.0448457% +buckets with 10 minimizer positions = 0.0349758% +buckets with 11 minimizer positions = 0.0279273% +buckets with 12 minimizer positions = 0.022929% +buckets with 13 minimizer positions = 0.0189582% +buckets with 14 minimizer positions = 0.0159649% +buckets with 15 minimizer positions = 0.0135407% +buckets with 16 minimizer positions = 0.0117506% +max_bucket_size 81171 +2025-10-21 14:46:23: saving data structure to disk... +2025-10-21 14:46:31: DONE diff --git a/benchmarks/results-21-10-25/k63/canon-bench.log b/benchmarks/results-21-10-25/k63/canon-bench.log new file mode 100644 index 0000000..643fe6d --- /dev/null +++ b/benchmarks/results-21-10-25/k63/canon-bench.log @@ -0,0 +1,60 @@ +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 631.809 +avg_nanosec_per_negative_lookup 459.727 +avg_nanosec_per_access 306.545 +iterator: avg_nanosec_per_kmer 2.79586 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 634.897 +avg_nanosec_per_negative_lookup 478.023 +avg_nanosec_per_access 300.399 +iterator: avg_nanosec_per_kmer 2.78933 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 621.437 +avg_nanosec_per_negative_lookup 476.323 +avg_nanosec_per_access 295.998 +iterator: avg_nanosec_per_kmer 2.8806 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 547.037 +avg_nanosec_per_negative_lookup 499.846 +avg_nanosec_per_access 332.06 +iterator: avg_nanosec_per_kmer 2.80736 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 561.943 +avg_nanosec_per_negative_lookup 507.71 +avg_nanosec_per_access 333.119 +iterator: avg_nanosec_per_kmer 2.84461 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 579.655 +avg_nanosec_per_negative_lookup 490.51 +avg_nanosec_per_access 337.485 +iterator: avg_nanosec_per_kmer 2.8116 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 735.346 +avg_nanosec_per_negative_lookup 530.724 +avg_nanosec_per_access 374.906 +iterator: avg_nanosec_per_kmer 2.84612 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 735.027 +avg_nanosec_per_negative_lookup 537.467 +avg_nanosec_per_access 358.872 +iterator: avg_nanosec_per_kmer 2.82918 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 734.37 +avg_nanosec_per_negative_lookup 538.679 +avg_nanosec_per_access 363.887 +iterator: avg_nanosec_per_kmer 2.81595 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1240.37 +avg_nanosec_per_negative_lookup 600.328 +avg_nanosec_per_access 681.789 +iterator: avg_nanosec_per_kmer 2.90587 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1242.4 +avg_nanosec_per_negative_lookup 592.073 +avg_nanosec_per_access 675.422 +iterator: avg_nanosec_per_kmer 2.89704 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1249.58 +avg_nanosec_per_negative_lookup 617.213 +avg_nanosec_per_access 672.296 +iterator: avg_nanosec_per_kmer 2.89418 diff --git a/benchmarks/results-21-10-25/k63/canon-build.log b/benchmarks/results-21-10-25/k63/canon-build.log new file mode 100644 index 0000000..21ba48b --- /dev/null +++ b/benchmarks/results-21-10-25/k63/canon-build.log @@ -0,0 +1,1358 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash +k = 63, m = 23, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.49378 [sec] (2.68383 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.432659 [sec] (0.777345 [ns/kmer]) +=== step 1: 'parse file' 1.92653 [sec] (3.46133 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.51493 [sec] (4.51849 [ns/kmer]) +num_minimizers = 28491340 +num_minimizer_positions = 33953502 +num_super_kmers = 35654865 +building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.5921 [sec] (2.86047 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.39365 [sec] (2.50392 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.50184 [sec] (2.69831 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 1198247/28491340 (4.20565%) +num_buckets_in_skew_index 5423/28491340 (0.0190339%) +max_bucket_size 883901 +log2_max_bucket_size 20 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 4734136/33953502 (13.943%) +num_minimizer_positions_of_buckets_in_skew_index 1931696/33953502 (5.68924%) +computing minimizers offsets: 0.501097 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5318600 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3430041 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2141998 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1598076 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 923867 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1202937 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 584748 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 883901: 4875198 +num_kmers_in_skew_index 20075465 (3.6069%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5318600 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 5318600 kmers; bits/key = 2.6732 + built positions[0] for 5318600 kmers; bits/key = 7.00006 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3430041 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3430041 kmers; bits/key = 3.16615 + built positions[1] for 3430041 kmers; bits/key = 8.00011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2141998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2141998)... + built mphs[2] for 2141998 kmers; bits/key = 2.56004 + built positions[2] for 2141998 kmers; bits/key = 9.00017 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1598076 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1598076)... + built mphs[3] for 1598076 kmers; bits/key = 2.56044 + built positions[3] for 1598076 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 923867 + building MPHF with 64 threads and 1 partitions (avg. partition size = 923867)... + built mphs[4] for 923867 kmers; bits/key = 2.41848 + built positions[4] for 923867 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1202937 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1202937)... + built mphs[5] for 1202937 kmers; bits/key = 2.41798 + built positions[5] for 1202937 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 584748 + building MPHF with 64 threads and 1 partitions (avg. partition size = 584748)... + built mphs[6] for 584748 kmers; bits/key = 2.41989 + built positions[6] for 584748 kmers; bits/key = 13.0006 + lower = 8192; upper = 883901; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4875198 kmers; bits/key = 2.70264 + built positions[7] for 4875198 kmers; bits/key = 20.0001 +computing skew index took: 6.24053 [sec] +=== step 3: 'build sparse and skew index' 6.78871 [sec] (12.1971 [ns/kmer]) +=== total_time 15.7178 [sec] (28.2396 [ns/kmer]) +total index size: 343387376 [B] -- 343.387 [MB] +SPACE BREAKDOWN: + mphf: 0.150698 [bits/kmer] (2.94393 [bits/key]) -- 3.05328% + strings_offsets: 0.115799 [bits/kmer] -- 2.34618% + control_codewords: 1.58688 [bits/kmer] -- 32.1514% + mid_load_buckets: 0.255171 [bits/kmer] -- 5.16998% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.8046e-05% + strings: 2.21266 [bits/kmer] -- 44.8304% + skew_index: 0.614414 [bits/kmer] -- 12.4485% + weights: 2.6447e-06 [bits/kmer] -- 5.35838e-05% + -------------- + total: 4.93563 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.7753% +buckets with 2 minimizer positions = 2.3214% +buckets with 3 minimizer positions = 0.763049% +buckets with 4 minimizer positions = 0.352742% +buckets with 5 minimizer positions = 0.198513% +buckets with 6 minimizer positions = 0.123876% +buckets with 7 minimizer positions = 0.0836956% +buckets with 8 minimizer positions = 0.0605798% +buckets with 9 minimizer positions = 0.0453261% +buckets with 10 minimizer positions = 0.0344771% +buckets with 11 minimizer positions = 0.0273838% +buckets with 12 minimizer positions = 0.0223928% +buckets with 13 minimizer positions = 0.0183845% +buckets with 14 minimizer positions = 0.0152924% +buckets with 15 minimizer positions = 0.0128916% +buckets with 16 minimizer positions = 0.011242% +max_bucket_size 883901 +2025-10-21 14:58:54: saving data structure to disk... +2025-10-21 14:58:54: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash +k = 63, m = 23, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.67734 [sec] (2.31754 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.690769 [sec] (0.597939 [ns/kmer]) +=== step 1: 'parse file' 3.36823 [sec] (2.91558 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.01886 [sec] (4.34439 [ns/kmer]) +num_minimizers = 67109831 +num_minimizer_positions = 67975722 +num_super_kmers = 71738384 +building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.95231 [sec] (2.55556 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.68431 [sec] (2.32358 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.51591 [sec] (1.31219 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 321065/67109831 (0.478417%) +num_buckets_in_skew_index 884/67109831 (0.00131724%) +max_bucket_size 2827 +log2_max_bucket_size 12 +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 1059674/67975722 (1.5589%) +num_minimizer_positions_of_buckets_in_skew_index 128166/67975722 (0.188547%) +computing minimizers offsets: 0.56221 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 928806 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 663068 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 440012 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2827: 40401 +num_kmers_in_skew_index 2302526 (0.19931%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 928806 + building MPHF with 64 threads and 1 partitions (avg. partition size = 928806)... + built mphs[0] for 928806 kmers; bits/key = 2.56131 + built positions[0] for 928806 kmers; bits/key = 7.0004 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 663068 + building MPHF with 64 threads and 1 partitions (avg. partition size = 663068)... + built mphs[1] for 663068 kmers; bits/key = 2.56222 + built positions[1] for 663068 kmers; bits/key = 8.00053 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 440012 + building MPHF with 64 threads and 1 partitions (avg. partition size = 440012)... + built mphs[2] for 440012 kmers; bits/key = 2.4211 + built positions[2] for 440012 kmers; bits/key = 9.00077 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 + building MPHF with 64 threads and 1 partitions (avg. partition size = 209599)... + built mphs[3] for 209599 kmers; bits/key = 2.42681 + built positions[3] for 209599 kmers; bits/key = 10.0016 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 + building MPHF with 64 threads and 1 partitions (avg. partition size = 20640)... + built mphs[4] for 20640 kmers; bits/key = 2.51938 + built positions[4] for 20640 kmers; bits/key = 11.0171 + lower = 2048; upper = 2827; num_bits_per_pos = 12; num_kmers_in_partition = 40401 + building MPHF with 64 threads and 1 partitions (avg. partition size = 40401)... + built mphs[5] for 40401 kmers; bits/key = 2.46845 + built positions[5] for 40401 kmers; bits/key = 12.0092 +computing skew index took: 1.33443 [sec] +=== step 3: 'build sparse and skew index' 1.9801 [sec] (1.714 [ns/kmer]) +=== total_time 17.5197 [sec] (15.1653 [ns/kmer]) +total index size: 605351935 [B] -- 605.352 [MB] +SPACE BREAKDOWN: + mphf: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 3.99712% + strings_offsets: 0.0958241 [bits/kmer] -- 2.28588% + control_codewords: 1.85892 [bits/kmer] -- 44.3443% + mid_load_buckets: 0.0284356 [bits/kmer] -- 0.678329% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.42718e-05% + strings: 2.01672 [bits/kmer] -- 48.1088% + skew_index: 0.0245431 [bits/kmer] -- 0.585475% + weights: 1.27418e-06 [bits/kmer] -- 3.03955e-05% + -------------- + total: 4.192 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.5203% +buckets with 2 minimizer positions = 0.325687% +buckets with 3 minimizer positions = 0.0664463% +buckets with 4 minimizer positions = 0.0280764% +buckets with 5 minimizer positions = 0.0153182% +buckets with 6 minimizer positions = 0.00938015% +buckets with 7 minimizer positions = 0.0064387% +buckets with 8 minimizer positions = 0.00455075% +buckets with 9 minimizer positions = 0.00351215% +buckets with 10 minimizer positions = 0.002557% +buckets with 11 minimizer positions = 0.00203398% +buckets with 12 minimizer positions = 0.00170765% +buckets with 13 minimizer positions = 0.00146178% +buckets with 14 minimizer positions = 0.0011727% +buckets with 15 minimizer positions = 0.000971542% +buckets with 16 minimizer positions = 0.000882136% +max_bucket_size 2827 +2025-10-21 14:59:12: saving data structure to disk... +2025-10-21 14:59:12: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 7.03029 [sec] (2.5368 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.5595 [sec] (0.56273 [ns/kmer]) +=== step 1: 'parse file' 8.58989 [sec] (3.09957 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.0868 [sec] (4.36138 [ns/kmer]) +num_minimizers = 143958008 +num_minimizer_positions = 168149002 +num_super_kmers = 177039547 +building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.1304 [sec] (2.21209 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.44138 [sec] (2.32431 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 4.52086 [sec] (1.6313 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 4129918/143958008 (2.86884%) +num_buckets_in_skew_index 37666/143958008 (0.0261646%) +max_bucket_size 95733 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 16748054/168149002 (9.96025%) +num_minimizer_positions_of_buckets_in_skew_index 11610524/168149002 (6.9049%) +computing minimizers offsets: 2.11228 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28852944 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26454379 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23917963 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20620416 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19906671 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18190089 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13420307 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95733: 26873605 +num_kmers_in_skew_index 178236374 (6.43147%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28852944 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28852944 kmers; bits/key = 2.52607 + built positions[0] for 28852944 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26454379 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26454379 kmers; bits/key = 2.55531 + built positions[1] for 26454379 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23917963 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 23917963 kmers; bits/key = 2.56705 + built positions[2] for 23917963 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20620416 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 20620416 kmers; bits/key = 2.55759 + built positions[3] for 20620416 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19906671 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[4] for 19906671 kmers; bits/key = 2.54825 + built positions[4] for 19906671 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18190089 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[5] for 18190089 kmers; bits/key = 2.65521 + built positions[5] for 18190089 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13420307 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 13420307 kmers; bits/key = 2.65235 + built positions[6] for 13420307 kmers; bits/key = 13 + lower = 8192; upper = 95733; num_bits_per_pos = 17; num_kmers_in_partition = 26873605 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[7] for 26873605 kmers; bits/key = 2.56978 + built positions[7] for 26873605 kmers; bits/key = 17 +computing skew index took: 24.5205 [sec] +=== step 3: 'build sparse and skew index' 26.8782 [sec] (9.69871 [ns/kmer]) +=== total_time 64.6475 [sec] (23.3274 [ns/kmer]) +total index size: 1825988568 [B] -- 1825.99 [MB] +SPACE BREAKDOWN: + mphf: 0.146358 [bits/kmer] (2.81751 [bits/key]) -- 2.7766% + strings_offsets: 0.11255 [bits/kmer] -- 2.13523% + control_codewords: 1.71421 [bits/kmer] -- 32.5208% + mid_load_buckets: 0.193388 [bits/kmer] -- 3.66882% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.4677e-05% + strings: 2.11826 [bits/kmer] -- 40.1861% + skew_index: 0.986348 [bits/kmer] -- 18.7123% + weights: 5.31156e-07 [bits/kmer] -- 1.00767e-05% + -------------- + total: 5.27111 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.105% +buckets with 2 minimizer positions = 1.67628% +buckets with 3 minimizer positions = 0.468323% +buckets with 4 minimizer positions = 0.210326% +buckets with 5 minimizer positions = 0.119884% +buckets with 6 minimizer positions = 0.0768592% +buckets with 7 minimizer positions = 0.0534996% +buckets with 8 minimizer positions = 0.0389544% +buckets with 9 minimizer positions = 0.0301845% +buckets with 10 minimizer positions = 0.0236083% +buckets with 11 minimizer positions = 0.0192897% +buckets with 12 minimizer positions = 0.015772% +buckets with 13 minimizer positions = 0.0133018% +buckets with 14 minimizer positions = 0.0114506% +buckets with 15 minimizer positions = 0.00978341% +buckets with 16 minimizer positions = 0.0086164% +max_bucket_size 95733 +2025-10-21 15:00:17: saving data structure to disk... +2025-10-21 15:00:18: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.7736 [sec] (4.68612 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.84.bin'... +=== step 1.2: 'computing minimizers tuples' 10.4057 [sec] (1.75571 [ns/kmer]) +=== step 1: 'parse file' 38.1794 [sec] (6.44185 [ns/kmer]) + == files to merge = 85 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 31.571 [sec] (5.32683 [ns/kmer]) +num_minimizers = 214434189 +num_minimizer_positions = 412025173 +num_super_kmers = 429075029 +building minimizers MPHF with 64 threads and 72 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 9.65249 [sec] (1.62862 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.1801 [sec] (2.39254 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 10.5451 [sec] (1.77922 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 66836768/214434189 (31.1689%) +num_buckets_in_skew_index 177364/214434189 (0.0827126%) +max_bucket_size 826761 +log2_max_bucket_size 20 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 197768423/412025173 (47.9991%) +num_minimizer_positions_of_buckets_in_skew_index 66836693/412025173 (16.2215%) +computing minimizers offsets: 11.899 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 112523772 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 106762115 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 99828516 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 95194090 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 85601489 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 82825801 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 70302719 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 826761: 218656277 +num_kmers_in_skew_index 871694779 (14.7077%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 112523772 + building MPHF with 64 threads and 38 partitions (avg. partition size = 3000000)... + built mphs[0] for 112523772 kmers; bits/key = 2.55734 + built positions[0] for 112523772 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 106762115 + building MPHF with 64 threads and 36 partitions (avg. partition size = 3000000)... + built mphs[1] for 106762115 kmers; bits/key = 2.54037 + built positions[1] for 106762115 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 99828516 + building MPHF with 64 threads and 34 partitions (avg. partition size = 3000000)... + built mphs[2] for 99828516 kmers; bits/key = 2.54621 + built positions[2] for 99828516 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 95194090 + building MPHF with 64 threads and 32 partitions (avg. partition size = 3000000)... + built mphs[3] for 95194090 kmers; bits/key = 2.54182 + built positions[3] for 95194090 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 85601489 + building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... + built mphs[4] for 85601489 kmers; bits/key = 2.55966 + built positions[4] for 85601489 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 82825801 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[5] for 82825801 kmers; bits/key = 2.55903 + built positions[5] for 82825801 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 70302719 + building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... + built mphs[6] for 70302719 kmers; bits/key = 2.53828 + built positions[6] for 70302719 kmers; bits/key = 13 + lower = 8192; upper = 826761; num_bits_per_pos = 20; num_kmers_in_partition = 218656277 + building MPHF with 64 threads and 73 partitions (avg. partition size = 3000000)... + built mphs[7] for 218656277 kmers; bits/key = 2.55521 + built positions[7] for 218656277 kmers; bits/key = 20 +computing skew index took: 132.665 [sec] +=== step 3: 'build sparse and skew index' 145.398 [sec] (24.5324 [ns/kmer]) +=== total_time 249.526 [sec] (42.1014 [ns/kmer]) +total index size: 6363775476 [B] -- 6363.78 [MB] +SPACE BREAKDOWN: + mphf: 0.102649 [bits/kmer] (2.83714 [bits/key]) -- 1.195% + strings_offsets: 0.273643 [bits/kmer] -- 3.18565% + control_codewords: 1.26632 [bits/kmer] -- 14.742% + mid_load_buckets: 1.13453 [bits/kmer] -- 13.2078% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.21134e-06% + strings: 3.2463 [bits/kmer] -- 37.7923% + skew_index: 2.56641 [bits/kmer] -- 29.8772% + weights: 2.48364e-07 [bits/kmer] -- 2.89137e-06% + -------------- + total: 8.58985 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 68.7484% +buckets with 2 minimizer positions = 20.1778% +buckets with 3 minimizer positions = 6.4974% +buckets with 4 minimizer positions = 2.0858% +buckets with 5 minimizer positions = 0.794975% +buckets with 6 minimizer positions = 0.393712% +buckets with 7 minimizer positions = 0.24135% +buckets with 8 minimizer positions = 0.166445% +buckets with 9 minimizer positions = 0.122788% +buckets with 10 minimizer positions = 0.0940265% +buckets with 11 minimizer positions = 0.0750543% +buckets with 12 minimizer positions = 0.0603994% +buckets with 13 minimizer positions = 0.0499459% +buckets with 14 minimizer positions = 0.0416757% +buckets with 15 minimizer positions = 0.0353955% +buckets with 16 minimizer positions = 0.0305488% +max_bucket_size 826761 +2025-10-21 15:04:29: saving data structure to disk... +2025-10-21 15:04:33: DONE diff --git a/benchmarks/results-21-10-25/k63/regular-bench.log b/benchmarks/results-21-10-25/k63/regular-bench.log new file mode 100644 index 0000000..ef9c0d1 --- /dev/null +++ b/benchmarks/results-21-10-25/k63/regular-bench.log @@ -0,0 +1,60 @@ +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 769.798 +avg_nanosec_per_negative_lookup 750.216 +avg_nanosec_per_access 295.061 +iterator: avg_nanosec_per_kmer 2.91164 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 760.167 +avg_nanosec_per_negative_lookup 746.572 +avg_nanosec_per_access 296.021 +iterator: avg_nanosec_per_kmer 2.79237 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 757.86 +avg_nanosec_per_negative_lookup 745.3 +avg_nanosec_per_access 310.214 +iterator: avg_nanosec_per_kmer 2.78571 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 706.44 +avg_nanosec_per_negative_lookup 812.075 +avg_nanosec_per_access 339.81 +iterator: avg_nanosec_per_kmer 2.78666 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 702.187 +avg_nanosec_per_negative_lookup 825.28 +avg_nanosec_per_access 341.688 +iterator: avg_nanosec_per_kmer 2.78945 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 689.162 +avg_nanosec_per_negative_lookup 814.183 +avg_nanosec_per_access 337.107 +iterator: avg_nanosec_per_kmer 2.7933 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 940.952 +avg_nanosec_per_negative_lookup 903.069 +avg_nanosec_per_access 375.989 +iterator: avg_nanosec_per_kmer 2.81406 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 947.225 +avg_nanosec_per_negative_lookup 896.248 +avg_nanosec_per_access 369.196 +iterator: avg_nanosec_per_kmer 2.81377 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 936.429 +avg_nanosec_per_negative_lookup 889.431 +avg_nanosec_per_access 362.546 +iterator: avg_nanosec_per_kmer 2.82993 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1511.05 +avg_nanosec_per_negative_lookup 1030.67 +avg_nanosec_per_access 680.146 +iterator: avg_nanosec_per_kmer 2.90132 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1525.74 +avg_nanosec_per_negative_lookup 1046.12 +avg_nanosec_per_access 670.539 +iterator: avg_nanosec_per_kmer 2.91647 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1552.93 +avg_nanosec_per_negative_lookup 1148.84 +avg_nanosec_per_access 684.755 +iterator: avg_nanosec_per_kmer 2.89824 diff --git a/benchmarks/results-21-10-25/k63/regular-build.log b/benchmarks/results-21-10-25/k63/regular-build.log new file mode 100644 index 0000000..b0a92aa --- /dev/null +++ b/benchmarks/results-21-10-25/k63/regular-build.log @@ -0,0 +1,1339 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.55137 [sec] (2.78729 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.351973 [sec] (0.632379 [ns/kmer]) +=== step 1: 'parse file' 1.91926 [sec] (3.44828 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.03731 [sec] (3.66038 [ns/kmer]) +num_minimizers = 24306363 +num_minimizer_positions = 28148872 +num_super_kmers = 28148872 +building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.34348 [sec] (2.41379 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.0756 [sec] (1.9325 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.607938 [sec] (1.09226 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) +num_buckets_in_skew_index 3271/24306363 (0.0134574%) +max_bucket_size 414759 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) +num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) +computing minimizers offsets: 0.372545 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 +num_kmers_in_skew_index 14306719 (2.57044%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3558021 kmers; bits/key = 3.06724 + built positions[0] for 3558021 kmers; bits/key = 7.0001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... + built mphs[1] for 2129998 kmers; bits/key = 2.56007 + built positions[1] for 2129998 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... + built mphs[2] for 1247229 kmers; bits/key = 2.56071 + built positions[2] for 1247229 kmers; bits/key = 9.00028 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... + built mphs[3] for 1130328 kmers; bits/key = 2.56088 + built positions[3] for 1130328 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... + built mphs[4] for 1022110 kmers; bits/key = 2.41826 + built positions[4] for 1022110 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 + building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... + built mphs[5] for 790746 kmers; bits/key = 2.4189 + built positions[5] for 790746 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 + building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... + built mphs[6] for 666283 kmers; bits/key = 2.5622 + built positions[6] for 666283 kmers; bits/key = 13.0005 + lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3762004 kmers; bits/key = 2.9235 + built positions[7] for 3762004 kmers; bits/key = 19.0001 +computing skew index took: 4.88703 [sec] +=== step 3: 'build sparse and skew index' 5.29821 [sec] (9.51912 [ns/kmer]) +=== total_time 12.2818 [sec] (22.0663 [ns/kmer]) +total index size: 308878208 [B] -- 308.878 [MB] +SPACE BREAKDOWN: + mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.93534% + strings_offsets: 0.115799 [bits/kmer] -- 2.6083% + control_codewords: 1.35379 [bits/kmer] -- 30.4933% + mid_load_buckets: 0.196907 [bits/kmer] -- 4.43522% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.67656e-05% + strings: 2.21266 [bits/kmer] -- 49.8391% + skew_index: 0.430136 [bits/kmer] -- 9.68858% + weights: 2.6447e-06 [bits/kmer] -- 5.95704e-05% + -------------- + total: 4.43961 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.0459% +buckets with 2 minimizer positions = 2.25565% +buckets with 3 minimizer positions = 0.699874% +buckets with 4 minimizer positions = 0.315284% +buckets with 5 minimizer positions = 0.173597% +buckets with 6 minimizer positions = 0.108305% +buckets with 7 minimizer positions = 0.0716932% +buckets with 8 minimizer positions = 0.0520522% +buckets with 9 minimizer positions = 0.0388458% +buckets with 10 minimizer positions = 0.0301485% +buckets with 11 minimizer positions = 0.0240019% +buckets with 12 minimizer positions = 0.0204144% +buckets with 13 minimizer positions = 0.0165265% +buckets with 14 minimizer positions = 0.013984% +buckets with 15 minimizer positions = 0.0120051% +buckets with 16 minimizer positions = 0.00972996% +max_bucket_size 414759 +2025-10-21 14:54:01: saving data structure to disk... +2025-10-21 14:54:01: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.94493 [sec] (2.54917 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.529738 [sec] (0.458548 [ns/kmer]) +=== step 1: 'parse file' 3.51638 [sec] (3.04383 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 3.99632 [sec] (3.45927 [ns/kmer]) +num_minimizers = 55464592 +num_minimizer_positions = 56006004 +num_super_kmers = 56006004 +building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.56062 [sec] (2.2165 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.1358 [sec] (1.84877 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.20158 [sec] (1.0401 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) +num_buckets_in_skew_index 490/55464592 (0.000883447%) +max_bucket_size 794 +log2_max_bucket_size 10 +skew index num_partitions 4 +num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) +num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) +computing minimizers offsets: 0.416387 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 +num_kmers_in_skew_index 1294137 (0.112022%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 + building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... + built mphs[0] for 604884 kmers; bits/key = 2.41964 + built positions[0] for 604884 kmers; bits/key = 7.00061 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 + building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... + built mphs[1] for 417805 kmers; bits/key = 2.42142 + built positions[1] for 417805 kmers; bits/key = 8.00082 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 + building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... + built mphs[2] for 221219 kmers; bits/key = 2.42569 + built positions[2] for 221219 kmers; bits/key = 9.00147 + lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... + built mphs[3] for 50229 kmers; bits/key = 2.45946 + built positions[3] for 50229 kmers; bits/key = 10.0073 +computing skew index took: 0.738825 [sec] +=== step 3: 'build sparse and skew index' 1.22735 [sec] (1.06241 [ns/kmer]) +=== total_time 14.638 [sec] (12.6709 [ns/kmer]) +total index size: 551471055 [B] -- 551.471 [MB] +SPACE BREAKDOWN: + mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.62484% + strings_offsets: 0.0958241 [bits/kmer] -- 2.50922% + control_codewords: 1.53635 [bits/kmer] -- 40.2303% + mid_load_buckets: 0.0184383 [bits/kmer] -- 0.482819% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.85973e-05% + strings: 2.01672 [bits/kmer] -- 52.8092% + skew_index: 0.0131204 [bits/kmer] -- 0.343567% + weights: 1.27418e-06 [bits/kmer] -- 3.33653e-05% + -------------- + total: 3.81888 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.6239% +buckets with 2 minimizer positions = 0.253291% +buckets with 3 minimizer positions = 0.0530717% +buckets with 4 minimizer positions = 0.0227569% +buckets with 5 minimizer positions = 0.012325% +buckets with 6 minimizer positions = 0.00748405% +buckets with 7 minimizer positions = 0.00509695% +buckets with 8 minimizer positions = 0.00359148% +buckets with 9 minimizer positions = 0.00270803% +buckets with 10 minimizer positions = 0.0021383% +buckets with 11 minimizer positions = 0.00159201% +buckets with 12 minimizer positions = 0.00125666% +buckets with 13 minimizer positions = 0.00109619% +buckets with 14 minimizer positions = 0.000941141% +buckets with 15 minimizer positions = 0.000795102% +buckets with 16 minimizer positions = 0.000685122% +max_bucket_size 794 +2025-10-21 14:54:16: saving data structure to disk... +2025-10-21 14:54:16: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 8.09582 [sec] (2.92129 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.12861 [sec] (0.407246 [ns/kmer]) +=== step 1: 'parse file' 9.23531 [sec] (3.33246 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 9.86942 [sec] (3.56127 [ns/kmer]) +num_minimizers = 122838669 +num_minimizer_positions = 140756047 +num_super_kmers = 140756047 +building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.05366 [sec] (1.82356 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.16079 [sec] (1.86222 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.65627 [sec] (1.31933 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) +num_buckets_in_skew_index 28203/122838669 (0.0229594%) +max_bucket_size 147936 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) +num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) +computing minimizers offsets: 1.59397 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 +num_kmers_in_skew_index 145458128 (5.2487%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 25196923 kmers; bits/key = 2.56001 + built positions[0] for 25196923 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21919654 kmers; bits/key = 2.60671 + built positions[1] for 21919654 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19634878 kmers; bits/key = 2.55594 + built positions[2] for 19634878 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 18051454 kmers; bits/key = 2.60116 + built positions[3] for 18051454 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17018125 kmers; bits/key = 2.58264 + built positions[4] for 17018125 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 14085569 kmers; bits/key = 2.54674 + built positions[5] for 14085569 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 9296403 kmers; bits/key = 2.72206 + built positions[6] for 9296403 kmers; bits/key = 13 + lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20255122 kmers; bits/key = 2.57505 + built positions[7] for 20255122 kmers; bits/key = 18 +computing skew index took: 17.8792 [sec] +=== step 3: 'build sparse and skew index' 19.6673 [sec] (7.09673 [ns/kmer]) +=== total_time 52.6427 [sec] (18.9956 [ns/kmer]) +total index size: 1647878152 [B] -- 1647.88 [MB] +SPACE BREAKDOWN: + mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.63218% + strings_offsets: 0.11255 [bits/kmer] -- 2.36601% + control_codewords: 1.46273 [bits/kmer] -- 30.7492% + mid_load_buckets: 0.146928 [bits/kmer] -- 3.08869% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.62633e-05% + strings: 2.11826 [bits/kmer] -- 44.5296% + skew_index: 0.791283 [bits/kmer] -- 16.6342% + weights: 5.31156e-07 [bits/kmer] -- 1.11659e-05% + -------------- + total: 4.75695 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.4557% +buckets with 2 minimizer positions = 1.46862% +buckets with 3 minimizer positions = 0.405135% +buckets with 4 minimizer positions = 0.185188% +buckets with 5 minimizer positions = 0.10523% +buckets with 6 minimizer positions = 0.0680771% +buckets with 7 minimizer positions = 0.0480598% +buckets with 8 minimizer positions = 0.0352926% +buckets with 9 minimizer positions = 0.0271502% +buckets with 10 minimizer positions = 0.0217871% +buckets with 11 minimizer positions = 0.0176866% +buckets with 12 minimizer positions = 0.014607% +buckets with 13 minimizer positions = 0.0121411% +buckets with 14 minimizer positions = 0.0105985% +buckets with 15 minimizer positions = 0.00909811% +buckets with 16 minimizer positions = 0.00794457% +max_bucket_size 147936 +2025-10-21 14:55:10: saving data structure to disk... +2025-10-21 14:55:10: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.7607 [sec] (4.68394 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.77.bin'... +=== step 1.2: 'computing minimizers tuples' 6.30247 [sec] (1.06339 [ns/kmer]) +=== step 1: 'parse file' 34.0633 [sec] (5.74734 [ns/kmer]) + == files to merge = 78 +saving tuples to 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +=== step 2.1: 'merging minimizers tuples' 25.733 [sec] (4.34182 [ns/kmer]) +num_minimizers = 213541130 +num_minimizer_positions = 352863220 +num_super_kmers = 352863220 +building minimizers MPHF with 64 threads and 72 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 9.45393 [sec] (1.59512 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 12.1472 [sec] (2.04955 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 7.89336 [sec] (1.33181 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 46977519/213541130 (21.9993%) +num_buckets_in_skew_index 144818/213541130 (0.0678174%) +max_bucket_size 1007380 +log2_max_bucket_size 20 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 135755886/352863220 (38.4727%) +num_minimizer_positions_of_buckets_in_skew_index 50688541/352863220 (14.3649%) +computing minimizers offsets: 8.5109 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 104047212 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 96849105 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 91470632 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 82637027 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 76747174 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 64811875 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 52461784 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 1007380: 169863610 +num_kmers_in_skew_index 738888419 (12.4669%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 104047212 + building MPHF with 64 threads and 35 partitions (avg. partition size = 3000000)... + built mphs[0] for 104047212 kmers; bits/key = 2.5546 + built positions[0] for 104047212 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 96849105 + building MPHF with 64 threads and 33 partitions (avg. partition size = 3000000)... + built mphs[1] for 96849105 kmers; bits/key = 2.52764 + built positions[1] for 96849105 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 91470632 + building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... + built mphs[2] for 91470632 kmers; bits/key = 2.57678 + built positions[2] for 91470632 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 82637027 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[3] for 82637027 kmers; bits/key = 2.56911 + built positions[3] for 82637027 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 76747174 + building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... + built mphs[4] for 76747174 kmers; bits/key = 2.52767 + built positions[4] for 76747174 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 64811875 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[5] for 64811875 kmers; bits/key = 2.55269 + built positions[5] for 64811875 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 52461784 + building MPHF with 64 threads and 18 partitions (avg. partition size = 3000000)... + built mphs[6] for 52461784 kmers; bits/key = 2.51634 + built positions[6] for 52461784 kmers; bits/key = 13 + lower = 8192; upper = 1007380; num_bits_per_pos = 20; num_kmers_in_partition = 169863610 + building MPHF with 64 threads and 57 partitions (avg. partition size = 3000000)... + built mphs[7] for 169863610 kmers; bits/key = 2.5614 + built positions[7] for 169863610 kmers; bits/key = 20 +computing skew index took: 103.968 [sec] +=== step 3: 'build sparse and skew index' 113.129 [sec] (19.0878 [ns/kmer]) +=== total_time 202.42 [sec] (34.1534 [ns/kmer]) +total index size: 5752839438 [B] -- 5752.84 [MB] +SPACE BREAKDOWN: + mphf: 0.102688 [bits/kmer] (2.85007 [bits/key]) -- 1.32241% + strings_offsets: 0.273643 [bits/kmer] -- 3.52396% + control_codewords: 1.26104 [bits/kmer] -- 16.2397% + mid_load_buckets: 0.778786 [bits/kmer] -- 10.0292% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.65857e-06% + strings: 3.2463 [bits/kmer] -- 41.8057% + skew_index: 2.10274 [bits/kmer] -- 27.0791% + weights: 2.48364e-07 [bits/kmer] -- 3.19842e-06% + -------------- + total: 7.76521 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 77.9329% +buckets with 2 minimizer positions = 15.8251% +buckets with 3 minimizer positions = 3.56019% +buckets with 4 minimizer positions = 1.02035% +buckets with 5 minimizer positions = 0.441893% +buckets with 6 minimizer positions = 0.254278% +buckets with 7 minimizer positions = 0.167918% +buckets with 8 minimizer positions = 0.119343% +buckets with 9 minimizer positions = 0.0889281% +buckets with 10 minimizer positions = 0.0689127% +buckets with 11 minimizer positions = 0.0548967% +buckets with 12 minimizer positions = 0.0444776% +buckets with 13 minimizer positions = 0.0366801% +buckets with 14 minimizer positions = 0.0309748% +buckets with 15 minimizer positions = 0.0263528% +buckets with 16 minimizer positions = 0.0226486% +max_bucket_size 1007380 +2025-10-21 14:58:34: saving data structure to disk... +2025-10-21 14:58:37: DONE From 1b373f3240945aca868d7c23bbea88f6e6596190 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 22 Oct 2025 13:52:34 +0200 Subject: [PATCH 058/112] cap kmers to scan in perf_test_iterator to 10^8 --- tools/perf.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index fbf97b2..74bcd65 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -11,13 +11,14 @@ void perf_test_iterator(Dict const& dict) { perf::timer_type t; t.start(); auto it = dict.begin(); - while (it.has_next()) { + uint64_t n = std::min(dict.num_kmers(), 100'000'000); + for (uint64_t i = 0; i != n; ++i) { auto [kmer_id, kmer] = it.next(); essentials::do_not_optimize_away(kmer_id); essentials::do_not_optimize_away(kmer.at(0)); } t.stop(); - double avg_nanosec = t.elapsed() / dict.num_kmers(); + double avg_nanosec = t.elapsed() / n; std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; } From 813b9bc2f5c461bb4a887f387c6c81a06ea6fb76 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 22 Oct 2025 15:28:51 +0200 Subject: [PATCH 059/112] updated scripts --- script/build.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/script/build.sh b/script/build.sh index 8aca172..4f809b3 100644 --- a/script/build.sh +++ b/script/build.sh @@ -15,12 +15,12 @@ rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulert rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 12 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j @@ -28,16 +28,16 @@ make -j rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 31 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 31 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash >> results-$1/k63/regular-build.log - -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 31 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 31 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash >> results-$1/k63/regular-build.log + +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash >> results-$1/k63/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From 2e42570ac4f26926f1612d27d2ba0018368ce66c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 22 Oct 2025 18:26:32 +0200 Subject: [PATCH 060/112] minor --- include/builder/parse_file.cpp | 8 ++++---- include/minimizer_iterator.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index a642d67..085c772 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -239,7 +239,7 @@ void dictionary_builder::parse_file(std::istream& is, const uint64_t index_end = std::min(index_begin + num_sequences_per_thread, num_sequences); - kmer_iterator it(strings_builder, k); + kmer_iterator kmer_it(strings_builder, k); minimizer_iterator minimizer_it(k, m, hasher); minimizer_iterator_rc minimizer_it_rc(k, m, hasher); @@ -254,12 +254,12 @@ void dictionary_builder::parse_file(std::istream& is, assert(prev_mini_info.minimizer == constants::invalid_uint64); uint64_t num_kmers_in_super_kmer = 0; - it.at(Kmer::bits_per_char * begin); + kmer_it.at(Kmer::bits_per_char * begin); minimizer_it.set_position(begin); minimizer_it_rc.set_position(begin); for (uint64_t j = 0; j != sequence_len - k + 1; ++j) { - auto uint_kmer = it.get(); + auto uint_kmer = kmer_it.get(); auto mini_info = minimizer_it.next(uint_kmer); assert(mini_info.pos_in_seq < end - m + 1); assert(mini_info.pos_in_kmer < k - m + 1); @@ -292,7 +292,7 @@ void dictionary_builder::parse_file(std::istream& is, } num_kmers_in_super_kmer += 1; - it.next(); + kmer_it.next(); } save(prev_mini_info, num_kmers_in_super_kmer); diff --git a/include/minimizer_iterator.hpp b/include/minimizer_iterator.hpp index c350940..83f6898 100644 --- a/include/minimizer_iterator.hpp +++ b/include/minimizer_iterator.hpp @@ -89,7 +89,7 @@ struct minimizer_iterator { /* "Re-scan" method. */ -template +template struct minimizer_iterator_rc { minimizer_iterator_rc() {} From f66ce60563c10a15b89d495272b43e6826a0044c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 22 Oct 2025 19:16:36 +0200 Subject: [PATCH 061/112] fixed build script and new results (22/10/25); also, noted that encoded offsets actually work as expected: one access guaranteed but the benefit kicks in only for large indexes, e.g., for se.k63 --- script/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/build.sh b/script/build.sh index 4f809b3..95c0913 100644 --- a/script/build.sh +++ b/script/build.sh @@ -20,7 +20,7 @@ rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eul rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 12 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j From a028972bfd038ed2b3e680d709c6b2c63bb91d42 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 23 Oct 2025 09:07:51 +0200 Subject: [PATCH 062/112] added results --- .../k31/canon-bench.log | 90 + .../k31/canon-build.log | 2284 ++++++++++++++++ .../k31/regular-bench.log | 90 + .../k31/regular-build.log | 2206 ++++++++++++++++ .../k63/canon-bench.log | 90 + .../k63/canon-build.log | 2131 +++++++++++++++ .../k63/regular-bench.log | 90 + .../k63/regular-build.log | 2101 +++++++++++++++ .../results-22-10-25/k31/canon-bench.log | 90 + .../results-22-10-25/k31/canon-build.log | 2285 +++++++++++++++++ .../results-22-10-25/k31/regular-bench.log | 90 + .../results-22-10-25/k31/regular-build.log | 2206 ++++++++++++++++ .../results-22-10-25/k63/canon-bench.log | 90 + .../results-22-10-25/k63/canon-build.log | 2131 +++++++++++++++ .../results-22-10-25/k63/regular-bench.log | 90 + .../results-22-10-25/k63/regular-build.log | 2101 +++++++++++++++ 16 files changed, 18165 insertions(+) create mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log create mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log create mode 100644 benchmarks/results-22-10-25/k31/canon-bench.log create mode 100644 benchmarks/results-22-10-25/k31/canon-build.log create mode 100644 benchmarks/results-22-10-25/k31/regular-bench.log create mode 100644 benchmarks/results-22-10-25/k31/regular-build.log create mode 100644 benchmarks/results-22-10-25/k63/canon-bench.log create mode 100644 benchmarks/results-22-10-25/k63/canon-build.log create mode 100644 benchmarks/results-22-10-25/k63/regular-bench.log create mode 100644 benchmarks/results-22-10-25/k63/regular-build.log diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log b/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log new file mode 100644 index 0000000..2803d05 --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 508.44 +avg_nanosec_per_negative_lookup 448.659 +avg_nanosec_per_access 250.192 +iterator: avg_nanosec_per_kmer 2.52036 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 508.499 +avg_nanosec_per_negative_lookup 422.478 +avg_nanosec_per_access 254.124 +iterator: avg_nanosec_per_kmer 2.56415 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 469.837 +avg_nanosec_per_negative_lookup 454.816 +avg_nanosec_per_access 244.543 +iterator: avg_nanosec_per_kmer 2.51074 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 448.309 +avg_nanosec_per_negative_lookup 429.68 +avg_nanosec_per_access 226.668 +iterator: avg_nanosec_per_kmer 2.52138 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 460.602 +avg_nanosec_per_negative_lookup 421.453 +avg_nanosec_per_access 226.503 +iterator: avg_nanosec_per_kmer 2.69089 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 431.613 +avg_nanosec_per_negative_lookup 445.229 +avg_nanosec_per_access 220.367 +iterator: avg_nanosec_per_kmer 2.49984 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 621.268 +avg_nanosec_per_negative_lookup 558.222 +avg_nanosec_per_access 370.135 +iterator: avg_nanosec_per_kmer 2.65783 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 649.382 +avg_nanosec_per_negative_lookup 573.823 +avg_nanosec_per_access 348.086 +iterator: avg_nanosec_per_kmer 2.50731 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 616.481 +avg_nanosec_per_negative_lookup 559.69 +avg_nanosec_per_access 363.882 +iterator: avg_nanosec_per_kmer 2.59154 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 783.211 +avg_nanosec_per_negative_lookup 623.164 +avg_nanosec_per_access 575.025 +iterator: avg_nanosec_per_kmer 2.55037 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 783.327 +avg_nanosec_per_negative_lookup 616.317 +avg_nanosec_per_access 546.797 +iterator: avg_nanosec_per_kmer 2.57689 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 789.088 +avg_nanosec_per_negative_lookup 634.175 +avg_nanosec_per_access 562.361 +iterator: avg_nanosec_per_kmer 2.56575 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 768.33 +avg_nanosec_per_negative_lookup 543.863 +avg_nanosec_per_access 426.418 +iterator: avg_nanosec_per_kmer 2.49788 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 754.612 +avg_nanosec_per_negative_lookup 538.25 +avg_nanosec_per_access 450.752 +iterator: avg_nanosec_per_kmer 2.64603 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 767.805 +avg_nanosec_per_negative_lookup 552.96 +avg_nanosec_per_access 429.486 +iterator: avg_nanosec_per_kmer 2.53384 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 701.579 +avg_nanosec_per_negative_lookup 529.494 +avg_nanosec_per_access 415.591 +iterator: avg_nanosec_per_kmer 2.64494 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 712.05 +avg_nanosec_per_negative_lookup 523.281 +avg_nanosec_per_access 421.972 +iterator: avg_nanosec_per_kmer 2.54065 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 720.165 +avg_nanosec_per_negative_lookup 539.569 +avg_nanosec_per_access 402.468 +iterator: avg_nanosec_per_kmer 2.61372 diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log b/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log new file mode 100644 index 0000000..106badd --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log @@ -0,0 +1,2284 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.53113 [sec] (3.04723 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.74125 [sec] (1.47523 [ns/kmer]) +=== step 1: 'parse file' 2.27247 [sec] (4.52263 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 7.19514 [sec] (14.3197 [ns/kmer]) +num_minimizers = 86163506 +num_minimizer_positions = 94463730 +num_super_kmers = 98209779 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.80006 [sec] (7.56283 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.78004 [sec] (7.52299 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.87193 [sec] (3.7255 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 2988605/86163506 (3.46853%) +num_buckets_in_skew_index 5810/86163506 (0.00674299%) +max_bucket_size 68577 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 10013861/94463730 (10.6007%) +num_minimizer_positions_of_buckets_in_skew_index 1280778/94463730 (1.35584%) +computing minimizers offsets: 1.19738 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1643143 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1178275 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 956038 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 605533 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 425543 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 382297 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 254872 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 68577: 624986 +num_kmers_in_skew_index 6070687 (1.20818%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1643143 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1643143)... + built mphs[0] for 1643143 kmers; bits/key = 2.56038 + built positions[0] for 1643143 kmers; bits/key = 7.0002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1178275 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1178275)... + built mphs[1] for 1178275 kmers; bits/key = 2.41806 + built positions[1] for 1178275 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 956038 + building MPHF with 64 threads and 1 partitions (avg. partition size = 956038)... + built mphs[2] for 956038 kmers; bits/key = 2.56129 + built positions[2] for 956038 kmers; bits/key = 9.00035 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 605533 + building MPHF with 64 threads and 1 partitions (avg. partition size = 605533)... + built mphs[3] for 605533 kmers; bits/key = 2.41961 + built positions[3] for 605533 kmers; bits/key = 10.0006 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 425543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 425543)... + built mphs[4] for 425543 kmers; bits/key = 2.42126 + built positions[4] for 425543 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 382297 + building MPHF with 64 threads and 1 partitions (avg. partition size = 382297)... + built mphs[5] for 382297 kmers; bits/key = 2.42153 + built positions[5] for 382297 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 254872 + building MPHF with 64 threads and 1 partitions (avg. partition size = 254872)... + built mphs[6] for 254872 kmers; bits/key = 2.56712 + built positions[6] for 254872 kmers; bits/key = 13.0013 + lower = 8192; upper = 68577; num_bits_per_pos = 17; num_kmers_in_partition = 624986 + building MPHF with 64 threads and 1 partitions (avg. partition size = 624986)... + built mphs[7] for 624986 kmers; bits/key = 2.41943 + built positions[7] for 624986 kmers; bits/key = 17.0005 +computing skew index took: 3.4033 [sec] +=== step 3: 'build sparse and skew index' 4.75385 [sec] (9.46106 [ns/kmer]) +=== total_time 23.6735 [sec] (47.1147 [ns/kmer]) +total index size: 637918700 [B] -- 637.919 [MB] +SPACE BREAKDOWN: + mphf: 0.487029 [bits/kmer] (2.84013 [bits/key]) -- 4.79519% + strings_offsets: 0.12283 [bits/kmer] -- 1.20936% + control_codewords: 6.34482 [bits/kmer] -- 62.4698% + mid_load_buckets: 0.717461 [bits/kmer] -- 7.06397% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.20116e-05% + strings: 2.24566 [bits/kmer] -- 22.1103% + skew_index: 0.238819 [bits/kmer] -- 2.35136% + weights: 2.92956e-06 [bits/kmer] -- 2.88438e-05% + -------------- + total: 10.1566 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.5247% +buckets with 2 minimizer positions = 2.16597% +buckets with 3 minimizer positions = 0.599947% +buckets with 4 minimizer positions = 0.247865% +buckets with 5 minimizer positions = 0.129293% +buckets with 6 minimizer positions = 0.0768388% +buckets with 7 minimizer positions = 0.0512653% +buckets with 8 minimizer positions = 0.0353688% +buckets with 9 minimizer positions = 0.0260667% +buckets with 10 minimizer positions = 0.0199121% +buckets with 11 minimizer positions = 0.0157805% +buckets with 12 minimizer positions = 0.0127513% +buckets with 13 minimizer positions = 0.0102503% +buckets with 14 minimizer positions = 0.00880535% +buckets with 15 minimizer positions = 0.0074347% +buckets with 16 minimizer positions = 0.00615574% +max_bucket_size 68577 +2025-10-22 19:29:16: saving data structure to disk... +2025-10-22 19:29:16: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.77737 [sec] (2.41427 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.50369 [sec] (1.30711 [ns/kmer]) +=== step 1: 'parse file' 4.28119 [sec] (3.72148 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 16.0668 [sec] (13.9662 [ns/kmer]) +num_minimizers = 209937048 +num_minimizer_positions = 213990360 +num_super_kmers = 222970482 +building minimizers MPHF with 64 threads and 70 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 8.98166 [sec] (7.80743 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.52983 [sec] (7.41467 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 7.67758 [sec] (6.67384 [ns/kmer]) +num_bits_per_offset = 37 +num_buckets_larger_than_1_not_in_skew_index 2035626/209937048 (0.969636%) +num_buckets_in_skew_index 2517/209937048 (0.00119893%) +max_bucket_size 5316 +log2_max_bucket_size 13 +skew index num_partitions 7 +num_minimizer_positions_of_buckets_larger_than_1 5736623/213990360 (2.68079%) +num_minimizer_positions_of_buckets_in_skew_index 354832/213990360 (0.165817%) +computing minimizers offsets: 1.87975 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 846431 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 463901 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 298968 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 116879 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 120430 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 42891 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 5316: 9813 +num_kmers_in_skew_index 1899313 (0.1651%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 846431 + building MPHF with 64 threads and 1 partitions (avg. partition size = 846431)... + built mphs[0] for 846431 kmers; bits/key = 2.41876 + built positions[0] for 846431 kmers; bits/key = 7.00042 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 463901 + building MPHF with 64 threads and 1 partitions (avg. partition size = 463901)... + built mphs[1] for 463901 kmers; bits/key = 2.42059 + built positions[1] for 463901 kmers; bits/key = 8.00074 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 298968 + building MPHF with 64 threads and 1 partitions (avg. partition size = 298968)... + built mphs[2] for 298968 kmers; bits/key = 2.42332 + built positions[2] for 298968 kmers; bits/key = 9.0012 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 116879 + building MPHF with 64 threads and 1 partitions (avg. partition size = 116879)... + built mphs[3] for 116879 kmers; bits/key = 2.57716 + built positions[3] for 116879 kmers; bits/key = 10.0031 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 120430 + building MPHF with 64 threads and 1 partitions (avg. partition size = 120430)... + built mphs[4] for 120430 kmers; bits/key = 2.43408 + built positions[4] for 120430 kmers; bits/key = 11.0027 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 42891 + building MPHF with 64 threads and 1 partitions (avg. partition size = 42891)... + built mphs[5] for 42891 kmers; bits/key = 2.46579 + built positions[5] for 42891 kmers; bits/key = 12.0089 + lower = 4096; upper = 5316; num_bits_per_pos = 13; num_kmers_in_partition = 9813 + building MPHF with 64 threads and 1 partitions (avg. partition size = 9813)... + built mphs[6] for 9813 kmers; bits/key = 2.48487 + built positions[6] for 9813 kmers; bits/key = 13.0374 +computing skew index took: 1.12068 [sec] +=== step 3: 'build sparse and skew index' 3.32891 [sec] (2.8937 [ns/kmer]) +=== total_time 48.8659 [sec] (42.4774 [ns/kmer]) +total index size: 1396053120 [B] -- 1396.05 [MB] +SPACE BREAKDOWN: + mphf: 0.514173 [bits/kmer] (2.81753 [bits/key]) -- 5.29622% + strings_offsets: 0.0157068 [bits/kmer] -- 0.161788% + control_codewords: 6.93464 [bits/kmer] -- 71.43% + mid_load_buckets: 0.184506 [bits/kmer] -- 1.9005% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 1.9197e-05% + strings: 2.0304 [bits/kmer] -- 20.9141% + skew_index: 0.0288715 [bits/kmer] -- 0.297389% + weights: 1.27956e-06 [bits/kmer] -- 1.318e-05% + -------------- + total: 9.7083 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.0292% +buckets with 2 minimizer positions = 0.755504% +buckets with 3 minimizer positions = 0.0986639% +buckets with 4 minimizer positions = 0.0387669% +buckets with 5 minimizer positions = 0.0208944% +buckets with 6 minimizer positions = 0.0129548% +buckets with 7 minimizer positions = 0.00864497% +buckets with 8 minimizer positions = 0.00604515% +buckets with 9 minimizer positions = 0.00458137% +buckets with 10 minimizer positions = 0.00347628% +buckets with 11 minimizer positions = 0.00277321% +buckets with 12 minimizer positions = 0.00222448% +buckets with 13 minimizer positions = 0.00183484% +buckets with 14 minimizer positions = 0.00150569% +buckets with 15 minimizer positions = 0.00123418% +buckets with 16 minimizer positions = 0.00103317% +max_bucket_size 5316 +2025-10-22 19:30:06: saving data structure to disk... +2025-10-22 19:30:07: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.42622 [sec] (2.96375 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.101.bin'... +=== step 1.2: 'computing minimizers tuples' 3.42168 [sec] (1.36557 [ns/kmer]) +=== step 1: 'parse file' 10.848 [sec] (4.32936 [ns/kmer]) + == files to merge = 102 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.1: 'merging minimizers tuples' 40.7928 [sec] (16.2801 [ns/kmer]) +num_minimizers = 462224926 +num_minimizer_positions = 511201278 +num_super_kmers = 531186741 +building minimizers MPHF with 64 threads and 155 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 20.6153 [sec] (8.22742 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 19.2297 [sec] (7.67443 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.4: 'merging minimizers tuples ' 28.6909 [sec] (11.4504 [ns/kmer]) +num_bits_per_offset = 40 +num_buckets_larger_than_1_not_in_skew_index 14266506/462224926 (3.08649%) +num_buckets_in_skew_index 60557/462224926 (0.0131012%) +max_bucket_size 22085 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 53165974/511201278 (10.4002%) +num_minimizer_positions_of_buckets_in_skew_index 10137441/511201278 (1.98306%) +computing minimizers offsets: 6.34323 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 14957205 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 10906495 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 7473094 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4774535 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2638087 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1593261 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 729770 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22085: 506148 +num_kmers_in_skew_index 43578595 (1.73919%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 14957205 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[0] for 14957205 kmers; bits/key = 2.56583 + built positions[0] for 14957205 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10906495 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[1] for 10906495 kmers; bits/key = 2.61744 + built positions[1] for 10906495 kmers; bits/key = 8.00003 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 7473094 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 7473094 kmers; bits/key = 2.65359 + built positions[2] for 7473094 kmers; bits/key = 9.00004 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4774535 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4774535 kmers; bits/key = 2.75085 + built positions[3] for 4774535 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2638087 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2638087)... + built mphs[4] for 2638087 kmers; bits/key = 2.55989 + built positions[4] for 2638087 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1593261 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1593261)... + built mphs[5] for 1593261 kmers; bits/key = 2.56041 + built positions[5] for 1593261 kmers; bits/key = 12.0002 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 729770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 729770)... + built mphs[6] for 729770 kmers; bits/key = 2.56195 + built positions[6] for 729770 kmers; bits/key = 13.0005 + lower = 8192; upper = 22085; num_bits_per_pos = 15; num_kmers_in_partition = 506148 + building MPHF with 64 threads and 1 partitions (avg. partition size = 506148)... + built mphs[7] for 506148 kmers; bits/key = 2.42048 + built positions[7] for 506148 kmers; bits/key = 15.0007 +computing skew index took: 10.0155 [sec] +=== step 3: 'build sparse and skew index' 17.2786 [sec] (6.89576 [ns/kmer]) +=== total_time 137.455 [sec] (54.8575 [ns/kmer]) +total index size: 3654352132 [B] -- 3654.35 [MB] +SPACE BREAKDOWN: + mphf: 0.523236 [bits/kmer] (2.83641 [bits/key]) -- 4.48459% + strings_offsets: 0.130909 [bits/kmer] -- 1.122% + control_codewords: 7.56331 [bits/kmer] -- 64.8242% + mid_load_buckets: 0.848728 [bits/kmer] -- 7.27434% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 7.33372e-06% + strings: 2.24545 [bits/kmer] -- 19.2455% + skew_index: 0.355788 [bits/kmer] -- 3.04941% + weights: 5.87466e-07 [bits/kmer] -- 5.03509e-06% + -------------- + total: 11.6674 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.9004% +buckets with 2 minimizer positions = 1.89323% +buckets with 3 minimizer positions = 0.481205% +buckets with 4 minimizer positions = 0.215066% +buckets with 5 minimizer positions = 0.121924% +buckets with 6 minimizer positions = 0.0781816% +buckets with 7 minimizer positions = 0.0541282% +buckets with 8 minimizer positions = 0.0394014% +buckets with 9 minimizer positions = 0.0296871% +buckets with 10 minimizer positions = 0.0233579% +buckets with 11 minimizer positions = 0.0188211% +buckets with 12 minimizer positions = 0.0152856% +buckets with 13 minimizer positions = 0.0127754% +buckets with 14 minimizer positions = 0.0106204% +buckets with 15 minimizer positions = 0.00907826% +buckets with 16 minimizer positions = 0.0079457% +max_bucket_size 22085 +2025-10-22 19:32:26: saving data structure to disk... +2025-10-22 19:32:28: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.3008 [sec] (4.65311 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.113.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.114.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.115.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.116.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.117.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.118.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.119.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.120.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.121.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.122.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.123.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.124.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.125.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.126.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.127.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.128.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.129.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.130.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.131.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.132.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.133.bin'... +=== step 1.2: 'computing minimizers tuples' 9.92957 [sec] (2.67059 [ns/kmer]) +=== step 1: 'parse file' 27.2305 [sec] (7.32373 [ns/kmer]) + == files to merge = 134 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +num_super_kmers = 800000000 +=== step 2.1: 'merging minimizers tuples' 66.9095 [sec] (17.9955 [ns/kmer]) +num_minimizers = 619508590 +num_minimizer_positions = 790834640 +num_super_kmers = 819080133 +building minimizers MPHF with 64 threads and 207 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 25.609 [sec] (6.88763 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 28.8736 [sec] (7.76563 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +num_super_kmers = 800000000 +=== step 2.4: 'merging minimizers tuples ' 43.8189 [sec] (11.7852 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 81104016/619508590 (13.0917%) +num_buckets_in_skew_index 149851/619508590 (0.0241887%) +max_bucket_size 71241 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 225181159/790834640 (28.4739%) +num_minimizer_positions_of_buckets_in_skew_index 27398758/790834640 (3.46454%) +computing minimizers offsets: 16.1527 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 35558914 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26726484 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19151665 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 12830346 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 8265693 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 5225188 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 3257832 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71241: 4228970 +num_kmers_in_skew_index 115245092 (3.09955%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 35558914 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[0] for 35558914 kmers; bits/key = 2.57422 + built positions[0] for 35558914 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26726484 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26726484 kmers; bits/key = 2.5656 + built positions[1] for 26726484 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19151665 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19151665 kmers; bits/key = 2.60993 + built positions[2] for 19151665 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 12830346 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[3] for 12830346 kmers; bits/key = 2.65495 + built positions[3] for 12830346 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8265693 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[4] for 8265693 kmers; bits/key = 2.59459 + built positions[4] for 8265693 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 5225188 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 5225188 kmers; bits/key = 2.63154 + built positions[5] for 5225188 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 3257832 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 3257832 kmers; bits/key = 3.31153 + built positions[6] for 3257832 kmers; bits/key = 13.0001 + lower = 8192; upper = 71241; num_bits_per_pos = 17; num_kmers_in_partition = 4228970 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4228970 kmers; bits/key = 2.84935 + built positions[7] for 4228970 kmers; bits/key = 17.0001 +computing skew index took: 19.0177 [sec] +=== step 3: 'build sparse and skew index' 36.8019 [sec] (9.89797 [ns/kmer]) +=== total_time 229.243 [sec] (61.6557 [ns/kmer]) +total index size: 6504372204 [B] -- 6504.37 [MB] +SPACE BREAKDOWN: + mphf: 0.472233 [bits/kmer] (2.83421 [bits/key]) -- 3.3743% + strings_offsets: 0.489994 [bits/kmer] -- 3.50121% + control_codewords: 6.99799 [bits/kmer] -- 50.0036% + mid_load_buckets: 2.48309 [bits/kmer] -- 17.7427% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.12031e-06% + strings: 2.8909 [bits/kmer] -- 20.6567% + skew_index: 0.660765 [bits/kmer] -- 4.72145% + weights: 3.95899e-07 [bits/kmer] -- 2.82887e-06% + -------------- + total: 13.995 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 86.8841% +buckets with 2 minimizer positions = 10.1608% +buckets with 3 minimizer positions = 1.5937% +buckets with 4 minimizer positions = 0.465965% +buckets with 5 minimizer positions = 0.227622% +buckets with 6 minimizer positions = 0.138122% +buckets with 7 minimizer positions = 0.0932371% +buckets with 8 minimizer positions = 0.0672932% +buckets with 9 minimizer positions = 0.0507686% +buckets with 10 minimizer positions = 0.0394317% +buckets with 11 minimizer positions = 0.0314958% +buckets with 12 minimizer positions = 0.025655% +buckets with 13 minimizer positions = 0.0213997% +buckets with 14 minimizer positions = 0.017952% +buckets with 15 minimizer positions = 0.0152708% +buckets with 16 minimizer positions = 0.0132381% +max_bucket_size 71241 +2025-10-22 19:36:20: saving data structure to disk... +2025-10-22 19:36:24: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 100000 sequences, 12802319 bases, 9802319 kmers +read 200000 sequences, 26155680 bases, 20155680 kmers +read 300000 sequences, 39727315 bases, 30727315 kmers +read 400000 sequences, 53567543 bases, 41567543 kmers +read 500000 sequences, 68009750 bases, 53009750 kmers +read 600000 sequences, 83050731 bases, 65050731 kmers +read 700000 sequences, 98819486 bases, 77819486 kmers +read 800000 sequences, 116043186 bases, 92043186 kmers +read 900000 sequences, 134201454 bases, 107201454 kmers +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 1100000 sequences, 174787795 bases, 141787795 kmers +read 1200000 sequences, 183806919 bases, 147806919 kmers +read 1300000 sequences, 190658371 bases, 151658371 kmers +read 1400000 sequences, 197393762 bases, 155393762 kmers +read 1500000 sequences, 204308958 bases, 159308958 kmers +read 1600000 sequences, 211178004 bases, 163178004 kmers +read 1700000 sequences, 217938129 bases, 166938129 kmers +read 1800000 sequences, 224728931 bases, 170728931 kmers +read 1900000 sequences, 231435055 bases, 174435055 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 2100000 sequences, 245162304 bases, 182162304 kmers +read 2200000 sequences, 251968534 bases, 185968534 kmers +read 2300000 sequences, 258797784 bases, 189797784 kmers +read 2400000 sequences, 265681419 bases, 193681419 kmers +read 2500000 sequences, 272480771 bases, 197480771 kmers +read 2600000 sequences, 279327274 bases, 201327274 kmers +read 2700000 sequences, 286169897 bases, 205169897 kmers +read 2800000 sequences, 293063897 bases, 209063897 kmers +read 2900000 sequences, 299941531 bases, 212941531 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 3100000 sequences, 313725925 bases, 220725925 kmers +read 3200000 sequences, 320629887 bases, 224629887 kmers +read 3300000 sequences, 327545193 bases, 228545193 kmers +read 3400000 sequences, 334471610 bases, 232471610 kmers +read 3500000 sequences, 341603766 bases, 236603766 kmers +read 3600000 sequences, 348399690 bases, 240399690 kmers +read 3700000 sequences, 355270676 bases, 244270676 kmers +read 3800000 sequences, 362436143 bases, 248436143 kmers +read 3900000 sequences, 369341114 bases, 252341114 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 4100000 sequences, 383163199 bases, 260163199 kmers +read 4200000 sequences, 390047987 bases, 264047987 kmers +read 4300000 sequences, 396880438 bases, 267880438 kmers +read 4400000 sequences, 403776565 bases, 271776565 kmers +read 4500000 sequences, 410576367 bases, 275576367 kmers +read 4600000 sequences, 417377049 bases, 279377049 kmers +read 4700000 sequences, 424274495 bases, 283274495 kmers +read 4800000 sequences, 431192311 bases, 287192311 kmers +read 4900000 sequences, 438257785 bases, 291257785 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 5100000 sequences, 452307732 bases, 299307732 kmers +read 5200000 sequences, 459344438 bases, 303344438 kmers +read 5300000 sequences, 466255981 bases, 307255981 kmers +read 5400000 sequences, 473220156 bases, 311220156 kmers +read 5500000 sequences, 480178864 bases, 315178864 kmers +read 5600000 sequences, 487198091 bases, 319198091 kmers +read 5700000 sequences, 494051268 bases, 323051268 kmers +read 5800000 sequences, 501294774 bases, 327294774 kmers +read 5900000 sequences, 508386191 bases, 331386191 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 6100000 sequences, 522265327 bases, 339265327 kmers +read 6200000 sequences, 529435219 bases, 343435219 kmers +read 6300000 sequences, 536513892 bases, 347513892 kmers +read 6400000 sequences, 543669227 bases, 351669227 kmers +read 6500000 sequences, 550654427 bases, 355654427 kmers +read 6600000 sequences, 557665979 bases, 359665979 kmers +read 6700000 sequences, 564815722 bases, 363815722 kmers +read 6800000 sequences, 571787007 bases, 367787007 kmers +read 6900000 sequences, 578923485 bases, 371923485 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 7100000 sequences, 593247546 bases, 380247546 kmers +read 7200000 sequences, 600225954 bases, 384225954 kmers +read 7300000 sequences, 607331027 bases, 388331027 kmers +read 7400000 sequences, 614417238 bases, 392417238 kmers +read 7500000 sequences, 621494916 bases, 396494916 kmers +read 7600000 sequences, 628713296 bases, 400713296 kmers +read 7700000 sequences, 635875916 bases, 404875916 kmers +read 7800000 sequences, 643000132 bases, 409000132 kmers +read 7900000 sequences, 650054935 bases, 413054935 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 8100000 sequences, 664392690 bases, 421392690 kmers +read 8200000 sequences, 671575430 bases, 425575430 kmers +read 8300000 sequences, 678822397 bases, 429822397 kmers +read 8400000 sequences, 685932522 bases, 433932522 kmers +read 8500000 sequences, 693003257 bases, 438003257 kmers +read 8600000 sequences, 700264806 bases, 442264806 kmers +read 8700000 sequences, 707441916 bases, 446441916 kmers +read 8800000 sequences, 714783716 bases, 450783716 kmers +read 8900000 sequences, 722048687 bases, 455048687 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 9100000 sequences, 736820834 bases, 463820834 kmers +read 9200000 sequences, 744240551 bases, 468240551 kmers +read 9300000 sequences, 751532385 bases, 472532385 kmers +read 9400000 sequences, 758908308 bases, 476908308 kmers +read 9500000 sequences, 766152765 bases, 481152765 kmers +read 9600000 sequences, 773460104 bases, 485460104 kmers +read 9700000 sequences, 780744999 bases, 489744999 kmers +read 9800000 sequences, 788046688 bases, 494046688 kmers +read 9900000 sequences, 795444088 bases, 498444088 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 10100000 sequences, 810379702 bases, 507379702 kmers +read 10200000 sequences, 817713311 bases, 511713311 kmers +read 10300000 sequences, 825011133 bases, 516011133 kmers +read 10400000 sequences, 832292513 bases, 520292513 kmers +read 10500000 sequences, 839612784 bases, 524612784 kmers +read 10600000 sequences, 847027439 bases, 529027439 kmers +read 10700000 sequences, 854363725 bases, 533363725 kmers +read 10800000 sequences, 861721984 bases, 537721984 kmers +read 10900000 sequences, 869045250 bases, 542045250 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 11100000 sequences, 883866002 bases, 550866002 kmers +read 11200000 sequences, 891340279 bases, 555340279 kmers +read 11300000 sequences, 899036889 bases, 560036889 kmers +read 11400000 sequences, 906434241 bases, 564434241 kmers +read 11500000 sequences, 913824257 bases, 568824257 kmers +read 11600000 sequences, 921342281 bases, 573342281 kmers +read 11700000 sequences, 928719144 bases, 577719144 kmers +read 11800000 sequences, 936164765 bases, 582164765 kmers +read 11900000 sequences, 943653758 bases, 586653758 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 12100000 sequences, 958744772 bases, 595744772 kmers +read 12200000 sequences, 966275858 bases, 600275858 kmers +read 12300000 sequences, 973962686 bases, 604962686 kmers +read 12400000 sequences, 981647965 bases, 609647965 kmers +read 12500000 sequences, 989234531 bases, 614234531 kmers +read 12600000 sequences, 996919849 bases, 618919849 kmers +read 12700000 sequences, 1004488446 bases, 623488446 kmers +read 12800000 sequences, 1012083435 bases, 628083435 kmers +read 12900000 sequences, 1019844583 bases, 632844583 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 13100000 sequences, 1035458430 bases, 642458430 kmers +read 13200000 sequences, 1043299596 bases, 647299596 kmers +read 13300000 sequences, 1051100294 bases, 652100294 kmers +read 13400000 sequences, 1058940054 bases, 656940054 kmers +read 13500000 sequences, 1066735225 bases, 661735225 kmers +read 13600000 sequences, 1074662997 bases, 666662997 kmers +read 13700000 sequences, 1082381283 bases, 671381283 kmers +read 13800000 sequences, 1090055507 bases, 676055507 kmers +read 13900000 sequences, 1097835965 bases, 680835965 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 14100000 sequences, 1113495622 bases, 690495622 kmers +read 14200000 sequences, 1121380038 bases, 695380038 kmers +read 14300000 sequences, 1129522879 bases, 700522879 kmers +read 14400000 sequences, 1137515487 bases, 705515487 kmers +read 14500000 sequences, 1145547633 bases, 710547633 kmers +read 14600000 sequences, 1153636718 bases, 715636718 kmers +read 14700000 sequences, 1161507672 bases, 720507672 kmers +read 14800000 sequences, 1169638977 bases, 725638977 kmers +read 14900000 sequences, 1177765602 bases, 730765602 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 15100000 sequences, 1193966066 bases, 740966066 kmers +read 15200000 sequences, 1201992531 bases, 745992531 kmers +read 15300000 sequences, 1210139564 bases, 751139564 kmers +read 15400000 sequences, 1218303770 bases, 756303770 kmers +read 15500000 sequences, 1226563924 bases, 761563924 kmers +read 15600000 sequences, 1234769102 bases, 766769102 kmers +read 15700000 sequences, 1243038710 bases, 772038710 kmers +read 15800000 sequences, 1251312331 bases, 777312331 kmers +read 15900000 sequences, 1259505857 bases, 782505857 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 16100000 sequences, 1276258510 bases, 793258510 kmers +read 16200000 sequences, 1284600618 bases, 798600618 kmers +read 16300000 sequences, 1292910529 bases, 803910529 kmers +read 16400000 sequences, 1301315569 bases, 809315569 kmers +read 16500000 sequences, 1309948482 bases, 814948482 kmers +read 16600000 sequences, 1318536932 bases, 820536932 kmers +read 16700000 sequences, 1326901868 bases, 825901868 kmers +read 16800000 sequences, 1335658656 bases, 831658656 kmers +read 16900000 sequences, 1344318999 bases, 837318999 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 17100000 sequences, 1361738649 bases, 848738649 kmers +read 17200000 sequences, 1370441463 bases, 854441463 kmers +read 17300000 sequences, 1379104762 bases, 860104762 kmers +read 17400000 sequences, 1387857799 bases, 865857799 kmers +read 17500000 sequences, 1396827318 bases, 871827318 kmers +read 17600000 sequences, 1405624638 bases, 877624638 kmers +read 17700000 sequences, 1414580410 bases, 883580410 kmers +read 17800000 sequences, 1423596393 bases, 889596393 kmers +read 17900000 sequences, 1432608671 bases, 895608671 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 18100000 sequences, 1451131708 bases, 908131708 kmers +read 18200000 sequences, 1460386801 bases, 914386801 kmers +read 18300000 sequences, 1469583369 bases, 920583369 kmers +read 18400000 sequences, 1478759459 bases, 926759459 kmers +read 18500000 sequences, 1488122391 bases, 933122391 kmers +read 18600000 sequences, 1497569745 bases, 939569745 kmers +read 18700000 sequences, 1507030485 bases, 946030485 kmers +read 18800000 sequences, 1516707149 bases, 952707149 kmers +read 18900000 sequences, 1526397934 bases, 959397934 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 19100000 sequences, 1546342668 bases, 973342668 kmers +read 19200000 sequences, 1556281669 bases, 980281669 kmers +read 19300000 sequences, 1566271275 bases, 987271275 kmers +read 19400000 sequences, 1576402796 bases, 994402796 kmers +read 19500000 sequences, 1586440957 bases, 1001440957 kmers +read 19600000 sequences, 1596689344 bases, 1008689344 kmers +read 19700000 sequences, 1607088748 bases, 1016088748 kmers +read 19800000 sequences, 1617543387 bases, 1023543387 kmers +read 19900000 sequences, 1628261415 bases, 1031261415 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20100000 sequences, 1650338356 bases, 1047338356 kmers +read 20200000 sequences, 1661398094 bases, 1055398094 kmers +read 20300000 sequences, 1672652108 bases, 1063652108 kmers +read 20400000 sequences, 1683961135 bases, 1071961135 kmers +read 20500000 sequences, 1695700838 bases, 1080700838 kmers +read 20600000 sequences, 1707448842 bases, 1089448842 kmers +read 20700000 sequences, 1719587691 bases, 1098587691 kmers +read 20800000 sequences, 1732024822 bases, 1108024822 kmers +=== step 1.1: 'encoding input' 5.94278 [sec] (5.34894 [ns/kmer]) +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max_len 176455 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.65.bin'... +=== step 1.2: 'computing minimizers tuples' 1.82301 [sec] (1.64085 [ns/kmer]) +=== step 1: 'parse file' 7.76591 [sec] (6.9899 [ns/kmer]) + == files to merge = 66 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 18.8093 [sec] (16.9298 [ns/kmer]) +num_minimizers = 174641353 +num_minimizer_positions = 240693690 +num_super_kmers = 249228267 +building minimizers MPHF with 64 threads and 59 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 7.61449 [sec] (6.85361 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 9.08502 [sec] (8.1772 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 6.07792 [sec] (5.47058 [ns/kmer]) +num_bits_per_offset = 43 +num_buckets_larger_than_1_not_in_skew_index 20680302/174641353 (11.8416%) +num_buckets_in_skew_index 18464/174641353 (0.0105725%) +max_bucket_size 37043 +log2_max_bucket_size 16 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 82592303/240693690 (34.3143%) +num_minimizer_positions_of_buckets_in_skew_index 4158800/240693690 (1.72784%) +computing minimizers offsets: 5.19724 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4817539 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2376719 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1827153 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1520019 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1265567 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 951364 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1017584 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 37043: 1228646 +num_kmers_in_skew_index 15004591 (1.35053%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4817539 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4817539 kmers; bits/key = 2.73 + built positions[0] for 4817539 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2376719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2376719)... + built mphs[1] for 2376719 kmers; bits/key = 2.55999 + built positions[1] for 2376719 kmers; bits/key = 8.00014 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1827153 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1827153)... + built mphs[2] for 1827153 kmers; bits/key = 2.56021 + built positions[2] for 1827153 kmers; bits/key = 9.0002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1520019 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1520019)... + built mphs[3] for 1520019 kmers; bits/key = 2.56043 + built positions[3] for 1520019 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1265567 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1265567)... + built mphs[4] for 1265567 kmers; bits/key = 2.56074 + built positions[4] for 1265567 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 951364 + building MPHF with 64 threads and 1 partitions (avg. partition size = 951364)... + built mphs[5] for 951364 kmers; bits/key = 2.56127 + built positions[5] for 951364 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1017584 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1017584)... + built mphs[6] for 1017584 kmers; bits/key = 2.41831 + built positions[6] for 1017584 kmers; bits/key = 13.0003 + lower = 8192; upper = 37043; num_bits_per_pos = 16; num_kmers_in_partition = 1228646 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1228646)... + built mphs[7] for 1228646 kmers; bits/key = 2.56083 + built positions[7] for 1228646 kmers; bits/key = 16.0003 +computing skew index took: 6.90364 [sec] +=== step 3: 'build sparse and skew index' 12.609 [sec] (11.3491 [ns/kmer]) +=== total_time 61.9617 [sec] (55.7701 [ns/kmer]) +total index size: 2026336026 [B] -- 2026.34 [MB] +SPACE BREAKDOWN: + mphf: 0.447872 [bits/kmer] (2.84923 [bits/key]) -- 3.06954% + strings_offsets: 0.580993 [bits/kmer] -- 3.9819% + control_codewords: 6.91637 [bits/kmer] -- 47.4022% + mid_load_buckets: 3.19659 [bits/kmer] -- 21.9082% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.32258e-05% + strings: 3.1245 [bits/kmer] -- 21.4141% + skew_index: 0.324502 [bits/kmer] -- 2.22401% + weights: 1.32491e-06 [bits/kmer] -- 9.08043e-06% + -------------- + total: 14.5908 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 88.1478% +buckets with 2 minimizer positions = 6.79213% +buckets with 3 minimizer positions = 1.92226% +buckets with 4 minimizer positions = 0.856078% +buckets with 5 minimizer positions = 0.493468% +buckets with 6 minimizer positions = 0.325915% +buckets with 7 minimizer positions = 0.234531% +buckets with 8 minimizer positions = 0.178296% +buckets with 9 minimizer positions = 0.141164% +buckets with 10 minimizer positions = 0.115104% +buckets with 11 minimizer positions = 0.0959486% +buckets with 12 minimizer positions = 0.0807615% +buckets with 13 minimizer positions = 0.0695379% +buckets with 14 minimizer positions = 0.060729% +buckets with 15 minimizer positions = 0.0531947% +buckets with 16 minimizer positions = 0.0472706% +max_bucket_size 37043 +2025-10-22 19:37:27: saving data structure to disk... +2025-10-22 19:37:28: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 100000 sequences, 8718431 bases, 5718431 kmers +read 200000 sequences, 17474097 bases, 11474097 kmers +read 300000 sequences, 26299449 bases, 17299449 kmers +read 400000 sequences, 35167130 bases, 23167130 kmers +read 500000 sequences, 43967965 bases, 28967965 kmers +read 600000 sequences, 52886445 bases, 34886445 kmers +read 700000 sequences, 61937196 bases, 40937196 kmers +read 800000 sequences, 71070714 bases, 47070714 kmers +read 900000 sequences, 80176912 bases, 53176912 kmers +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 1100000 sequences, 98984859 bases, 65984859 kmers +read 1200000 sequences, 108719881 bases, 72719881 kmers +read 1300000 sequences, 118280880 bases, 79280880 kmers +read 1400000 sequences, 127917770 bases, 85917770 kmers +read 1500000 sequences, 137591691 bases, 92591691 kmers +read 1600000 sequences, 147395215 bases, 99395215 kmers +read 1700000 sequences, 157335047 bases, 106335047 kmers +read 1800000 sequences, 167445213 bases, 113445213 kmers +read 1900000 sequences, 177725569 bases, 120725569 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 2100000 sequences, 198499534 bases, 135499534 kmers +read 2200000 sequences, 209053278 bases, 143053278 kmers +read 2300000 sequences, 219848016 bases, 150848016 kmers +read 2400000 sequences, 230787167 bases, 158787167 kmers +read 2500000 sequences, 242014409 bases, 167014409 kmers +read 2600000 sequences, 253501985 bases, 175501985 kmers +read 2700000 sequences, 265108770 bases, 184108770 kmers +read 2800000 sequences, 277040197 bases, 193040197 kmers +read 2900000 sequences, 289406751 bases, 202406751 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 3100000 sequences, 315168435 bases, 222168435 kmers +read 3200000 sequences, 329083083 bases, 233083083 kmers +read 3300000 sequences, 343508535 bases, 244508535 kmers +read 3400000 sequences, 358608045 bases, 256608045 kmers +read 3500000 sequences, 374790387 bases, 269790387 kmers +read 3600000 sequences, 392124136 bases, 284124136 kmers +read 3700000 sequences, 410698510 bases, 299698510 kmers +read 3800000 sequences, 431358064 bases, 317358064 kmers +read 3900000 sequences, 454179453 bases, 337179453 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 4100000 sequences, 468031549 bases, 345031549 kmers +read 4200000 sequences, 474889571 bases, 348889571 kmers +read 4300000 sequences, 481729708 bases, 352729708 kmers +read 4400000 sequences, 488721954 bases, 356721954 kmers +read 4500000 sequences, 495625078 bases, 360625078 kmers +read 4600000 sequences, 502596576 bases, 364596576 kmers +read 4700000 sequences, 509600517 bases, 368600517 kmers +read 4800000 sequences, 516484470 bases, 372484470 kmers +read 4900000 sequences, 523427219 bases, 376427219 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 5100000 sequences, 537329595 bases, 384329595 kmers +read 5200000 sequences, 544209359 bases, 388209359 kmers +read 5300000 sequences, 551189922 bases, 392189922 kmers +read 5400000 sequences, 558101939 bases, 396101939 kmers +read 5500000 sequences, 565120163 bases, 400120163 kmers +read 5600000 sequences, 572157570 bases, 404157570 kmers +read 5700000 sequences, 579064866 bases, 408064866 kmers +read 5800000 sequences, 586002711 bases, 412002711 kmers +read 5900000 sequences, 592940936 bases, 415940936 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 6100000 sequences, 607035798 bases, 424035798 kmers +read 6200000 sequences, 614208718 bases, 428208718 kmers +read 6300000 sequences, 621168245 bases, 432168245 kmers +read 6400000 sequences, 628072498 bases, 436072498 kmers +read 6500000 sequences, 635102614 bases, 440102614 kmers +read 6600000 sequences, 642120732 bases, 444120732 kmers +read 6700000 sequences, 649088967 bases, 448088967 kmers +read 6800000 sequences, 656101755 bases, 452101755 kmers +read 6900000 sequences, 663148884 bases, 456148884 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 7100000 sequences, 677027864 bases, 464027864 kmers +read 7200000 sequences, 684172202 bases, 468172202 kmers +read 7300000 sequences, 691211207 bases, 472211207 kmers +read 7400000 sequences, 698208790 bases, 476208790 kmers +read 7500000 sequences, 705328995 bases, 480328995 kmers +read 7600000 sequences, 712361023 bases, 484361023 kmers +read 7700000 sequences, 719471804 bases, 488471804 kmers +read 7800000 sequences, 726605138 bases, 492605138 kmers +read 7900000 sequences, 733774594 bases, 496774594 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 8100000 sequences, 747950180 bases, 504950180 kmers +read 8200000 sequences, 755058730 bases, 509058730 kmers +read 8300000 sequences, 762216427 bases, 513216427 kmers +read 8400000 sequences, 769353851 bases, 517353851 kmers +read 8500000 sequences, 776583161 bases, 521583161 kmers +read 8600000 sequences, 783816261 bases, 525816261 kmers +read 8700000 sequences, 791077370 bases, 530077370 kmers +read 8800000 sequences, 798157781 bases, 534157781 kmers +read 8900000 sequences, 805241016 bases, 538241016 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 9100000 sequences, 819617693 bases, 546617693 kmers +read 9200000 sequences, 826809772 bases, 550809772 kmers +read 9300000 sequences, 833919107 bases, 554919107 kmers +read 9400000 sequences, 841155666 bases, 559155666 kmers +read 9500000 sequences, 848401695 bases, 563401695 kmers +read 9600000 sequences, 855643716 bases, 567643716 kmers +read 9700000 sequences, 862872782 bases, 571872782 kmers +read 9800000 sequences, 870171741 bases, 576171741 kmers +read 9900000 sequences, 877460939 bases, 580460939 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 10100000 sequences, 891988915 bases, 588988915 kmers +read 10200000 sequences, 899332167 bases, 593332167 kmers +read 10300000 sequences, 906596132 bases, 597596132 kmers +read 10400000 sequences, 913914222 bases, 601914222 kmers +read 10500000 sequences, 921197164 bases, 606197164 kmers +read 10600000 sequences, 928621352 bases, 610621352 kmers +read 10700000 sequences, 935962590 bases, 614962590 kmers +read 10800000 sequences, 943225398 bases, 619225398 kmers +read 10900000 sequences, 950606271 bases, 623606271 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 11100000 sequences, 965609642 bases, 632609642 kmers +read 11200000 sequences, 972999574 bases, 636999574 kmers +read 11300000 sequences, 980385996 bases, 641385996 kmers +read 11400000 sequences, 987756692 bases, 645756692 kmers +read 11500000 sequences, 995228727 bases, 650228727 kmers +read 11600000 sequences, 1002716000 bases, 654716000 kmers +read 11700000 sequences, 1010163238 bases, 659163238 kmers +read 11800000 sequences, 1017604060 bases, 663604060 kmers +read 11900000 sequences, 1025150347 bases, 668150347 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 12100000 sequences, 1040213508 bases, 677213508 kmers +read 12200000 sequences, 1047864763 bases, 681864763 kmers +read 12300000 sequences, 1055370986 bases, 686370986 kmers +read 12400000 sequences, 1062882136 bases, 690882136 kmers +read 12500000 sequences, 1070457834 bases, 695457834 kmers +read 12600000 sequences, 1078056503 bases, 700056503 kmers +read 12700000 sequences, 1085619892 bases, 704619892 kmers +read 12800000 sequences, 1093220371 bases, 709220371 kmers +read 12900000 sequences, 1100938017 bases, 713938017 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 13100000 sequences, 1116117667 bases, 723117667 kmers +read 13200000 sequences, 1123791984 bases, 727791984 kmers +read 13300000 sequences, 1131456294 bases, 732456294 kmers +read 13400000 sequences, 1139167231 bases, 737167231 kmers +read 13500000 sequences, 1147084240 bases, 742084240 kmers +read 13600000 sequences, 1154903455 bases, 746903455 kmers +read 13700000 sequences, 1162719581 bases, 751719581 kmers +read 13800000 sequences, 1170515268 bases, 756515268 kmers +read 13900000 sequences, 1178310906 bases, 761310906 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 14100000 sequences, 1194143461 bases, 771143461 kmers +read 14200000 sequences, 1202037257 bases, 776037257 kmers +read 14300000 sequences, 1210016774 bases, 781016774 kmers +read 14400000 sequences, 1217929746 bases, 785929746 kmers +read 14500000 sequences, 1226009557 bases, 791009557 kmers +read 14600000 sequences, 1233936531 bases, 795936531 kmers +read 14700000 sequences, 1241953842 bases, 800953842 kmers +read 14800000 sequences, 1249971925 bases, 805971925 kmers +read 14900000 sequences, 1258012031 bases, 811012031 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 15100000 sequences, 1274149698 bases, 821149698 kmers +read 15200000 sequences, 1282474916 bases, 826474916 kmers +read 15300000 sequences, 1290768947 bases, 831768947 kmers +read 15400000 sequences, 1299121797 bases, 837121797 kmers +read 15500000 sequences, 1307304198 bases, 842304198 kmers +read 15600000 sequences, 1315661756 bases, 847661756 kmers +read 15700000 sequences, 1324089837 bases, 853089837 kmers +read 15800000 sequences, 1332318617 bases, 858318617 kmers +read 15900000 sequences, 1340760587 bases, 863760587 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16100000 sequences, 1357811757 bases, 874811757 kmers +read 16200000 sequences, 1366358226 bases, 880358226 kmers +read 16300000 sequences, 1375027036 bases, 886027036 kmers +read 16400000 sequences, 1383710258 bases, 891710258 kmers +=== step 1.1: 'encoding input' 4.66664 [sec] (5.21815 [ns/kmer]) +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max_len 117016 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.49449 [sec] (1.67112 [ns/kmer]) +=== step 1: 'parse file' 6.16124 [sec] (6.88938 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 14.9847 [sec] (16.7556 [ns/kmer]) +num_minimizers = 143418843 +num_minimizer_positions = 193511241 +num_super_kmers = 200364919 +building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.30493 [sec] (7.05005 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.40292 [sec] (8.27781 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.95714 [sec] (4.4248 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 18123968/143418843 (12.6371%) +num_buckets_in_skew_index 15172/143418843 (0.0105788%) +max_bucket_size 30655 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 65664193/193511241 (33.933%) +num_minimizer_positions_of_buckets_in_skew_index 2567345/193511241 (1.32672%) +computing minimizers offsets: 4.31495 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4240400 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1914946 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1106165 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 771672 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 562721 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 475654 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 388509 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 30655: 459571 +num_kmers_in_skew_index 9919638 (1.10919%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4240400 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4240400 kmers; bits/key = 2.84282 + built positions[0] for 4240400 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1914946 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1914946)... + built mphs[1] for 1914946 kmers; bits/key = 2.56017 + built positions[1] for 1914946 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1106165 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1106165)... + built mphs[2] for 1106165 kmers; bits/key = 2.56093 + built positions[2] for 1106165 kmers; bits/key = 9.00032 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 771672 + building MPHF with 64 threads and 1 partitions (avg. partition size = 771672)... + built mphs[3] for 771672 kmers; bits/key = 2.41893 + built positions[3] for 771672 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 562721 + building MPHF with 64 threads and 1 partitions (avg. partition size = 562721)... + built mphs[4] for 562721 kmers; bits/key = 2.56295 + built positions[4] for 562721 kmers; bits/key = 11.0006 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 475654 + building MPHF with 64 threads and 1 partitions (avg. partition size = 475654)... + built mphs[5] for 475654 kmers; bits/key = 2.56365 + built positions[5] for 475654 kmers; bits/key = 12.0008 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 388509 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388509)... + built mphs[6] for 388509 kmers; bits/key = 2.42185 + built positions[6] for 388509 kmers; bits/key = 13.0008 + lower = 8192; upper = 30655; num_bits_per_pos = 15; num_kmers_in_partition = 459571 + building MPHF with 64 threads and 1 partitions (avg. partition size = 459571)... + built mphs[7] for 459571 kmers; bits/key = 2.4208 + built positions[7] for 459571 kmers; bits/key = 15.0007 +computing skew index took: 4.06247 [sec] +=== step 3: 'build sparse and skew index' 8.76323 [sec] (9.79887 [ns/kmer]) +=== total_time 47.5741 [sec] (53.1965 [ns/kmer]) +total index size: 1578012598 [B] -- 1578.01 [MB] +SPACE BREAKDOWN: + mphf: 0.453288 [bits/kmer] (2.82655 [bits/key]) -- 3.21116% + strings_offsets: 0.5699 [bits/kmer] -- 4.03726% + control_codewords: 6.73546 [bits/kmer] -- 47.715% + mid_load_buckets: 3.0104 [bits/kmer] -- 21.3261% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 1.69834e-05% + strings: 3.10303 [bits/kmer] -- 21.9823% + skew_index: 0.243934 [bits/kmer] -- 1.72807% + weights: 1.64596e-06 [bits/kmer] -- 1.16602e-05% + -------------- + total: 14.116 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 87.3523% +buckets with 2 minimizer positions = 7.4877% +buckets with 3 minimizer positions = 2.14684% +buckets with 4 minimizer positions = 0.927917% +buckets with 5 minimizer positions = 0.508829% +buckets with 6 minimizer positions = 0.320607% +buckets with 7 minimizer positions = 0.221914% +buckets with 8 minimizer positions = 0.16449% +buckets with 9 minimizer positions = 0.128547% +buckets with 10 minimizer positions = 0.104586% +buckets with 11 minimizer positions = 0.0865967% +buckets with 12 minimizer positions = 0.0732902% +buckets with 13 minimizer positions = 0.062991% +buckets with 14 minimizer positions = 0.0543541% +buckets with 15 minimizer positions = 0.0475495% +buckets with 16 minimizer positions = 0.0409653% +max_bucket_size 30655 +2025-10-22 19:38:17: saving data structure to disk... +2025-10-22 19:38:17: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log b/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log new file mode 100644 index 0000000..5d7185b --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 637.172 +avg_nanosec_per_negative_lookup 808.384 +avg_nanosec_per_access 257.917 +iterator: avg_nanosec_per_kmer 2.63495 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 651.837 +avg_nanosec_per_negative_lookup 791.604 +avg_nanosec_per_access 247.392 +iterator: avg_nanosec_per_kmer 2.57436 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 674.085 +avg_nanosec_per_negative_lookup 818.888 +avg_nanosec_per_access 241.841 +iterator: avg_nanosec_per_kmer 2.52253 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 628.412 +avg_nanosec_per_negative_lookup 813.347 +avg_nanosec_per_access 225.477 +iterator: avg_nanosec_per_kmer 2.6821 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 612.56 +avg_nanosec_per_negative_lookup 799.281 +avg_nanosec_per_access 233.08 +iterator: avg_nanosec_per_kmer 2.51182 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 628.923 +avg_nanosec_per_negative_lookup 808.612 +avg_nanosec_per_access 223.195 +iterator: avg_nanosec_per_kmer 2.51995 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 883.91 +avg_nanosec_per_negative_lookup 1063.57 +avg_nanosec_per_access 345.899 +iterator: avg_nanosec_per_kmer 2.5201 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 878.852 +avg_nanosec_per_negative_lookup 1068.28 +avg_nanosec_per_access 374.985 +iterator: avg_nanosec_per_kmer 2.66045 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 879.735 +avg_nanosec_per_negative_lookup 1071.35 +avg_nanosec_per_access 360.997 +iterator: avg_nanosec_per_kmer 2.55874 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1024.87 +avg_nanosec_per_negative_lookup 1160.68 +avg_nanosec_per_access 566.086 +iterator: avg_nanosec_per_kmer 2.49651 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1019.8 +avg_nanosec_per_negative_lookup 1182.6 +avg_nanosec_per_access 536.878 +iterator: avg_nanosec_per_kmer 2.4974 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1041.95 +avg_nanosec_per_negative_lookup 1445.91 +avg_nanosec_per_access 701.872 +iterator: avg_nanosec_per_kmer 2.53857 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 1106.41 +avg_nanosec_per_negative_lookup 1180.46 +avg_nanosec_per_access 536.742 +iterator: avg_nanosec_per_kmer 2.5207 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 1008.41 +avg_nanosec_per_negative_lookup 1031.6 +avg_nanosec_per_access 428.146 +iterator: avg_nanosec_per_kmer 2.54727 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 964.208 +avg_nanosec_per_negative_lookup 1038.54 +avg_nanosec_per_access 458.887 +iterator: avg_nanosec_per_kmer 2.61802 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 931.219 +avg_nanosec_per_negative_lookup 1024.01 +avg_nanosec_per_access 435.612 +iterator: avg_nanosec_per_kmer 2.52558 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 922.35 +avg_nanosec_per_negative_lookup 1020.25 +avg_nanosec_per_access 419.456 +iterator: avg_nanosec_per_kmer 2.51027 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 925.126 +avg_nanosec_per_negative_lookup 1043.39 +avg_nanosec_per_access 408.153 +iterator: avg_nanosec_per_kmer 2.6008 diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log b/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log new file mode 100644 index 0000000..9f4e60d --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log @@ -0,0 +1,2206 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.5564 [sec] (3.09753 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.576843 [sec] (1.14803 [ns/kmer]) +=== step 1: 'parse file' 2.13334 [sec] (4.24574 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.76784 [sec] (11.4791 [ns/kmer]) +num_minimizers = 72381146 +num_minimizer_positions = 78455681 +num_super_kmers = 78455681 +building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.24653 [sec] (6.46121 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.95991 [sec] (5.89078 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.10475 [sec] (2.19865 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) +num_buckets_in_skew_index 4215/72381146 (0.00582334%) +max_bucket_size 70346 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) +num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) +computing minimizers offsets: 0.876075 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 +num_kmers_in_skew_index 4740893 (0.943527%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... + built mphs[0] for 1260546 kmers; bits/key = 2.56076 + built positions[0] for 1260546 kmers; bits/key = 7.00029 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 + building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... + built mphs[1] for 994175 kmers; bits/key = 2.41831 + built positions[1] for 994175 kmers; bits/key = 8.00033 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... + built mphs[2] for 665719 kmers; bits/key = 2.41938 + built positions[2] for 665719 kmers; bits/key = 9.00051 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 + building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... + built mphs[3] for 408608 kmers; bits/key = 2.42149 + built positions[3] for 408608 kmers; bits/key = 10.0008 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 + building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... + built mphs[4] for 423234 kmers; bits/key = 2.56407 + built positions[4] for 423234 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 + building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... + built mphs[5] for 271419 kmers; bits/key = 2.42412 + built positions[5] for 271419 kmers; bits/key = 12.0014 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 + building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... + built mphs[6] for 288814 kmers; bits/key = 2.42387 + built positions[6] for 288814 kmers; bits/key = 13.0013 + lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 + building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... + built mphs[7] for 428378 kmers; bits/key = 2.56398 + built positions[7] for 428378 kmers; bits/key = 17.0008 +computing skew index took: 2.69504 [sec] +=== step 3: 'build sparse and skew index' 3.68623 [sec] (7.3363 [ns/kmer]) +=== total_time 18.8986 [sec] (37.6118 [ns/kmer]) +total index size: 554516156 [B] -- 554.516 [MB] +SPACE BREAKDOWN: + mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 4.73772% + strings_offsets: 0.12283 [bits/kmer] -- 1.39125% + control_codewords: 5.32993 [bits/kmer] -- 60.3703% + mid_load_buckets: 0.527143 [bits/kmer] -- 5.97077% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.83304e-05% + strings: 2.24566 [bits/kmer] -- 25.4358% + skew_index: 0.184883 [bits/kmer] -- 2.09411% + weights: 2.92956e-06 [bits/kmer] -- 3.31821e-05% + -------------- + total: 8.82873 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.8721% +buckets with 2 minimizer positions = 2.00417% +buckets with 3 minimizer positions = 0.51765% +buckets with 4 minimizer positions = 0.211311% +buckets with 5 minimizer positions = 0.109826% +buckets with 6 minimizer positions = 0.0661802% +buckets with 7 minimizer positions = 0.0437061% +buckets with 8 minimizer positions = 0.0308464% +buckets with 9 minimizer positions = 0.0235614% +buckets with 10 minimizer positions = 0.0177228% +buckets with 11 minimizer positions = 0.0139967% +buckets with 12 minimizer positions = 0.0112902% +buckets with 13 minimizer positions = 0.00931044% +buckets with 14 minimizer positions = 0.00771748% +buckets with 15 minimizer positions = 0.00632347% +buckets with 16 minimizer positions = 0.00528591% +max_bucket_size 70346 +2025-10-22 19:21:45: saving data structure to disk... +2025-10-22 19:21:45: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.75719 [sec] (2.39673 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.10745 [sec] (0.962663 [ns/kmer]) +=== step 1: 'parse file' 3.86477 [sec] (3.3595 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.7274 [sec] (11.0635 [ns/kmer]) +num_minimizers = 173258591 +num_minimizer_positions = 175959772 +num_super_kmers = 175959772 +building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 7.07968 [sec] (6.15411 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.53208 [sec] (5.6781 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.60795 [sec] (2.26699 [ns/kmer]) +num_bits_per_offset = 37 +num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) +num_buckets_in_skew_index 1541/173258591 (0.000889422%) +max_bucket_size 3747 +log2_max_bucket_size 12 +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) +num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) +computing minimizers offsets: 1.38139 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 +num_kmers_in_skew_index 1185367 (0.10304%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 + building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... + built mphs[0] for 559507 kmers; bits/key = 2.41999 + built positions[0] for 559507 kmers; bits/key = 7.00068 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 + building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... + built mphs[1] for 317132 kmers; bits/key = 2.42276 + built positions[1] for 317132 kmers; bits/key = 8.00111 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 + building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... + built mphs[2] for 144139 kmers; bits/key = 2.43099 + built positions[2] for 144139 kmers; bits/key = 9.00242 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... + built mphs[3] for 106543 kmers; bits/key = 2.43597 + built positions[3] for 106543 kmers; bits/key = 10.0034 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 + building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... + built mphs[4] for 21308 kmers; bits/key = 2.51323 + built positions[4] for 21308 kmers; bits/key = 11.0171 + lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 + building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... + built mphs[5] for 36738 kmers; bits/key = 2.4746 + built positions[5] for 36738 kmers; bits/key = 12.0098 +computing skew index took: 0.673315 [sec] +=== step 3: 'build sparse and skew index' 2.32917 [sec] (2.02466 [ns/kmer]) +=== total_time 35.1411 [sec] (30.5469 [ns/kmer]) +total index size: 1198623216 [B] -- 1198.62 [MB] +SPACE BREAKDOWN: + mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.11439% + strings_offsets: 0.0157068 [bits/kmer] -- 0.188436% + control_codewords: 5.72308 [bits/kmer] -- 68.6603% + mid_load_buckets: 0.12243 [bits/kmer] -- 1.46881% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.2359e-05% + strings: 2.0304 [bits/kmer] -- 24.3589% + skew_index: 0.0174324 [bits/kmer] -- 0.209139% + weights: 1.27956e-06 [bits/kmer] -- 1.53509e-05% + -------------- + total: 8.33535 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.2421% +buckets with 2 minimizer positions = 0.571193% +buckets with 3 minimizer positions = 0.0840564% +buckets with 4 minimizer positions = 0.0345576% +buckets with 5 minimizer positions = 0.0184735% +buckets with 6 minimizer positions = 0.011514% +buckets with 7 minimizer positions = 0.00772718% +buckets with 8 minimizer positions = 0.00537809% +buckets with 9 minimizer positions = 0.00392246% +buckets with 10 minimizer positions = 0.00304862% +buckets with 11 minimizer positions = 0.00236583% +buckets with 12 minimizer positions = 0.0019139% +buckets with 13 minimizer positions = 0.00156356% +buckets with 14 minimizer positions = 0.00127613% +buckets with 15 minimizer positions = 0.00105276% +buckets with 16 minimizer positions = 0.000939636% +max_bucket_size 3747 +2025-10-22 19:22:21: saving data structure to disk... +2025-10-22 19:22:22: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.3917 [sec] (2.94998 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.72.bin'... +=== step 1.2: 'computing minimizers tuples' 2.56915 [sec] (1.02533 [ns/kmer]) +=== step 1: 'parse file' 9.96098 [sec] (3.97536 [ns/kmer]) + == files to merge = 73 +saving tuples to 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 35.4864 [sec] (14.1624 [ns/kmer]) +num_minimizers = 386687326 +num_minimizer_positions = 423023926 +num_super_kmers = 423023926 +building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 16.8163 [sec] (6.71127 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 15.7663 [sec] (6.29222 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 7.98796 [sec] (3.18794 [ns/kmer]) +num_bits_per_offset = 40 +num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) +num_buckets_in_skew_index 42372/386687326 (0.0109577%) +max_bucket_size 22972 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) +num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) +computing minimizers offsets: 4.78595 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 +num_kmers_in_skew_index 32063746 (1.27964%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11807213 kmers; bits/key = 2.55841 + built positions[0] for 11807213 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8389556 kmers; bits/key = 2.61352 + built positions[1] for 8389556 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5343660 kmers; bits/key = 2.66261 + built positions[2] for 5343660 kmers; bits/key = 9.00007 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3076413 kmers; bits/key = 3.34298 + built positions[3] for 3076413 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... + built mphs[4] for 1855446 kmers; bits/key = 2.56022 + built positions[4] for 1855446 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... + built mphs[5] for 1008178 kmers; bits/key = 2.41829 + built positions[5] for 1008178 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... + built mphs[6] for 375770 kmers; bits/key = 2.42182 + built positions[6] for 375770 kmers; bits/key = 13.001 + lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 + building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... + built mphs[7] for 207510 kmers; bits/key = 2.42618 + built positions[7] for 207510 kmers; bits/key = 15.0018 +computing skew index took: 7.73771 [sec] +=== step 3: 'build sparse and skew index' 13.2397 [sec] (5.28388 [ns/kmer]) +=== total_time 99.2577 [sec] (39.6131 [ns/kmer]) +total index size: 3142971190 [B] -- 3142.97 [MB] +SPACE BREAKDOWN: + mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 4.3469% + strings_offsets: 0.130909 [bits/kmer] -- 1.30456% + control_codewords: 6.3273 [bits/kmer] -- 63.0541% + mid_load_buckets: 0.645302 [bits/kmer] -- 6.4307% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.52696e-06% + strings: 2.24545 [bits/kmer] -- 22.3769% + skew_index: 0.24955 [bits/kmer] -- 2.48686% + weights: 5.87466e-07 [bits/kmer] -- 5.85433e-06% + -------------- + total: 10.0347 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1918% +buckets with 2 minimizer positions = 1.69205% +buckets with 3 minimizer positions = 0.442612% +buckets with 4 minimizer positions = 0.201662% +buckets with 5 minimizer positions = 0.114623% +buckets with 6 minimizer positions = 0.0734475% +buckets with 7 minimizer positions = 0.0506719% +buckets with 8 minimizer positions = 0.0368406% +buckets with 9 minimizer positions = 0.0280203% +buckets with 10 minimizer positions = 0.0218197% +buckets with 11 minimizer positions = 0.0175108% +buckets with 12 minimizer positions = 0.0142045% +buckets with 13 minimizer positions = 0.0116337% +buckets with 14 minimizer positions = 0.00980818% +buckets with 15 minimizer positions = 0.00832637% +buckets with 16 minimizer positions = 0.00717712% +max_bucket_size 22972 +2025-10-22 19:24:03: saving data structure to disk... +2025-10-22 19:24:04: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.3328 [sec] (4.6617 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.113.bin'... +=== step 1.2: 'computing minimizers tuples' 6.7409 [sec] (1.81299 [ns/kmer]) +=== step 1: 'parse file' 24.0738 [sec] (6.47472 [ns/kmer]) + == files to merge = 114 +saving tuples to 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.1: 'merging minimizers tuples' 53.8141 [sec] (14.4735 [ns/kmer]) +num_minimizers = 544808214 +num_minimizer_positions = 661139039 +num_super_kmers = 661139039 +building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 22.2734 [sec] (5.99051 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 23.6036 [sec] (6.34826 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.4: 'merging minimizers tuples ' 34.5282 [sec] (9.28647 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) +num_buckets_in_skew_index 108291/544808214 (0.0198769%) +max_bucket_size 81171 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) +num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) +computing minimizers offsets: 11.2575 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 +num_kmers_in_skew_index 88257432 (2.37371%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28872109 kmers; bits/key = 2.53953 + built positions[0] for 28872109 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21161002 kmers; bits/key = 2.665 + built positions[1] for 21161002 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 14619521 kmers; bits/key = 2.58618 + built positions[2] for 14619521 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 8967010 kmers; bits/key = 2.51981 + built positions[3] for 8967010 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 5825185 kmers; bits/key = 2.55049 + built positions[4] for 5825185 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3889571 kmers; bits/key = 2.9515 + built positions[5] for 3889571 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... + built mphs[6] for 2412718 kmers; bits/key = 2.41709 + built positions[6] for 2412718 kmers; bits/key = 13.0002 + lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... + built mphs[7] for 2510316 kmers; bits/key = 2.55991 + built positions[7] for 2510316 kmers; bits/key = 17.0001 +computing skew index took: 17.0783 [sec] +=== step 3: 'build sparse and skew index' 29.6542 [sec] (7.97558 [ns/kmer]) +=== total_time 187.947 [sec] (50.549 [ns/kmer]) +total index size: 5611961302 [B] -- 5611.96 [MB] +SPACE BREAKDOWN: + mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 3.4406% + strings_offsets: 0.489994 [bits/kmer] -- 4.05798% + control_codewords: 6.15417 [bits/kmer] -- 50.9669% + mid_load_buckets: 1.64366 [bits/kmer] -- 13.6123% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.77551e-06% + strings: 2.8909 [bits/kmer] -- 23.9415% + skew_index: 0.480662 [bits/kmer] -- 3.98069% + weights: 3.95899e-07 [bits/kmer] -- 3.27871e-06% + -------------- + total: 12.0748 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 90.4966% +buckets with 2 minimizer positions = 7.33042% +buckets with 3 minimizer positions = 1.04104% +buckets with 4 minimizer positions = 0.358078% +buckets with 5 minimizer positions = 0.190444% +buckets with 6 minimizer positions = 0.119606% +buckets with 7 minimizer positions = 0.0815559% +buckets with 8 minimizer positions = 0.059031% +buckets with 9 minimizer positions = 0.0448457% +buckets with 10 minimizer positions = 0.0349758% +buckets with 11 minimizer positions = 0.0279273% +buckets with 12 minimizer positions = 0.022929% +buckets with 13 minimizer positions = 0.0189582% +buckets with 14 minimizer positions = 0.0159649% +buckets with 15 minimizer positions = 0.0135407% +buckets with 16 minimizer positions = 0.0117506% +max_bucket_size 81171 +2025-10-22 19:27:15: saving data structure to disk... +2025-10-22 19:27:17: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 100000 sequences, 12802319 bases, 9802319 kmers +read 200000 sequences, 26155680 bases, 20155680 kmers +read 300000 sequences, 39727315 bases, 30727315 kmers +read 400000 sequences, 53567543 bases, 41567543 kmers +read 500000 sequences, 68009750 bases, 53009750 kmers +read 600000 sequences, 83050731 bases, 65050731 kmers +read 700000 sequences, 98819486 bases, 77819486 kmers +read 800000 sequences, 116043186 bases, 92043186 kmers +read 900000 sequences, 134201454 bases, 107201454 kmers +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 1100000 sequences, 174787795 bases, 141787795 kmers +read 1200000 sequences, 183806919 bases, 147806919 kmers +read 1300000 sequences, 190658371 bases, 151658371 kmers +read 1400000 sequences, 197393762 bases, 155393762 kmers +read 1500000 sequences, 204308958 bases, 159308958 kmers +read 1600000 sequences, 211178004 bases, 163178004 kmers +read 1700000 sequences, 217938129 bases, 166938129 kmers +read 1800000 sequences, 224728931 bases, 170728931 kmers +read 1900000 sequences, 231435055 bases, 174435055 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 2100000 sequences, 245162304 bases, 182162304 kmers +read 2200000 sequences, 251968534 bases, 185968534 kmers +read 2300000 sequences, 258797784 bases, 189797784 kmers +read 2400000 sequences, 265681419 bases, 193681419 kmers +read 2500000 sequences, 272480771 bases, 197480771 kmers +read 2600000 sequences, 279327274 bases, 201327274 kmers +read 2700000 sequences, 286169897 bases, 205169897 kmers +read 2800000 sequences, 293063897 bases, 209063897 kmers +read 2900000 sequences, 299941531 bases, 212941531 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 3100000 sequences, 313725925 bases, 220725925 kmers +read 3200000 sequences, 320629887 bases, 224629887 kmers +read 3300000 sequences, 327545193 bases, 228545193 kmers +read 3400000 sequences, 334471610 bases, 232471610 kmers +read 3500000 sequences, 341603766 bases, 236603766 kmers +read 3600000 sequences, 348399690 bases, 240399690 kmers +read 3700000 sequences, 355270676 bases, 244270676 kmers +read 3800000 sequences, 362436143 bases, 248436143 kmers +read 3900000 sequences, 369341114 bases, 252341114 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 4100000 sequences, 383163199 bases, 260163199 kmers +read 4200000 sequences, 390047987 bases, 264047987 kmers +read 4300000 sequences, 396880438 bases, 267880438 kmers +read 4400000 sequences, 403776565 bases, 271776565 kmers +read 4500000 sequences, 410576367 bases, 275576367 kmers +read 4600000 sequences, 417377049 bases, 279377049 kmers +read 4700000 sequences, 424274495 bases, 283274495 kmers +read 4800000 sequences, 431192311 bases, 287192311 kmers +read 4900000 sequences, 438257785 bases, 291257785 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 5100000 sequences, 452307732 bases, 299307732 kmers +read 5200000 sequences, 459344438 bases, 303344438 kmers +read 5300000 sequences, 466255981 bases, 307255981 kmers +read 5400000 sequences, 473220156 bases, 311220156 kmers +read 5500000 sequences, 480178864 bases, 315178864 kmers +read 5600000 sequences, 487198091 bases, 319198091 kmers +read 5700000 sequences, 494051268 bases, 323051268 kmers +read 5800000 sequences, 501294774 bases, 327294774 kmers +read 5900000 sequences, 508386191 bases, 331386191 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 6100000 sequences, 522265327 bases, 339265327 kmers +read 6200000 sequences, 529435219 bases, 343435219 kmers +read 6300000 sequences, 536513892 bases, 347513892 kmers +read 6400000 sequences, 543669227 bases, 351669227 kmers +read 6500000 sequences, 550654427 bases, 355654427 kmers +read 6600000 sequences, 557665979 bases, 359665979 kmers +read 6700000 sequences, 564815722 bases, 363815722 kmers +read 6800000 sequences, 571787007 bases, 367787007 kmers +read 6900000 sequences, 578923485 bases, 371923485 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 7100000 sequences, 593247546 bases, 380247546 kmers +read 7200000 sequences, 600225954 bases, 384225954 kmers +read 7300000 sequences, 607331027 bases, 388331027 kmers +read 7400000 sequences, 614417238 bases, 392417238 kmers +read 7500000 sequences, 621494916 bases, 396494916 kmers +read 7600000 sequences, 628713296 bases, 400713296 kmers +read 7700000 sequences, 635875916 bases, 404875916 kmers +read 7800000 sequences, 643000132 bases, 409000132 kmers +read 7900000 sequences, 650054935 bases, 413054935 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 8100000 sequences, 664392690 bases, 421392690 kmers +read 8200000 sequences, 671575430 bases, 425575430 kmers +read 8300000 sequences, 678822397 bases, 429822397 kmers +read 8400000 sequences, 685932522 bases, 433932522 kmers +read 8500000 sequences, 693003257 bases, 438003257 kmers +read 8600000 sequences, 700264806 bases, 442264806 kmers +read 8700000 sequences, 707441916 bases, 446441916 kmers +read 8800000 sequences, 714783716 bases, 450783716 kmers +read 8900000 sequences, 722048687 bases, 455048687 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 9100000 sequences, 736820834 bases, 463820834 kmers +read 9200000 sequences, 744240551 bases, 468240551 kmers +read 9300000 sequences, 751532385 bases, 472532385 kmers +read 9400000 sequences, 758908308 bases, 476908308 kmers +read 9500000 sequences, 766152765 bases, 481152765 kmers +read 9600000 sequences, 773460104 bases, 485460104 kmers +read 9700000 sequences, 780744999 bases, 489744999 kmers +read 9800000 sequences, 788046688 bases, 494046688 kmers +read 9900000 sequences, 795444088 bases, 498444088 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 10100000 sequences, 810379702 bases, 507379702 kmers +read 10200000 sequences, 817713311 bases, 511713311 kmers +read 10300000 sequences, 825011133 bases, 516011133 kmers +read 10400000 sequences, 832292513 bases, 520292513 kmers +read 10500000 sequences, 839612784 bases, 524612784 kmers +read 10600000 sequences, 847027439 bases, 529027439 kmers +read 10700000 sequences, 854363725 bases, 533363725 kmers +read 10800000 sequences, 861721984 bases, 537721984 kmers +read 10900000 sequences, 869045250 bases, 542045250 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 11100000 sequences, 883866002 bases, 550866002 kmers +read 11200000 sequences, 891340279 bases, 555340279 kmers +read 11300000 sequences, 899036889 bases, 560036889 kmers +read 11400000 sequences, 906434241 bases, 564434241 kmers +read 11500000 sequences, 913824257 bases, 568824257 kmers +read 11600000 sequences, 921342281 bases, 573342281 kmers +read 11700000 sequences, 928719144 bases, 577719144 kmers +read 11800000 sequences, 936164765 bases, 582164765 kmers +read 11900000 sequences, 943653758 bases, 586653758 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 12100000 sequences, 958744772 bases, 595744772 kmers +read 12200000 sequences, 966275858 bases, 600275858 kmers +read 12300000 sequences, 973962686 bases, 604962686 kmers +read 12400000 sequences, 981647965 bases, 609647965 kmers +read 12500000 sequences, 989234531 bases, 614234531 kmers +read 12600000 sequences, 996919849 bases, 618919849 kmers +read 12700000 sequences, 1004488446 bases, 623488446 kmers +read 12800000 sequences, 1012083435 bases, 628083435 kmers +read 12900000 sequences, 1019844583 bases, 632844583 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 13100000 sequences, 1035458430 bases, 642458430 kmers +read 13200000 sequences, 1043299596 bases, 647299596 kmers +read 13300000 sequences, 1051100294 bases, 652100294 kmers +read 13400000 sequences, 1058940054 bases, 656940054 kmers +read 13500000 sequences, 1066735225 bases, 661735225 kmers +read 13600000 sequences, 1074662997 bases, 666662997 kmers +read 13700000 sequences, 1082381283 bases, 671381283 kmers +read 13800000 sequences, 1090055507 bases, 676055507 kmers +read 13900000 sequences, 1097835965 bases, 680835965 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 14100000 sequences, 1113495622 bases, 690495622 kmers +read 14200000 sequences, 1121380038 bases, 695380038 kmers +read 14300000 sequences, 1129522879 bases, 700522879 kmers +read 14400000 sequences, 1137515487 bases, 705515487 kmers +read 14500000 sequences, 1145547633 bases, 710547633 kmers +read 14600000 sequences, 1153636718 bases, 715636718 kmers +read 14700000 sequences, 1161507672 bases, 720507672 kmers +read 14800000 sequences, 1169638977 bases, 725638977 kmers +read 14900000 sequences, 1177765602 bases, 730765602 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 15100000 sequences, 1193966066 bases, 740966066 kmers +read 15200000 sequences, 1201992531 bases, 745992531 kmers +read 15300000 sequences, 1210139564 bases, 751139564 kmers +read 15400000 sequences, 1218303770 bases, 756303770 kmers +read 15500000 sequences, 1226563924 bases, 761563924 kmers +read 15600000 sequences, 1234769102 bases, 766769102 kmers +read 15700000 sequences, 1243038710 bases, 772038710 kmers +read 15800000 sequences, 1251312331 bases, 777312331 kmers +read 15900000 sequences, 1259505857 bases, 782505857 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 16100000 sequences, 1276258510 bases, 793258510 kmers +read 16200000 sequences, 1284600618 bases, 798600618 kmers +read 16300000 sequences, 1292910529 bases, 803910529 kmers +read 16400000 sequences, 1301315569 bases, 809315569 kmers +read 16500000 sequences, 1309948482 bases, 814948482 kmers +read 16600000 sequences, 1318536932 bases, 820536932 kmers +read 16700000 sequences, 1326901868 bases, 825901868 kmers +read 16800000 sequences, 1335658656 bases, 831658656 kmers +read 16900000 sequences, 1344318999 bases, 837318999 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 17100000 sequences, 1361738649 bases, 848738649 kmers +read 17200000 sequences, 1370441463 bases, 854441463 kmers +read 17300000 sequences, 1379104762 bases, 860104762 kmers +read 17400000 sequences, 1387857799 bases, 865857799 kmers +read 17500000 sequences, 1396827318 bases, 871827318 kmers +read 17600000 sequences, 1405624638 bases, 877624638 kmers +read 17700000 sequences, 1414580410 bases, 883580410 kmers +read 17800000 sequences, 1423596393 bases, 889596393 kmers +read 17900000 sequences, 1432608671 bases, 895608671 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 18100000 sequences, 1451131708 bases, 908131708 kmers +read 18200000 sequences, 1460386801 bases, 914386801 kmers +read 18300000 sequences, 1469583369 bases, 920583369 kmers +read 18400000 sequences, 1478759459 bases, 926759459 kmers +read 18500000 sequences, 1488122391 bases, 933122391 kmers +read 18600000 sequences, 1497569745 bases, 939569745 kmers +read 18700000 sequences, 1507030485 bases, 946030485 kmers +read 18800000 sequences, 1516707149 bases, 952707149 kmers +read 18900000 sequences, 1526397934 bases, 959397934 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 19100000 sequences, 1546342668 bases, 973342668 kmers +read 19200000 sequences, 1556281669 bases, 980281669 kmers +read 19300000 sequences, 1566271275 bases, 987271275 kmers +read 19400000 sequences, 1576402796 bases, 994402796 kmers +read 19500000 sequences, 1586440957 bases, 1001440957 kmers +read 19600000 sequences, 1596689344 bases, 1008689344 kmers +read 19700000 sequences, 1607088748 bases, 1016088748 kmers +read 19800000 sequences, 1617543387 bases, 1023543387 kmers +read 19900000 sequences, 1628261415 bases, 1031261415 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20100000 sequences, 1650338356 bases, 1047338356 kmers +read 20200000 sequences, 1661398094 bases, 1055398094 kmers +read 20300000 sequences, 1672652108 bases, 1063652108 kmers +read 20400000 sequences, 1683961135 bases, 1071961135 kmers +read 20500000 sequences, 1695700838 bases, 1080700838 kmers +read 20600000 sequences, 1707448842 bases, 1089448842 kmers +read 20700000 sequences, 1719587691 bases, 1098587691 kmers +read 20800000 sequences, 1732024822 bases, 1108024822 kmers +=== step 1.1: 'encoding input' 5.89154 [sec] (5.30282 [ns/kmer]) +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max_len 176455 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.35085 [sec] (1.21586 [ns/kmer]) +=== step 1: 'parse file' 7.2425 [sec] (6.51879 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 15.4965 [sec] (13.948 [ns/kmer]) +num_minimizers = 153003346 +num_minimizer_positions = 201447538 +num_super_kmers = 201447538 +building minimizers MPHF with 64 threads and 52 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.64158 [sec] (5.97792 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.42931 [sec] (6.68693 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.34967 [sec] (3.01496 [ns/kmer]) +num_bits_per_offset = 43 +num_buckets_larger_than_1_not_in_skew_index 16447921/153003346 (10.75%) +num_buckets_in_skew_index 10727/153003346 (0.00701096%) +max_bucket_size 71743 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 61815481/201447538 (30.6856%) +num_minimizer_positions_of_buckets_in_skew_index 3087359/201447538 (1.53259%) +computing minimizers offsets: 4.08541 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2530324 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1770374 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1563484 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1214204 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1091924 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1055593 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 789627 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71743: 1030596 +num_kmers_in_skew_index 11046126 (0.994234%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2530324 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2530324)... + built mphs[0] for 2530324 kmers; bits/key = 2.5599 + built positions[0] for 2530324 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1770374 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1770374)... + built mphs[1] for 1770374 kmers; bits/key = 2.56029 + built positions[1] for 1770374 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1563484 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1563484)... + built mphs[2] for 1563484 kmers; bits/key = 2.56038 + built positions[2] for 1563484 kmers; bits/key = 9.00021 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1214204 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1214204)... + built mphs[3] for 1214204 kmers; bits/key = 2.56081 + built positions[3] for 1214204 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1091924 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1091924)... + built mphs[4] for 1091924 kmers; bits/key = 2.4182 + built positions[4] for 1091924 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1055593 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1055593)... + built mphs[5] for 1055593 kmers; bits/key = 2.56108 + built positions[5] for 1055593 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 789627 + building MPHF with 64 threads and 1 partitions (avg. partition size = 789627)... + built mphs[6] for 789627 kmers; bits/key = 2.41888 + built positions[6] for 789627 kmers; bits/key = 13.0004 + lower = 8192; upper = 71743; num_bits_per_pos = 17; num_kmers_in_partition = 1030596 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1030596)... + built mphs[7] for 1030596 kmers; bits/key = 2.4183 + built positions[7] for 1030596 kmers; bits/key = 17.0004 +computing skew index took: 6.40632 [sec] +=== step 3: 'build sparse and skew index' 10.8952 [sec] (9.80652 [ns/kmer]) +=== total_time 51.0548 [sec] (45.9531 [ns/kmer]) +total index size: 1777130884 [B] -- 1777.13 [MB] +SPACE BREAKDOWN: + mphf: 0.394931 [bits/kmer] (2.86775 [bits/key]) -- 3.08626% + strings_offsets: 0.580993 [bits/kmer] -- 4.54028% + control_codewords: 6.05944 [bits/kmer] -- 47.3526% + mid_load_buckets: 2.39246 [bits/kmer] -- 18.6963% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.50805e-05% + strings: 3.1245 [bits/kmer] -- 24.417% + skew_index: 0.244083 [bits/kmer] -- 1.90743% + weights: 1.32491e-06 [bits/kmer] -- 1.03538e-05% + -------------- + total: 12.7964 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 89.2429% +buckets with 2 minimizer positions = 6.05035% +buckets with 3 minimizer positions = 1.71539% +buckets with 4 minimizer positions = 0.818195% +buckets with 5 minimizer positions = 0.497438% +buckets with 6 minimizer positions = 0.343779% +buckets with 7 minimizer positions = 0.255749% +buckets with 8 minimizer positions = 0.199702% +buckets with 9 minimizer positions = 0.159387% +buckets with 10 minimizer positions = 0.13028% +buckets with 11 minimizer positions = 0.107217% +buckets with 12 minimizer positions = 0.0878229% +buckets with 13 minimizer positions = 0.0717429% +buckets with 14 minimizer positions = 0.0589601% +buckets with 15 minimizer positions = 0.0471898% +buckets with 16 minimizer positions = 0.0377861% +max_bucket_size 71743 +2025-10-22 19:28:10: saving data structure to disk... +2025-10-22 19:28:11: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 100000 sequences, 8718431 bases, 5718431 kmers +read 200000 sequences, 17474097 bases, 11474097 kmers +read 300000 sequences, 26299449 bases, 17299449 kmers +read 400000 sequences, 35167130 bases, 23167130 kmers +read 500000 sequences, 43967965 bases, 28967965 kmers +read 600000 sequences, 52886445 bases, 34886445 kmers +read 700000 sequences, 61937196 bases, 40937196 kmers +read 800000 sequences, 71070714 bases, 47070714 kmers +read 900000 sequences, 80176912 bases, 53176912 kmers +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 1100000 sequences, 98984859 bases, 65984859 kmers +read 1200000 sequences, 108719881 bases, 72719881 kmers +read 1300000 sequences, 118280880 bases, 79280880 kmers +read 1400000 sequences, 127917770 bases, 85917770 kmers +read 1500000 sequences, 137591691 bases, 92591691 kmers +read 1600000 sequences, 147395215 bases, 99395215 kmers +read 1700000 sequences, 157335047 bases, 106335047 kmers +read 1800000 sequences, 167445213 bases, 113445213 kmers +read 1900000 sequences, 177725569 bases, 120725569 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 2100000 sequences, 198499534 bases, 135499534 kmers +read 2200000 sequences, 209053278 bases, 143053278 kmers +read 2300000 sequences, 219848016 bases, 150848016 kmers +read 2400000 sequences, 230787167 bases, 158787167 kmers +read 2500000 sequences, 242014409 bases, 167014409 kmers +read 2600000 sequences, 253501985 bases, 175501985 kmers +read 2700000 sequences, 265108770 bases, 184108770 kmers +read 2800000 sequences, 277040197 bases, 193040197 kmers +read 2900000 sequences, 289406751 bases, 202406751 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 3100000 sequences, 315168435 bases, 222168435 kmers +read 3200000 sequences, 329083083 bases, 233083083 kmers +read 3300000 sequences, 343508535 bases, 244508535 kmers +read 3400000 sequences, 358608045 bases, 256608045 kmers +read 3500000 sequences, 374790387 bases, 269790387 kmers +read 3600000 sequences, 392124136 bases, 284124136 kmers +read 3700000 sequences, 410698510 bases, 299698510 kmers +read 3800000 sequences, 431358064 bases, 317358064 kmers +read 3900000 sequences, 454179453 bases, 337179453 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 4100000 sequences, 468031549 bases, 345031549 kmers +read 4200000 sequences, 474889571 bases, 348889571 kmers +read 4300000 sequences, 481729708 bases, 352729708 kmers +read 4400000 sequences, 488721954 bases, 356721954 kmers +read 4500000 sequences, 495625078 bases, 360625078 kmers +read 4600000 sequences, 502596576 bases, 364596576 kmers +read 4700000 sequences, 509600517 bases, 368600517 kmers +read 4800000 sequences, 516484470 bases, 372484470 kmers +read 4900000 sequences, 523427219 bases, 376427219 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 5100000 sequences, 537329595 bases, 384329595 kmers +read 5200000 sequences, 544209359 bases, 388209359 kmers +read 5300000 sequences, 551189922 bases, 392189922 kmers +read 5400000 sequences, 558101939 bases, 396101939 kmers +read 5500000 sequences, 565120163 bases, 400120163 kmers +read 5600000 sequences, 572157570 bases, 404157570 kmers +read 5700000 sequences, 579064866 bases, 408064866 kmers +read 5800000 sequences, 586002711 bases, 412002711 kmers +read 5900000 sequences, 592940936 bases, 415940936 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 6100000 sequences, 607035798 bases, 424035798 kmers +read 6200000 sequences, 614208718 bases, 428208718 kmers +read 6300000 sequences, 621168245 bases, 432168245 kmers +read 6400000 sequences, 628072498 bases, 436072498 kmers +read 6500000 sequences, 635102614 bases, 440102614 kmers +read 6600000 sequences, 642120732 bases, 444120732 kmers +read 6700000 sequences, 649088967 bases, 448088967 kmers +read 6800000 sequences, 656101755 bases, 452101755 kmers +read 6900000 sequences, 663148884 bases, 456148884 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 7100000 sequences, 677027864 bases, 464027864 kmers +read 7200000 sequences, 684172202 bases, 468172202 kmers +read 7300000 sequences, 691211207 bases, 472211207 kmers +read 7400000 sequences, 698208790 bases, 476208790 kmers +read 7500000 sequences, 705328995 bases, 480328995 kmers +read 7600000 sequences, 712361023 bases, 484361023 kmers +read 7700000 sequences, 719471804 bases, 488471804 kmers +read 7800000 sequences, 726605138 bases, 492605138 kmers +read 7900000 sequences, 733774594 bases, 496774594 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 8100000 sequences, 747950180 bases, 504950180 kmers +read 8200000 sequences, 755058730 bases, 509058730 kmers +read 8300000 sequences, 762216427 bases, 513216427 kmers +read 8400000 sequences, 769353851 bases, 517353851 kmers +read 8500000 sequences, 776583161 bases, 521583161 kmers +read 8600000 sequences, 783816261 bases, 525816261 kmers +read 8700000 sequences, 791077370 bases, 530077370 kmers +read 8800000 sequences, 798157781 bases, 534157781 kmers +read 8900000 sequences, 805241016 bases, 538241016 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 9100000 sequences, 819617693 bases, 546617693 kmers +read 9200000 sequences, 826809772 bases, 550809772 kmers +read 9300000 sequences, 833919107 bases, 554919107 kmers +read 9400000 sequences, 841155666 bases, 559155666 kmers +read 9500000 sequences, 848401695 bases, 563401695 kmers +read 9600000 sequences, 855643716 bases, 567643716 kmers +read 9700000 sequences, 862872782 bases, 571872782 kmers +read 9800000 sequences, 870171741 bases, 576171741 kmers +read 9900000 sequences, 877460939 bases, 580460939 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 10100000 sequences, 891988915 bases, 588988915 kmers +read 10200000 sequences, 899332167 bases, 593332167 kmers +read 10300000 sequences, 906596132 bases, 597596132 kmers +read 10400000 sequences, 913914222 bases, 601914222 kmers +read 10500000 sequences, 921197164 bases, 606197164 kmers +read 10600000 sequences, 928621352 bases, 610621352 kmers +read 10700000 sequences, 935962590 bases, 614962590 kmers +read 10800000 sequences, 943225398 bases, 619225398 kmers +read 10900000 sequences, 950606271 bases, 623606271 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 11100000 sequences, 965609642 bases, 632609642 kmers +read 11200000 sequences, 972999574 bases, 636999574 kmers +read 11300000 sequences, 980385996 bases, 641385996 kmers +read 11400000 sequences, 987756692 bases, 645756692 kmers +read 11500000 sequences, 995228727 bases, 650228727 kmers +read 11600000 sequences, 1002716000 bases, 654716000 kmers +read 11700000 sequences, 1010163238 bases, 659163238 kmers +read 11800000 sequences, 1017604060 bases, 663604060 kmers +read 11900000 sequences, 1025150347 bases, 668150347 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 12100000 sequences, 1040213508 bases, 677213508 kmers +read 12200000 sequences, 1047864763 bases, 681864763 kmers +read 12300000 sequences, 1055370986 bases, 686370986 kmers +read 12400000 sequences, 1062882136 bases, 690882136 kmers +read 12500000 sequences, 1070457834 bases, 695457834 kmers +read 12600000 sequences, 1078056503 bases, 700056503 kmers +read 12700000 sequences, 1085619892 bases, 704619892 kmers +read 12800000 sequences, 1093220371 bases, 709220371 kmers +read 12900000 sequences, 1100938017 bases, 713938017 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 13100000 sequences, 1116117667 bases, 723117667 kmers +read 13200000 sequences, 1123791984 bases, 727791984 kmers +read 13300000 sequences, 1131456294 bases, 732456294 kmers +read 13400000 sequences, 1139167231 bases, 737167231 kmers +read 13500000 sequences, 1147084240 bases, 742084240 kmers +read 13600000 sequences, 1154903455 bases, 746903455 kmers +read 13700000 sequences, 1162719581 bases, 751719581 kmers +read 13800000 sequences, 1170515268 bases, 756515268 kmers +read 13900000 sequences, 1178310906 bases, 761310906 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 14100000 sequences, 1194143461 bases, 771143461 kmers +read 14200000 sequences, 1202037257 bases, 776037257 kmers +read 14300000 sequences, 1210016774 bases, 781016774 kmers +read 14400000 sequences, 1217929746 bases, 785929746 kmers +read 14500000 sequences, 1226009557 bases, 791009557 kmers +read 14600000 sequences, 1233936531 bases, 795936531 kmers +read 14700000 sequences, 1241953842 bases, 800953842 kmers +read 14800000 sequences, 1249971925 bases, 805971925 kmers +read 14900000 sequences, 1258012031 bases, 811012031 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 15100000 sequences, 1274149698 bases, 821149698 kmers +read 15200000 sequences, 1282474916 bases, 826474916 kmers +read 15300000 sequences, 1290768947 bases, 831768947 kmers +read 15400000 sequences, 1299121797 bases, 837121797 kmers +read 15500000 sequences, 1307304198 bases, 842304198 kmers +read 15600000 sequences, 1315661756 bases, 847661756 kmers +read 15700000 sequences, 1324089837 bases, 853089837 kmers +read 15800000 sequences, 1332318617 bases, 858318617 kmers +read 15900000 sequences, 1340760587 bases, 863760587 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16100000 sequences, 1357811757 bases, 874811757 kmers +read 16200000 sequences, 1366358226 bases, 880358226 kmers +read 16300000 sequences, 1375027036 bases, 886027036 kmers +read 16400000 sequences, 1383710258 bases, 891710258 kmers +=== step 1.1: 'encoding input' 4.65741 [sec] (5.20782 [ns/kmer]) +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max_len 117016 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.13306 [sec] (1.26697 [ns/kmer]) +=== step 1: 'parse file' 5.79059 [sec] (6.47492 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.2371 [sec] (13.6832 [ns/kmer]) +num_minimizers = 126246665 +num_minimizer_positions = 162006751 +num_super_kmers = 162006751 +building minimizers MPHF with 64 threads and 43 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.56026 [sec] (6.21738 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.07689 [sec] (6.79506 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.54494 [sec] (2.8457 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 14059268/126246665 (11.1363%) +num_buckets_in_skew_index 8266/126246665 (0.0065475%) +max_bucket_size 36894 +log2_max_bucket_size 16 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 48164669/162006751 (29.73%) +num_minimizer_positions_of_buckets_in_skew_index 1662951/162006751 (1.02647%) +computing minimizers offsets: 3.24737 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2254325 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1183762 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 885561 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 591648 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 450833 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 373731 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 338406 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 36894: 388502 +num_kmers_in_skew_index 6466768 (0.723101%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2254325 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2254325)... + built mphs[0] for 2254325 kmers; bits/key = 2.56001 + built positions[0] for 2254325 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1183762 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1183762)... + built mphs[1] for 1183762 kmers; bits/key = 2.56081 + built positions[1] for 1183762 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 885561 + building MPHF with 64 threads and 1 partitions (avg. partition size = 885561)... + built mphs[2] for 885561 kmers; bits/key = 2.56147 + built positions[2] for 885561 kmers; bits/key = 9.00043 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 591648 + building MPHF with 64 threads and 1 partitions (avg. partition size = 591648)... + built mphs[3] for 591648 kmers; bits/key = 2.56263 + built positions[3] for 591648 kmers; bits/key = 10.0005 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 450833 + building MPHF with 64 threads and 1 partitions (avg. partition size = 450833)... + built mphs[4] for 450833 kmers; bits/key = 2.42098 + built positions[4] for 450833 kmers; bits/key = 11.0007 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 373731 + building MPHF with 64 threads and 1 partitions (avg. partition size = 373731)... + built mphs[5] for 373731 kmers; bits/key = 2.56484 + built positions[5] for 373731 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 338406 + building MPHF with 64 threads and 1 partitions (avg. partition size = 338406)... + built mphs[6] for 338406 kmers; bits/key = 2.4226 + built positions[6] for 338406 kmers; bits/key = 13.001 + lower = 8192; upper = 36894; num_bits_per_pos = 16; num_kmers_in_partition = 388502 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388502)... + built mphs[7] for 388502 kmers; bits/key = 2.56472 + built positions[7] for 388502 kmers; bits/key = 16.0009 +computing skew index took: 3.78562 [sec] +=== step 3: 'build sparse and skew index' 7.3585 [sec] (8.22813 [ns/kmer]) +=== total_time 39.5682 [sec] (44.2444 [ns/kmer]) +total index size: 1383564118 [B] -- 1383.56 [MB] +SPACE BREAKDOWN: + mphf: 0.405702 [bits/kmer] (2.87392 [bits/key]) -- 3.27798% + strings_offsets: 0.5699 [bits/kmer] -- 4.60466% + control_codewords: 5.929 [bits/kmer] -- 47.9049% + mid_load_buckets: 2.20813 [bits/kmer] -- 17.8412% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 1.93703e-05% + strings: 3.10303 [bits/kmer] -- 25.0718% + skew_index: 0.160832 [bits/kmer] -- 1.29948% + weights: 1.64596e-06 [bits/kmer] -- 1.3299e-05% + -------------- + total: 12.3766 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 88.8571% +buckets with 2 minimizer positions = 6.64024% +buckets with 3 minimizer positions = 1.83049% +buckets with 4 minimizer positions = 0.817717% +buckets with 5 minimizer positions = 0.475524% +buckets with 6 minimizer positions = 0.319677% +buckets with 7 minimizer positions = 0.233881% +buckets with 8 minimizer positions = 0.178737% +buckets with 9 minimizer positions = 0.138965% +buckets with 10 minimizer positions = 0.107245% +buckets with 11 minimizer positions = 0.0823246% +buckets with 12 minimizer positions = 0.0632579% +buckets with 13 minimizer positions = 0.0483173% +buckets with 14 minimizer positions = 0.0365673% +buckets with 15 minimizer positions = 0.027916% +buckets with 16 minimizer positions = 0.0218604% +max_bucket_size 36894 +2025-10-22 19:28:51: saving data structure to disk... +2025-10-22 19:28:52: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log b/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log new file mode 100644 index 0000000..191a50f --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 579.768 +avg_nanosec_per_negative_lookup 506.333 +avg_nanosec_per_access 258.877 +iterator: avg_nanosec_per_kmer 3.01295 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 596.971 +avg_nanosec_per_negative_lookup 512.353 +avg_nanosec_per_access 258.206 +iterator: avg_nanosec_per_kmer 2.97432 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 597.496 +avg_nanosec_per_negative_lookup 509.627 +avg_nanosec_per_access 255.916 +iterator: avg_nanosec_per_kmer 2.9514 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 540.561 +avg_nanosec_per_negative_lookup 500.015 +avg_nanosec_per_access 234.012 +iterator: avg_nanosec_per_kmer 2.96457 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 534.006 +avg_nanosec_per_negative_lookup 492.577 +avg_nanosec_per_access 236.368 +iterator: avg_nanosec_per_kmer 3.03606 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 516.414 +avg_nanosec_per_negative_lookup 508.606 +avg_nanosec_per_access 224.229 +iterator: avg_nanosec_per_kmer 3.01148 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 704.324 +avg_nanosec_per_negative_lookup 577.388 +avg_nanosec_per_access 298.719 +iterator: avg_nanosec_per_kmer 2.96439 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 719.55 +avg_nanosec_per_negative_lookup 610.767 +avg_nanosec_per_access 283.708 +iterator: avg_nanosec_per_kmer 2.96453 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 708.24 +avg_nanosec_per_negative_lookup 614.214 +avg_nanosec_per_access 287.144 +iterator: avg_nanosec_per_kmer 3.1315 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1079.39 +avg_nanosec_per_negative_lookup 750.383 +avg_nanosec_per_access 621.495 +iterator: avg_nanosec_per_kmer 3.27382 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1080.52 +avg_nanosec_per_negative_lookup 755.266 +avg_nanosec_per_access 627.388 +iterator: avg_nanosec_per_kmer 3.25596 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1066.3 +avg_nanosec_per_negative_lookup 741.883 +avg_nanosec_per_access 632.038 +iterator: avg_nanosec_per_kmer 3.29883 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1224.96 +avg_nanosec_per_negative_lookup 631.554 +avg_nanosec_per_access 507.259 +iterator: avg_nanosec_per_kmer 3.07508 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1243.48 +avg_nanosec_per_negative_lookup 644.174 +avg_nanosec_per_access 480.913 +iterator: avg_nanosec_per_kmer 3.06122 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1231.49 +avg_nanosec_per_negative_lookup 641.143 +avg_nanosec_per_access 512.887 +iterator: avg_nanosec_per_kmer 3.0728 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1171.05 +avg_nanosec_per_negative_lookup 615.697 +avg_nanosec_per_access 463.638 +iterator: avg_nanosec_per_kmer 3.06504 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1181.86 +avg_nanosec_per_negative_lookup 621.847 +avg_nanosec_per_access 457.245 +iterator: avg_nanosec_per_kmer 3.00108 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1175.19 +avg_nanosec_per_negative_lookup 643.635 +avg_nanosec_per_access 430.929 +iterator: avg_nanosec_per_kmer 3.07084 diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log b/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log new file mode 100644 index 0000000..a2aac75 --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log @@ -0,0 +1,2131 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.482 [sec] (2.66267 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.432565 [sec] (0.777176 [ns/kmer]) +=== step 1: 'parse file' 1.91466 [sec] (3.44002 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.6217 [sec] (4.71032 [ns/kmer]) +num_minimizers = 29275778 +num_minimizer_positions = 34590805 +num_super_kmers = 36307176 +building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.63405 [sec] (2.93585 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.37919 [sec] (2.47795 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.731842 [sec] (1.31488 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 1189512/29275778 (4.06313%) +num_buckets_in_skew_index 5032/29275778 (0.0171883%) +max_bucket_size 815743 +log2_max_bucket_size 20 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 4643594/34590805 (13.4244%) +num_minimizer_positions_of_buckets_in_skew_index 1865977/34590805 (5.39443%) +computing minimizers offsets: 0.479114 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4850737 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3133092 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1886121 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1113398 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 945186 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1019479 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 681501 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 815743: 5508330 +num_kmers_in_skew_index 19137844 (3.43844%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4850737 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4850737 kmers; bits/key = 2.71418 + built positions[0] for 4850737 kmers; bits/key = 7.00007 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3133092 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3133092 kmers; bits/key = 3.15324 + built positions[1] for 3133092 kmers; bits/key = 8.00011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1886121 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1886121)... + built mphs[2] for 1886121 kmers; bits/key = 2.5602 + built positions[2] for 1886121 kmers; bits/key = 9.00018 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1113398 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1113398)... + built mphs[3] for 1113398 kmers; bits/key = 2.56094 + built positions[3] for 1113398 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 945186 + building MPHF with 64 threads and 1 partitions (avg. partition size = 945186)... + built mphs[4] for 945186 kmers; bits/key = 2.56129 + built positions[4] for 945186 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1019479 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1019479)... + built mphs[5] for 1019479 kmers; bits/key = 2.56115 + built positions[5] for 1019479 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 681501 + building MPHF with 64 threads and 1 partitions (avg. partition size = 681501)... + built mphs[6] for 681501 kmers; bits/key = 2.41941 + built positions[6] for 681501 kmers; bits/key = 13.0005 + lower = 8192; upper = 815743; num_bits_per_pos = 20; num_kmers_in_partition = 5508330 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 5508330 kmers; bits/key = 2.59546 + built positions[7] for 5508330 kmers; bits/key = 20.0001 +computing skew index took: 5.89842 [sec] +=== step 3: 'build sparse and skew index' 6.42909 [sec] (11.5509 [ns/kmer]) +=== total_time 14.7105 [sec] (26.43 [ns/kmer]) +total index size: 367802718 [B] -- 367.803 [MB] +SPACE BREAKDOWN: + mphf: 0.151285 [bits/kmer] (2.87621 [bits/key]) -- 2.8617% + strings_offsets: 0.0514514 [bits/kmer] -- 0.97325% + control_codewords: 1.94616 [bits/kmer] -- 36.8134% + mid_load_buckets: 0.300349 [bits/kmer] -- 5.68137% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.28651e-05% + strings: 2.21266 [bits/kmer] -- 41.8545% + skew_index: 0.624643 [bits/kmer] -- 11.8157% + weights: 2.6447e-06 [bits/kmer] -- 5.00268e-05% + -------------- + total: 5.28656 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9197% +buckets with 2 minimizer positions = 2.25505% +buckets with 3 minimizer positions = 0.743143% +buckets with 4 minimizer positions = 0.33953% +buckets with 5 minimizer positions = 0.188914% +buckets with 6 minimizer positions = 0.116602% +buckets with 7 minimizer positions = 0.0799535% +buckets with 8 minimizer positions = 0.0565963% +buckets with 9 minimizer positions = 0.0427691% +buckets with 10 minimizer positions = 0.0324774% +buckets with 11 minimizer positions = 0.0259498% +buckets with 12 minimizer positions = 0.0206382% +buckets with 13 minimizer positions = 0.017038% +buckets with 14 minimizer positions = 0.0148143% +buckets with 15 minimizer positions = 0.0124232% +buckets with 16 minimizer positions = 0.0107973% +max_bucket_size 815743 +2025-10-22 19:44:49: saving data structure to disk... +2025-10-22 19:44:49: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.68923 [sec] (2.32783 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.698686 [sec] (0.604792 [ns/kmer]) +=== step 1: 'parse file' 3.38802 [sec] (2.93271 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.18951 [sec] (4.49211 [ns/kmer]) +num_minimizers = 68497878 +num_minimizer_positions = 69282395 +num_super_kmers = 73080845 +building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.0244 [sec] (2.61796 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.7233 [sec] (2.35732 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.4648 [sec] (1.26795 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 296941/68497878 (0.433504%) +num_buckets_in_skew_index 787/68497878 (0.00114894%) +max_bucket_size 1509 +log2_max_bucket_size 11 +skew index num_partitions 5 +num_minimizer_positions_of_buckets_larger_than_1 973386/69282395 (1.40495%) +num_minimizer_positions_of_buckets_in_skew_index 108859/69282395 (0.157124%) +computing minimizers offsets: 0.596444 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 854803 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 508726 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 353088 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 143157 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1509: 45334 +num_kmers_in_skew_index 1905108 (0.164909%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 854803 + building MPHF with 64 threads and 1 partitions (avg. partition size = 854803)... + built mphs[0] for 854803 kmers; bits/key = 2.5616 + built positions[0] for 854803 kmers; bits/key = 7.00044 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 508726 + building MPHF with 64 threads and 1 partitions (avg. partition size = 508726)... + built mphs[1] for 508726 kmers; bits/key = 2.42032 + built positions[1] for 508726 kmers; bits/key = 8.00066 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 353088 + building MPHF with 64 threads and 1 partitions (avg. partition size = 353088)... + built mphs[2] for 353088 kmers; bits/key = 2.56521 + built positions[2] for 353088 kmers; bits/key = 9.00091 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 143157 + building MPHF with 64 threads and 1 partitions (avg. partition size = 143157)... + built mphs[3] for 143157 kmers; bits/key = 2.4309 + built positions[3] for 143157 kmers; bits/key = 10.0026 + lower = 1024; upper = 1509; num_bits_per_pos = 11; num_kmers_in_partition = 45334 + building MPHF with 64 threads and 1 partitions (avg. partition size = 45334)... + built mphs[4] for 45334 kmers; bits/key = 2.46173 + built positions[4] for 45334 kmers; bits/key = 11.0074 +computing skew index took: 1.09443 [sec] +=== step 3: 'build sparse and skew index' 1.78937 [sec] (1.54891 [ns/kmer]) +=== total_time 17.5794 [sec] (15.217 [ns/kmer]) +total index size: 640267074 [B] -- 640.267 [MB] +SPACE BREAKDOWN: + mphf: 0.16806 [bits/kmer] (2.83441 [bits/key]) -- 3.79043% + strings_offsets: 0.0041807 [bits/kmer] -- 0.0942919% + control_codewords: 2.19383 [bits/kmer] -- 49.4798% + mid_load_buckets: 0.030333 [bits/kmer] -- 0.684133% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.18575e-05% + strings: 2.01672 [bits/kmer] -- 45.4853% + skew_index: 0.0206612 [bits/kmer] -- 0.465995% + weights: 1.27418e-06 [bits/kmer] -- 2.8738e-05% + -------------- + total: 4.43379 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.5653% +buckets with 2 minimizer positions = 0.296122% +buckets with 3 minimizer positions = 0.0602092% +buckets with 4 minimizer positions = 0.0251672% +buckets with 5 minimizer positions = 0.0136895% +buckets with 6 minimizer positions = 0.00842362% +buckets with 7 minimizer positions = 0.00572864% +buckets with 8 minimizer positions = 0.00416071% +buckets with 9 minimizer positions = 0.00301323% +buckets with 10 minimizer positions = 0.00248183% +buckets with 11 minimizer positions = 0.00184093% +buckets with 12 minimizer positions = 0.00158691% +buckets with 13 minimizer positions = 0.00117084% +buckets with 14 minimizer positions = 0.00105697% +buckets with 15 minimizer positions = 0.000887619% +buckets with 16 minimizer positions = 0.000756228% +max_bucket_size 1509 +2025-10-22 19:45:07: saving data structure to disk... +2025-10-22 19:45:07: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 7.10615 [sec] (2.56418 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.56413 [sec] (0.564399 [ns/kmer]) +=== step 1: 'parse file' 8.67042 [sec] (3.12863 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.7316 [sec] (4.59406 [ns/kmer]) +num_minimizers = 149769567 +num_minimizer_positions = 173272792 +num_super_kmers = 182565576 +building minimizers MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.11577 [sec] (2.20681 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.41367 [sec] (2.31431 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.7812 [sec] (1.36441 [ns/kmer]) +num_bits_per_offset = 39 +num_buckets_larger_than_1_not_in_skew_index 4082749/149769567 (2.72602%) +num_buckets_in_skew_index 35781/149769567 (0.0238907%) +max_bucket_size 284250 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 16495406/173272792 (9.51991%) +num_minimizer_positions_of_buckets_in_skew_index 11126349/173272792 (6.42129%) +computing minimizers offsets: 2.10428 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 26742724 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 24475836 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 21113117 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19260150 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17989259 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15443443 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 12315344 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 284250: 28690575 +num_kmers_in_skew_index 166030448 (5.99103%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26742724 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 26742724 kmers; bits/key = 2.56429 + built positions[0] for 26742724 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 24475836 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 24475836 kmers; bits/key = 2.62316 + built positions[1] for 24475836 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 21113117 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 21113117 kmers; bits/key = 2.6904 + built positions[2] for 21113117 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 19260150 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 19260150 kmers; bits/key = 2.59757 + built positions[3] for 19260150 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17989259 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17989259 kmers; bits/key = 2.53715 + built positions[4] for 17989259 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 15443443 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[5] for 15443443 kmers; bits/key = 2.69254 + built positions[5] for 15443443 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 12315344 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 12315344 kmers; bits/key = 2.67895 + built positions[6] for 12315344 kmers; bits/key = 13 + lower = 8192; upper = 284250; num_bits_per_pos = 19; num_kmers_in_partition = 28690575 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[7] for 28690575 kmers; bits/key = 2.55295 + built positions[7] for 28690575 kmers; bits/key = 19 +computing skew index took: 22.4196 [sec] +=== step 3: 'build sparse and skew index' 24.8074 [sec] (8.95149 [ns/kmer]) +=== total_time 62.5201 [sec] (22.5597 [ns/kmer]) +total index size: 1966639402 [B] -- 1966.64 [MB] +SPACE BREAKDOWN: + mphf: 0.152644 [bits/kmer] (2.82451 [bits/key]) -- 2.68876% + strings_offsets: 0.0305175 [bits/kmer] -- 0.537553% + control_codewords: 2.16171 [bits/kmer] -- 38.0775% + mid_load_buckets: 0.232136 [bits/kmer] -- 4.08896% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.36273e-05% + strings: 2.11826 [bits/kmer] -- 37.3121% + skew_index: 0.981863 [bits/kmer] -- 17.2951% + weights: 5.31156e-07 [bits/kmer] -- 9.35606e-06% + -------------- + total: 5.67713 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.2501% +buckets with 2 minimizer positions = 1.59767% +buckets with 3 minimizer positions = 0.444706% +buckets with 4 minimizer positions = 0.198987% +buckets with 5 minimizer positions = 0.113029% +buckets with 6 minimizer positions = 0.07244% +buckets with 7 minimizer positions = 0.0504562% +buckets with 8 minimizer positions = 0.0370322% +buckets with 9 minimizer positions = 0.0281472% +buckets with 10 minimizer positions = 0.0224598% +buckets with 11 minimizer positions = 0.0182414% +buckets with 12 minimizer positions = 0.0149463% +buckets with 13 minimizer positions = 0.0124745% +buckets with 14 minimizer positions = 0.0107405% +buckets with 15 minimizer positions = 0.00923686% +buckets with 16 minimizer positions = 0.00803234% +max_bucket_size 284250 +2025-10-22 19:46:10: saving data structure to disk... +2025-10-22 19:46:11: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.5065 [sec] (4.64104 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.90.bin'... +=== step 1.2: 'computing minimizers tuples' 11.2511 [sec] (1.89835 [ns/kmer]) +=== step 1: 'parse file' 38.7577 [sec] (6.53941 [ns/kmer]) + == files to merge = 91 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.1: 'merging minimizers tuples' 39.3406 [sec] (6.63776 [ns/kmer]) +num_minimizers = 295344565 +num_minimizer_positions = 485764487 +num_super_kmers = 507036670 +building minimizers MPHF with 64 threads and 99 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 12.6573 [sec] (2.13561 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.697 [sec] (2.98593 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.4: 'merging minimizers tuples ' 22.5965 [sec] (3.8126 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 76095635/295344565 (25.765%) +num_buckets_in_skew_index 164193/295344565 (0.0555937%) +max_bucket_size 265182 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 218504008/485764487 (44.9815%) +num_minimizer_positions_of_buckets_in_skew_index 48175742/485764487 (9.91751%) +computing minimizers offsets: 13.4054 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 91237805 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 81089595 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 71244043 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 64999827 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 55340829 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 44026748 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 33883659 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 265182: 85368523 +num_kmers_in_skew_index 527191029 (8.89506%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 91237805 + building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... + built mphs[0] for 91237805 kmers; bits/key = 2.54472 + built positions[0] for 91237805 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 81089595 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[1] for 81089595 kmers; bits/key = 2.56263 + built positions[1] for 81089595 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 71244043 + building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... + built mphs[2] for 71244043 kmers; bits/key = 2.56439 + built positions[2] for 71244043 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 64999827 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[3] for 64999827 kmers; bits/key = 2.54652 + built positions[3] for 64999827 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 55340829 + building MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... + built mphs[4] for 55340829 kmers; bits/key = 2.53877 + built positions[4] for 55340829 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 44026748 + building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... + built mphs[5] for 44026748 kmers; bits/key = 2.53894 + built positions[5] for 44026748 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 33883659 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[6] for 33883659 kmers; bits/key = 2.5671 + built positions[6] for 33883659 kmers; bits/key = 13 + lower = 8192; upper = 265182; num_bits_per_pos = 19; num_kmers_in_partition = 85368523 + building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... + built mphs[7] for 85368523 kmers; bits/key = 2.56049 + built positions[7] for 85368523 kmers; bits/key = 19 +computing skew index took: 78.3486 [sec] +=== step 3: 'build sparse and skew index' 92.7098 [sec] (15.6425 [ns/kmer]) +=== total_time 223.759 [sec] (37.7538 [ns/kmer]) +total index size: 6570787528 [B] -- 6570.79 [MB] +SPACE BREAKDOWN: + mphf: 0.141443 [bits/kmer] (2.83839 [bits/key]) -- 1.59475% + strings_offsets: 0.341727 [bits/kmer] -- 3.85293% + control_codewords: 2.09295 [bits/kmer] -- 23.5978% + mid_load_buckets: 1.51156 [bits/kmer] -- 17.0426% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.07866e-06% + strings: 3.2463 [bits/kmer] -- 36.6016% + skew_index: 1.5353 [bits/kmer] -- 17.3103% + weights: 2.48364e-07 [bits/kmer] -- 2.80027e-06% + -------------- + total: 8.86928 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 74.1794% +buckets with 2 minimizer positions = 17.5493% +buckets with 3 minimizer positions = 4.9171% +buckets with 4 minimizer positions = 1.47166% +buckets with 5 minimizer positions = 0.573611% +buckets with 6 minimizer positions = 0.301038% +buckets with 7 minimizer positions = 0.190827% +buckets with 8 minimizer positions = 0.133018% +buckets with 9 minimizer positions = 0.0984907% +buckets with 10 minimizer positions = 0.0753777% +buckets with 11 minimizer positions = 0.0590937% +buckets with 12 minimizer positions = 0.0475793% +buckets with 13 minimizer positions = 0.0389636% +buckets with 14 minimizer positions = 0.0324661% +buckets with 15 minimizer positions = 0.0273305% +buckets with 16 minimizer positions = 0.0232809% +max_bucket_size 265182 +2025-10-22 19:49:57: saving data structure to disk... +2025-10-22 19:50:01: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 100000 sequences, 14595280 bases, 8395280 kmers +read 200000 sequences, 29023453 bases, 16623453 kmers +read 300000 sequences, 43790922 bases, 25190922 kmers +read 400000 sequences, 58362099 bases, 33562099 kmers +read 500000 sequences, 72908170 bases, 41908170 kmers +read 600000 sequences, 87446702 bases, 50246702 kmers +read 700000 sequences, 102099804 bases, 58699804 kmers +read 800000 sequences, 117134400 bases, 67534400 kmers +read 900000 sequences, 131713463 bases, 75913463 kmers +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 1100000 sequences, 161101660 bases, 92901660 kmers +read 1200000 sequences, 175910768 bases, 101510768 kmers +read 1300000 sequences, 190897904 bases, 110297904 kmers +read 1400000 sequences, 205802973 bases, 119002973 kmers +read 1500000 sequences, 221158148 bases, 128158148 kmers +read 1600000 sequences, 236346274 bases, 137146274 kmers +read 1700000 sequences, 251304432 bases, 145904432 kmers +read 1800000 sequences, 266473950 bases, 154873950 kmers +read 1900000 sequences, 281471604 bases, 163671604 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 2100000 sequences, 312420706 bases, 182220706 kmers +read 2200000 sequences, 327946210 bases, 191546210 kmers +read 2300000 sequences, 343525540 bases, 200925540 kmers +read 2400000 sequences, 358949847 bases, 210149847 kmers +read 2500000 sequences, 374380009 bases, 219380009 kmers +read 2600000 sequences, 390142304 bases, 228942304 kmers +read 2700000 sequences, 405642535 bases, 238242535 kmers +read 2800000 sequences, 421259989 bases, 247659989 kmers +read 2900000 sequences, 436893769 bases, 257093769 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 3100000 sequences, 468090902 bases, 275890902 kmers +read 3200000 sequences, 483923930 bases, 285523930 kmers +read 3300000 sequences, 499749509 bases, 295149509 kmers +read 3400000 sequences, 515726709 bases, 304926709 kmers +read 3500000 sequences, 532169207 bases, 315169207 kmers +read 3600000 sequences, 548394020 bases, 325194020 kmers +read 3700000 sequences, 564809686 bases, 335409686 kmers +read 3800000 sequences, 581403559 bases, 345803559 kmers +read 3900000 sequences, 597837340 bases, 356037340 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 4100000 sequences, 630803806 bases, 376603806 kmers +read 4200000 sequences, 647222216 bases, 386822216 kmers +read 4300000 sequences, 663750824 bases, 397150824 kmers +read 4400000 sequences, 680423234 bases, 407623234 kmers +read 4500000 sequences, 696967173 bases, 417967173 kmers +read 4600000 sequences, 714107161 bases, 428907161 kmers +read 4700000 sequences, 731190344 bases, 439790344 kmers +read 4800000 sequences, 748610325 bases, 451010325 kmers +read 4900000 sequences, 765806425 bases, 462006425 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 5100000 sequences, 800681271 bases, 484481271 kmers +read 5200000 sequences, 818515777 bases, 496115777 kmers +read 5300000 sequences, 836324012 bases, 507724012 kmers +read 5400000 sequences, 854771265 bases, 519971265 kmers +read 5500000 sequences, 873098069 bases, 532098069 kmers +read 5600000 sequences, 891182426 bases, 543982426 kmers +read 5700000 sequences, 910053448 bases, 556653448 kmers +read 5800000 sequences, 928444429 bases, 568844429 kmers +read 5900000 sequences, 947244294 bases, 581444294 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 6100000 sequences, 985974168 bases, 607774168 kmers +read 6200000 sequences, 1005630833 bases, 621230833 kmers +read 6300000 sequences, 1026020245 bases, 635420245 kmers +read 6400000 sequences, 1046696751 bases, 649896751 kmers +read 6500000 sequences, 1067596462 bases, 664596462 kmers +read 6600000 sequences, 1088718265 bases, 679518265 kmers +read 6700000 sequences, 1110387368 bases, 694987368 kmers +read 6800000 sequences, 1132578732 bases, 710978732 kmers +read 6900000 sequences, 1155047095 bases, 727247095 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 7100000 sequences, 1201726249 bases, 761526249 kmers +read 7200000 sequences, 1226646751 bases, 780246751 kmers +read 7300000 sequences, 1252079351 bases, 799479351 kmers +read 7400000 sequences, 1279261003 bases, 820461003 kmers +read 7500000 sequences, 1307802702 bases, 842802702 kmers +read 7600000 sequences, 1338212409 bases, 867012409 kmers +read 7700000 sequences, 1370354710 bases, 892954710 kmers +read 7800000 sequences, 1383049738 bases, 899449738 kmers +read 7900000 sequences, 1395810952 bases, 906010952 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 8100000 sequences, 1421220952 bases, 919020952 kmers +read 8200000 sequences, 1433887434 bases, 925487434 kmers +read 8300000 sequences, 1446445917 bases, 931845917 kmers +read 8400000 sequences, 1459153909 bases, 938353909 kmers +read 8500000 sequences, 1471877671 bases, 944877671 kmers +read 8600000 sequences, 1484865624 bases, 951665624 kmers +read 8700000 sequences, 1497567228 bases, 958167228 kmers +read 8800000 sequences, 1510543060 bases, 964943060 kmers +read 8900000 sequences, 1523371874 bases, 971571874 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 9100000 sequences, 1548860619 bases, 984660619 kmers +read 9200000 sequences, 1561712707 bases, 991312707 kmers +read 9300000 sequences, 1574401520 bases, 997801520 kmers +read 9400000 sequences, 1586885001 bases, 1004085001 kmers +read 9500000 sequences, 1599621412 bases, 1010621412 kmers +read 9600000 sequences, 1612397675 bases, 1017197675 kmers +read 9700000 sequences, 1625388385 bases, 1023988385 kmers +read 9800000 sequences, 1638536946 bases, 1030936946 kmers +read 9900000 sequences, 1651980650 bases, 1038180650 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 10100000 sequences, 1677570910 bases, 1051370910 kmers +read 10200000 sequences, 1690246890 bases, 1057846890 kmers +read 10300000 sequences, 1703230366 bases, 1064630366 kmers +read 10400000 sequences, 1716086552 bases, 1071286552 kmers +read 10500000 sequences, 1729082411 bases, 1078082411 kmers +read 10600000 sequences, 1741944091 bases, 1084744091 kmers +read 10700000 sequences, 1754780793 bases, 1091380793 kmers +read 10800000 sequences, 1767537304 bases, 1097937304 kmers +read 10900000 sequences, 1780512088 bases, 1104712088 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 11100000 sequences, 1807103354 bases, 1118903354 kmers +read 11200000 sequences, 1819865542 bases, 1125465542 kmers +read 11300000 sequences, 1832952701 bases, 1132352701 kmers +read 11400000 sequences, 1846108191 bases, 1139308191 kmers +read 11500000 sequences, 1859202023 bases, 1146202023 kmers +read 11600000 sequences, 1872125111 bases, 1152925111 kmers +read 11700000 sequences, 1884949294 bases, 1159549294 kmers +read 11800000 sequences, 1897879213 bases, 1166279213 kmers +read 11900000 sequences, 1910688502 bases, 1172888502 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 12100000 sequences, 1936528765 bases, 1186328765 kmers +read 12200000 sequences, 1949822939 bases, 1193422939 kmers +read 12300000 sequences, 1962607705 bases, 1200007705 kmers +read 12400000 sequences, 1975528951 bases, 1206728951 kmers +read 12500000 sequences, 1988356507 bases, 1213356507 kmers +read 12600000 sequences, 2001310116 bases, 1220110116 kmers +read 12700000 sequences, 2014316977 bases, 1226916977 kmers +read 12800000 sequences, 2027300676 bases, 1233700676 kmers +read 12900000 sequences, 2040283112 bases, 1240483112 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 13100000 sequences, 2066357392 bases, 1254157392 kmers +read 13200000 sequences, 2079514117 bases, 1261114117 kmers +read 13300000 sequences, 2092587055 bases, 1267987055 kmers +read 13400000 sequences, 2105687861 bases, 1274887861 kmers +read 13500000 sequences, 2118896002 bases, 1281896002 kmers +read 13600000 sequences, 2131841724 bases, 1288641724 kmers +read 13700000 sequences, 2144909308 bases, 1295509308 kmers +read 13800000 sequences, 2157799174 bases, 1302199174 kmers +read 13900000 sequences, 2170824760 bases, 1309024760 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 14100000 sequences, 2196888939 bases, 1322688939 kmers +read 14200000 sequences, 2209993052 bases, 1329593052 kmers +read 14300000 sequences, 2223177518 bases, 1336577518 kmers +read 14400000 sequences, 2236324767 bases, 1343524767 kmers +read 14500000 sequences, 2249926194 bases, 1350926194 kmers +read 14600000 sequences, 2263244067 bases, 1358044067 kmers +read 14700000 sequences, 2276666210 bases, 1365266210 kmers +read 14800000 sequences, 2289846389 bases, 1372246389 kmers +read 14900000 sequences, 2303142205 bases, 1379342205 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 15100000 sequences, 2329658257 bases, 1393458257 kmers +read 15200000 sequences, 2342799874 bases, 1400399874 kmers +read 15300000 sequences, 2355936598 bases, 1407336598 kmers +read 15400000 sequences, 2369202825 bases, 1414402825 kmers +read 15500000 sequences, 2382453933 bases, 1421453933 kmers +read 15600000 sequences, 2395606868 bases, 1428406868 kmers +read 15700000 sequences, 2408903524 bases, 1435503524 kmers +read 15800000 sequences, 2422488600 bases, 1442888600 kmers +read 15900000 sequences, 2435763741 bases, 1449963741 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 16100000 sequences, 2462152775 bases, 1463952775 kmers +read 16200000 sequences, 2475426803 bases, 1471026803 kmers +read 16300000 sequences, 2488985859 bases, 1478385859 kmers +read 16400000 sequences, 2502322646 bases, 1485522646 kmers +read 16500000 sequences, 2515682566 bases, 1492682566 kmers +read 16600000 sequences, 2529274259 bases, 1500074259 kmers +read 16700000 sequences, 2542622794 bases, 1507222794 kmers +read 16800000 sequences, 2556056912 bases, 1514456912 kmers +read 16900000 sequences, 2569267145 bases, 1521467145 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 17100000 sequences, 2596061102 bases, 1535861102 kmers +read 17200000 sequences, 2609459388 bases, 1543059388 kmers +read 17300000 sequences, 2622881245 bases, 1550281245 kmers +read 17400000 sequences, 2636336794 bases, 1557536794 kmers +read 17500000 sequences, 2649678629 bases, 1564678629 kmers +read 17600000 sequences, 2663341782 bases, 1572141782 kmers +read 17700000 sequences, 2676693590 bases, 1579293590 kmers +read 17800000 sequences, 2690200716 bases, 1586600716 kmers +read 17900000 sequences, 2703543489 bases, 1593743489 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 18100000 sequences, 2730783796 bases, 1608583796 kmers +read 18200000 sequences, 2744196467 bases, 1615796467 kmers +read 18300000 sequences, 2757894852 bases, 1623294852 kmers +read 18400000 sequences, 2771403521 bases, 1630603521 kmers +read 18500000 sequences, 2784930678 bases, 1637930678 kmers +read 18600000 sequences, 2798778608 bases, 1645578608 kmers +read 18700000 sequences, 2812434788 bases, 1653034788 kmers +read 18800000 sequences, 2826041925 bases, 1660441925 kmers +read 18900000 sequences, 2839594143 bases, 1667794143 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 19100000 sequences, 2866645368 bases, 1682445368 kmers +read 19200000 sequences, 2880162017 bases, 1689762017 kmers +read 19300000 sequences, 2893733500 bases, 1697133500 kmers +read 19400000 sequences, 2907861888 bases, 1705061888 kmers +read 19500000 sequences, 2921431859 bases, 1712431859 kmers +read 19600000 sequences, 2934950257 bases, 1719750257 kmers +read 19700000 sequences, 2948908590 bases, 1727508590 kmers +read 19800000 sequences, 2962655324 bases, 1735055324 kmers +read 19900000 sequences, 2976658842 bases, 1742858842 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 20100000 sequences, 3004463124 bases, 1758263124 kmers +read 20200000 sequences, 3018263669 bases, 1765863669 kmers +read 20300000 sequences, 3032235817 bases, 1773635817 kmers +read 20400000 sequences, 3045926851 bases, 1781126851 kmers +read 20500000 sequences, 3059718085 bases, 1788718085 kmers +read 20600000 sequences, 3073465760 bases, 1796265760 kmers +read 20700000 sequences, 3087374365 bases, 1803974365 kmers +read 20800000 sequences, 3101202279 bases, 1811602279 kmers +read 20900000 sequences, 3115301042 bases, 1819501042 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 21100000 sequences, 3143428950 bases, 1835228950 kmers +read 21200000 sequences, 3157337269 bases, 1842937269 kmers +read 21300000 sequences, 3171218453 bases, 1850618453 kmers +read 21400000 sequences, 3185386330 bases, 1858586330 kmers +read 21500000 sequences, 3199499619 bases, 1866499619 kmers +read 21600000 sequences, 3213699144 bases, 1874499144 kmers +read 21700000 sequences, 3227725083 bases, 1882325083 kmers +read 21800000 sequences, 3241636024 bases, 1890036024 kmers +read 21900000 sequences, 3255686690 bases, 1897886690 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 22100000 sequences, 3284189309 bases, 1913989309 kmers +read 22200000 sequences, 3298558467 bases, 1922158467 kmers +read 22300000 sequences, 3312627222 bases, 1930027222 kmers +read 22400000 sequences, 3326674715 bases, 1937874715 kmers +read 22500000 sequences, 3340769161 bases, 1945769161 kmers +read 22600000 sequences, 3355403951 bases, 1954203951 kmers +read 22700000 sequences, 3369592323 bases, 1962192323 kmers +read 22800000 sequences, 3383749832 bases, 1970149832 kmers +read 22900000 sequences, 3398280808 bases, 1978480808 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23100000 sequences, 3427105278 bases, 1994905278 kmers +read 23200000 sequences, 3441898165 bases, 2003498165 kmers +read 23300000 sequences, 3456307790 bases, 2011707790 kmers +read 23400000 sequences, 3470437552 bases, 2019637552 kmers +=== step 1.1: 'encoding input' 10.4056 [sec] (5.13183 [ns/kmer]) +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max_len 643923 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 20 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.49671 [sec] (0.738147 [ns/kmer]) +=== step 1: 'parse file' 11.9024 [sec] (5.87005 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 13.1335 [sec] (6.47717 [ns/kmer]) +num_minimizers = 86631941 +num_minimizer_positions = 169264838 +num_super_kmers = 176725324 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 4.09208 [sec] (2.01813 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.84624 [sec] (2.88325 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.45465 [sec] (1.70376 [ns/kmer]) +num_bits_per_offset = 45 +num_buckets_larger_than_1_not_in_skew_index 14311872/86631941 (16.5203%) +num_buckets_in_skew_index 167883/86631941 (0.193789%) +max_bucket_size 475227 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 74713236/169264838 (44.1398%) +num_minimizer_positions_of_buckets_in_skew_index 22399416/169264838 (13.2334%) +computing minimizers offsets: 4.30549 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 164308993 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 48058096 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13657562 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6137831 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4414714 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 4433156 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 4082117 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 475227: 35954358 +num_kmers_in_skew_index 281046827 (13.8607%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 164308993 + building MPHF with 64 threads and 55 partitions (avg. partition size = 3000000)... + built mphs[0] for 164308993 kmers; bits/key = 2.56349 + built positions[0] for 164308993 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 48058096 + building MPHF with 64 threads and 17 partitions (avg. partition size = 3000000)... + built mphs[1] for 48058096 kmers; bits/key = 2.53932 + built positions[1] for 48058096 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13657562 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13657562 kmers; bits/key = 2.61351 + built positions[2] for 13657562 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6137831 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6137831 kmers; bits/key = 2.93085 + built positions[3] for 6137831 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4414714 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4414714 kmers; bits/key = 2.84407 + built positions[4] for 4414714 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 4433156 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 4433156 kmers; bits/key = 2.73731 + built positions[5] for 4433156 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 4082117 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 4082117 kmers; bits/key = 2.9369 + built positions[6] for 4082117 kmers; bits/key = 13.0001 + lower = 8192; upper = 475227; num_bits_per_pos = 19; num_kmers_in_partition = 35954358 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[7] for 35954358 kmers; bits/key = 2.55049 + built positions[7] for 35954358 kmers; bits/key = 19 +computing skew index took: 43.7682 [sec] +=== step 3: 'build sparse and skew index' 48.4027 [sec] (23.8713 [ns/kmer]) +=== total_time 86.8316 [sec] (42.8236 [ns/kmer]) +total index size: 2449943884 [B] -- 2449.94 [MB] +SPACE BREAKDOWN: + mphf: 0.120785 [bits/kmer] (2.82702 [bits/key]) -- 1.24957% + strings_offsets: 0.370467 [bits/kmer] -- 3.83263% + control_codewords: 1.96536 [bits/kmer] -- 20.3325% + mid_load_buckets: 1.65812 [bits/kmer] -- 17.1539% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.0939e-05% + strings: 3.43556 [bits/kmer] -- 35.5423% + skew_index: 2.11582 [bits/kmer] -- 21.8891% + weights: 7.25961e-07 [bits/kmer] -- 7.51038e-06% + -------------- + total: 9.66611 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 83.2859% +buckets with 2 minimizer positions = 8.38918% +buckets with 3 minimizer positions = 2.77772% +buckets with 4 minimizer positions = 1.31798% +buckets with 5 minimizer positions = 0.776307% +buckets with 6 minimizer positions = 0.518707% +buckets with 7 minimizer positions = 0.374551% +buckets with 8 minimizer positions = 0.285226% +buckets with 9 minimizer positions = 0.226981% +buckets with 10 minimizer positions = 0.183834% +buckets with 11 minimizer positions = 0.15397% +buckets with 12 minimizer positions = 0.131367% +buckets with 13 minimizer positions = 0.113066% +buckets with 14 minimizer positions = 0.0987326% +buckets with 15 minimizer positions = 0.0868144% +buckets with 16 minimizer positions = 0.0771828% +max_bucket_size 475227 +2025-10-22 19:51:29: saving data structure to disk... +2025-10-22 19:51:30: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 100000 sequences, 29016680 bases, 22816680 kmers +read 200000 sequences, 59512851 bases, 47112851 kmers +read 300000 sequences, 93672898 bases, 75072898 kmers +read 400000 sequences, 116504758 bases, 91704758 kmers +read 500000 sequences, 129640784 bases, 98640784 kmers +read 600000 sequences, 142888339 bases, 105688339 kmers +read 700000 sequences, 156121559 bases, 112721559 kmers +read 800000 sequences, 169296181 bases, 119696181 kmers +read 900000 sequences, 182473664 bases, 126673664 kmers +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 1100000 sequences, 208767883 bases, 140567883 kmers +read 1200000 sequences, 222206242 bases, 147806242 kmers +read 1300000 sequences, 235299002 bases, 154699002 kmers +read 1400000 sequences, 248482676 bases, 161682676 kmers +read 1500000 sequences, 261589002 bases, 168589002 kmers +read 1600000 sequences, 275055224 bases, 175855224 kmers +read 1700000 sequences, 288035899 bases, 182635899 kmers +read 1800000 sequences, 301349839 bases, 189749839 kmers +read 1900000 sequences, 314875402 bases, 197075402 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 2100000 sequences, 341368638 bases, 211168638 kmers +read 2200000 sequences, 354712561 bases, 218312561 kmers +read 2300000 sequences, 368072063 bases, 225472063 kmers +read 2400000 sequences, 381369139 bases, 232569139 kmers +read 2500000 sequences, 395076735 bases, 240076735 kmers +read 2600000 sequences, 408571236 bases, 247371236 kmers +read 2700000 sequences, 421770941 bases, 254370941 kmers +read 2800000 sequences, 434931097 bases, 261331097 kmers +read 2900000 sequences, 448299063 bases, 268499063 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 3100000 sequences, 474884907 bases, 282684907 kmers +read 3200000 sequences, 488437875 bases, 290037875 kmers +read 3300000 sequences, 501681623 bases, 297081623 kmers +read 3400000 sequences, 514981749 bases, 304181749 kmers +read 3500000 sequences, 528308911 bases, 311308911 kmers +read 3600000 sequences, 541636977 bases, 318436977 kmers +read 3700000 sequences, 555162428 bases, 325762428 kmers +read 3800000 sequences, 568696864 bases, 333096864 kmers +read 3900000 sequences, 581917367 bases, 340117367 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 4100000 sequences, 608987326 bases, 354787326 kmers +read 4200000 sequences, 622285230 bases, 361885230 kmers +read 4300000 sequences, 635647937 bases, 369047937 kmers +read 4400000 sequences, 648992641 bases, 376192641 kmers +read 4500000 sequences, 662513085 bases, 383513085 kmers +read 4600000 sequences, 675930708 bases, 390730708 kmers +read 4700000 sequences, 689630997 bases, 398230997 kmers +read 4800000 sequences, 702998525 bases, 405398525 kmers +read 4900000 sequences, 716509106 bases, 412709106 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 5100000 sequences, 743782200 bases, 427582200 kmers +read 5200000 sequences, 757644345 bases, 435244345 kmers +read 5300000 sequences, 771125199 bases, 442525199 kmers +read 5400000 sequences, 784691064 bases, 449891064 kmers +read 5500000 sequences, 798294855 bases, 457294855 kmers +read 5600000 sequences, 811868593 bases, 464668593 kmers +read 5700000 sequences, 825311254 bases, 471911254 kmers +read 5800000 sequences, 838965535 bases, 479365535 kmers +read 5900000 sequences, 852651369 bases, 486851369 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 6100000 sequences, 879791139 bases, 501591139 kmers +read 6200000 sequences, 893568574 bases, 509168574 kmers +read 6300000 sequences, 907221132 bases, 516621132 kmers +read 6400000 sequences, 920850746 bases, 524050746 kmers +read 6500000 sequences, 934451496 bases, 531451496 kmers +read 6600000 sequences, 948058192 bases, 538858192 kmers +read 6700000 sequences, 961672076 bases, 546272076 kmers +read 6800000 sequences, 975396607 bases, 553796607 kmers +read 6900000 sequences, 989058970 bases, 561258970 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 7100000 sequences, 1016671875 bases, 576471875 kmers +read 7200000 sequences, 1030411659 bases, 584011659 kmers +read 7300000 sequences, 1044405182 bases, 591805182 kmers +read 7400000 sequences, 1058406016 bases, 599606016 kmers +read 7500000 sequences, 1072419258 bases, 607419258 kmers +read 7600000 sequences, 1086161571 bases, 614961571 kmers +read 7700000 sequences, 1100358439 bases, 622958439 kmers +read 7800000 sequences, 1114261097 bases, 630661097 kmers +read 7900000 sequences, 1128307808 bases, 638507808 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 8100000 sequences, 1156357087 bases, 654157087 kmers +read 8200000 sequences, 1170571919 bases, 662171919 kmers +read 8300000 sequences, 1184451177 bases, 669851177 kmers +read 8400000 sequences, 1198299415 bases, 677499415 kmers +read 8500000 sequences, 1212442446 bases, 685442446 kmers +read 8600000 sequences, 1226405386 bases, 693205386 kmers +read 8700000 sequences, 1240703127 bases, 701303127 kmers +read 8800000 sequences, 1254656983 bases, 709056983 kmers +read 8900000 sequences, 1268621397 bases, 716821397 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 9100000 sequences, 1297350868 bases, 733150868 kmers +read 9200000 sequences, 1311516008 bases, 741116008 kmers +read 9300000 sequences, 1325689722 bases, 749089722 kmers +read 9400000 sequences, 1339681966 bases, 756881966 kmers +read 9500000 sequences, 1353794378 bases, 764794378 kmers +read 9600000 sequences, 1368052593 bases, 772852593 kmers +read 9700000 sequences, 1382481060 bases, 781081060 kmers +read 9800000 sequences, 1397029165 bases, 789429165 kmers +read 9900000 sequences, 1411261935 bases, 797461935 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 10100000 sequences, 1439978158 bases, 813778158 kmers +read 10200000 sequences, 1454566042 bases, 822166042 kmers +read 10300000 sequences, 1469140008 bases, 830540008 kmers +read 10400000 sequences, 1483590209 bases, 838790209 kmers +read 10500000 sequences, 1497966729 bases, 846966729 kmers +read 10600000 sequences, 1512656712 bases, 855456712 kmers +read 10700000 sequences, 1527179954 bases, 863779954 kmers +read 10800000 sequences, 1541782827 bases, 872182827 kmers +read 10900000 sequences, 1556446263 bases, 880646263 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 11100000 sequences, 1585817113 bases, 897617113 kmers +read 11200000 sequences, 1600557391 bases, 906157391 kmers +read 11300000 sequences, 1615262703 bases, 914662703 kmers +read 11400000 sequences, 1629999627 bases, 923199627 kmers +read 11500000 sequences, 1644860568 bases, 931860568 kmers +read 11600000 sequences, 1659779614 bases, 940579614 kmers +read 11700000 sequences, 1674792374 bases, 949392374 kmers +read 11800000 sequences, 1689736749 bases, 958136749 kmers +read 11900000 sequences, 1704892610 bases, 967092610 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 12100000 sequences, 1735135576 bases, 984935576 kmers +read 12200000 sequences, 1750297083 bases, 993897083 kmers +read 12300000 sequences, 1765691330 bases, 1003091330 kmers +read 12400000 sequences, 1781168609 bases, 1012368609 kmers +read 12500000 sequences, 1796591819 bases, 1021591819 kmers +read 12600000 sequences, 1811901104 bases, 1030701104 kmers +read 12700000 sequences, 1827876510 bases, 1040476510 kmers +read 12800000 sequences, 1843393773 bases, 1049793773 kmers +read 12900000 sequences, 1858842782 bases, 1059042782 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 13100000 sequences, 1890244268 bases, 1078044268 kmers +read 13200000 sequences, 1905959273 bases, 1087559273 kmers +read 13300000 sequences, 1922228338 bases, 1097628338 kmers +read 13400000 sequences, 1938520111 bases, 1107720111 kmers +read 13500000 sequences, 1954665049 bases, 1117665049 kmers +read 13600000 sequences, 1970696591 bases, 1127496591 kmers +read 13700000 sequences, 1987164795 bases, 1137764795 kmers +read 13800000 sequences, 2003371475 bases, 1147771475 kmers +read 13900000 sequences, 2019649864 bases, 1157849864 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 14100000 sequences, 2052986091 bases, 1178786091 kmers +read 14200000 sequences, 2069712172 bases, 1189312172 kmers +read 14300000 sequences, 2086760589 bases, 1200160589 kmers +read 14400000 sequences, 2103719627 bases, 1210919627 kmers +read 14500000 sequences, 2120768565 bases, 1221768565 kmers +read 14600000 sequences, 2137973642 bases, 1232773642 kmers +read 14700000 sequences, 2155333528 bases, 1243933528 kmers +read 14800000 sequences, 2173029002 bases, 1255429002 kmers +read 14900000 sequences, 2190761957 bases, 1266961957 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 15100000 sequences, 2226994114 bases, 1290794114 kmers +read 15200000 sequences, 2245240873 bases, 1302840873 kmers +read 15300000 sequences, 2264078057 bases, 1315478057 kmers +read 15400000 sequences, 2282789468 bases, 1327989468 kmers +read 15500000 sequences, 2301835717 bases, 1340835717 kmers +read 15600000 sequences, 2321337137 bases, 1354137137 kmers +read 15700000 sequences, 2341431175 bases, 1368031175 kmers +read 15800000 sequences, 2361547906 bases, 1381947906 kmers +read 15900000 sequences, 2382126087 bases, 1396326087 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16100000 sequences, 2424934550 bases, 1426734550 kmers +read 16200000 sequences, 2447209476 bases, 1442809476 kmers +read 16300000 sequences, 2470231832 bases, 1459631832 kmers +read 16400000 sequences, 2494281037 bases, 1477481037 kmers +read 16500000 sequences, 2519161670 bases, 1496161670 kmers +read 16600000 sequences, 2545406869 bases, 1516206869 kmers +=== step 1.1: 'encoding input' 7.40246 [sec] (4.85437 [ns/kmer]) +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max_len 499189 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 19 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.13368 [sec] (0.743445 [ns/kmer]) +=== step 1: 'parse file' 8.53626 [sec] (5.5979 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 9.94436 [sec] (6.5213 [ns/kmer]) +num_minimizers = 69577229 +num_minimizer_positions = 126350163 +num_super_kmers = 131966527 +building minimizers MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.2208 [sec] (2.11214 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.37959 [sec] (2.87204 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.54732 [sec] (1.67048 [ns/kmer]) +num_bits_per_offset = 43 +num_buckets_larger_than_1_not_in_skew_index 12190335/69577229 (17.5206%) +num_buckets_in_skew_index 86973/69577229 (0.125002%) +max_bucket_size 245177 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 57511599/126350163 (45.5176%) +num_minimizer_positions_of_buckets_in_skew_index 11538643/126350163 (9.13227%) +computing minimizers offsets: 3.31397 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 77399356 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26776297 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13974034 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6504754 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3263868 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2527517 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2420664 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 245177: 10756294 +num_kmers_in_skew_index 143622784 (9.41848%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 77399356 + building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... + built mphs[0] for 77399356 kmers; bits/key = 2.54863 + built positions[0] for 77399356 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26776297 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26776297 kmers; bits/key = 2.54559 + built positions[1] for 26776297 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13974034 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13974034 kmers; bits/key = 2.56375 + built positions[2] for 13974034 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6504754 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6504754 kmers; bits/key = 2.78902 + built positions[3] for 6504754 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 3263868 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 3263868 kmers; bits/key = 3.30619 + built positions[4] for 3263868 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2527517 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2527517)... + built mphs[5] for 2527517 kmers; bits/key = 2.55992 + built positions[5] for 2527517 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2420664 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2420664)... + built mphs[6] for 2420664 kmers; bits/key = 2.55997 + built positions[6] for 2420664 kmers; bits/key = 13.0001 + lower = 8192; upper = 245177; num_bits_per_pos = 18; num_kmers_in_partition = 10756294 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[7] for 10756294 kmers; bits/key = 2.64819 + built positions[7] for 10756294 kmers; bits/key = 18 +computing skew index took: 23.4021 [sec] +=== step 3: 'build sparse and skew index' 26.9603 [sec] (17.68 [ns/kmer]) +=== total_time 55.5886 [sec] (36.4538 [ns/kmer]) +total index size: 1685868004 [B] -- 1685.87 [MB] +SPACE BREAKDOWN: + mphf: 0.132337 [bits/kmer] (2.9004 [bits/key]) -- 1.49628% + strings_offsets: 0.349116 [bits/kmer] -- 3.94729% + control_codewords: 2.0076 [bits/kmer] -- 22.699% + mid_load_buckets: 1.62174 [bits/kmer] -- 18.3362% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.58969e-05% + strings: 3.35283 [bits/kmer] -- 37.9088% + skew_index: 1.38083 [bits/kmer] -- 15.6124% + weights: 9.65307e-07 [bits/kmer] -- 1.09143e-05% + -------------- + total: 8.84445 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 82.3544% +buckets with 2 minimizer positions = 9.17598% +buckets with 3 minimizer positions = 3.08546% +buckets with 4 minimizer positions = 1.44294% +buckets with 5 minimizer positions = 0.830594% +buckets with 6 minimizer positions = 0.537643% +buckets with 7 minimizer positions = 0.377841% +buckets with 8 minimizer positions = 0.278926% +buckets with 9 minimizer positions = 0.215933% +buckets with 10 minimizer positions = 0.171191% +buckets with 11 minimizer positions = 0.139152% +buckets with 12 minimizer positions = 0.116435% +buckets with 13 minimizer positions = 0.0976368% +buckets with 14 minimizer positions = 0.0839542% +buckets with 15 minimizer positions = 0.0727882% +buckets with 16 minimizer positions = 0.064557% +max_bucket_size 245177 +2025-10-22 19:52:26: saving data structure to disk... +2025-10-22 19:52:27: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log b/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log new file mode 100644 index 0000000..1de5d75 --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 725.615 +avg_nanosec_per_negative_lookup 827.258 +avg_nanosec_per_access 269.507 +iterator: avg_nanosec_per_kmer 3.09292 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 734.653 +avg_nanosec_per_negative_lookup 814.742 +avg_nanosec_per_access 259.998 +iterator: avg_nanosec_per_kmer 2.98297 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 728.479 +avg_nanosec_per_negative_lookup 808.392 +avg_nanosec_per_access 254.699 +iterator: avg_nanosec_per_kmer 3.14332 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 649.815 +avg_nanosec_per_negative_lookup 839.658 +avg_nanosec_per_access 234.242 +iterator: avg_nanosec_per_kmer 2.97374 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 668.364 +avg_nanosec_per_negative_lookup 839.46 +avg_nanosec_per_access 225.036 +iterator: avg_nanosec_per_kmer 2.94503 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 666.555 +avg_nanosec_per_negative_lookup 838.066 +avg_nanosec_per_access 223.988 +iterator: avg_nanosec_per_kmer 3.09782 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 908.953 +avg_nanosec_per_negative_lookup 1041.12 +avg_nanosec_per_access 293.449 +iterator: avg_nanosec_per_kmer 3.11285 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 914.293 +avg_nanosec_per_negative_lookup 1026.73 +avg_nanosec_per_access 290.706 +iterator: avg_nanosec_per_kmer 3.08455 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 903.423 +avg_nanosec_per_negative_lookup 1020.04 +avg_nanosec_per_access 299.17 +iterator: avg_nanosec_per_kmer 2.94884 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1301.15 +avg_nanosec_per_negative_lookup 1324.08 +avg_nanosec_per_access 620.661 +iterator: avg_nanosec_per_kmer 3.23553 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1316.73 +avg_nanosec_per_negative_lookup 1315.07 +avg_nanosec_per_access 633.006 +iterator: avg_nanosec_per_kmer 3.25937 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1320.82 +avg_nanosec_per_negative_lookup 1295.76 +avg_nanosec_per_access 633.214 +iterator: avg_nanosec_per_kmer 3.18149 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 1608.94 +avg_nanosec_per_negative_lookup 1124.2 +avg_nanosec_per_access 508.115 +iterator: avg_nanosec_per_kmer 3.1276 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 1610.69 +avg_nanosec_per_negative_lookup 1125.24 +avg_nanosec_per_access 501.268 +iterator: avg_nanosec_per_kmer 3.10151 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 1601.6 +avg_nanosec_per_negative_lookup 1136.42 +avg_nanosec_per_access 482.985 +iterator: avg_nanosec_per_kmer 3.21048 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1421.01 +avg_nanosec_per_negative_lookup 1103.72 +avg_nanosec_per_access 433.92 +iterator: avg_nanosec_per_kmer 3.07458 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1422.2 +avg_nanosec_per_negative_lookup 1111.88 +avg_nanosec_per_access 434.816 +iterator: avg_nanosec_per_kmer 3.00043 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1425.87 +avg_nanosec_per_negative_lookup 1108.87 +avg_nanosec_per_access 433.94 +iterator: avg_nanosec_per_kmer 2.97986 diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log b/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log new file mode 100644 index 0000000..0bab8fe --- /dev/null +++ b/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log @@ -0,0 +1,2101 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.52585 [sec] (2.74144 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.355252 [sec] (0.63827 [ns/kmer]) +=== step 1: 'parse file' 1.88118 [sec] (3.37986 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.04496 [sec] (3.67411 [ns/kmer]) +num_minimizers = 24306363 +num_minimizer_positions = 28148872 +num_super_kmers = 28148872 +building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.33686 [sec] (2.4019 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.11553 [sec] (2.00423 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.571707 [sec] (1.02717 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) +num_buckets_in_skew_index 3271/24306363 (0.0134574%) +max_bucket_size 414759 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) +num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) +computing minimizers offsets: 0.359595 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 +num_kmers_in_skew_index 14306719 (2.57044%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3558021 kmers; bits/key = 3.06724 + built positions[0] for 3558021 kmers; bits/key = 7.0001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... + built mphs[1] for 2129998 kmers; bits/key = 2.56007 + built positions[1] for 2129998 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... + built mphs[2] for 1247229 kmers; bits/key = 2.56071 + built positions[2] for 1247229 kmers; bits/key = 9.00028 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... + built mphs[3] for 1130328 kmers; bits/key = 2.56088 + built positions[3] for 1130328 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... + built mphs[4] for 1022110 kmers; bits/key = 2.41826 + built positions[4] for 1022110 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 + building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... + built mphs[5] for 790746 kmers; bits/key = 2.4189 + built positions[5] for 790746 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 + building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... + built mphs[6] for 666283 kmers; bits/key = 2.5622 + built positions[6] for 666283 kmers; bits/key = 13.0005 + lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3762004 kmers; bits/key = 2.9235 + built positions[7] for 3762004 kmers; bits/key = 19.0001 +computing skew index took: 4.94707 [sec] +=== step 3: 'build sparse and skew index' 5.34705 [sec] (9.60688 [ns/kmer]) +=== total_time 12.2973 [sec] (22.0942 [ns/kmer]) +total index size: 326233848 [B] -- 326.234 [MB] +SPACE BREAKDOWN: + mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.77918% + strings_offsets: 0.0514514 [bits/kmer] -- 1.09726% + control_codewords: 1.61581 [bits/kmer] -- 34.459% + mid_load_buckets: 0.236288 [bits/kmer] -- 5.03912% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.21497e-05% + strings: 2.21266 [bits/kmer] -- 47.1876% + skew_index: 0.442537 [bits/kmer] -- 9.43763% + weights: 2.6447e-06 [bits/kmer] -- 5.64013e-05% + -------------- + total: 4.68907 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.0459% +buckets with 2 minimizer positions = 2.25565% +buckets with 3 minimizer positions = 0.699874% +buckets with 4 minimizer positions = 0.315284% +buckets with 5 minimizer positions = 0.173597% +buckets with 6 minimizer positions = 0.108305% +buckets with 7 minimizer positions = 0.0716932% +buckets with 8 minimizer positions = 0.0520522% +buckets with 9 minimizer positions = 0.0388458% +buckets with 10 minimizer positions = 0.0301485% +buckets with 11 minimizer positions = 0.0240019% +buckets with 12 minimizer positions = 0.0204144% +buckets with 13 minimizer positions = 0.0165265% +buckets with 14 minimizer positions = 0.013984% +buckets with 15 minimizer positions = 0.0120051% +buckets with 16 minimizer positions = 0.00972996% +max_bucket_size 414759 +2025-10-22 19:38:42: saving data structure to disk... +2025-10-22 19:38:42: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.70251 [sec] (2.33933 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.537199 [sec] (0.465006 [ns/kmer]) +=== step 1: 'parse file' 3.23984 [sec] (2.80445 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 4.17705 [sec] (3.61571 [ns/kmer]) +num_minimizers = 55464592 +num_minimizer_positions = 56006004 +num_super_kmers = 56006004 +building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.59216 [sec] (2.24381 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.20356 [sec] (1.90743 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.10828 [sec] (0.959345 [ns/kmer]) +num_bits_per_offset = 36 +num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) +num_buckets_in_skew_index 490/55464592 (0.000883447%) +max_bucket_size 794 +log2_max_bucket_size 10 +skew index num_partitions 4 +num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) +num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) +computing minimizers offsets: 0.453547 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 +num_kmers_in_skew_index 1294137 (0.112022%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 + building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... + built mphs[0] for 604884 kmers; bits/key = 2.41964 + built positions[0] for 604884 kmers; bits/key = 7.00061 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 + building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... + built mphs[1] for 417805 kmers; bits/key = 2.42142 + built positions[1] for 417805 kmers; bits/key = 8.00082 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 + building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... + built mphs[2] for 221219 kmers; bits/key = 2.42569 + built positions[2] for 221219 kmers; bits/key = 9.00147 + lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... + built mphs[3] for 50229 kmers; bits/key = 2.45946 + built positions[3] for 50229 kmers; bits/key = 10.0073 +computing skew index took: 0.747187 [sec] +=== step 3: 'build sparse and skew index' 1.27939 [sec] (1.10746 [ns/kmer]) +=== total_time 14.6003 [sec] (12.6382 [ns/kmer]) +total index size: 573371308 [B] -- 573.371 [MB] +SPACE BREAKDOWN: + mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.48638% + strings_offsets: 0.0041807 [bits/kmer] -- 0.105293% + control_codewords: 1.7764 [bits/kmer] -- 44.7396% + mid_load_buckets: 0.0214122 [bits/kmer] -- 0.539276% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.67411e-05% + strings: 2.01672 [bits/kmer] -- 50.7921% + skew_index: 0.0133927 [bits/kmer] -- 0.337302% + weights: 1.27418e-06 [bits/kmer] -- 3.20909e-05% + -------------- + total: 3.97054 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.6239% +buckets with 2 minimizer positions = 0.253291% +buckets with 3 minimizer positions = 0.0530717% +buckets with 4 minimizer positions = 0.0227569% +buckets with 5 minimizer positions = 0.012325% +buckets with 6 minimizer positions = 0.00748405% +buckets with 7 minimizer positions = 0.00509695% +buckets with 8 minimizer positions = 0.00359148% +buckets with 9 minimizer positions = 0.00270803% +buckets with 10 minimizer positions = 0.0021383% +buckets with 11 minimizer positions = 0.00159201% +buckets with 12 minimizer positions = 0.00125666% +buckets with 13 minimizer positions = 0.00109619% +buckets with 14 minimizer positions = 0.000941141% +buckets with 15 minimizer positions = 0.000795102% +buckets with 16 minimizer positions = 0.000685122% +max_bucket_size 794 +2025-10-22 19:38:57: saving data structure to disk... +2025-10-22 19:38:57: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 7.01876 [sec] (2.53264 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.19082 [sec] (0.429694 [ns/kmer]) +=== step 1: 'parse file' 8.2097 [sec] (2.96238 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 10.1877 [sec] (3.67614 [ns/kmer]) +num_minimizers = 122838669 +num_minimizer_positions = 140756047 +num_super_kmers = 140756047 +building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.14116 [sec] (1.85513 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.25586 [sec] (1.89652 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.82724 [sec] (1.02018 [ns/kmer]) +num_bits_per_offset = 39 +num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) +num_buckets_in_skew_index 28203/122838669 (0.0229594%) +max_bucket_size 147936 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) +num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) +computing minimizers offsets: 1.60838 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 +num_kmers_in_skew_index 145458128 (5.2487%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 25196923 kmers; bits/key = 2.56001 + built positions[0] for 25196923 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21919654 kmers; bits/key = 2.60671 + built positions[1] for 21919654 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19634878 kmers; bits/key = 2.55594 + built positions[2] for 19634878 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 18051454 kmers; bits/key = 2.60116 + built positions[3] for 18051454 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17018125 kmers; bits/key = 2.58264 + built positions[4] for 17018125 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 14085569 kmers; bits/key = 2.54674 + built positions[5] for 14085569 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 9296403 kmers; bits/key = 2.72206 + built positions[6] for 9296403 kmers; bits/key = 13 + lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20255122 kmers; bits/key = 2.57505 + built positions[7] for 20255122 kmers; bits/key = 18 +computing skew index took: 18.6002 [sec] +=== step 3: 'build sparse and skew index' 20.439 [sec] (7.3752 [ns/kmer]) +=== total_time 52.0607 [sec] (18.7856 [ns/kmer]) +total index size: 1745357114 [B] -- 1745.36 [MB] +SPACE BREAKDOWN: + mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.48517% + strings_offsets: 0.0305175 [bits/kmer] -- 0.605705% + control_codewords: 1.773 [bits/kmer] -- 35.1901% + mid_load_buckets: 0.179068 [bits/kmer] -- 3.5541% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.5355e-05% + strings: 2.11826 [bits/kmer] -- 42.0426% + skew_index: 0.812294 [bits/kmer] -- 16.1222% + weights: 5.31156e-07 [bits/kmer] -- 1.05423e-05% + -------------- + total: 5.03835 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.4557% +buckets with 2 minimizer positions = 1.46862% +buckets with 3 minimizer positions = 0.405135% +buckets with 4 minimizer positions = 0.185188% +buckets with 5 minimizer positions = 0.10523% +buckets with 6 minimizer positions = 0.0680771% +buckets with 7 minimizer positions = 0.0480598% +buckets with 8 minimizer positions = 0.0352926% +buckets with 9 minimizer positions = 0.0271502% +buckets with 10 minimizer positions = 0.0217871% +buckets with 11 minimizer positions = 0.0176866% +buckets with 12 minimizer positions = 0.014607% +buckets with 13 minimizer positions = 0.0121411% +buckets with 14 minimizer positions = 0.0105985% +buckets with 15 minimizer positions = 0.00909811% +buckets with 16 minimizer positions = 0.00794457% +max_bucket_size 147936 +2025-10-22 19:39:50: saving data structure to disk... +2025-10-22 19:39:51: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.9859 [sec] (4.72193 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.82.bin'... +=== step 1.2: 'computing minimizers tuples' 6.66802 [sec] (1.12506 [ns/kmer]) +=== step 1: 'parse file' 34.654 [sec] (5.84701 [ns/kmer]) + == files to merge = 83 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 30.7528 [sec] (5.18879 [ns/kmer]) +num_minimizers = 274429863 +num_minimizer_positions = 406062800 +num_super_kmers = 406062800 +building minimizers MPHF with 64 threads and 92 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 11.5559 [sec] (1.94978 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.4428 [sec] (2.43688 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 8.45177 [sec] (1.42603 [ns/kmer]) +num_bits_per_offset = 41 +num_buckets_larger_than_1_not_in_skew_index 51299487/274429863 (18.6931%) +num_buckets_in_skew_index 131946/274429863 (0.04808%) +max_bucket_size 176220 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 146053805/406062800 (35.9683%) +num_minimizer_positions_of_buckets_in_skew_index 37010565/406062800 (9.11449%) +computing minimizers offsets: 9.19898 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 83316513 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 74231522 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 67271777 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 57125353 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 46013184 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 37921473 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 28349062 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 176220: 62824185 +num_kmers_in_skew_index 457053069 (7.71165%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 83316513 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[0] for 83316513 kmers; bits/key = 2.55669 + built positions[0] for 83316513 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 74231522 + building MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... + built mphs[1] for 74231522 kmers; bits/key = 2.57033 + built positions[1] for 74231522 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 67271777 + building MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... + built mphs[2] for 67271777 kmers; bits/key = 2.54468 + built positions[2] for 67271777 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 57125353 + building MPHF with 64 threads and 20 partitions (avg. partition size = 3000000)... + built mphs[3] for 57125353 kmers; bits/key = 2.53252 + built positions[3] for 57125353 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46013184 + building MPHF with 64 threads and 16 partitions (avg. partition size = 3000000)... + built mphs[4] for 46013184 kmers; bits/key = 2.53117 + built positions[4] for 46013184 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 37921473 + building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... + built mphs[5] for 37921473 kmers; bits/key = 2.56414 + built positions[5] for 37921473 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 28349062 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[6] for 28349062 kmers; bits/key = 2.56358 + built positions[6] for 28349062 kmers; bits/key = 13 + lower = 8192; upper = 176220; num_bits_per_pos = 18; num_kmers_in_partition = 62824185 + building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... + built mphs[7] for 62824185 kmers; bits/key = 2.55204 + built positions[7] for 62824185 kmers; bits/key = 18 +computing skew index took: 64.578 [sec] +=== step 3: 'build sparse and skew index' 74.5844 [sec] (12.5843 [ns/kmer]) +=== total_time 174.442 [sec] (29.4328 [ns/kmer]) +total index size: 5881909658 [B] -- 5881.91 [MB] +SPACE BREAKDOWN: + mphf: 0.131165 [bits/kmer] (2.83273 [bits/key]) -- 1.65207% + strings_offsets: 0.341727 [bits/kmer] -- 4.30418% + control_codewords: 1.94474 [bits/kmer] -- 24.4947% + mid_load_buckets: 1.01036 [bits/kmer] -- 12.7259% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.55634e-06% + strings: 3.2463 [bits/kmer] -- 40.8883% + skew_index: 1.26513 [bits/kmer] -- 15.9348% + weights: 2.48364e-07 [bits/kmer] -- 3.12824e-06% + -------------- + total: 7.93943 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 81.2588% +buckets with 2 minimizer positions = 13.7158% +buckets with 3 minimizer positions = 2.82467% +buckets with 4 minimizer positions = 0.819903% +buckets with 5 minimizer positions = 0.371916% +buckets with 6 minimizer positions = 0.218785% +buckets with 7 minimizer positions = 0.143859% +buckets with 8 minimizer positions = 0.101665% +buckets with 9 minimizer positions = 0.0751737% +buckets with 10 minimizer positions = 0.0573965% +buckets with 11 minimizer positions = 0.0451926% +buckets with 12 minimizer positions = 0.0368258% +buckets with 13 minimizer positions = 0.0299698% +buckets with 14 minimizer positions = 0.025193% +buckets with 15 minimizer positions = 0.0214499% +buckets with 16 minimizer positions = 0.0183803% +max_bucket_size 176220 +2025-10-22 19:42:47: saving data structure to disk... +2025-10-22 19:42:50: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 100000 sequences, 14595280 bases, 8395280 kmers +read 200000 sequences, 29023453 bases, 16623453 kmers +read 300000 sequences, 43790922 bases, 25190922 kmers +read 400000 sequences, 58362099 bases, 33562099 kmers +read 500000 sequences, 72908170 bases, 41908170 kmers +read 600000 sequences, 87446702 bases, 50246702 kmers +read 700000 sequences, 102099804 bases, 58699804 kmers +read 800000 sequences, 117134400 bases, 67534400 kmers +read 900000 sequences, 131713463 bases, 75913463 kmers +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 1100000 sequences, 161101660 bases, 92901660 kmers +read 1200000 sequences, 175910768 bases, 101510768 kmers +read 1300000 sequences, 190897904 bases, 110297904 kmers +read 1400000 sequences, 205802973 bases, 119002973 kmers +read 1500000 sequences, 221158148 bases, 128158148 kmers +read 1600000 sequences, 236346274 bases, 137146274 kmers +read 1700000 sequences, 251304432 bases, 145904432 kmers +read 1800000 sequences, 266473950 bases, 154873950 kmers +read 1900000 sequences, 281471604 bases, 163671604 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 2100000 sequences, 312420706 bases, 182220706 kmers +read 2200000 sequences, 327946210 bases, 191546210 kmers +read 2300000 sequences, 343525540 bases, 200925540 kmers +read 2400000 sequences, 358949847 bases, 210149847 kmers +read 2500000 sequences, 374380009 bases, 219380009 kmers +read 2600000 sequences, 390142304 bases, 228942304 kmers +read 2700000 sequences, 405642535 bases, 238242535 kmers +read 2800000 sequences, 421259989 bases, 247659989 kmers +read 2900000 sequences, 436893769 bases, 257093769 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 3100000 sequences, 468090902 bases, 275890902 kmers +read 3200000 sequences, 483923930 bases, 285523930 kmers +read 3300000 sequences, 499749509 bases, 295149509 kmers +read 3400000 sequences, 515726709 bases, 304926709 kmers +read 3500000 sequences, 532169207 bases, 315169207 kmers +read 3600000 sequences, 548394020 bases, 325194020 kmers +read 3700000 sequences, 564809686 bases, 335409686 kmers +read 3800000 sequences, 581403559 bases, 345803559 kmers +read 3900000 sequences, 597837340 bases, 356037340 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 4100000 sequences, 630803806 bases, 376603806 kmers +read 4200000 sequences, 647222216 bases, 386822216 kmers +read 4300000 sequences, 663750824 bases, 397150824 kmers +read 4400000 sequences, 680423234 bases, 407623234 kmers +read 4500000 sequences, 696967173 bases, 417967173 kmers +read 4600000 sequences, 714107161 bases, 428907161 kmers +read 4700000 sequences, 731190344 bases, 439790344 kmers +read 4800000 sequences, 748610325 bases, 451010325 kmers +read 4900000 sequences, 765806425 bases, 462006425 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 5100000 sequences, 800681271 bases, 484481271 kmers +read 5200000 sequences, 818515777 bases, 496115777 kmers +read 5300000 sequences, 836324012 bases, 507724012 kmers +read 5400000 sequences, 854771265 bases, 519971265 kmers +read 5500000 sequences, 873098069 bases, 532098069 kmers +read 5600000 sequences, 891182426 bases, 543982426 kmers +read 5700000 sequences, 910053448 bases, 556653448 kmers +read 5800000 sequences, 928444429 bases, 568844429 kmers +read 5900000 sequences, 947244294 bases, 581444294 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 6100000 sequences, 985974168 bases, 607774168 kmers +read 6200000 sequences, 1005630833 bases, 621230833 kmers +read 6300000 sequences, 1026020245 bases, 635420245 kmers +read 6400000 sequences, 1046696751 bases, 649896751 kmers +read 6500000 sequences, 1067596462 bases, 664596462 kmers +read 6600000 sequences, 1088718265 bases, 679518265 kmers +read 6700000 sequences, 1110387368 bases, 694987368 kmers +read 6800000 sequences, 1132578732 bases, 710978732 kmers +read 6900000 sequences, 1155047095 bases, 727247095 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 7100000 sequences, 1201726249 bases, 761526249 kmers +read 7200000 sequences, 1226646751 bases, 780246751 kmers +read 7300000 sequences, 1252079351 bases, 799479351 kmers +read 7400000 sequences, 1279261003 bases, 820461003 kmers +read 7500000 sequences, 1307802702 bases, 842802702 kmers +read 7600000 sequences, 1338212409 bases, 867012409 kmers +read 7700000 sequences, 1370354710 bases, 892954710 kmers +read 7800000 sequences, 1383049738 bases, 899449738 kmers +read 7900000 sequences, 1395810952 bases, 906010952 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 8100000 sequences, 1421220952 bases, 919020952 kmers +read 8200000 sequences, 1433887434 bases, 925487434 kmers +read 8300000 sequences, 1446445917 bases, 931845917 kmers +read 8400000 sequences, 1459153909 bases, 938353909 kmers +read 8500000 sequences, 1471877671 bases, 944877671 kmers +read 8600000 sequences, 1484865624 bases, 951665624 kmers +read 8700000 sequences, 1497567228 bases, 958167228 kmers +read 8800000 sequences, 1510543060 bases, 964943060 kmers +read 8900000 sequences, 1523371874 bases, 971571874 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 9100000 sequences, 1548860619 bases, 984660619 kmers +read 9200000 sequences, 1561712707 bases, 991312707 kmers +read 9300000 sequences, 1574401520 bases, 997801520 kmers +read 9400000 sequences, 1586885001 bases, 1004085001 kmers +read 9500000 sequences, 1599621412 bases, 1010621412 kmers +read 9600000 sequences, 1612397675 bases, 1017197675 kmers +read 9700000 sequences, 1625388385 bases, 1023988385 kmers +read 9800000 sequences, 1638536946 bases, 1030936946 kmers +read 9900000 sequences, 1651980650 bases, 1038180650 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 10100000 sequences, 1677570910 bases, 1051370910 kmers +read 10200000 sequences, 1690246890 bases, 1057846890 kmers +read 10300000 sequences, 1703230366 bases, 1064630366 kmers +read 10400000 sequences, 1716086552 bases, 1071286552 kmers +read 10500000 sequences, 1729082411 bases, 1078082411 kmers +read 10600000 sequences, 1741944091 bases, 1084744091 kmers +read 10700000 sequences, 1754780793 bases, 1091380793 kmers +read 10800000 sequences, 1767537304 bases, 1097937304 kmers +read 10900000 sequences, 1780512088 bases, 1104712088 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 11100000 sequences, 1807103354 bases, 1118903354 kmers +read 11200000 sequences, 1819865542 bases, 1125465542 kmers +read 11300000 sequences, 1832952701 bases, 1132352701 kmers +read 11400000 sequences, 1846108191 bases, 1139308191 kmers +read 11500000 sequences, 1859202023 bases, 1146202023 kmers +read 11600000 sequences, 1872125111 bases, 1152925111 kmers +read 11700000 sequences, 1884949294 bases, 1159549294 kmers +read 11800000 sequences, 1897879213 bases, 1166279213 kmers +read 11900000 sequences, 1910688502 bases, 1172888502 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 12100000 sequences, 1936528765 bases, 1186328765 kmers +read 12200000 sequences, 1949822939 bases, 1193422939 kmers +read 12300000 sequences, 1962607705 bases, 1200007705 kmers +read 12400000 sequences, 1975528951 bases, 1206728951 kmers +read 12500000 sequences, 1988356507 bases, 1213356507 kmers +read 12600000 sequences, 2001310116 bases, 1220110116 kmers +read 12700000 sequences, 2014316977 bases, 1226916977 kmers +read 12800000 sequences, 2027300676 bases, 1233700676 kmers +read 12900000 sequences, 2040283112 bases, 1240483112 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 13100000 sequences, 2066357392 bases, 1254157392 kmers +read 13200000 sequences, 2079514117 bases, 1261114117 kmers +read 13300000 sequences, 2092587055 bases, 1267987055 kmers +read 13400000 sequences, 2105687861 bases, 1274887861 kmers +read 13500000 sequences, 2118896002 bases, 1281896002 kmers +read 13600000 sequences, 2131841724 bases, 1288641724 kmers +read 13700000 sequences, 2144909308 bases, 1295509308 kmers +read 13800000 sequences, 2157799174 bases, 1302199174 kmers +read 13900000 sequences, 2170824760 bases, 1309024760 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 14100000 sequences, 2196888939 bases, 1322688939 kmers +read 14200000 sequences, 2209993052 bases, 1329593052 kmers +read 14300000 sequences, 2223177518 bases, 1336577518 kmers +read 14400000 sequences, 2236324767 bases, 1343524767 kmers +read 14500000 sequences, 2249926194 bases, 1350926194 kmers +read 14600000 sequences, 2263244067 bases, 1358044067 kmers +read 14700000 sequences, 2276666210 bases, 1365266210 kmers +read 14800000 sequences, 2289846389 bases, 1372246389 kmers +read 14900000 sequences, 2303142205 bases, 1379342205 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 15100000 sequences, 2329658257 bases, 1393458257 kmers +read 15200000 sequences, 2342799874 bases, 1400399874 kmers +read 15300000 sequences, 2355936598 bases, 1407336598 kmers +read 15400000 sequences, 2369202825 bases, 1414402825 kmers +read 15500000 sequences, 2382453933 bases, 1421453933 kmers +read 15600000 sequences, 2395606868 bases, 1428406868 kmers +read 15700000 sequences, 2408903524 bases, 1435503524 kmers +read 15800000 sequences, 2422488600 bases, 1442888600 kmers +read 15900000 sequences, 2435763741 bases, 1449963741 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 16100000 sequences, 2462152775 bases, 1463952775 kmers +read 16200000 sequences, 2475426803 bases, 1471026803 kmers +read 16300000 sequences, 2488985859 bases, 1478385859 kmers +read 16400000 sequences, 2502322646 bases, 1485522646 kmers +read 16500000 sequences, 2515682566 bases, 1492682566 kmers +read 16600000 sequences, 2529274259 bases, 1500074259 kmers +read 16700000 sequences, 2542622794 bases, 1507222794 kmers +read 16800000 sequences, 2556056912 bases, 1514456912 kmers +read 16900000 sequences, 2569267145 bases, 1521467145 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 17100000 sequences, 2596061102 bases, 1535861102 kmers +read 17200000 sequences, 2609459388 bases, 1543059388 kmers +read 17300000 sequences, 2622881245 bases, 1550281245 kmers +read 17400000 sequences, 2636336794 bases, 1557536794 kmers +read 17500000 sequences, 2649678629 bases, 1564678629 kmers +read 17600000 sequences, 2663341782 bases, 1572141782 kmers +read 17700000 sequences, 2676693590 bases, 1579293590 kmers +read 17800000 sequences, 2690200716 bases, 1586600716 kmers +read 17900000 sequences, 2703543489 bases, 1593743489 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 18100000 sequences, 2730783796 bases, 1608583796 kmers +read 18200000 sequences, 2744196467 bases, 1615796467 kmers +read 18300000 sequences, 2757894852 bases, 1623294852 kmers +read 18400000 sequences, 2771403521 bases, 1630603521 kmers +read 18500000 sequences, 2784930678 bases, 1637930678 kmers +read 18600000 sequences, 2798778608 bases, 1645578608 kmers +read 18700000 sequences, 2812434788 bases, 1653034788 kmers +read 18800000 sequences, 2826041925 bases, 1660441925 kmers +read 18900000 sequences, 2839594143 bases, 1667794143 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 19100000 sequences, 2866645368 bases, 1682445368 kmers +read 19200000 sequences, 2880162017 bases, 1689762017 kmers +read 19300000 sequences, 2893733500 bases, 1697133500 kmers +read 19400000 sequences, 2907861888 bases, 1705061888 kmers +read 19500000 sequences, 2921431859 bases, 1712431859 kmers +read 19600000 sequences, 2934950257 bases, 1719750257 kmers +read 19700000 sequences, 2948908590 bases, 1727508590 kmers +read 19800000 sequences, 2962655324 bases, 1735055324 kmers +read 19900000 sequences, 2976658842 bases, 1742858842 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 20100000 sequences, 3004463124 bases, 1758263124 kmers +read 20200000 sequences, 3018263669 bases, 1765863669 kmers +read 20300000 sequences, 3032235817 bases, 1773635817 kmers +read 20400000 sequences, 3045926851 bases, 1781126851 kmers +read 20500000 sequences, 3059718085 bases, 1788718085 kmers +read 20600000 sequences, 3073465760 bases, 1796265760 kmers +read 20700000 sequences, 3087374365 bases, 1803974365 kmers +read 20800000 sequences, 3101202279 bases, 1811602279 kmers +read 20900000 sequences, 3115301042 bases, 1819501042 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 21100000 sequences, 3143428950 bases, 1835228950 kmers +read 21200000 sequences, 3157337269 bases, 1842937269 kmers +read 21300000 sequences, 3171218453 bases, 1850618453 kmers +read 21400000 sequences, 3185386330 bases, 1858586330 kmers +read 21500000 sequences, 3199499619 bases, 1866499619 kmers +read 21600000 sequences, 3213699144 bases, 1874499144 kmers +read 21700000 sequences, 3227725083 bases, 1882325083 kmers +read 21800000 sequences, 3241636024 bases, 1890036024 kmers +read 21900000 sequences, 3255686690 bases, 1897886690 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 22100000 sequences, 3284189309 bases, 1913989309 kmers +read 22200000 sequences, 3298558467 bases, 1922158467 kmers +read 22300000 sequences, 3312627222 bases, 1930027222 kmers +read 22400000 sequences, 3326674715 bases, 1937874715 kmers +read 22500000 sequences, 3340769161 bases, 1945769161 kmers +read 22600000 sequences, 3355403951 bases, 1954203951 kmers +read 22700000 sequences, 3369592323 bases, 1962192323 kmers +read 22800000 sequences, 3383749832 bases, 1970149832 kmers +read 22900000 sequences, 3398280808 bases, 1978480808 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23100000 sequences, 3427105278 bases, 1994905278 kmers +read 23200000 sequences, 3441898165 bases, 2003498165 kmers +read 23300000 sequences, 3456307790 bases, 2011707790 kmers +read 23400000 sequences, 3470437552 bases, 2019637552 kmers +=== step 1.1: 'encoding input' 10.2453 [sec] (5.05279 [ns/kmer]) +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max_len 643923 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 20 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.10721 [sec] (0.546055 [ns/kmer]) +=== step 1: 'parse file' 11.3527 [sec] (5.59891 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 10.7525 [sec] (5.30294 [ns/kmer]) +num_minimizers = 76630489 +num_minimizer_positions = 141268659 +num_super_kmers = 141268659 +building minimizers MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.46423 [sec] (1.70849 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.74393 [sec] (2.33961 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.03839 [sec] (1.49848 [ns/kmer]) +num_bits_per_offset = 45 +num_buckets_larger_than_1_not_in_skew_index 12031601/76630489 (15.7008%) +num_buckets_in_skew_index 62262/76630489 (0.0812496%) +max_bucket_size 281880 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 66085279/141268659 (46.7799%) +num_minimizer_positions_of_buckets_in_skew_index 10646754/141268659 (7.53653%) +computing minimizers offsets: 3.40426 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 65292887 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16768176 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 6866326 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4652668 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4307414 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3858894 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5911410 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 281880: 31685511 +num_kmers_in_skew_index 139343286 (6.87214%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 65292887 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[0] for 65292887 kmers; bits/key = 2.55008 + built positions[0] for 65292887 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16768176 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16768176 kmers; bits/key = 2.56383 + built positions[1] for 16768176 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 6866326 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 6866326 kmers; bits/key = 2.72645 + built positions[2] for 6866326 kmers; bits/key = 9.00006 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4652668 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4652668 kmers; bits/key = 2.812 + built positions[3] for 4652668 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4307414 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4307414 kmers; bits/key = 2.80506 + built positions[4] for 4307414 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3858894 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3858894 kmers; bits/key = 3.08272 + built positions[5] for 3858894 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5911410 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 5911410 kmers; bits/key = 2.51936 + built positions[6] for 5911410 kmers; bits/key = 13.0001 + lower = 8192; upper = 281880; num_bits_per_pos = 19; num_kmers_in_partition = 31685511 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[7] for 31685511 kmers; bits/key = 2.52689 + built positions[7] for 31685511 kmers; bits/key = 19 +computing skew index took: 21.1257 [sec] +=== step 3: 'build sparse and skew index' 24.8069 [sec] (12.2343 [ns/kmer]) +=== total_time 58.1587 [sec] (28.6827 [ns/kmer]) +total index size: 2093414430 [B] -- 2093.41 [MB] +SPACE BREAKDOWN: + mphf: 0.108372 [bits/kmer] (2.86754 [bits/key]) -- 1.3121% + strings_offsets: 0.370467 [bits/kmer] -- 4.48537% + control_codewords: 1.73846 [bits/kmer] -- 21.0482% + mid_load_buckets: 1.46664 [bits/kmer] -- 17.7571% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.28021e-05% + strings: 3.43556 [bits/kmer] -- 41.5955% + skew_index: 1.13995 [bits/kmer] -- 13.8017% + weights: 7.25961e-07 [bits/kmer] -- 8.78947e-06% + -------------- + total: 8.25945 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 84.2179% +buckets with 2 minimizer positions = 7.76108% +buckets with 3 minimizer positions = 2.50949% +buckets with 4 minimizer positions = 1.23307% +buckets with 5 minimizer positions = 0.750442% +buckets with 6 minimizer positions = 0.516927% +buckets with 7 minimizer positions = 0.38172% +buckets with 8 minimizer positions = 0.296813% +buckets with 9 minimizer positions = 0.239214% +buckets with 10 minimizer positions = 0.197673% +buckets with 11 minimizer positions = 0.166211% +buckets with 12 minimizer positions = 0.142668% +buckets with 13 minimizer positions = 0.124415% +buckets with 14 minimizer positions = 0.108818% +buckets with 15 minimizer positions = 0.0962646% +buckets with 16 minimizer positions = 0.0863325% +max_bucket_size 281880 +2025-10-22 19:43:49: saving data structure to disk... +2025-10-22 19:43:50: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 100000 sequences, 29016680 bases, 22816680 kmers +read 200000 sequences, 59512851 bases, 47112851 kmers +read 300000 sequences, 93672898 bases, 75072898 kmers +read 400000 sequences, 116504758 bases, 91704758 kmers +read 500000 sequences, 129640784 bases, 98640784 kmers +read 600000 sequences, 142888339 bases, 105688339 kmers +read 700000 sequences, 156121559 bases, 112721559 kmers +read 800000 sequences, 169296181 bases, 119696181 kmers +read 900000 sequences, 182473664 bases, 126673664 kmers +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 1100000 sequences, 208767883 bases, 140567883 kmers +read 1200000 sequences, 222206242 bases, 147806242 kmers +read 1300000 sequences, 235299002 bases, 154699002 kmers +read 1400000 sequences, 248482676 bases, 161682676 kmers +read 1500000 sequences, 261589002 bases, 168589002 kmers +read 1600000 sequences, 275055224 bases, 175855224 kmers +read 1700000 sequences, 288035899 bases, 182635899 kmers +read 1800000 sequences, 301349839 bases, 189749839 kmers +read 1900000 sequences, 314875402 bases, 197075402 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 2100000 sequences, 341368638 bases, 211168638 kmers +read 2200000 sequences, 354712561 bases, 218312561 kmers +read 2300000 sequences, 368072063 bases, 225472063 kmers +read 2400000 sequences, 381369139 bases, 232569139 kmers +read 2500000 sequences, 395076735 bases, 240076735 kmers +read 2600000 sequences, 408571236 bases, 247371236 kmers +read 2700000 sequences, 421770941 bases, 254370941 kmers +read 2800000 sequences, 434931097 bases, 261331097 kmers +read 2900000 sequences, 448299063 bases, 268499063 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 3100000 sequences, 474884907 bases, 282684907 kmers +read 3200000 sequences, 488437875 bases, 290037875 kmers +read 3300000 sequences, 501681623 bases, 297081623 kmers +read 3400000 sequences, 514981749 bases, 304181749 kmers +read 3500000 sequences, 528308911 bases, 311308911 kmers +read 3600000 sequences, 541636977 bases, 318436977 kmers +read 3700000 sequences, 555162428 bases, 325762428 kmers +read 3800000 sequences, 568696864 bases, 333096864 kmers +read 3900000 sequences, 581917367 bases, 340117367 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 4100000 sequences, 608987326 bases, 354787326 kmers +read 4200000 sequences, 622285230 bases, 361885230 kmers +read 4300000 sequences, 635647937 bases, 369047937 kmers +read 4400000 sequences, 648992641 bases, 376192641 kmers +read 4500000 sequences, 662513085 bases, 383513085 kmers +read 4600000 sequences, 675930708 bases, 390730708 kmers +read 4700000 sequences, 689630997 bases, 398230997 kmers +read 4800000 sequences, 702998525 bases, 405398525 kmers +read 4900000 sequences, 716509106 bases, 412709106 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 5100000 sequences, 743782200 bases, 427582200 kmers +read 5200000 sequences, 757644345 bases, 435244345 kmers +read 5300000 sequences, 771125199 bases, 442525199 kmers +read 5400000 sequences, 784691064 bases, 449891064 kmers +read 5500000 sequences, 798294855 bases, 457294855 kmers +read 5600000 sequences, 811868593 bases, 464668593 kmers +read 5700000 sequences, 825311254 bases, 471911254 kmers +read 5800000 sequences, 838965535 bases, 479365535 kmers +read 5900000 sequences, 852651369 bases, 486851369 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 6100000 sequences, 879791139 bases, 501591139 kmers +read 6200000 sequences, 893568574 bases, 509168574 kmers +read 6300000 sequences, 907221132 bases, 516621132 kmers +read 6400000 sequences, 920850746 bases, 524050746 kmers +read 6500000 sequences, 934451496 bases, 531451496 kmers +read 6600000 sequences, 948058192 bases, 538858192 kmers +read 6700000 sequences, 961672076 bases, 546272076 kmers +read 6800000 sequences, 975396607 bases, 553796607 kmers +read 6900000 sequences, 989058970 bases, 561258970 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 7100000 sequences, 1016671875 bases, 576471875 kmers +read 7200000 sequences, 1030411659 bases, 584011659 kmers +read 7300000 sequences, 1044405182 bases, 591805182 kmers +read 7400000 sequences, 1058406016 bases, 599606016 kmers +read 7500000 sequences, 1072419258 bases, 607419258 kmers +read 7600000 sequences, 1086161571 bases, 614961571 kmers +read 7700000 sequences, 1100358439 bases, 622958439 kmers +read 7800000 sequences, 1114261097 bases, 630661097 kmers +read 7900000 sequences, 1128307808 bases, 638507808 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 8100000 sequences, 1156357087 bases, 654157087 kmers +read 8200000 sequences, 1170571919 bases, 662171919 kmers +read 8300000 sequences, 1184451177 bases, 669851177 kmers +read 8400000 sequences, 1198299415 bases, 677499415 kmers +read 8500000 sequences, 1212442446 bases, 685442446 kmers +read 8600000 sequences, 1226405386 bases, 693205386 kmers +read 8700000 sequences, 1240703127 bases, 701303127 kmers +read 8800000 sequences, 1254656983 bases, 709056983 kmers +read 8900000 sequences, 1268621397 bases, 716821397 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 9100000 sequences, 1297350868 bases, 733150868 kmers +read 9200000 sequences, 1311516008 bases, 741116008 kmers +read 9300000 sequences, 1325689722 bases, 749089722 kmers +read 9400000 sequences, 1339681966 bases, 756881966 kmers +read 9500000 sequences, 1353794378 bases, 764794378 kmers +read 9600000 sequences, 1368052593 bases, 772852593 kmers +read 9700000 sequences, 1382481060 bases, 781081060 kmers +read 9800000 sequences, 1397029165 bases, 789429165 kmers +read 9900000 sequences, 1411261935 bases, 797461935 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 10100000 sequences, 1439978158 bases, 813778158 kmers +read 10200000 sequences, 1454566042 bases, 822166042 kmers +read 10300000 sequences, 1469140008 bases, 830540008 kmers +read 10400000 sequences, 1483590209 bases, 838790209 kmers +read 10500000 sequences, 1497966729 bases, 846966729 kmers +read 10600000 sequences, 1512656712 bases, 855456712 kmers +read 10700000 sequences, 1527179954 bases, 863779954 kmers +read 10800000 sequences, 1541782827 bases, 872182827 kmers +read 10900000 sequences, 1556446263 bases, 880646263 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 11100000 sequences, 1585817113 bases, 897617113 kmers +read 11200000 sequences, 1600557391 bases, 906157391 kmers +read 11300000 sequences, 1615262703 bases, 914662703 kmers +read 11400000 sequences, 1629999627 bases, 923199627 kmers +read 11500000 sequences, 1644860568 bases, 931860568 kmers +read 11600000 sequences, 1659779614 bases, 940579614 kmers +read 11700000 sequences, 1674792374 bases, 949392374 kmers +read 11800000 sequences, 1689736749 bases, 958136749 kmers +read 11900000 sequences, 1704892610 bases, 967092610 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 12100000 sequences, 1735135576 bases, 984935576 kmers +read 12200000 sequences, 1750297083 bases, 993897083 kmers +read 12300000 sequences, 1765691330 bases, 1003091330 kmers +read 12400000 sequences, 1781168609 bases, 1012368609 kmers +read 12500000 sequences, 1796591819 bases, 1021591819 kmers +read 12600000 sequences, 1811901104 bases, 1030701104 kmers +read 12700000 sequences, 1827876510 bases, 1040476510 kmers +read 12800000 sequences, 1843393773 bases, 1049793773 kmers +read 12900000 sequences, 1858842782 bases, 1059042782 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 13100000 sequences, 1890244268 bases, 1078044268 kmers +read 13200000 sequences, 1905959273 bases, 1087559273 kmers +read 13300000 sequences, 1922228338 bases, 1097628338 kmers +read 13400000 sequences, 1938520111 bases, 1107720111 kmers +read 13500000 sequences, 1954665049 bases, 1117665049 kmers +read 13600000 sequences, 1970696591 bases, 1127496591 kmers +read 13700000 sequences, 1987164795 bases, 1137764795 kmers +read 13800000 sequences, 2003371475 bases, 1147771475 kmers +read 13900000 sequences, 2019649864 bases, 1157849864 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 14100000 sequences, 2052986091 bases, 1178786091 kmers +read 14200000 sequences, 2069712172 bases, 1189312172 kmers +read 14300000 sequences, 2086760589 bases, 1200160589 kmers +read 14400000 sequences, 2103719627 bases, 1210919627 kmers +read 14500000 sequences, 2120768565 bases, 1221768565 kmers +read 14600000 sequences, 2137973642 bases, 1232773642 kmers +read 14700000 sequences, 2155333528 bases, 1243933528 kmers +read 14800000 sequences, 2173029002 bases, 1255429002 kmers +read 14900000 sequences, 2190761957 bases, 1266961957 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 15100000 sequences, 2226994114 bases, 1290794114 kmers +read 15200000 sequences, 2245240873 bases, 1302840873 kmers +read 15300000 sequences, 2264078057 bases, 1315478057 kmers +read 15400000 sequences, 2282789468 bases, 1327989468 kmers +read 15500000 sequences, 2301835717 bases, 1340835717 kmers +read 15600000 sequences, 2321337137 bases, 1354137137 kmers +read 15700000 sequences, 2341431175 bases, 1368031175 kmers +read 15800000 sequences, 2361547906 bases, 1381947906 kmers +read 15900000 sequences, 2382126087 bases, 1396326087 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16100000 sequences, 2424934550 bases, 1426734550 kmers +read 16200000 sequences, 2447209476 bases, 1442809476 kmers +read 16300000 sequences, 2470231832 bases, 1459631832 kmers +read 16400000 sequences, 2494281037 bases, 1477481037 kmers +read 16500000 sequences, 2519161670 bases, 1496161670 kmers +read 16600000 sequences, 2545406869 bases, 1516206869 kmers +=== step 1.1: 'encoding input' 7.41505 [sec] (4.86264 [ns/kmer]) +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max_len 499189 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 19 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.848832 [sec] (0.556646 [ns/kmer]) +=== step 1: 'parse file' 8.26403 [sec] (5.41937 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 8.0502 [sec] (5.27915 [ns/kmer]) +num_minimizers = 61951224 +num_minimizer_positions = 105337248 +num_super_kmers = 105337248 +building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.92058 [sec] (1.91525 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.56979 [sec] (2.34099 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.21697 [sec] (1.45384 [ns/kmer]) +num_bits_per_offset = 43 +num_buckets_larger_than_1_not_in_skew_index 9999764/61951224 (16.1414%) +num_buckets_in_skew_index 36489/61951224 (0.0588996%) +max_bucket_size 144478 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 47622255/105337248 (45.2093%) +num_minimizer_positions_of_buckets_in_skew_index 5800022/105337248 (5.50615%) +computing minimizers offsets: 2.54015 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 32078766 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16092632 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 8174536 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3454318 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2781070 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2981930 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2815305 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 144478: 7418130 +num_kmers_in_skew_index 75796687 (4.97059%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 32078766 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[0] for 32078766 kmers; bits/key = 2.51437 + built positions[0] for 32078766 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16092632 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16092632 kmers; bits/key = 2.65398 + built positions[1] for 16092632 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8174536 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 8174536 kmers; bits/key = 2.61889 + built positions[2] for 8174536 kmers; bits/key = 9.00005 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3454318 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3454318 kmers; bits/key = 3.14686 + built positions[3] for 3454318 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2781070 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2781070)... + built mphs[4] for 2781070 kmers; bits/key = 2.55987 + built positions[4] for 2781070 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2981930 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2981930)... + built mphs[5] for 2981930 kmers; bits/key = 2.55978 + built positions[5] for 2981930 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2815305 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2815305)... + built mphs[6] for 2815305 kmers; bits/key = 2.55984 + built positions[6] for 2815305 kmers; bits/key = 13.0001 + lower = 8192; upper = 144478; num_bits_per_pos = 18; num_kmers_in_partition = 7418130 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[7] for 7418130 kmers; bits/key = 2.72795 + built positions[7] for 7418130 kmers; bits/key = 18.0001 +computing skew index took: 14.4216 [sec] +=== step 3: 'build sparse and skew index' 17.1651 [sec] (11.2565 [ns/kmer]) +=== total_time 42.1867 [sec] (27.6651 [ns/kmer]) +total index size: 1467612062 [B] -- 1467.61 [MB] +SPACE BREAKDOWN: + mphf: 0.116088 [bits/kmer] (2.85745 [bits/key]) -- 1.50774% + strings_offsets: 0.349116 [bits/kmer] -- 4.53431% + control_codewords: 1.78756 [bits/kmer] -- 23.2167% + mid_load_buckets: 1.34288 [bits/kmer] -- 17.4412% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.8261e-05% + strings: 3.35283 [bits/kmer] -- 43.5464% + skew_index: 0.750966 [bits/kmer] -- 9.75353% + weights: 9.65307e-07 [bits/kmer] -- 1.25374e-05% + -------------- + total: 7.69943 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 83.7998% +buckets with 2 minimizer positions = 8.4968% +buckets with 3 minimizer positions = 2.71676% +buckets with 4 minimizer positions = 1.2809% +buckets with 5 minimizer positions = 0.745569% +buckets with 6 minimizer positions = 0.487324% +buckets with 7 minimizer positions = 0.345178% +buckets with 8 minimizer positions = 0.259136% +buckets with 9 minimizer positions = 0.202319% +buckets with 10 minimizer positions = 0.163595% +buckets with 11 minimizer positions = 0.136582% +buckets with 12 minimizer positions = 0.116401% +buckets with 13 minimizer positions = 0.100962% +buckets with 14 minimizer positions = 0.0888166% +buckets with 15 minimizer positions = 0.0782793% +buckets with 16 minimizer positions = 0.0706992% +max_bucket_size 144478 +2025-10-22 19:44:33: saving data structure to disk... +2025-10-22 19:44:34: DONE diff --git a/benchmarks/results-22-10-25/k31/canon-bench.log b/benchmarks/results-22-10-25/k31/canon-bench.log new file mode 100644 index 0000000..2a9e45d --- /dev/null +++ b/benchmarks/results-22-10-25/k31/canon-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 490.001 +avg_nanosec_per_negative_lookup 363.626 +avg_nanosec_per_access 296.576 +iterator: avg_nanosec_per_kmer 2.61326 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 467.735 +avg_nanosec_per_negative_lookup 387.336 +avg_nanosec_per_access 279.748 +iterator: avg_nanosec_per_kmer 2.58 +./sshash bench -i cod.k31.canon.sshash +avg_nanosec_per_positive_lookup 482.938 +avg_nanosec_per_negative_lookup 373.025 +avg_nanosec_per_access 285.938 +iterator: avg_nanosec_per_kmer 2.56108 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 471.123 +avg_nanosec_per_negative_lookup 395.101 +avg_nanosec_per_access 285.146 +iterator: avg_nanosec_per_kmer 2.79883 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 446.361 +avg_nanosec_per_negative_lookup 411.512 +avg_nanosec_per_access 278.263 +iterator: avg_nanosec_per_kmer 2.64528 +./sshash bench -i kestrel.k31.canon.sshash +avg_nanosec_per_positive_lookup 452.706 +avg_nanosec_per_negative_lookup 409.562 +avg_nanosec_per_access 283.325 +iterator: avg_nanosec_per_kmer 2.61142 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 650.548 +avg_nanosec_per_negative_lookup 451.696 +avg_nanosec_per_access 355.356 +iterator: avg_nanosec_per_kmer 2.60496 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 654.33 +avg_nanosec_per_negative_lookup 429.121 +avg_nanosec_per_access 369.249 +iterator: avg_nanosec_per_kmer 2.70813 +./sshash bench -i human.k31.canon.sshash +avg_nanosec_per_positive_lookup 655.352 +avg_nanosec_per_negative_lookup 437.184 +avg_nanosec_per_access 377.19 +iterator: avg_nanosec_per_kmer 2.67443 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 869.684 +avg_nanosec_per_negative_lookup 475.705 +avg_nanosec_per_access 565.996 +iterator: avg_nanosec_per_kmer 2.54627 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 865.621 +avg_nanosec_per_negative_lookup 499.274 +avg_nanosec_per_access 547.339 +iterator: avg_nanosec_per_kmer 2.71205 +./sshash bench -i hprc.k31.canon.sshash +avg_nanosec_per_positive_lookup 865.477 +avg_nanosec_per_negative_lookup 498.415 +avg_nanosec_per_access 575.876 +iterator: avg_nanosec_per_kmer 2.68009 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 887.109 +avg_nanosec_per_negative_lookup 432.255 +avg_nanosec_per_access 393.194 +iterator: avg_nanosec_per_kmer 2.58167 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 896.531 +avg_nanosec_per_negative_lookup 416.519 +avg_nanosec_per_access 419.574 +iterator: avg_nanosec_per_kmer 2.63357 +./sshash bench -i ec.k31.canon.sshash +avg_nanosec_per_positive_lookup 897.833 +avg_nanosec_per_negative_lookup 427.088 +avg_nanosec_per_access 387.424 +iterator: avg_nanosec_per_kmer 2.56043 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 776.793 +avg_nanosec_per_negative_lookup 417.866 +avg_nanosec_per_access 372.162 +iterator: avg_nanosec_per_kmer 2.50114 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 780.562 +avg_nanosec_per_negative_lookup 406.663 +avg_nanosec_per_access 391.707 +iterator: avg_nanosec_per_kmer 2.56239 +./sshash bench -i se.k31.canon.sshash +avg_nanosec_per_positive_lookup 786.172 +avg_nanosec_per_negative_lookup 429.785 +avg_nanosec_per_access 362.01 +iterator: avg_nanosec_per_kmer 2.50344 diff --git a/benchmarks/results-22-10-25/k31/canon-build.log b/benchmarks/results-22-10-25/k31/canon-build.log new file mode 100644 index 0000000..c137418 --- /dev/null +++ b/benchmarks/results-22-10-25/k31/canon-build.log @@ -0,0 +1,2285 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.50844 [sec] (3.00209 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.753351 [sec] (1.49931 [ns/kmer]) +=== step 1: 'parse file' 2.2619 [sec] (4.5016 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 7.2128 [sec] (14.3548 [ns/kmer]) +num_minimizers = 86163506 +num_minimizer_positions = 94463730 +num_super_kmers = 98209779 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.83684 [sec] (7.63602 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75822 [sec] (7.47957 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.20955 [sec] (4.39741 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 2988605/86163506 (3.46853%) +num_buckets_in_skew_index 5810/86163506 (0.00674299%) +max_bucket_size 68577 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 10013861/94463730 (10.6007%) +num_minimizer_positions_of_buckets_in_skew_index 1280778/94463730 (1.35584%) +computing minimizers offsets: 1.1862 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1643143 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1178275 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 956038 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 605533 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 425543 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 382297 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 254872 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 68577: 624986 +num_kmers_in_skew_index 6070687 (1.20818%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1643143 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1643143)... + built mphs[0] for 1643143 kmers; bits/key = 2.56038 + built positions[0] for 1643143 kmers; bits/key = 7.0002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1178275 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1178275)... + built mphs[1] for 1178275 kmers; bits/key = 2.41806 + built positions[1] for 1178275 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 956038 + building MPHF with 64 threads and 1 partitions (avg. partition size = 956038)... + built mphs[2] for 956038 kmers; bits/key = 2.56129 + built positions[2] for 956038 kmers; bits/key = 9.00035 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 605533 + building MPHF with 64 threads and 1 partitions (avg. partition size = 605533)... + built mphs[3] for 605533 kmers; bits/key = 2.41961 + built positions[3] for 605533 kmers; bits/key = 10.0006 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 425543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 425543)... + built mphs[4] for 425543 kmers; bits/key = 2.42126 + built positions[4] for 425543 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 382297 + building MPHF with 64 threads and 1 partitions (avg. partition size = 382297)... + built mphs[5] for 382297 kmers; bits/key = 2.42153 + built positions[5] for 382297 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 254872 + building MPHF with 64 threads and 1 partitions (avg. partition size = 254872)... + built mphs[6] for 254872 kmers; bits/key = 2.56712 + built positions[6] for 254872 kmers; bits/key = 13.0013 + lower = 8192; upper = 68577; num_bits_per_pos = 17; num_kmers_in_partition = 624986 + building MPHF with 64 threads and 1 partitions (avg. partition size = 624986)... + built mphs[7] for 624986 kmers; bits/key = 2.41943 + built positions[7] for 624986 kmers; bits/key = 17.0005 +computing skew index took: 3.31214 [sec] +=== step 3: 'build sparse and skew index' 4.6292 [sec] (9.21297 [ns/kmer]) +=== total_time 23.9085 [sec] (47.5824 [ns/kmer]) +total index size: 566181073 [B] -- 566.181 [MB] +SPACE BREAKDOWN: + mphf: 0.487029 [bits/kmer] (2.84013 [bits/key]) -- 5.40276% + strings_offsets: 0.144419 [bits/kmer] -- 1.60208% + control_codewords: 5.31593 [bits/kmer] -- 58.9712% + mid_load_buckets: 0.597885 [bits/kmer] -- 6.63251% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.73347e-05% + strings: 2.24566 [bits/kmer] -- 24.9118% + skew_index: 0.223525 [bits/kmer] -- 2.47963% + weights: 2.92956e-06 [bits/kmer] -- 3.24984e-05% + -------------- + total: 9.01445 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.5247% +buckets with 2 minimizer positions = 2.16597% +buckets with 3 minimizer positions = 0.599947% +buckets with 4 minimizer positions = 0.247865% +buckets with 5 minimizer positions = 0.129293% +buckets with 6 minimizer positions = 0.0768388% +buckets with 7 minimizer positions = 0.0512653% +buckets with 8 minimizer positions = 0.0353688% +buckets with 9 minimizer positions = 0.0260667% +buckets with 10 minimizer positions = 0.0199121% +buckets with 11 minimizer positions = 0.0157805% +buckets with 12 minimizer positions = 0.0127513% +buckets with 13 minimizer positions = 0.0102503% +buckets with 14 minimizer positions = 0.00880535% +buckets with 15 minimizer positions = 0.0074347% +buckets with 16 minimizer positions = 0.00615574% +max_bucket_size 68577 +2025-10-22 15:39:03: saving data structure to disk... +2025-10-22 15:39:03: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.75159 [sec] (2.39186 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.50493 [sec] (1.30818 [ns/kmer]) +=== step 1: 'parse file' 4.25662 [sec] (3.70013 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 15.8878 [sec] (13.8107 [ns/kmer]) +num_minimizers = 209937048 +num_minimizer_positions = 213990360 +num_super_kmers = 222970482 +building minimizers MPHF with 64 threads and 70 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 9.19805 [sec] (7.99553 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.85452 [sec] (7.69691 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 6.14877 [sec] (5.3449 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 2035626/209937048 (0.969636%) +num_buckets_in_skew_index 2517/209937048 (0.00119893%) +max_bucket_size 5316 +log2_max_bucket_size 13 +skew index num_partitions 7 +num_minimizer_positions_of_buckets_larger_than_1 5736623/213990360 (2.68079%) +num_minimizer_positions_of_buckets_in_skew_index 354832/213990360 (0.165817%) +computing minimizers offsets: 1.89353 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 846431 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 463901 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 298968 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 116879 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 120430 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 42891 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 5316: 9813 +num_kmers_in_skew_index 1899313 (0.1651%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 846431 + building MPHF with 64 threads and 1 partitions (avg. partition size = 846431)... + built mphs[0] for 846431 kmers; bits/key = 2.41876 + built positions[0] for 846431 kmers; bits/key = 7.00042 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 463901 + building MPHF with 64 threads and 1 partitions (avg. partition size = 463901)... + built mphs[1] for 463901 kmers; bits/key = 2.42059 + built positions[1] for 463901 kmers; bits/key = 8.00074 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 298968 + building MPHF with 64 threads and 1 partitions (avg. partition size = 298968)... + built mphs[2] for 298968 kmers; bits/key = 2.42332 + built positions[2] for 298968 kmers; bits/key = 9.0012 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 116879 + building MPHF with 64 threads and 1 partitions (avg. partition size = 116879)... + built mphs[3] for 116879 kmers; bits/key = 2.57716 + built positions[3] for 116879 kmers; bits/key = 10.0031 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 120430 + building MPHF with 64 threads and 1 partitions (avg. partition size = 120430)... + built mphs[4] for 120430 kmers; bits/key = 2.43408 + built positions[4] for 120430 kmers; bits/key = 11.0027 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 42891 + building MPHF with 64 threads and 1 partitions (avg. partition size = 42891)... + built mphs[5] for 42891 kmers; bits/key = 2.46579 + built positions[5] for 42891 kmers; bits/key = 12.0089 + lower = 4096; upper = 5316; num_bits_per_pos = 13; num_kmers_in_partition = 9813 + building MPHF with 64 threads and 1 partitions (avg. partition size = 9813)... + built mphs[6] for 9813 kmers; bits/key = 2.48487 + built positions[6] for 9813 kmers; bits/key = 13.0374 +computing skew index took: 1.07048 [sec] +=== step 3: 'build sparse and skew index' 3.24932 [sec] (2.82451 [ns/kmer]) +=== total_time 47.5951 [sec] (41.3726 [ns/kmer]) +total index size: 1246156067 [B] -- 1246.16 [MB] +SPACE BREAKDOWN: + mphf: 0.514173 [bits/kmer] (2.81753 [bits/key]) -- 5.93329% + strings_offsets: 0.100021 [bits/kmer] -- 1.15419% + control_codewords: 5.8397 [bits/kmer] -- 67.3871% + mid_load_buckets: 0.154586 [bits/kmer] -- 1.78384% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.15061e-05% + strings: 2.0304 [bits/kmer] -- 23.4298% + skew_index: 0.0270208 [bits/kmer] -- 0.311806% + weights: 1.27956e-06 [bits/kmer] -- 1.47654e-05% + -------------- + total: 8.6659 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.0292% +buckets with 2 minimizer positions = 0.755504% +buckets with 3 minimizer positions = 0.0986639% +buckets with 4 minimizer positions = 0.0387669% +buckets with 5 minimizer positions = 0.0208944% +buckets with 6 minimizer positions = 0.0129548% +buckets with 7 minimizer positions = 0.00864497% +buckets with 8 minimizer positions = 0.00604515% +buckets with 9 minimizer positions = 0.00458137% +buckets with 10 minimizer positions = 0.00347628% +buckets with 11 minimizer positions = 0.00277321% +buckets with 12 minimizer positions = 0.00222448% +buckets with 13 minimizer positions = 0.00183484% +buckets with 14 minimizer positions = 0.00150569% +buckets with 15 minimizer positions = 0.00123418% +buckets with 16 minimizer positions = 0.00103317% +max_bucket_size 5316 +2025-10-22 15:39:52: saving data structure to disk... +2025-10-22 15:39:53: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.46522 [sec] (2.97932 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.101.bin'... +=== step 1.2: 'computing minimizers tuples' 3.57549 [sec] (1.42695 [ns/kmer]) +=== step 1: 'parse file' 11.0408 [sec] (4.40632 [ns/kmer]) + == files to merge = 102 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.1: 'merging minimizers tuples' 40.4007 [sec] (16.1236 [ns/kmer]) +num_minimizers = 462224926 +num_minimizer_positions = 511201278 +num_super_kmers = 531186741 +building minimizers MPHF with 64 threads and 155 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 20.0466 [sec] (8.00046 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 19.9375 [sec] (7.95693 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.4: 'merging minimizers tuples ' 25.5011 [sec] (10.1773 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 14266506/462224926 (3.08649%) +num_buckets_in_skew_index 60557/462224926 (0.0131012%) +max_bucket_size 22085 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 53165974/511201278 (10.4002%) +num_minimizer_positions_of_buckets_in_skew_index 10137441/511201278 (1.98306%) +computing minimizers offsets: 6.36281 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 14957205 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 10906495 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 7473094 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4774535 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2638087 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1593261 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 729770 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22085: 506148 +num_kmers_in_skew_index 43578595 (1.73919%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 14957205 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[0] for 14957205 kmers; bits/key = 2.56583 + built positions[0] for 14957205 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10906495 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[1] for 10906495 kmers; bits/key = 2.61744 + built positions[1] for 10906495 kmers; bits/key = 8.00003 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 7473094 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 7473094 kmers; bits/key = 2.65359 + built positions[2] for 7473094 kmers; bits/key = 9.00004 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4774535 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4774535 kmers; bits/key = 2.75085 + built positions[3] for 4774535 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2638087 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2638087)... + built mphs[4] for 2638087 kmers; bits/key = 2.55989 + built positions[4] for 2638087 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1593261 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1593261)... + built mphs[5] for 1593261 kmers; bits/key = 2.56041 + built positions[5] for 1593261 kmers; bits/key = 12.0002 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 729770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 729770)... + built mphs[6] for 729770 kmers; bits/key = 2.56195 + built positions[6] for 729770 kmers; bits/key = 13.0005 + lower = 8192; upper = 22085; num_bits_per_pos = 15; num_kmers_in_partition = 506148 + building MPHF with 64 threads and 1 partitions (avg. partition size = 506148)... + built mphs[7] for 506148 kmers; bits/key = 2.42048 + built positions[7] for 506148 kmers; bits/key = 15.0007 +computing skew index took: 9.23161 [sec] +=== step 3: 'build sparse and skew index' 16.3315 [sec] (6.51779 [ns/kmer]) +=== total_time 133.258 [sec] (53.1825 [ns/kmer]) +total index size: 3135788870 [B] -- 3135.79 [MB] +SPACE BREAKDOWN: + mphf: 0.523236 [bits/kmer] (2.83641 [bits/key]) -- 5.2262% + strings_offsets: 0.153147 [bits/kmer] -- 1.52966% + control_codewords: 6.08754 [bits/kmer] -- 60.8038% + mid_load_buckets: 0.678982 [bits/kmer] -- 6.78183% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.54649e-06% + strings: 2.24545 [bits/kmer] -- 22.4281% + skew_index: 0.323422 [bits/kmer] -- 3.23041% + weights: 5.87466e-07 [bits/kmer] -- 5.86774e-06% + -------------- + total: 10.0118 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.9004% +buckets with 2 minimizer positions = 1.89323% +buckets with 3 minimizer positions = 0.481205% +buckets with 4 minimizer positions = 0.215066% +buckets with 5 minimizer positions = 0.121924% +buckets with 6 minimizer positions = 0.0781816% +buckets with 7 minimizer positions = 0.0541282% +buckets with 8 minimizer positions = 0.0394014% +buckets with 9 minimizer positions = 0.0296871% +buckets with 10 minimizer positions = 0.0233579% +buckets with 11 minimizer positions = 0.0188211% +buckets with 12 minimizer positions = 0.0152856% +buckets with 13 minimizer positions = 0.0127754% +buckets with 14 minimizer positions = 0.0106204% +buckets with 15 minimizer positions = 0.00907826% +buckets with 16 minimizer positions = 0.0079457% +max_bucket_size 22085 +2025-10-22 15:42:08: saving data structure to disk... +2025-10-22 15:42:10: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.4034 [sec] (4.6807 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.113.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.114.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.115.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.116.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.117.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.118.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.119.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.120.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.121.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.122.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.123.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.124.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.125.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.126.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.127.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.128.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.129.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.130.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.131.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.132.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.133.bin'... +=== step 1.2: 'computing minimizers tuples' 9.78668 [sec] (2.63216 [ns/kmer]) +=== step 1: 'parse file' 27.1902 [sec] (7.31288 [ns/kmer]) + == files to merge = 134 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +num_super_kmers = 800000000 +=== step 2.1: 'merging minimizers tuples' 66.2394 [sec] (17.8153 [ns/kmer]) +num_minimizers = 619508590 +num_minimizer_positions = 790834640 +num_super_kmers = 819080133 +building minimizers MPHF with 64 threads and 207 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 25.8872 [sec] (6.96243 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 28.2671 [sec] (7.60251 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +num_super_kmers = 700000000 +num_super_kmers = 750000000 +num_super_kmers = 800000000 +=== step 2.4: 'merging minimizers tuples ' 29.9639 [sec] (8.05888 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 81104016/619508590 (13.0917%) +num_buckets_in_skew_index 149851/619508590 (0.0241887%) +max_bucket_size 71241 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 225181159/790834640 (28.4739%) +num_minimizer_positions_of_buckets_in_skew_index 27398758/790834640 (3.46454%) +computing minimizers offsets: 16.0013 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 35558914 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26726484 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19151665 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 12830346 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 8265693 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 5225188 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 3257832 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71241: 4228970 +num_kmers_in_skew_index 115245092 (3.09955%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 35558914 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[0] for 35558914 kmers; bits/key = 2.57422 + built positions[0] for 35558914 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26726484 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26726484 kmers; bits/key = 2.5656 + built positions[1] for 26726484 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19151665 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19151665 kmers; bits/key = 2.60993 + built positions[2] for 19151665 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 12830346 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[3] for 12830346 kmers; bits/key = 2.65495 + built positions[3] for 12830346 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8265693 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[4] for 8265693 kmers; bits/key = 2.59459 + built positions[4] for 8265693 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 5225188 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 5225188 kmers; bits/key = 2.63154 + built positions[5] for 5225188 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 3257832 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 3257832 kmers; bits/key = 3.31153 + built positions[6] for 3257832 kmers; bits/key = 13.0001 + lower = 8192; upper = 71241; num_bits_per_pos = 17; num_kmers_in_partition = 4228970 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4228970 kmers; bits/key = 2.84935 + built positions[7] for 4228970 kmers; bits/key = 17.0001 +computing skew index took: 16.4974 [sec] +=== step 3: 'build sparse and skew index' 33.9205 [sec] (9.12301 [ns/kmer]) +=== total_time 211.468 [sec] (56.875 [ns/kmer]) +total index size: 5544019780 [B] -- 5544.02 [MB] +SPACE BREAKDOWN: + mphf: 0.472233 [bits/kmer] (2.83421 [bits/key]) -- 3.95881% + strings_offsets: 0.300083 [bits/kmer] -- 2.51565% + control_codewords: 5.66504 [bits/kmer] -- 47.491% + mid_load_buckets: 1.99858 [bits/kmer] -- 16.7545% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.83404e-06% + strings: 2.8909 [bits/kmer] -- 24.2349% + skew_index: 0.601813 [bits/kmer] -- 5.04511% + weights: 3.95899e-07 [bits/kmer] -- 3.31889e-06% + -------------- + total: 11.9286 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 86.8841% +buckets with 2 minimizer positions = 10.1608% +buckets with 3 minimizer positions = 1.5937% +buckets with 4 minimizer positions = 0.465965% +buckets with 5 minimizer positions = 0.227622% +buckets with 6 minimizer positions = 0.138122% +buckets with 7 minimizer positions = 0.0932371% +buckets with 8 minimizer positions = 0.0672932% +buckets with 9 minimizer positions = 0.0507686% +buckets with 10 minimizer positions = 0.0394317% +buckets with 11 minimizer positions = 0.0314958% +buckets with 12 minimizer positions = 0.025655% +buckets with 13 minimizer positions = 0.0213997% +buckets with 14 minimizer positions = 0.017952% +buckets with 15 minimizer positions = 0.0152708% +buckets with 16 minimizer positions = 0.0132381% +max_bucket_size 71241 +2025-10-22 15:45:44: saving data structure to disk... +2025-10-22 15:45:47: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 100000 sequences, 12802319 bases, 9802319 kmers +read 200000 sequences, 26155680 bases, 20155680 kmers +read 300000 sequences, 39727315 bases, 30727315 kmers +read 400000 sequences, 53567543 bases, 41567543 kmers +read 500000 sequences, 68009750 bases, 53009750 kmers +read 600000 sequences, 83050731 bases, 65050731 kmers +read 700000 sequences, 98819486 bases, 77819486 kmers +read 800000 sequences, 116043186 bases, 92043186 kmers +read 900000 sequences, 134201454 bases, 107201454 kmers +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 1100000 sequences, 174787795 bases, 141787795 kmers +read 1200000 sequences, 183806919 bases, 147806919 kmers +read 1300000 sequences, 190658371 bases, 151658371 kmers +read 1400000 sequences, 197393762 bases, 155393762 kmers +read 1500000 sequences, 204308958 bases, 159308958 kmers +read 1600000 sequences, 211178004 bases, 163178004 kmers +read 1700000 sequences, 217938129 bases, 166938129 kmers +read 1800000 sequences, 224728931 bases, 170728931 kmers +read 1900000 sequences, 231435055 bases, 174435055 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 2100000 sequences, 245162304 bases, 182162304 kmers +read 2200000 sequences, 251968534 bases, 185968534 kmers +read 2300000 sequences, 258797784 bases, 189797784 kmers +read 2400000 sequences, 265681419 bases, 193681419 kmers +read 2500000 sequences, 272480771 bases, 197480771 kmers +read 2600000 sequences, 279327274 bases, 201327274 kmers +read 2700000 sequences, 286169897 bases, 205169897 kmers +read 2800000 sequences, 293063897 bases, 209063897 kmers +read 2900000 sequences, 299941531 bases, 212941531 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 3100000 sequences, 313725925 bases, 220725925 kmers +read 3200000 sequences, 320629887 bases, 224629887 kmers +read 3300000 sequences, 327545193 bases, 228545193 kmers +read 3400000 sequences, 334471610 bases, 232471610 kmers +read 3500000 sequences, 341603766 bases, 236603766 kmers +read 3600000 sequences, 348399690 bases, 240399690 kmers +read 3700000 sequences, 355270676 bases, 244270676 kmers +read 3800000 sequences, 362436143 bases, 248436143 kmers +read 3900000 sequences, 369341114 bases, 252341114 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 4100000 sequences, 383163199 bases, 260163199 kmers +read 4200000 sequences, 390047987 bases, 264047987 kmers +read 4300000 sequences, 396880438 bases, 267880438 kmers +read 4400000 sequences, 403776565 bases, 271776565 kmers +read 4500000 sequences, 410576367 bases, 275576367 kmers +read 4600000 sequences, 417377049 bases, 279377049 kmers +read 4700000 sequences, 424274495 bases, 283274495 kmers +read 4800000 sequences, 431192311 bases, 287192311 kmers +read 4900000 sequences, 438257785 bases, 291257785 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 5100000 sequences, 452307732 bases, 299307732 kmers +read 5200000 sequences, 459344438 bases, 303344438 kmers +read 5300000 sequences, 466255981 bases, 307255981 kmers +read 5400000 sequences, 473220156 bases, 311220156 kmers +read 5500000 sequences, 480178864 bases, 315178864 kmers +read 5600000 sequences, 487198091 bases, 319198091 kmers +read 5700000 sequences, 494051268 bases, 323051268 kmers +read 5800000 sequences, 501294774 bases, 327294774 kmers +read 5900000 sequences, 508386191 bases, 331386191 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 6100000 sequences, 522265327 bases, 339265327 kmers +read 6200000 sequences, 529435219 bases, 343435219 kmers +read 6300000 sequences, 536513892 bases, 347513892 kmers +read 6400000 sequences, 543669227 bases, 351669227 kmers +read 6500000 sequences, 550654427 bases, 355654427 kmers +read 6600000 sequences, 557665979 bases, 359665979 kmers +read 6700000 sequences, 564815722 bases, 363815722 kmers +read 6800000 sequences, 571787007 bases, 367787007 kmers +read 6900000 sequences, 578923485 bases, 371923485 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 7100000 sequences, 593247546 bases, 380247546 kmers +read 7200000 sequences, 600225954 bases, 384225954 kmers +read 7300000 sequences, 607331027 bases, 388331027 kmers +read 7400000 sequences, 614417238 bases, 392417238 kmers +read 7500000 sequences, 621494916 bases, 396494916 kmers +read 7600000 sequences, 628713296 bases, 400713296 kmers +read 7700000 sequences, 635875916 bases, 404875916 kmers +read 7800000 sequences, 643000132 bases, 409000132 kmers +read 7900000 sequences, 650054935 bases, 413054935 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 8100000 sequences, 664392690 bases, 421392690 kmers +read 8200000 sequences, 671575430 bases, 425575430 kmers +read 8300000 sequences, 678822397 bases, 429822397 kmers +read 8400000 sequences, 685932522 bases, 433932522 kmers +read 8500000 sequences, 693003257 bases, 438003257 kmers +read 8600000 sequences, 700264806 bases, 442264806 kmers +read 8700000 sequences, 707441916 bases, 446441916 kmers +read 8800000 sequences, 714783716 bases, 450783716 kmers +read 8900000 sequences, 722048687 bases, 455048687 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 9100000 sequences, 736820834 bases, 463820834 kmers +read 9200000 sequences, 744240551 bases, 468240551 kmers +read 9300000 sequences, 751532385 bases, 472532385 kmers +read 9400000 sequences, 758908308 bases, 476908308 kmers +read 9500000 sequences, 766152765 bases, 481152765 kmers +read 9600000 sequences, 773460104 bases, 485460104 kmers +read 9700000 sequences, 780744999 bases, 489744999 kmers +read 9800000 sequences, 788046688 bases, 494046688 kmers +read 9900000 sequences, 795444088 bases, 498444088 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 10100000 sequences, 810379702 bases, 507379702 kmers +read 10200000 sequences, 817713311 bases, 511713311 kmers +read 10300000 sequences, 825011133 bases, 516011133 kmers +read 10400000 sequences, 832292513 bases, 520292513 kmers +read 10500000 sequences, 839612784 bases, 524612784 kmers +read 10600000 sequences, 847027439 bases, 529027439 kmers +read 10700000 sequences, 854363725 bases, 533363725 kmers +read 10800000 sequences, 861721984 bases, 537721984 kmers +read 10900000 sequences, 869045250 bases, 542045250 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 11100000 sequences, 883866002 bases, 550866002 kmers +read 11200000 sequences, 891340279 bases, 555340279 kmers +read 11300000 sequences, 899036889 bases, 560036889 kmers +read 11400000 sequences, 906434241 bases, 564434241 kmers +read 11500000 sequences, 913824257 bases, 568824257 kmers +read 11600000 sequences, 921342281 bases, 573342281 kmers +read 11700000 sequences, 928719144 bases, 577719144 kmers +read 11800000 sequences, 936164765 bases, 582164765 kmers +read 11900000 sequences, 943653758 bases, 586653758 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 12100000 sequences, 958744772 bases, 595744772 kmers +read 12200000 sequences, 966275858 bases, 600275858 kmers +read 12300000 sequences, 973962686 bases, 604962686 kmers +read 12400000 sequences, 981647965 bases, 609647965 kmers +read 12500000 sequences, 989234531 bases, 614234531 kmers +read 12600000 sequences, 996919849 bases, 618919849 kmers +read 12700000 sequences, 1004488446 bases, 623488446 kmers +read 12800000 sequences, 1012083435 bases, 628083435 kmers +read 12900000 sequences, 1019844583 bases, 632844583 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 13100000 sequences, 1035458430 bases, 642458430 kmers +read 13200000 sequences, 1043299596 bases, 647299596 kmers +read 13300000 sequences, 1051100294 bases, 652100294 kmers +read 13400000 sequences, 1058940054 bases, 656940054 kmers +read 13500000 sequences, 1066735225 bases, 661735225 kmers +read 13600000 sequences, 1074662997 bases, 666662997 kmers +read 13700000 sequences, 1082381283 bases, 671381283 kmers +read 13800000 sequences, 1090055507 bases, 676055507 kmers +read 13900000 sequences, 1097835965 bases, 680835965 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 14100000 sequences, 1113495622 bases, 690495622 kmers +read 14200000 sequences, 1121380038 bases, 695380038 kmers +read 14300000 sequences, 1129522879 bases, 700522879 kmers +read 14400000 sequences, 1137515487 bases, 705515487 kmers +read 14500000 sequences, 1145547633 bases, 710547633 kmers +read 14600000 sequences, 1153636718 bases, 715636718 kmers +read 14700000 sequences, 1161507672 bases, 720507672 kmers +read 14800000 sequences, 1169638977 bases, 725638977 kmers +read 14900000 sequences, 1177765602 bases, 730765602 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 15100000 sequences, 1193966066 bases, 740966066 kmers +read 15200000 sequences, 1201992531 bases, 745992531 kmers +read 15300000 sequences, 1210139564 bases, 751139564 kmers +read 15400000 sequences, 1218303770 bases, 756303770 kmers +read 15500000 sequences, 1226563924 bases, 761563924 kmers +read 15600000 sequences, 1234769102 bases, 766769102 kmers +read 15700000 sequences, 1243038710 bases, 772038710 kmers +read 15800000 sequences, 1251312331 bases, 777312331 kmers +read 15900000 sequences, 1259505857 bases, 782505857 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 16100000 sequences, 1276258510 bases, 793258510 kmers +read 16200000 sequences, 1284600618 bases, 798600618 kmers +read 16300000 sequences, 1292910529 bases, 803910529 kmers +read 16400000 sequences, 1301315569 bases, 809315569 kmers +read 16500000 sequences, 1309948482 bases, 814948482 kmers +read 16600000 sequences, 1318536932 bases, 820536932 kmers +read 16700000 sequences, 1326901868 bases, 825901868 kmers +read 16800000 sequences, 1335658656 bases, 831658656 kmers +read 16900000 sequences, 1344318999 bases, 837318999 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 17100000 sequences, 1361738649 bases, 848738649 kmers +read 17200000 sequences, 1370441463 bases, 854441463 kmers +read 17300000 sequences, 1379104762 bases, 860104762 kmers +read 17400000 sequences, 1387857799 bases, 865857799 kmers +read 17500000 sequences, 1396827318 bases, 871827318 kmers +read 17600000 sequences, 1405624638 bases, 877624638 kmers +read 17700000 sequences, 1414580410 bases, 883580410 kmers +read 17800000 sequences, 1423596393 bases, 889596393 kmers +read 17900000 sequences, 1432608671 bases, 895608671 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 18100000 sequences, 1451131708 bases, 908131708 kmers +read 18200000 sequences, 1460386801 bases, 914386801 kmers +read 18300000 sequences, 1469583369 bases, 920583369 kmers +read 18400000 sequences, 1478759459 bases, 926759459 kmers +read 18500000 sequences, 1488122391 bases, 933122391 kmers +read 18600000 sequences, 1497569745 bases, 939569745 kmers +read 18700000 sequences, 1507030485 bases, 946030485 kmers +read 18800000 sequences, 1516707149 bases, 952707149 kmers +read 18900000 sequences, 1526397934 bases, 959397934 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 19100000 sequences, 1546342668 bases, 973342668 kmers +read 19200000 sequences, 1556281669 bases, 980281669 kmers +read 19300000 sequences, 1566271275 bases, 987271275 kmers +read 19400000 sequences, 1576402796 bases, 994402796 kmers +read 19500000 sequences, 1586440957 bases, 1001440957 kmers +read 19600000 sequences, 1596689344 bases, 1008689344 kmers +read 19700000 sequences, 1607088748 bases, 1016088748 kmers +read 19800000 sequences, 1617543387 bases, 1023543387 kmers +read 19900000 sequences, 1628261415 bases, 1031261415 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20100000 sequences, 1650338356 bases, 1047338356 kmers +read 20200000 sequences, 1661398094 bases, 1055398094 kmers +read 20300000 sequences, 1672652108 bases, 1063652108 kmers +read 20400000 sequences, 1683961135 bases, 1071961135 kmers +read 20500000 sequences, 1695700838 bases, 1080700838 kmers +read 20600000 sequences, 1707448842 bases, 1089448842 kmers +read 20700000 sequences, 1719587691 bases, 1098587691 kmers +read 20800000 sequences, 1732024822 bases, 1108024822 kmers +=== step 1.1: 'encoding input' 5.91576 [sec] (5.32463 [ns/kmer]) +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max_len 176455 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.65.bin'... +=== step 1.2: 'computing minimizers tuples' 1.77346 [sec] (1.59625 [ns/kmer]) +=== step 1: 'parse file' 7.68936 [sec] (6.921 [ns/kmer]) + == files to merge = 66 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 18.4003 [sec] (16.5616 [ns/kmer]) +num_minimizers = 174641353 +num_minimizer_positions = 240693690 +num_super_kmers = 249228267 +building minimizers MPHF with 64 threads and 59 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 7.58937 [sec] (6.831 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.95839 [sec] (8.06322 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 4.60646 [sec] (4.14616 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 20680302/174641353 (11.8416%) +num_buckets_in_skew_index 18464/174641353 (0.0105725%) +max_bucket_size 37043 +log2_max_bucket_size 16 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 82592303/240693690 (34.3143%) +num_minimizer_positions_of_buckets_in_skew_index 4158800/240693690 (1.72784%) +computing minimizers offsets: 4.96345 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4817539 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2376719 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1827153 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1520019 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1265567 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 951364 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1017584 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 37043: 1228646 +num_kmers_in_skew_index 15004591 (1.35053%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4817539 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4817539 kmers; bits/key = 2.73 + built positions[0] for 4817539 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2376719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2376719)... + built mphs[1] for 2376719 kmers; bits/key = 2.55999 + built positions[1] for 2376719 kmers; bits/key = 8.00014 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1827153 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1827153)... + built mphs[2] for 1827153 kmers; bits/key = 2.56021 + built positions[2] for 1827153 kmers; bits/key = 9.0002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1520019 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1520019)... + built mphs[3] for 1520019 kmers; bits/key = 2.56043 + built positions[3] for 1520019 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1265567 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1265567)... + built mphs[4] for 1265567 kmers; bits/key = 2.56074 + built positions[4] for 1265567 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 951364 + building MPHF with 64 threads and 1 partitions (avg. partition size = 951364)... + built mphs[5] for 951364 kmers; bits/key = 2.56127 + built positions[5] for 951364 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1017584 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1017584)... + built mphs[6] for 1017584 kmers; bits/key = 2.41831 + built positions[6] for 1017584 kmers; bits/key = 13.0003 + lower = 8192; upper = 37043; num_bits_per_pos = 16; num_kmers_in_partition = 1228646 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1228646)... + built mphs[7] for 1228646 kmers; bits/key = 2.56083 + built positions[7] for 1228646 kmers; bits/key = 16.0003 +computing skew index took: 6.59343 [sec] +=== step 3: 'build sparse and skew index' 11.9582 [sec] (10.7633 [ns/kmer]) +=== total_time 59.202 [sec] (53.2862 [ns/kmer]) +total index size: 1600485105 [B] -- 1600.49 [MB] +SPACE BREAKDOWN: + mphf: 0.447872 [bits/kmer] (2.84923 [bits/key]) -- 3.88627% + strings_offsets: 0.337884 [bits/kmer] -- 2.93189% + control_codewords: 5.03009 [bits/kmer] -- 43.6471% + mid_load_buckets: 2.30452 [bits/kmer] -- 19.9968% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.67449e-05% + strings: 3.1245 [bits/kmer] -- 27.1119% + skew_index: 0.279583 [bits/kmer] -- 2.426% + weights: 1.32491e-06 [bits/kmer] -- 1.14965e-05% + -------------- + total: 11.5244 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 88.1478% +buckets with 2 minimizer positions = 6.79213% +buckets with 3 minimizer positions = 1.92226% +buckets with 4 minimizer positions = 0.856078% +buckets with 5 minimizer positions = 0.493468% +buckets with 6 minimizer positions = 0.325915% +buckets with 7 minimizer positions = 0.234531% +buckets with 8 minimizer positions = 0.178296% +buckets with 9 minimizer positions = 0.141164% +buckets with 10 minimizer positions = 0.115104% +buckets with 11 minimizer positions = 0.0959486% +buckets with 12 minimizer positions = 0.0807615% +buckets with 13 minimizer positions = 0.0695379% +buckets with 14 minimizer positions = 0.060729% +buckets with 15 minimizer positions = 0.0531947% +buckets with 16 minimizer positions = 0.0472706% +max_bucket_size 37043 +2025-10-22 15:46:47: saving data structure to disk... +2025-10-22 15:46:48: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 100000 sequences, 8718431 bases, 5718431 kmers +read 200000 sequences, 17474097 bases, 11474097 kmers +read 300000 sequences, 26299449 bases, 17299449 kmers +read 400000 sequences, 35167130 bases, 23167130 kmers +read 500000 sequences, 43967965 bases, 28967965 kmers +read 600000 sequences, 52886445 bases, 34886445 kmers +read 700000 sequences, 61937196 bases, 40937196 kmers +read 800000 sequences, 71070714 bases, 47070714 kmers +read 900000 sequences, 80176912 bases, 53176912 kmers +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 1100000 sequences, 98984859 bases, 65984859 kmers +read 1200000 sequences, 108719881 bases, 72719881 kmers +read 1300000 sequences, 118280880 bases, 79280880 kmers +read 1400000 sequences, 127917770 bases, 85917770 kmers +read 1500000 sequences, 137591691 bases, 92591691 kmers +read 1600000 sequences, 147395215 bases, 99395215 kmers +read 1700000 sequences, 157335047 bases, 106335047 kmers +read 1800000 sequences, 167445213 bases, 113445213 kmers +read 1900000 sequences, 177725569 bases, 120725569 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 2100000 sequences, 198499534 bases, 135499534 kmers +read 2200000 sequences, 209053278 bases, 143053278 kmers +read 2300000 sequences, 219848016 bases, 150848016 kmers +read 2400000 sequences, 230787167 bases, 158787167 kmers +read 2500000 sequences, 242014409 bases, 167014409 kmers +read 2600000 sequences, 253501985 bases, 175501985 kmers +read 2700000 sequences, 265108770 bases, 184108770 kmers +read 2800000 sequences, 277040197 bases, 193040197 kmers +read 2900000 sequences, 289406751 bases, 202406751 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 3100000 sequences, 315168435 bases, 222168435 kmers +read 3200000 sequences, 329083083 bases, 233083083 kmers +read 3300000 sequences, 343508535 bases, 244508535 kmers +read 3400000 sequences, 358608045 bases, 256608045 kmers +read 3500000 sequences, 374790387 bases, 269790387 kmers +read 3600000 sequences, 392124136 bases, 284124136 kmers +read 3700000 sequences, 410698510 bases, 299698510 kmers +read 3800000 sequences, 431358064 bases, 317358064 kmers +read 3900000 sequences, 454179453 bases, 337179453 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 4100000 sequences, 468031549 bases, 345031549 kmers +read 4200000 sequences, 474889571 bases, 348889571 kmers +read 4300000 sequences, 481729708 bases, 352729708 kmers +read 4400000 sequences, 488721954 bases, 356721954 kmers +read 4500000 sequences, 495625078 bases, 360625078 kmers +read 4600000 sequences, 502596576 bases, 364596576 kmers +read 4700000 sequences, 509600517 bases, 368600517 kmers +read 4800000 sequences, 516484470 bases, 372484470 kmers +read 4900000 sequences, 523427219 bases, 376427219 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 5100000 sequences, 537329595 bases, 384329595 kmers +read 5200000 sequences, 544209359 bases, 388209359 kmers +read 5300000 sequences, 551189922 bases, 392189922 kmers +read 5400000 sequences, 558101939 bases, 396101939 kmers +read 5500000 sequences, 565120163 bases, 400120163 kmers +read 5600000 sequences, 572157570 bases, 404157570 kmers +read 5700000 sequences, 579064866 bases, 408064866 kmers +read 5800000 sequences, 586002711 bases, 412002711 kmers +read 5900000 sequences, 592940936 bases, 415940936 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 6100000 sequences, 607035798 bases, 424035798 kmers +read 6200000 sequences, 614208718 bases, 428208718 kmers +read 6300000 sequences, 621168245 bases, 432168245 kmers +read 6400000 sequences, 628072498 bases, 436072498 kmers +read 6500000 sequences, 635102614 bases, 440102614 kmers +read 6600000 sequences, 642120732 bases, 444120732 kmers +read 6700000 sequences, 649088967 bases, 448088967 kmers +read 6800000 sequences, 656101755 bases, 452101755 kmers +read 6900000 sequences, 663148884 bases, 456148884 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 7100000 sequences, 677027864 bases, 464027864 kmers +read 7200000 sequences, 684172202 bases, 468172202 kmers +read 7300000 sequences, 691211207 bases, 472211207 kmers +read 7400000 sequences, 698208790 bases, 476208790 kmers +read 7500000 sequences, 705328995 bases, 480328995 kmers +read 7600000 sequences, 712361023 bases, 484361023 kmers +read 7700000 sequences, 719471804 bases, 488471804 kmers +read 7800000 sequences, 726605138 bases, 492605138 kmers +read 7900000 sequences, 733774594 bases, 496774594 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 8100000 sequences, 747950180 bases, 504950180 kmers +read 8200000 sequences, 755058730 bases, 509058730 kmers +read 8300000 sequences, 762216427 bases, 513216427 kmers +read 8400000 sequences, 769353851 bases, 517353851 kmers +read 8500000 sequences, 776583161 bases, 521583161 kmers +read 8600000 sequences, 783816261 bases, 525816261 kmers +read 8700000 sequences, 791077370 bases, 530077370 kmers +read 8800000 sequences, 798157781 bases, 534157781 kmers +read 8900000 sequences, 805241016 bases, 538241016 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 9100000 sequences, 819617693 bases, 546617693 kmers +read 9200000 sequences, 826809772 bases, 550809772 kmers +read 9300000 sequences, 833919107 bases, 554919107 kmers +read 9400000 sequences, 841155666 bases, 559155666 kmers +read 9500000 sequences, 848401695 bases, 563401695 kmers +read 9600000 sequences, 855643716 bases, 567643716 kmers +read 9700000 sequences, 862872782 bases, 571872782 kmers +read 9800000 sequences, 870171741 bases, 576171741 kmers +read 9900000 sequences, 877460939 bases, 580460939 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 10100000 sequences, 891988915 bases, 588988915 kmers +read 10200000 sequences, 899332167 bases, 593332167 kmers +read 10300000 sequences, 906596132 bases, 597596132 kmers +read 10400000 sequences, 913914222 bases, 601914222 kmers +read 10500000 sequences, 921197164 bases, 606197164 kmers +read 10600000 sequences, 928621352 bases, 610621352 kmers +read 10700000 sequences, 935962590 bases, 614962590 kmers +read 10800000 sequences, 943225398 bases, 619225398 kmers +read 10900000 sequences, 950606271 bases, 623606271 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 11100000 sequences, 965609642 bases, 632609642 kmers +read 11200000 sequences, 972999574 bases, 636999574 kmers +read 11300000 sequences, 980385996 bases, 641385996 kmers +read 11400000 sequences, 987756692 bases, 645756692 kmers +read 11500000 sequences, 995228727 bases, 650228727 kmers +read 11600000 sequences, 1002716000 bases, 654716000 kmers +read 11700000 sequences, 1010163238 bases, 659163238 kmers +read 11800000 sequences, 1017604060 bases, 663604060 kmers +read 11900000 sequences, 1025150347 bases, 668150347 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 12100000 sequences, 1040213508 bases, 677213508 kmers +read 12200000 sequences, 1047864763 bases, 681864763 kmers +read 12300000 sequences, 1055370986 bases, 686370986 kmers +read 12400000 sequences, 1062882136 bases, 690882136 kmers +read 12500000 sequences, 1070457834 bases, 695457834 kmers +read 12600000 sequences, 1078056503 bases, 700056503 kmers +read 12700000 sequences, 1085619892 bases, 704619892 kmers +read 12800000 sequences, 1093220371 bases, 709220371 kmers +read 12900000 sequences, 1100938017 bases, 713938017 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 13100000 sequences, 1116117667 bases, 723117667 kmers +read 13200000 sequences, 1123791984 bases, 727791984 kmers +read 13300000 sequences, 1131456294 bases, 732456294 kmers +read 13400000 sequences, 1139167231 bases, 737167231 kmers +read 13500000 sequences, 1147084240 bases, 742084240 kmers +read 13600000 sequences, 1154903455 bases, 746903455 kmers +read 13700000 sequences, 1162719581 bases, 751719581 kmers +read 13800000 sequences, 1170515268 bases, 756515268 kmers +read 13900000 sequences, 1178310906 bases, 761310906 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 14100000 sequences, 1194143461 bases, 771143461 kmers +read 14200000 sequences, 1202037257 bases, 776037257 kmers +read 14300000 sequences, 1210016774 bases, 781016774 kmers +read 14400000 sequences, 1217929746 bases, 785929746 kmers +read 14500000 sequences, 1226009557 bases, 791009557 kmers +read 14600000 sequences, 1233936531 bases, 795936531 kmers +read 14700000 sequences, 1241953842 bases, 800953842 kmers +read 14800000 sequences, 1249971925 bases, 805971925 kmers +read 14900000 sequences, 1258012031 bases, 811012031 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 15100000 sequences, 1274149698 bases, 821149698 kmers +read 15200000 sequences, 1282474916 bases, 826474916 kmers +read 15300000 sequences, 1290768947 bases, 831768947 kmers +read 15400000 sequences, 1299121797 bases, 837121797 kmers +read 15500000 sequences, 1307304198 bases, 842304198 kmers +read 15600000 sequences, 1315661756 bases, 847661756 kmers +read 15700000 sequences, 1324089837 bases, 853089837 kmers +read 15800000 sequences, 1332318617 bases, 858318617 kmers +read 15900000 sequences, 1340760587 bases, 863760587 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16100000 sequences, 1357811757 bases, 874811757 kmers +read 16200000 sequences, 1366358226 bases, 880358226 kmers +read 16300000 sequences, 1375027036 bases, 886027036 kmers +read 16400000 sequences, 1383710258 bases, 891710258 kmers +=== step 1.1: 'encoding input' 4.68884 [sec] (5.24296 [ns/kmer]) +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max_len 117016 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.2899 [sec] (1.44234 [ns/kmer]) +=== step 1: 'parse file' 5.97888 [sec] (6.68547 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 14.7808 [sec] (16.5276 [ns/kmer]) +num_minimizers = 143418843 +num_minimizer_positions = 193511241 +num_super_kmers = 200364919 +building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.20897 [sec] (6.94274 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.03814 [sec] (7.86991 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.8231 [sec] (3.15673 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 18123968/143418843 (12.6371%) +num_buckets_in_skew_index 15172/143418843 (0.0105788%) +max_bucket_size 30655 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 65664193/193511241 (33.933%) +num_minimizer_positions_of_buckets_in_skew_index 2567345/193511241 (1.32672%) +computing minimizers offsets: 3.98591 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4240400 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1914946 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1106165 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 771672 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 562721 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 475654 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 388509 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 30655: 459571 +num_kmers_in_skew_index 9919638 (1.10919%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4240400 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4240400 kmers; bits/key = 2.84282 + built positions[0] for 4240400 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1914946 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1914946)... + built mphs[1] for 1914946 kmers; bits/key = 2.56017 + built positions[1] for 1914946 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1106165 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1106165)... + built mphs[2] for 1106165 kmers; bits/key = 2.56093 + built positions[2] for 1106165 kmers; bits/key = 9.00032 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 771672 + building MPHF with 64 threads and 1 partitions (avg. partition size = 771672)... + built mphs[3] for 771672 kmers; bits/key = 2.41893 + built positions[3] for 771672 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 562721 + building MPHF with 64 threads and 1 partitions (avg. partition size = 562721)... + built mphs[4] for 562721 kmers; bits/key = 2.56295 + built positions[4] for 562721 kmers; bits/key = 11.0006 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 475654 + building MPHF with 64 threads and 1 partitions (avg. partition size = 475654)... + built mphs[5] for 475654 kmers; bits/key = 2.56365 + built positions[5] for 475654 kmers; bits/key = 12.0008 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 388509 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388509)... + built mphs[6] for 388509 kmers; bits/key = 2.42185 + built positions[6] for 388509 kmers; bits/key = 13.0008 + lower = 8192; upper = 30655; num_bits_per_pos = 15; num_kmers_in_partition = 459571 + building MPHF with 64 threads and 1 partitions (avg. partition size = 459571)... + built mphs[7] for 459571 kmers; bits/key = 2.4208 + built positions[7] for 459571 kmers; bits/key = 15.0007 +computing skew index took: 3.84596 [sec] +=== step 3: 'build sparse and skew index' 8.13507 [sec] (9.09647 [ns/kmer]) +=== total_time 44.9649 [sec] (50.2789 [ns/kmer]) +total index size: 1287008492 [B] -- 1287.01 [MB] +SPACE BREAKDOWN: + mphf: 0.453288 [bits/kmer] (2.82655 [bits/key]) -- 3.93723% + strings_offsets: 0.333373 [bits/kmer] -- 2.89565% + control_codewords: 5.13178 [bits/kmer] -- 44.5743% + mid_load_buckets: 2.27616 [bits/kmer] -- 19.7706% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.08235e-05% + strings: 3.10303 [bits/kmer] -- 26.9527% + skew_index: 0.215227 [bits/kmer] -- 1.86944% + weights: 1.64596e-06 [bits/kmer] -- 1.42967e-05% + -------------- + total: 11.5129 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 87.3523% +buckets with 2 minimizer positions = 7.4877% +buckets with 3 minimizer positions = 2.14684% +buckets with 4 minimizer positions = 0.927917% +buckets with 5 minimizer positions = 0.508829% +buckets with 6 minimizer positions = 0.320607% +buckets with 7 minimizer positions = 0.221914% +buckets with 8 minimizer positions = 0.16449% +buckets with 9 minimizer positions = 0.128547% +buckets with 10 minimizer positions = 0.104586% +buckets with 11 minimizer positions = 0.0865967% +buckets with 12 minimizer positions = 0.0732902% +buckets with 13 minimizer positions = 0.062991% +buckets with 14 minimizer positions = 0.0543541% +buckets with 15 minimizer positions = 0.0475495% +buckets with 16 minimizer positions = 0.0409653% +max_bucket_size 30655 +2025-10-22 18:38:09: saving data structure to disk... +2025-10-22 18:38:11: DONE + diff --git a/benchmarks/results-22-10-25/k31/regular-bench.log b/benchmarks/results-22-10-25/k31/regular-bench.log new file mode 100644 index 0000000..1ba03dc --- /dev/null +++ b/benchmarks/results-22-10-25/k31/regular-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 648.305 +avg_nanosec_per_negative_lookup 695.741 +avg_nanosec_per_access 279.6 +iterator: avg_nanosec_per_kmer 2.53235 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 653.268 +avg_nanosec_per_negative_lookup 695.842 +avg_nanosec_per_access 279.349 +iterator: avg_nanosec_per_kmer 2.61822 +./sshash bench -i cod.k31.sshash +avg_nanosec_per_positive_lookup 634.66 +avg_nanosec_per_negative_lookup 700.528 +avg_nanosec_per_access 290.753 +iterator: avg_nanosec_per_kmer 2.744 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 625.999 +avg_nanosec_per_negative_lookup 757.035 +avg_nanosec_per_access 287.668 +iterator: avg_nanosec_per_kmer 2.62408 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 628.17 +avg_nanosec_per_negative_lookup 751.121 +avg_nanosec_per_access 279.75 +iterator: avg_nanosec_per_kmer 2.65167 +./sshash bench -i kestrel.k31.sshash +avg_nanosec_per_positive_lookup 637.028 +avg_nanosec_per_negative_lookup 756.516 +avg_nanosec_per_access 279.722 +iterator: avg_nanosec_per_kmer 2.78434 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 883.449 +avg_nanosec_per_negative_lookup 830.867 +avg_nanosec_per_access 358.553 +iterator: avg_nanosec_per_kmer 2.71647 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 880.462 +avg_nanosec_per_negative_lookup 826.909 +avg_nanosec_per_access 356.664 +iterator: avg_nanosec_per_kmer 2.70977 +./sshash bench -i human.k31.sshash +avg_nanosec_per_positive_lookup 878.291 +avg_nanosec_per_negative_lookup 828.208 +avg_nanosec_per_access 361.108 +iterator: avg_nanosec_per_kmer 2.73747 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1142.35 +avg_nanosec_per_negative_lookup 903.169 +avg_nanosec_per_access 556.08 +iterator: avg_nanosec_per_kmer 2.5543 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1133.38 +avg_nanosec_per_negative_lookup 887.641 +avg_nanosec_per_access 560.262 +iterator: avg_nanosec_per_kmer 2.52931 +./sshash bench -i hprc.k31.sshash +avg_nanosec_per_positive_lookup 1128.25 +avg_nanosec_per_negative_lookup 897.297 +avg_nanosec_per_access 570.004 +iterator: avg_nanosec_per_kmer 2.58062 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 1075.35 +avg_nanosec_per_negative_lookup 788.298 +avg_nanosec_per_access 400.502 +iterator: avg_nanosec_per_kmer 2.62252 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 1057.65 +avg_nanosec_per_negative_lookup 785.094 +avg_nanosec_per_access 395.239 +iterator: avg_nanosec_per_kmer 2.56189 +./sshash bench -i ec.k31.sshash +avg_nanosec_per_positive_lookup 1060.7 +avg_nanosec_per_negative_lookup 786.358 +avg_nanosec_per_access 394.851 +iterator: avg_nanosec_per_kmer 2.76176 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 975.228 +avg_nanosec_per_negative_lookup 777.359 +avg_nanosec_per_access 364.022 +iterator: avg_nanosec_per_kmer 2.58587 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 974.828 +avg_nanosec_per_negative_lookup 767.215 +avg_nanosec_per_access 370.83 +iterator: avg_nanosec_per_kmer 2.48011 +./sshash bench -i se.k31.sshash +avg_nanosec_per_positive_lookup 979.848 +avg_nanosec_per_negative_lookup 758.218 +avg_nanosec_per_access 378.567 +iterator: avg_nanosec_per_kmer 2.50634 diff --git a/benchmarks/results-22-10-25/k31/regular-build.log b/benchmarks/results-22-10-25/k31/regular-build.log new file mode 100644 index 0000000..5483668 --- /dev/null +++ b/benchmarks/results-22-10-25/k31/regular-build.log @@ -0,0 +1,2206 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 100000 sequences, 25039709 bases, 22039709 kmers +read 200000 sequences, 50140769 bases, 44140769 kmers +read 300000 sequences, 75429503 bases, 66429503 kmers +read 400000 sequences, 100861284 bases, 88861284 kmers +read 500000 sequences, 126668595 bases, 111668595 kmers +read 600000 sequences, 152842190 bases, 134842190 kmers +read 700000 sequences, 179047111 bases, 158047111 kmers +read 800000 sequences, 205700617 bases, 181700617 kmers +read 900000 sequences, 232874017 bases, 205874017 kmers +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 1100000 sequences, 290089276 bases, 257089276 kmers +read 1200000 sequences, 322579696 bases, 286579696 kmers +read 1300000 sequences, 361073757 bases, 322073757 kmers +read 1400000 sequences, 398962877 bases, 356962877 kmers +read 1500000 sequences, 424322359 bases, 379322359 kmers +read 1600000 sequences, 449412328 bases, 401412328 kmers +read 1700000 sequences, 474428244 bases, 423428244 kmers +read 1800000 sequences, 499637157 bases, 445637157 kmers +read 1900000 sequences, 524718987 bases, 467718987 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +=== step 1.1: 'encoding input' 1.60941 [sec] (3.20302 [ns/kmer]) +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max_len 31415 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 15 +num. bits per_string_id 21 +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.627384 [sec] (1.24861 [ns/kmer]) +=== step 1: 'parse file' 2.2369 [sec] (4.45185 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.89184 [sec] (11.7259 [ns/kmer]) +num_minimizers = 72381146 +num_minimizer_positions = 78455681 +num_super_kmers = 78455681 +building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.3287 [sec] (6.62473 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.1333 [sec] (6.23585 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.5676 [sec] (3.11981 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) +num_buckets_in_skew_index 4215/72381146 (0.00582334%) +max_bucket_size 70346 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) +num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) +computing minimizers offsets: 0.885346 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 +num_kmers_in_skew_index 4740893 (0.943527%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... + built mphs[0] for 1260546 kmers; bits/key = 2.56076 + built positions[0] for 1260546 kmers; bits/key = 7.00029 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 + building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... + built mphs[1] for 994175 kmers; bits/key = 2.41831 + built positions[1] for 994175 kmers; bits/key = 8.00033 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... + built mphs[2] for 665719 kmers; bits/key = 2.41938 + built positions[2] for 665719 kmers; bits/key = 9.00051 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 + building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... + built mphs[3] for 408608 kmers; bits/key = 2.42149 + built positions[3] for 408608 kmers; bits/key = 10.0008 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 + building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... + built mphs[4] for 423234 kmers; bits/key = 2.56407 + built positions[4] for 423234 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 + building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... + built mphs[5] for 271419 kmers; bits/key = 2.42412 + built positions[5] for 271419 kmers; bits/key = 12.0014 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 + building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... + built mphs[6] for 288814 kmers; bits/key = 2.42387 + built positions[6] for 288814 kmers; bits/key = 13.0013 + lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 + building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... + built mphs[7] for 428378 kmers; bits/key = 2.56398 + built positions[7] for 428378 kmers; bits/key = 17.0008 +computing skew index took: 2.63084 [sec] +=== step 3: 'build sparse and skew index' 3.62251 [sec] (7.20948 [ns/kmer]) +=== total_time 19.7808 [sec] (39.3676 [ns/kmer]) +total index size: 495332369 [B] -- 495.332 [MB] +SPACE BREAKDOWN: + mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 5.30379% + strings_offsets: 0.144419 [bits/kmer] -- 1.83123% + control_codewords: 4.46561 [bits/kmer] -- 56.624% + mid_load_buckets: 0.439286 [bits/kmer] -- 5.57015% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 5.41051e-05% + strings: 2.24566 [bits/kmer] -- 28.4749% + skew_index: 0.173169 [bits/kmer] -- 2.19578% + weights: 2.92956e-06 [bits/kmer] -- 3.71468e-05% + -------------- + total: 7.88643 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.8721% +buckets with 2 minimizer positions = 2.00417% +buckets with 3 minimizer positions = 0.51765% +buckets with 4 minimizer positions = 0.211311% +buckets with 5 minimizer positions = 0.109826% +buckets with 6 minimizer positions = 0.0661802% +buckets with 7 minimizer positions = 0.0437061% +buckets with 8 minimizer positions = 0.0308464% +buckets with 9 minimizer positions = 0.0235614% +buckets with 10 minimizer positions = 0.0177228% +buckets with 11 minimizer positions = 0.0139967% +buckets with 12 minimizer positions = 0.0112902% +buckets with 13 minimizer positions = 0.00931044% +buckets with 14 minimizer positions = 0.00771748% +buckets with 15 minimizer positions = 0.00632347% +buckets with 16 minimizer positions = 0.00528591% +max_bucket_size 70346 +2025-10-22 15:31:29: saving data structure to disk... +2025-10-22 15:31:29: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash +k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 100000 sequences, 213090663 bases, 210090663 kmers +read 200000 sequences, 390706054 bases, 384706054 kmers +read 300000 sequences, 575072969 bases, 566072969 kmers +read 400000 sequences, 764532516 bases, 752532516 kmers +read 500000 sequences, 971034211 bases, 956034211 kmers +=== step 1.1: 'encoding input' 2.82986 [sec] (2.4599 [ns/kmer]) +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max_len 111973 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.21188 [sec] (1.05344 [ns/kmer]) +=== step 1: 'parse file' 4.04186 [sec] (3.51344 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.9524 [sec] (11.2591 [ns/kmer]) +num_minimizers = 173258591 +num_minimizer_positions = 175959772 +num_super_kmers = 175959772 +building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 7.3914 [sec] (6.42507 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.04416 [sec] (6.12323 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.90168 [sec] (3.39159 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) +num_buckets_in_skew_index 1541/173258591 (0.000889422%) +max_bucket_size 3747 +log2_max_bucket_size 12 +skew index num_partitions 6 +num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) +num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) +computing minimizers offsets: 1.44785 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 +num_kmers_in_skew_index 1185367 (0.10304%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 + building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... + built mphs[0] for 559507 kmers; bits/key = 2.41999 + built positions[0] for 559507 kmers; bits/key = 7.00068 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 + building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... + built mphs[1] for 317132 kmers; bits/key = 2.42276 + built positions[1] for 317132 kmers; bits/key = 8.00111 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 + building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... + built mphs[2] for 144139 kmers; bits/key = 2.43099 + built positions[2] for 144139 kmers; bits/key = 9.00242 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... + built mphs[3] for 106543 kmers; bits/key = 2.43597 + built positions[3] for 106543 kmers; bits/key = 10.0034 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 + building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... + built mphs[4] for 21308 kmers; bits/key = 2.51323 + built positions[4] for 21308 kmers; bits/key = 11.0171 + lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 + building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... + built mphs[5] for 36738 kmers; bits/key = 2.4746 + built positions[5] for 36738 kmers; bits/key = 12.0098 +computing skew index took: 0.683529 [sec] +=== step 3: 'build sparse and skew index' 2.37095 [sec] (2.06098 [ns/kmer]) +=== total_time 37.7025 [sec] (32.7734 [ns/kmer]) +total index size: 1077792931 [B] -- 1077.79 [MB] +SPACE BREAKDOWN: + mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.68775% + strings_offsets: 0.100021 [bits/kmer] -- 1.33448% + control_codewords: 4.81944 [bits/kmer] -- 64.3013% + mid_load_buckets: 0.102577 [bits/kmer] -- 1.36859% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.48656e-05% + strings: 2.0304 [bits/kmer] -- 27.0897% + skew_index: 0.0163494 [bits/kmer] -- 0.218135% + weights: 1.27956e-06 [bits/kmer] -- 1.70719e-05% + -------------- + total: 7.49509 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.2421% +buckets with 2 minimizer positions = 0.571193% +buckets with 3 minimizer positions = 0.0840564% +buckets with 4 minimizer positions = 0.0345576% +buckets with 5 minimizer positions = 0.0184735% +buckets with 6 minimizer positions = 0.011514% +buckets with 7 minimizer positions = 0.00772718% +buckets with 8 minimizer positions = 0.00537809% +buckets with 9 minimizer positions = 0.00392246% +buckets with 10 minimizer positions = 0.00304862% +buckets with 11 minimizer positions = 0.00236583% +buckets with 12 minimizer positions = 0.0019139% +buckets with 13 minimizer positions = 0.00156356% +buckets with 14 minimizer positions = 0.00127613% +buckets with 15 minimizer positions = 0.00105276% +buckets with 16 minimizer positions = 0.000939636% +max_bucket_size 3747 +2025-10-22 15:32:08: saving data structure to disk... +2025-10-22 15:32:08: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 100000 sequences, 24154227 bases, 21154227 kmers +read 200000 sequences, 48616745 bases, 42616745 kmers +read 300000 sequences, 73131168 bases, 64131168 kmers +read 400000 sequences, 97783784 bases, 85783784 kmers +read 500000 sequences, 122219552 bases, 107219552 kmers +read 600000 sequences, 146714901 bases, 128714901 kmers +read 700000 sequences, 171233804 bases, 150233804 kmers +read 800000 sequences, 195697027 bases, 171697027 kmers +read 900000 sequences, 220477681 bases, 193477681 kmers +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 1100000 sequences, 269861607 bases, 236861607 kmers +read 1200000 sequences, 294553493 bases, 258553493 kmers +read 1300000 sequences, 319281545 bases, 280281545 kmers +read 1400000 sequences, 344259217 bases, 302259217 kmers +read 1500000 sequences, 368900918 bases, 323900918 kmers +read 1600000 sequences, 393910514 bases, 345910514 kmers +read 1700000 sequences, 418576877 bases, 367576877 kmers +read 1800000 sequences, 443411058 bases, 389411058 kmers +read 1900000 sequences, 468035760 bases, 411035760 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 2100000 sequences, 517853084 bases, 454853084 kmers +read 2200000 sequences, 542402295 bases, 476402295 kmers +read 2300000 sequences, 567260929 bases, 498260929 kmers +read 2400000 sequences, 592478511 bases, 520478511 kmers +read 2500000 sequences, 617295104 bases, 542295104 kmers +read 2600000 sequences, 642488145 bases, 564488145 kmers +read 2700000 sequences, 667681578 bases, 586681578 kmers +read 2800000 sequences, 693019259 bases, 609019259 kmers +read 2900000 sequences, 718419143 bases, 631419143 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 3100000 sequences, 768135640 bases, 675135640 kmers +read 3200000 sequences, 793535062 bases, 697535062 kmers +read 3300000 sequences, 819157829 bases, 720157829 kmers +read 3400000 sequences, 844256835 bases, 742256835 kmers +read 3500000 sequences, 869741969 bases, 764741969 kmers +read 3600000 sequences, 895152274 bases, 787152274 kmers +read 3700000 sequences, 920884378 bases, 809884378 kmers +read 3800000 sequences, 946277383 bases, 832277383 kmers +read 3900000 sequences, 972103118 bases, 855103118 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 4100000 sequences, 1023962646 bases, 900962646 kmers +read 4200000 sequences, 1050002968 bases, 924002968 kmers +read 4300000 sequences, 1076025969 bases, 947025969 kmers +read 4400000 sequences, 1101901631 bases, 969901631 kmers +read 4500000 sequences, 1127998278 bases, 992998278 kmers +read 4600000 sequences, 1153713407 bases, 1015713407 kmers +read 4700000 sequences, 1179840926 bases, 1038840926 kmers +read 4800000 sequences, 1205900970 bases, 1061900970 kmers +read 4900000 sequences, 1232271178 bases, 1085271178 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 5100000 sequences, 1285390459 bases, 1132390459 kmers +read 5200000 sequences, 1312574249 bases, 1156574249 kmers +read 5300000 sequences, 1339714478 bases, 1180714478 kmers +read 5400000 sequences, 1366712591 bases, 1204712591 kmers +read 5500000 sequences, 1394310534 bases, 1229310534 kmers +read 5600000 sequences, 1421870003 bases, 1253870003 kmers +read 5700000 sequences, 1449547648 bases, 1278547648 kmers +read 5800000 sequences, 1477687357 bases, 1303687357 kmers +read 5900000 sequences, 1505662954 bases, 1328662954 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 6100000 sequences, 1562404881 bases, 1379404881 kmers +read 6200000 sequences, 1591527069 bases, 1405527069 kmers +read 6300000 sequences, 1620530804 bases, 1431530804 kmers +read 6400000 sequences, 1650356233 bases, 1458356233 kmers +read 6500000 sequences, 1680100821 bases, 1485100821 kmers +read 6600000 sequences, 1709838197 bases, 1511838197 kmers +read 6700000 sequences, 1739768925 bases, 1538768925 kmers +read 6800000 sequences, 1771033269 bases, 1567033269 kmers +read 6900000 sequences, 1802736428 bases, 1595736428 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 7100000 sequences, 1868203051 bases, 1655203051 kmers +read 7200000 sequences, 1901851998 bases, 1685851998 kmers +read 7300000 sequences, 1936102668 bases, 1717102668 kmers +read 7400000 sequences, 1971764309 bases, 1749764309 kmers +read 7500000 sequences, 2008379679 bases, 1783379679 kmers +read 7600000 sequences, 2046720436 bases, 1818720436 kmers +read 7700000 sequences, 2086662475 bases, 1855662475 kmers +read 7800000 sequences, 2129062951 bases, 1895062951 kmers +read 7900000 sequences, 2174789182 bases, 1937789182 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 8100000 sequences, 2283235936 bases, 2040235936 kmers +read 8200000 sequences, 2311905494 bases, 2065905494 kmers +read 8300000 sequences, 2336057351 bases, 2087057351 kmers +read 8400000 sequences, 2360509696 bases, 2108509696 kmers +read 8500000 sequences, 2384831354 bases, 2129831354 kmers +read 8600000 sequences, 2409417290 bases, 2151417290 kmers +read 8700000 sequences, 2433617061 bases, 2172617061 kmers +read 8800000 sequences, 2458186109 bases, 2194186109 kmers +read 8900000 sequences, 2482411693 bases, 2215411693 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 9100000 sequences, 2531678312 bases, 2258678312 kmers +read 9200000 sequences, 2555989599 bases, 2279989599 kmers +read 9300000 sequences, 2580569607 bases, 2301569607 kmers +read 9400000 sequences, 2605362854 bases, 2323362854 kmers +read 9500000 sequences, 2629786955 bases, 2344786955 kmers +read 9600000 sequences, 2654330707 bases, 2366330707 kmers +read 9700000 sequences, 2679002962 bases, 2388002962 kmers +read 9800000 sequences, 2703472217 bases, 2409472217 kmers +read 9900000 sequences, 2727977441 bases, 2430977441 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10100000 sequences, 2776332680 bases, 2473332680 kmers +read 10200000 sequences, 2800726063 bases, 2494726063 kmers +=== step 1.1: 'encoding input' 7.47891 [sec] (2.98478 [ns/kmer]) +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max_len 35848 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 16 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.72.bin'... +=== step 1.2: 'computing minimizers tuples' 2.88374 [sec] (1.15088 [ns/kmer]) +=== step 1: 'parse file' 10.3628 [sec] (4.13572 [ns/kmer]) + == files to merge = 73 +saving tuples to 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 31.28 [sec] (12.4836 [ns/kmer]) +num_minimizers = 386687326 +num_minimizer_positions = 423023926 +num_super_kmers = 423023926 +building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 16.5285 [sec] (6.59642 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 16.6364 [sec] (6.63946 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 8.96654 [sec] (3.57849 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) +num_buckets_in_skew_index 42372/386687326 (0.0109577%) +max_bucket_size 22972 +log2_max_bucket_size 15 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) +num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) +computing minimizers offsets: 4.75658 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 +num_kmers_in_skew_index 32063746 (1.27964%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11807213 kmers; bits/key = 2.55841 + built positions[0] for 11807213 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8389556 kmers; bits/key = 2.61352 + built positions[1] for 8389556 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5343660 kmers; bits/key = 2.66261 + built positions[2] for 5343660 kmers; bits/key = 9.00007 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3076413 kmers; bits/key = 3.34298 + built positions[3] for 3076413 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... + built mphs[4] for 1855446 kmers; bits/key = 2.56022 + built positions[4] for 1855446 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... + built mphs[5] for 1008178 kmers; bits/key = 2.41829 + built positions[5] for 1008178 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... + built mphs[6] for 375770 kmers; bits/key = 2.42182 + built positions[6] for 375770 kmers; bits/key = 13.001 + lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 + building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... + built mphs[7] for 207510 kmers; bits/key = 2.42618 + built positions[7] for 207510 kmers; bits/key = 15.0018 +computing skew index took: 7.27877 [sec] +=== step 3: 'build sparse and skew index' 12.6394 [sec] (5.0443 [ns/kmer]) +=== total_time 96.4136 [sec] (38.478 [ns/kmer]) +total index size: 2716053216 [B] -- 2716.05 [MB] +SPACE BREAKDOWN: + mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 5.03015% + strings_offsets: 0.153147 [bits/kmer] -- 1.76606% + control_codewords: 5.0927 [bits/kmer] -- 58.7281% + mid_load_buckets: 0.516242 [bits/kmer] -- 5.95319% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 9.86726e-06% + strings: 2.24545 [bits/kmer] -- 25.8941% + skew_index: 0.227926 [bits/kmer] -- 2.6284% + weights: 5.87466e-07 [bits/kmer] -- 6.77454e-06% + -------------- + total: 8.67167 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.1918% +buckets with 2 minimizer positions = 1.69205% +buckets with 3 minimizer positions = 0.442612% +buckets with 4 minimizer positions = 0.201662% +buckets with 5 minimizer positions = 0.114623% +buckets with 6 minimizer positions = 0.0734475% +buckets with 7 minimizer positions = 0.0506719% +buckets with 8 minimizer positions = 0.0368406% +buckets with 9 minimizer positions = 0.0280203% +buckets with 10 minimizer positions = 0.0218197% +buckets with 11 minimizer positions = 0.0175108% +buckets with 12 minimizer positions = 0.0142045% +buckets with 13 minimizer positions = 0.0116337% +buckets with 14 minimizer positions = 0.00980818% +buckets with 15 minimizer positions = 0.00832637% +buckets with 16 minimizer positions = 0.00717712% +max_bucket_size 22972 +2025-10-22 15:33:47: saving data structure to disk... +2025-10-22 15:33:48: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 100000 sequences, 15142665 bases, 12142665 kmers +read 200000 sequences, 30293268 bases, 24293268 kmers +read 300000 sequences, 45689601 bases, 36689601 kmers +read 400000 sequences, 61242967 bases, 49242967 kmers +read 500000 sequences, 77204739 bases, 62204739 kmers +read 600000 sequences, 93322789 bases, 75322789 kmers +read 700000 sequences, 109580816 bases, 88580816 kmers +read 800000 sequences, 126019260 bases, 102019260 kmers +read 900000 sequences, 142771299 bases, 115771299 kmers +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 1100000 sequences, 177221950 bases, 144221950 kmers +read 1200000 sequences, 194614684 bases, 158614684 kmers +read 1300000 sequences, 212431437 bases, 173431437 kmers +read 1400000 sequences, 230443393 bases, 188443393 kmers +read 1500000 sequences, 248830761 bases, 203830761 kmers +read 1600000 sequences, 267495983 bases, 219495983 kmers +read 1700000 sequences, 286467836 bases, 235467836 kmers +read 1800000 sequences, 305974817 bases, 251974817 kmers +read 1900000 sequences, 325573650 bases, 268573650 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 2100000 sequences, 365932867 bases, 302932867 kmers +read 2200000 sequences, 386928615 bases, 320928615 kmers +read 2300000 sequences, 408196697 bases, 339196697 kmers +read 2400000 sequences, 429706087 bases, 357706087 kmers +read 2500000 sequences, 451663964 bases, 376663964 kmers +read 2600000 sequences, 474186092 bases, 396186092 kmers +read 2700000 sequences, 497212163 bases, 416212163 kmers +read 2800000 sequences, 520661958 bases, 436661958 kmers +read 2900000 sequences, 544614330 bases, 457614330 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 3100000 sequences, 594100261 bases, 501100261 kmers +read 3200000 sequences, 619323817 bases, 523323817 kmers +read 3300000 sequences, 645628550 bases, 546628550 kmers +read 3400000 sequences, 672448968 bases, 570448968 kmers +read 3500000 sequences, 699905699 bases, 594905699 kmers +read 3600000 sequences, 728253489 bases, 620253489 kmers +read 3700000 sequences, 756996702 bases, 645996702 kmers +read 3800000 sequences, 786498197 bases, 672498197 kmers +read 3900000 sequences, 816910601 bases, 699910601 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 4100000 sequences, 880941235 bases, 757941235 kmers +read 4200000 sequences, 914418284 bases, 788418284 kmers +read 4300000 sequences, 948701560 bases, 819701560 kmers +read 4400000 sequences, 984340143 bases, 852340143 kmers +read 4500000 sequences, 1021325821 bases, 886325821 kmers +read 4600000 sequences, 1059630845 bases, 921630845 kmers +read 4700000 sequences, 1098776441 bases, 957776441 kmers +read 4800000 sequences, 1139816109 bases, 995816109 kmers +read 4900000 sequences, 1182502603 bases, 1035502603 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 5100000 sequences, 1272831022 bases, 1119831022 kmers +read 5200000 sequences, 1320724594 bases, 1164724594 kmers +read 5300000 sequences, 1371130743 bases, 1212130743 kmers +read 5400000 sequences, 1423474811 bases, 1261474811 kmers +read 5500000 sequences, 1478533032 bases, 1313533032 kmers +read 5600000 sequences, 1536511127 bases, 1368511127 kmers +read 5700000 sequences, 1597650635 bases, 1426650635 kmers +read 5800000 sequences, 1661332605 bases, 1487332605 kmers +read 5900000 sequences, 1728788521 bases, 1551788521 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 6100000 sequences, 1855582769 bases, 1672582769 kmers +read 6200000 sequences, 1861290633 bases, 1675290633 kmers +read 6300000 sequences, 1866992020 bases, 1677992020 kmers +read 6400000 sequences, 1872712764 bases, 1680712764 kmers +read 6500000 sequences, 1878412792 bases, 1683412792 kmers +read 6600000 sequences, 1884126799 bases, 1686126799 kmers +read 6700000 sequences, 1889847798 bases, 1688847798 kmers +read 6800000 sequences, 1895565126 bases, 1691565126 kmers +read 6900000 sequences, 1901268639 bases, 1694268639 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 7100000 sequences, 1912694987 bases, 1699694987 kmers +read 7200000 sequences, 1918405480 bases, 1702405480 kmers +read 7300000 sequences, 1924111745 bases, 1705111745 kmers +read 7400000 sequences, 1929830164 bases, 1707830164 kmers +read 7500000 sequences, 1935540033 bases, 1710540033 kmers +read 7600000 sequences, 1941266136 bases, 1713266136 kmers +read 7700000 sequences, 1946976124 bases, 1715976124 kmers +read 7800000 sequences, 1952688156 bases, 1718688156 kmers +read 7900000 sequences, 1958402003 bases, 1721402003 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 8100000 sequences, 1969830383 bases, 1726830383 kmers +read 8200000 sequences, 1975558550 bases, 1729558550 kmers +read 8300000 sequences, 1981284034 bases, 1732284034 kmers +read 8400000 sequences, 1986995293 bases, 1734995293 kmers +read 8500000 sequences, 1992721438 bases, 1737721438 kmers +read 8600000 sequences, 1998449545 bases, 1740449545 kmers +read 8700000 sequences, 2004184386 bases, 1743184386 kmers +read 8800000 sequences, 2009910316 bases, 1745910316 kmers +read 8900000 sequences, 2015628093 bases, 1748628093 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 9100000 sequences, 2027081578 bases, 1754081578 kmers +read 9200000 sequences, 2032818056 bases, 1756818056 kmers +read 9300000 sequences, 2038553042 bases, 1759553042 kmers +read 9400000 sequences, 2044303212 bases, 1762303212 kmers +read 9500000 sequences, 2050045516 bases, 1765045516 kmers +read 9600000 sequences, 2055782121 bases, 1767782121 kmers +read 9700000 sequences, 2061515493 bases, 1770515493 kmers +read 9800000 sequences, 2067264752 bases, 1773264752 kmers +read 9900000 sequences, 2073029647 bases, 1776029647 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 10100000 sequences, 2084516749 bases, 1781516749 kmers +read 10200000 sequences, 2090254271 bases, 1784254271 kmers +read 10300000 sequences, 2096010949 bases, 1787010949 kmers +read 10400000 sequences, 2101750129 bases, 1789750129 kmers +read 10500000 sequences, 2107490529 bases, 1792490529 kmers +read 10600000 sequences, 2113226835 bases, 1795226835 kmers +read 10700000 sequences, 2118984102 bases, 1797984102 kmers +read 10800000 sequences, 2124753185 bases, 1800753185 kmers +read 10900000 sequences, 2130500348 bases, 1803500348 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 11100000 sequences, 2141999029 bases, 1808999029 kmers +read 11200000 sequences, 2147751510 bases, 1811751510 kmers +read 11300000 sequences, 2153511666 bases, 1814511666 kmers +read 11400000 sequences, 2159254652 bases, 1817254652 kmers +read 11500000 sequences, 2165018881 bases, 1820018881 kmers +read 11600000 sequences, 2170788123 bases, 1822788123 kmers +read 11700000 sequences, 2176561496 bases, 1825561496 kmers +read 11800000 sequences, 2182327454 bases, 1828327454 kmers +read 11900000 sequences, 2188093430 bases, 1831093430 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 12100000 sequences, 2199640006 bases, 1836640006 kmers +read 12200000 sequences, 2205409598 bases, 1839409598 kmers +read 12300000 sequences, 2211196063 bases, 1842196063 kmers +read 12400000 sequences, 2216980714 bases, 1844980714 kmers +read 12500000 sequences, 2222778714 bases, 1847778714 kmers +read 12600000 sequences, 2228548365 bases, 1850548365 kmers +read 12700000 sequences, 2234333747 bases, 1853333747 kmers +read 12800000 sequences, 2240119304 bases, 1856119304 kmers +read 12900000 sequences, 2245909893 bases, 1858909893 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 13100000 sequences, 2257517214 bases, 1864517214 kmers +read 13200000 sequences, 2263299879 bases, 1867299879 kmers +read 13300000 sequences, 2269090399 bases, 1870090399 kmers +read 13400000 sequences, 2274889092 bases, 1872889092 kmers +read 13500000 sequences, 2280679397 bases, 1875679397 kmers +read 13600000 sequences, 2286496358 bases, 1878496358 kmers +read 13700000 sequences, 2292303473 bases, 1881303473 kmers +read 13800000 sequences, 2298095885 bases, 1884095885 kmers +read 13900000 sequences, 2303896281 bases, 1886896281 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 14100000 sequences, 2315487847 bases, 1892487847 kmers +read 14200000 sequences, 2321299157 bases, 1895299157 kmers +read 14300000 sequences, 2327098753 bases, 1898098753 kmers +read 14400000 sequences, 2332930688 bases, 1900930688 kmers +read 14500000 sequences, 2338742297 bases, 1903742297 kmers +read 14600000 sequences, 2344551817 bases, 1906551817 kmers +read 14700000 sequences, 2350372555 bases, 1909372555 kmers +read 14800000 sequences, 2356184455 bases, 1912184455 kmers +read 14900000 sequences, 2362012488 bases, 1915012488 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 15100000 sequences, 2373646143 bases, 1920646143 kmers +read 15200000 sequences, 2379487644 bases, 1923487644 kmers +read 15300000 sequences, 2385319610 bases, 1926319610 kmers +read 15400000 sequences, 2391160020 bases, 1929160020 kmers +read 15500000 sequences, 2396996732 bases, 1931996732 kmers +read 15600000 sequences, 2402827545 bases, 1934827545 kmers +read 15700000 sequences, 2408655256 bases, 1937655256 kmers +read 15800000 sequences, 2414491274 bases, 1940491274 kmers +read 15900000 sequences, 2420340396 bases, 1943340396 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 16100000 sequences, 2432032145 bases, 1949032145 kmers +read 16200000 sequences, 2437865389 bases, 1951865389 kmers +read 16300000 sequences, 2443712476 bases, 1954712476 kmers +read 16400000 sequences, 2449571096 bases, 1957571096 kmers +read 16500000 sequences, 2455436828 bases, 1960436828 kmers +read 16600000 sequences, 2461294178 bases, 1963294178 kmers +read 16700000 sequences, 2467151105 bases, 1966151105 kmers +read 16800000 sequences, 2473014630 bases, 1969014630 kmers +read 16900000 sequences, 2478879186 bases, 1971879186 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 17100000 sequences, 2490639960 bases, 1977639960 kmers +read 17200000 sequences, 2496505139 bases, 1980505139 kmers +read 17300000 sequences, 2502376271 bases, 1983376271 kmers +read 17400000 sequences, 2508235904 bases, 1986235904 kmers +read 17500000 sequences, 2514119057 bases, 1989119057 kmers +read 17600000 sequences, 2520003875 bases, 1992003875 kmers +read 17700000 sequences, 2525879611 bases, 1994879611 kmers +read 17800000 sequences, 2531769764 bases, 1997769764 kmers +read 17900000 sequences, 2537665494 bases, 2000665494 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 18100000 sequences, 2549454349 bases, 2006454349 kmers +read 18200000 sequences, 2555337312 bases, 2009337312 kmers +read 18300000 sequences, 2561224835 bases, 2012224835 kmers +read 18400000 sequences, 2567143113 bases, 2015143113 kmers +read 18500000 sequences, 2573036170 bases, 2018036170 kmers +read 18600000 sequences, 2578924000 bases, 2020924000 kmers +read 18700000 sequences, 2584830744 bases, 2023830744 kmers +read 18800000 sequences, 2590732842 bases, 2026732842 kmers +read 18900000 sequences, 2596629182 bases, 2029629182 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 19100000 sequences, 2608476670 bases, 2035476670 kmers +read 19200000 sequences, 2614389892 bases, 2038389892 kmers +read 19300000 sequences, 2620312339 bases, 2041312339 kmers +read 19400000 sequences, 2626244711 bases, 2044244711 kmers +read 19500000 sequences, 2632165901 bases, 2047165901 kmers +read 19600000 sequences, 2638096345 bases, 2050096345 kmers +read 19700000 sequences, 2644023009 bases, 2053023009 kmers +read 19800000 sequences, 2649949840 bases, 2055949840 kmers +read 19900000 sequences, 2655887687 bases, 2058887687 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 20100000 sequences, 2667773946 bases, 2064773946 kmers +read 20200000 sequences, 2673731741 bases, 2067731741 kmers +read 20300000 sequences, 2679668693 bases, 2070668693 kmers +read 20400000 sequences, 2685621460 bases, 2073621460 kmers +read 20500000 sequences, 2691583341 bases, 2076583341 kmers +read 20600000 sequences, 2697548092 bases, 2079548092 kmers +read 20700000 sequences, 2703523059 bases, 2082523059 kmers +read 20800000 sequences, 2709482884 bases, 2085482884 kmers +read 20900000 sequences, 2715437392 bases, 2088437392 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 21100000 sequences, 2727378334 bases, 2094378334 kmers +read 21200000 sequences, 2733356854 bases, 2097356854 kmers +read 21300000 sequences, 2739324076 bases, 2100324076 kmers +read 21400000 sequences, 2745311010 bases, 2103311010 kmers +read 21500000 sequences, 2751305570 bases, 2106305570 kmers +read 21600000 sequences, 2757280040 bases, 2109280040 kmers +read 21700000 sequences, 2763250403 bases, 2112250403 kmers +read 21800000 sequences, 2769246063 bases, 2115246063 kmers +read 21900000 sequences, 2775228429 bases, 2118228429 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 22100000 sequences, 2787227975 bases, 2124227975 kmers +read 22200000 sequences, 2793232339 bases, 2127232339 kmers +read 22300000 sequences, 2799254537 bases, 2130254537 kmers +read 22400000 sequences, 2805268524 bases, 2133268524 kmers +read 22500000 sequences, 2811273840 bases, 2136273840 kmers +read 22600000 sequences, 2817297507 bases, 2139297507 kmers +read 22700000 sequences, 2823311900 bases, 2142311900 kmers +read 22800000 sequences, 2829348707 bases, 2145348707 kmers +read 22900000 sequences, 2835387583 bases, 2148387583 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 23100000 sequences, 2847447392 bases, 2154447392 kmers +read 23200000 sequences, 2853464302 bases, 2157464302 kmers +read 23300000 sequences, 2859504386 bases, 2160504386 kmers +read 23400000 sequences, 2865558691 bases, 2163558691 kmers +read 23500000 sequences, 2871616658 bases, 2166616658 kmers +read 23600000 sequences, 2877666271 bases, 2169666271 kmers +read 23700000 sequences, 2883709058 bases, 2172709058 kmers +read 23800000 sequences, 2889780118 bases, 2175780118 kmers +read 23900000 sequences, 2895851803 bases, 2178851803 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 24100000 sequences, 2908006062 bases, 2185006062 kmers +read 24200000 sequences, 2914097550 bases, 2188097550 kmers +read 24300000 sequences, 2920158586 bases, 2191158586 kmers +read 24400000 sequences, 2926232376 bases, 2194232376 kmers +read 24500000 sequences, 2932310420 bases, 2197310420 kmers +read 24600000 sequences, 2938383731 bases, 2200383731 kmers +read 24700000 sequences, 2944455608 bases, 2203455608 kmers +read 24800000 sequences, 2950553561 bases, 2206553561 kmers +read 24900000 sequences, 2956625219 bases, 2209625219 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 25100000 sequences, 2968838477 bases, 2215838477 kmers +read 25200000 sequences, 2974964628 bases, 2218964628 kmers +read 25300000 sequences, 2981066401 bases, 2222066401 kmers +read 25400000 sequences, 2987174744 bases, 2225174744 kmers +read 25500000 sequences, 2993287478 bases, 2228287478 kmers +read 25600000 sequences, 2999404216 bases, 2231404216 kmers +read 25700000 sequences, 3005525981 bases, 2234525981 kmers +read 25800000 sequences, 3011641856 bases, 2237641856 kmers +read 25900000 sequences, 3017762733 bases, 2240762733 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 26100000 sequences, 3030074528 bases, 2247074528 kmers +read 26200000 sequences, 3036215414 bases, 2250215414 kmers +read 26300000 sequences, 3042374233 bases, 2253374233 kmers +read 26400000 sequences, 3048520232 bases, 2256520232 kmers +read 26500000 sequences, 3054682852 bases, 2259682852 kmers +read 26600000 sequences, 3060872402 bases, 2262872402 kmers +read 26700000 sequences, 3067031401 bases, 2266031401 kmers +read 26800000 sequences, 3073202281 bases, 2269202281 kmers +read 26900000 sequences, 3079363143 bases, 2272363143 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 27100000 sequences, 3091751576 bases, 2278751576 kmers +read 27200000 sequences, 3097952633 bases, 2281952633 kmers +read 27300000 sequences, 3104145587 bases, 2285145587 kmers +read 27400000 sequences, 3110358955 bases, 2288358955 kmers +read 27500000 sequences, 3116537007 bases, 2291537007 kmers +read 27600000 sequences, 3122708736 bases, 2294708736 kmers +read 27700000 sequences, 3128900428 bases, 2297900428 kmers +read 27800000 sequences, 3135111582 bases, 2301111582 kmers +read 27900000 sequences, 3141317272 bases, 2304317272 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 28100000 sequences, 3153730468 bases, 2310730468 kmers +read 28200000 sequences, 3159957719 bases, 2313957719 kmers +read 28300000 sequences, 3166181248 bases, 2317181248 kmers +read 28400000 sequences, 3172412163 bases, 2320412163 kmers +read 28500000 sequences, 3178654889 bases, 2323654889 kmers +read 28600000 sequences, 3184886557 bases, 2326886557 kmers +read 28700000 sequences, 3191117113 bases, 2330117113 kmers +read 28800000 sequences, 3197379587 bases, 2333379587 kmers +read 28900000 sequences, 3203639497 bases, 2336639497 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 29100000 sequences, 3216141276 bases, 2343141276 kmers +read 29200000 sequences, 3222413348 bases, 2346413348 kmers +read 29300000 sequences, 3228708388 bases, 2349708388 kmers +read 29400000 sequences, 3234965821 bases, 2352965821 kmers +read 29500000 sequences, 3241275247 bases, 2356275247 kmers +read 29600000 sequences, 3247560749 bases, 2359560749 kmers +read 29700000 sequences, 3253851490 bases, 2362851490 kmers +read 29800000 sequences, 3260147874 bases, 2366147874 kmers +read 29900000 sequences, 3266443233 bases, 2369443233 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 30100000 sequences, 3279084906 bases, 2376084906 kmers +read 30200000 sequences, 3285396341 bases, 2379396341 kmers +read 30300000 sequences, 3291706676 bases, 2382706676 kmers +read 30400000 sequences, 3298020786 bases, 2386020786 kmers +read 30500000 sequences, 3304365070 bases, 2389365070 kmers +read 30600000 sequences, 3310727452 bases, 2392727452 kmers +read 30700000 sequences, 3317071667 bases, 2396071667 kmers +read 30800000 sequences, 3323415773 bases, 2399415773 kmers +read 30900000 sequences, 3329791034 bases, 2402791034 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 31100000 sequences, 3342541655 bases, 2409541655 kmers +read 31200000 sequences, 3348907418 bases, 2412907418 kmers +read 31300000 sequences, 3355301313 bases, 2416301313 kmers +read 31400000 sequences, 3361677962 bases, 2419677962 kmers +read 31500000 sequences, 3368088646 bases, 2423088646 kmers +read 31600000 sequences, 3374497442 bases, 2426497442 kmers +read 31700000 sequences, 3380955023 bases, 2429955023 kmers +read 31800000 sequences, 3387385518 bases, 2433385518 kmers +read 31900000 sequences, 3393821602 bases, 2436821602 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 32100000 sequences, 3406661510 bases, 2443661510 kmers +read 32200000 sequences, 3413131182 bases, 2447131182 kmers +read 32300000 sequences, 3419570417 bases, 2450570417 kmers +read 32400000 sequences, 3426014473 bases, 2454014473 kmers +read 32500000 sequences, 3432484492 bases, 2457484492 kmers +read 32600000 sequences, 3438957077 bases, 2460957077 kmers +read 32700000 sequences, 3445449751 bases, 2464449751 kmers +read 32800000 sequences, 3451918312 bases, 2467918312 kmers +read 32900000 sequences, 3458402343 bases, 2471402343 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 33100000 sequences, 3471383138 bases, 2478383138 kmers +read 33200000 sequences, 3477878876 bases, 2481878876 kmers +read 33300000 sequences, 3484417237 bases, 2485417237 kmers +read 33400000 sequences, 3490941906 bases, 2488941906 kmers +read 33500000 sequences, 3497445866 bases, 2492445866 kmers +read 33600000 sequences, 3503981454 bases, 2495981454 kmers +read 33700000 sequences, 3510547347 bases, 2499547347 kmers +read 33800000 sequences, 3517100206 bases, 2503100206 kmers +read 33900000 sequences, 3523655303 bases, 2506655303 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 34100000 sequences, 3536826243 bases, 2513826243 kmers +read 34200000 sequences, 3543370780 bases, 2517370780 kmers +read 34300000 sequences, 3549941979 bases, 2520941979 kmers +read 34400000 sequences, 3556525137 bases, 2524525137 kmers +read 34500000 sequences, 3563130115 bases, 2528130115 kmers +read 34600000 sequences, 3569739837 bases, 2531739837 kmers +read 34700000 sequences, 3576369361 bases, 2535369361 kmers +read 34800000 sequences, 3582984639 bases, 2538984639 kmers +read 34900000 sequences, 3589639399 bases, 2542639399 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 35100000 sequences, 3602915662 bases, 2549915662 kmers +read 35200000 sequences, 3609531526 bases, 2553531526 kmers +read 35300000 sequences, 3616196959 bases, 2557196959 kmers +read 35400000 sequences, 3622877546 bases, 2560877546 kmers +read 35500000 sequences, 3629567025 bases, 2564567025 kmers +read 35600000 sequences, 3636241351 bases, 2568241351 kmers +read 35700000 sequences, 3642915002 bases, 2571915002 kmers +read 35800000 sequences, 3649603384 bases, 2575603384 kmers +read 35900000 sequences, 3656318502 bases, 2579318502 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 36100000 sequences, 3669778307 bases, 2586778307 kmers +read 36200000 sequences, 3676509859 bases, 2590509859 kmers +read 36300000 sequences, 3683277516 bases, 2594277516 kmers +read 36400000 sequences, 3690023320 bases, 2598023320 kmers +read 36500000 sequences, 3696780854 bases, 2601780854 kmers +read 36600000 sequences, 3703553953 bases, 2605553953 kmers +read 36700000 sequences, 3710337625 bases, 2609337625 kmers +read 36800000 sequences, 3717123059 bases, 2613123059 kmers +read 36900000 sequences, 3723910303 bases, 2616910303 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 37100000 sequences, 3737567921 bases, 2624567921 kmers +read 37200000 sequences, 3744378334 bases, 2628378334 kmers +read 37300000 sequences, 3751211150 bases, 2632211150 kmers +read 37400000 sequences, 3758073195 bases, 2636073195 kmers +read 37500000 sequences, 3764943165 bases, 2639943165 kmers +read 37600000 sequences, 3771815781 bases, 2643815781 kmers +read 37700000 sequences, 3778662258 bases, 2647662258 kmers +read 37800000 sequences, 3785547755 bases, 2651547755 kmers +read 37900000 sequences, 3792403207 bases, 2655403207 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 38100000 sequences, 3806240239 bases, 2663240239 kmers +read 38200000 sequences, 3813157631 bases, 2667157631 kmers +read 38300000 sequences, 3820098452 bases, 2671098452 kmers +read 38400000 sequences, 3827045725 bases, 2675045725 kmers +read 38500000 sequences, 3834035833 bases, 2679035833 kmers +read 38600000 sequences, 3841003380 bases, 2683003380 kmers +read 38700000 sequences, 3848003738 bases, 2687003738 kmers +read 38800000 sequences, 3854998346 bases, 2690998346 kmers +read 38900000 sequences, 3861999405 bases, 2694999405 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 39100000 sequences, 3876075315 bases, 2703075315 kmers +read 39200000 sequences, 3883150369 bases, 2707150369 kmers +read 39300000 sequences, 3890222678 bases, 2711222678 kmers +read 39400000 sequences, 3897268602 bases, 2715268602 kmers +read 39500000 sequences, 3904370166 bases, 2719370166 kmers +read 39600000 sequences, 3911448081 bases, 2723448081 kmers +read 39700000 sequences, 3918568391 bases, 2727568391 kmers +read 39800000 sequences, 3925645479 bases, 2731645479 kmers +read 39900000 sequences, 3932749450 bases, 2735749450 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 40100000 sequences, 3947016376 bases, 2744016376 kmers +read 40200000 sequences, 3954176429 bases, 2748176429 kmers +read 40300000 sequences, 3961389436 bases, 2752389436 kmers +read 40400000 sequences, 3968552140 bases, 2756552140 kmers +read 40500000 sequences, 3975752284 bases, 2760752284 kmers +read 40600000 sequences, 3982970774 bases, 2764970774 kmers +read 40700000 sequences, 3990152770 bases, 2769152770 kmers +read 40800000 sequences, 3997405392 bases, 2773405392 kmers +read 40900000 sequences, 4004672449 bases, 2777672449 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 41100000 sequences, 4019238458 bases, 2786238458 kmers +read 41200000 sequences, 4026519204 bases, 2790519204 kmers +read 41300000 sequences, 4033822627 bases, 2794822627 kmers +read 41400000 sequences, 4041178312 bases, 2799178312 kmers +read 41500000 sequences, 4048493890 bases, 2803493890 kmers +read 41600000 sequences, 4055829069 bases, 2807829069 kmers +read 41700000 sequences, 4063212651 bases, 2812212651 kmers +read 41800000 sequences, 4070629970 bases, 2816629970 kmers +read 41900000 sequences, 4078028124 bases, 2821028124 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 42100000 sequences, 4092898033 bases, 2829898033 kmers +read 42200000 sequences, 4100371919 bases, 2834371919 kmers +read 42300000 sequences, 4107845273 bases, 2838845273 kmers +read 42400000 sequences, 4115310575 bases, 2843310575 kmers +read 42500000 sequences, 4122794242 bases, 2847794242 kmers +read 42600000 sequences, 4130336855 bases, 2852336855 kmers +read 42700000 sequences, 4137838944 bases, 2856838944 kmers +read 42800000 sequences, 4145439563 bases, 2861439563 kmers +read 42900000 sequences, 4153050309 bases, 2866050309 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 43100000 sequences, 4168281242 bases, 2875281242 kmers +read 43200000 sequences, 4175884442 bases, 2879884442 kmers +read 43300000 sequences, 4183511133 bases, 2884511133 kmers +read 43400000 sequences, 4191154040 bases, 2889154040 kmers +read 43500000 sequences, 4198863024 bases, 2893863024 kmers +read 43600000 sequences, 4206635969 bases, 2898635969 kmers +read 43700000 sequences, 4214404705 bases, 2903404705 kmers +read 43800000 sequences, 4222136141 bases, 2908136141 kmers +read 43900000 sequences, 4229915550 bases, 2912915550 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 44100000 sequences, 4245541378 bases, 2922541378 kmers +read 44200000 sequences, 4253343647 bases, 2927343647 kmers +read 44300000 sequences, 4261209191 bases, 2932209191 kmers +read 44400000 sequences, 4269076563 bases, 2937076563 kmers +read 44500000 sequences, 4276951559 bases, 2941951559 kmers +read 44600000 sequences, 4284863538 bases, 2946863538 kmers +read 44700000 sequences, 4292779456 bases, 2951779456 kmers +read 44800000 sequences, 4300761539 bases, 2956761539 kmers +read 44900000 sequences, 4308749182 bases, 2961749182 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 45100000 sequences, 4324743959 bases, 2971743959 kmers +read 45200000 sequences, 4332706382 bases, 2976706382 kmers +read 45300000 sequences, 4340799763 bases, 2981799763 kmers +read 45400000 sequences, 4348938081 bases, 2986938081 kmers +read 45500000 sequences, 4357089457 bases, 2992089457 kmers +read 45600000 sequences, 4365213164 bases, 2997213164 kmers +read 45700000 sequences, 4373409316 bases, 3002409316 kmers +read 45800000 sequences, 4381556002 bases, 3007556002 kmers +read 45900000 sequences, 4389760164 bases, 3012760164 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 46100000 sequences, 4406387109 bases, 3023387109 kmers +read 46200000 sequences, 4414694594 bases, 3028694594 kmers +read 46300000 sequences, 4423058706 bases, 3034058706 kmers +read 46400000 sequences, 4431425517 bases, 3039425517 kmers +read 46500000 sequences, 4439833456 bases, 3044833456 kmers +read 46600000 sequences, 4448259129 bases, 3050259129 kmers +read 46700000 sequences, 4456675047 bases, 3055675047 kmers +read 46800000 sequences, 4465159540 bases, 3061159540 kmers +read 46900000 sequences, 4473635471 bases, 3066635471 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 47100000 sequences, 4490782806 bases, 3077782806 kmers +read 47200000 sequences, 4499401969 bases, 3083401969 kmers +read 47300000 sequences, 4508109189 bases, 3089109189 kmers +read 47400000 sequences, 4516742353 bases, 3094742353 kmers +read 47500000 sequences, 4525469627 bases, 3100469627 kmers +read 47600000 sequences, 4534242740 bases, 3106242740 kmers +read 47700000 sequences, 4542982939 bases, 3111982939 kmers +read 47800000 sequences, 4551866526 bases, 3117866526 kmers +read 47900000 sequences, 4560699455 bases, 3123699455 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 48100000 sequences, 4578501178 bases, 3135501178 kmers +read 48200000 sequences, 4587457081 bases, 3141457081 kmers +read 48300000 sequences, 4596477808 bases, 3147477808 kmers +read 48400000 sequences, 4605472928 bases, 3153472928 kmers +read 48500000 sequences, 4614570375 bases, 3159570375 kmers +read 48600000 sequences, 4623645856 bases, 3165645856 kmers +read 48700000 sequences, 4632844357 bases, 3171844357 kmers +read 48800000 sequences, 4642092291 bases, 3178092291 kmers +read 48900000 sequences, 4651346132 bases, 3184346132 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 49100000 sequences, 4670019495 bases, 3197019495 kmers +read 49200000 sequences, 4679397192 bases, 3203397192 kmers +read 49300000 sequences, 4688892187 bases, 3209892187 kmers +read 49400000 sequences, 4698398513 bases, 3216398513 kmers +read 49500000 sequences, 4707888109 bases, 3222888109 kmers +read 49600000 sequences, 4717466158 bases, 3229466158 kmers +read 49700000 sequences, 4727070115 bases, 3236070115 kmers +read 49800000 sequences, 4736756166 bases, 3242756166 kmers +read 49900000 sequences, 4746452288 bases, 3249452288 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 50100000 sequences, 4766057260 bases, 3263057260 kmers +read 50200000 sequences, 4775878546 bases, 3269878546 kmers +read 50300000 sequences, 4785728039 bases, 3276728039 kmers +read 50400000 sequences, 4795653898 bases, 3283653898 kmers +read 50500000 sequences, 4805712637 bases, 3290712637 kmers +read 50600000 sequences, 4815738547 bases, 3297738547 kmers +read 50700000 sequences, 4825926096 bases, 3304926096 kmers +read 50800000 sequences, 4836224453 bases, 3312224453 kmers +read 50900000 sequences, 4846451602 bases, 3319451602 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 51100000 sequences, 4867266416 bases, 3334266416 kmers +read 51200000 sequences, 4877861881 bases, 3341861881 kmers +read 51300000 sequences, 4888414860 bases, 3349414860 kmers +read 51400000 sequences, 4899113807 bases, 3357113807 kmers +read 51500000 sequences, 4909857607 bases, 3364857607 kmers +read 51600000 sequences, 4920671079 bases, 3372671079 kmers +read 51700000 sequences, 4931457242 bases, 3380457242 kmers +read 51800000 sequences, 4942313207 bases, 3388313207 kmers +read 51900000 sequences, 4953292425 bases, 3396292425 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 52100000 sequences, 4975538491 bases, 3412538491 kmers +read 52200000 sequences, 4986760200 bases, 3420760200 kmers +read 52300000 sequences, 4998126907 bases, 3429126907 kmers +read 52400000 sequences, 5009563138 bases, 3437563138 kmers +read 52500000 sequences, 5021023021 bases, 3446023021 kmers +read 52600000 sequences, 5032535974 bases, 3454535974 kmers +read 52700000 sequences, 5044218691 bases, 3463218691 kmers +read 52800000 sequences, 5055973659 bases, 3471973659 kmers +read 52900000 sequences, 5067872847 bases, 3480872847 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 53100000 sequences, 5091783862 bases, 3498783862 kmers +read 53200000 sequences, 5103925623 bases, 3507925623 kmers +read 53300000 sequences, 5116241038 bases, 3517241038 kmers +read 53400000 sequences, 5128584984 bases, 3526584984 kmers +read 53500000 sequences, 5140962968 bases, 3535962968 kmers +read 53600000 sequences, 5153500539 bases, 3545500539 kmers +read 53700000 sequences, 5166148926 bases, 3555148926 kmers +read 53800000 sequences, 5178959440 bases, 3564959440 kmers +read 53900000 sequences, 5191971464 bases, 3574971464 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 54100000 sequences, 5218297450 bases, 3595297450 kmers +read 54200000 sequences, 5231683154 bases, 3605683154 kmers +read 54300000 sequences, 5245150446 bases, 3616150446 kmers +read 54400000 sequences, 5258739234 bases, 3626739234 kmers +read 54500000 sequences, 5272405108 bases, 3637405108 kmers +read 54600000 sequences, 5286362318 bases, 3648362318 kmers +read 54700000 sequences, 5300436762 bases, 3659436762 kmers +read 54800000 sequences, 5314343088 bases, 3670343088 kmers +read 54900000 sequences, 5328793236 bases, 3681793236 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55100000 sequences, 5358294857 bases, 3705294857 kmers +read 55200000 sequences, 5373205019 bases, 3717205019 kmers +=== step 1.1: 'encoding input' 17.285 [sec] (4.64885 [ns/kmer]) +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max_len 17920 +num. bits per_absolute_offset 33 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.90.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.91.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.92.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.93.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.94.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.95.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.96.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.97.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.98.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.99.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.100.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.101.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.102.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.103.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.104.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.105.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.106.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.107.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.108.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.109.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.110.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.111.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.112.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.113.bin'... +=== step 1.2: 'computing minimizers tuples' 6.82763 [sec] (1.83631 [ns/kmer]) +=== step 1: 'parse file' 24.1285 [sec] (6.48944 [ns/kmer]) + == files to merge = 114 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.1: 'merging minimizers tuples' 53.8513 [sec] (14.4835 [ns/kmer]) +num_minimizers = 544808214 +num_minimizer_positions = 661139039 +num_super_kmers = 661139039 +building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 23.2314 [sec] (6.24814 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 24.0437 [sec] (6.46663 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +num_super_kmers = 550000000 +num_super_kmers = 600000000 +num_super_kmers = 650000000 +=== step 2.4: 'merging minimizers tuples ' 33.8791 [sec] (9.1119 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) +num_buckets_in_skew_index 108291/544808214 (0.0198769%) +max_bucket_size 81171 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) +num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) +computing minimizers offsets: 11.3559 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 +num_kmers_in_skew_index 88257432 (2.37371%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28872109 kmers; bits/key = 2.53953 + built positions[0] for 28872109 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21161002 kmers; bits/key = 2.665 + built positions[1] for 21161002 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 14619521 kmers; bits/key = 2.58618 + built positions[2] for 14619521 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 8967010 kmers; bits/key = 2.51981 + built positions[3] for 8967010 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 5825185 kmers; bits/key = 2.55049 + built positions[4] for 5825185 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3889571 kmers; bits/key = 2.9515 + built positions[5] for 3889571 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... + built mphs[6] for 2412718 kmers; bits/key = 2.41709 + built positions[6] for 2412718 kmers; bits/key = 13.0002 + lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... + built mphs[7] for 2510316 kmers; bits/key = 2.55991 + built positions[7] for 2510316 kmers; bits/key = 17.0001 +computing skew index took: 15.3327 [sec] +=== step 3: 'build sparse and skew index' 27.8147 [sec] (7.48084 [ns/kmer]) +=== total_time 186.949 [sec] (50.2804 [ns/kmer]) +total index size: 4810783158 [B] -- 4810.78 [MB] +SPACE BREAKDOWN: + mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 4.01359% + strings_offsets: 0.300083 [bits/kmer] -- 2.89907% + control_codewords: 4.98195 [bits/kmer] -- 48.1301% + mid_load_buckets: 1.32295 [bits/kmer] -- 12.7809% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.57082e-06% + strings: 2.8909 [bits/kmer] -- 27.9287% + skew_index: 0.439676 [bits/kmer] -- 4.24766% + weights: 3.95899e-07 [bits/kmer] -- 3.82474e-06% + -------------- + total: 10.351 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 90.4966% +buckets with 2 minimizer positions = 7.33042% +buckets with 3 minimizer positions = 1.04104% +buckets with 4 minimizer positions = 0.358078% +buckets with 5 minimizer positions = 0.190444% +buckets with 6 minimizer positions = 0.119606% +buckets with 7 minimizer positions = 0.0815559% +buckets with 8 minimizer positions = 0.059031% +buckets with 9 minimizer positions = 0.0448457% +buckets with 10 minimizer positions = 0.0349758% +buckets with 11 minimizer positions = 0.0279273% +buckets with 12 minimizer positions = 0.022929% +buckets with 13 minimizer positions = 0.0189582% +buckets with 14 minimizer positions = 0.0159649% +buckets with 15 minimizer positions = 0.0135407% +buckets with 16 minimizer positions = 0.0117506% +max_bucket_size 81171 +2025-10-22 15:36:58: saving data structure to disk... +2025-10-22 15:37:00: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 100000 sequences, 12802319 bases, 9802319 kmers +read 200000 sequences, 26155680 bases, 20155680 kmers +read 300000 sequences, 39727315 bases, 30727315 kmers +read 400000 sequences, 53567543 bases, 41567543 kmers +read 500000 sequences, 68009750 bases, 53009750 kmers +read 600000 sequences, 83050731 bases, 65050731 kmers +read 700000 sequences, 98819486 bases, 77819486 kmers +read 800000 sequences, 116043186 bases, 92043186 kmers +read 900000 sequences, 134201454 bases, 107201454 kmers +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 1100000 sequences, 174787795 bases, 141787795 kmers +read 1200000 sequences, 183806919 bases, 147806919 kmers +read 1300000 sequences, 190658371 bases, 151658371 kmers +read 1400000 sequences, 197393762 bases, 155393762 kmers +read 1500000 sequences, 204308958 bases, 159308958 kmers +read 1600000 sequences, 211178004 bases, 163178004 kmers +read 1700000 sequences, 217938129 bases, 166938129 kmers +read 1800000 sequences, 224728931 bases, 170728931 kmers +read 1900000 sequences, 231435055 bases, 174435055 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 2100000 sequences, 245162304 bases, 182162304 kmers +read 2200000 sequences, 251968534 bases, 185968534 kmers +read 2300000 sequences, 258797784 bases, 189797784 kmers +read 2400000 sequences, 265681419 bases, 193681419 kmers +read 2500000 sequences, 272480771 bases, 197480771 kmers +read 2600000 sequences, 279327274 bases, 201327274 kmers +read 2700000 sequences, 286169897 bases, 205169897 kmers +read 2800000 sequences, 293063897 bases, 209063897 kmers +read 2900000 sequences, 299941531 bases, 212941531 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 3100000 sequences, 313725925 bases, 220725925 kmers +read 3200000 sequences, 320629887 bases, 224629887 kmers +read 3300000 sequences, 327545193 bases, 228545193 kmers +read 3400000 sequences, 334471610 bases, 232471610 kmers +read 3500000 sequences, 341603766 bases, 236603766 kmers +read 3600000 sequences, 348399690 bases, 240399690 kmers +read 3700000 sequences, 355270676 bases, 244270676 kmers +read 3800000 sequences, 362436143 bases, 248436143 kmers +read 3900000 sequences, 369341114 bases, 252341114 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 4100000 sequences, 383163199 bases, 260163199 kmers +read 4200000 sequences, 390047987 bases, 264047987 kmers +read 4300000 sequences, 396880438 bases, 267880438 kmers +read 4400000 sequences, 403776565 bases, 271776565 kmers +read 4500000 sequences, 410576367 bases, 275576367 kmers +read 4600000 sequences, 417377049 bases, 279377049 kmers +read 4700000 sequences, 424274495 bases, 283274495 kmers +read 4800000 sequences, 431192311 bases, 287192311 kmers +read 4900000 sequences, 438257785 bases, 291257785 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 5100000 sequences, 452307732 bases, 299307732 kmers +read 5200000 sequences, 459344438 bases, 303344438 kmers +read 5300000 sequences, 466255981 bases, 307255981 kmers +read 5400000 sequences, 473220156 bases, 311220156 kmers +read 5500000 sequences, 480178864 bases, 315178864 kmers +read 5600000 sequences, 487198091 bases, 319198091 kmers +read 5700000 sequences, 494051268 bases, 323051268 kmers +read 5800000 sequences, 501294774 bases, 327294774 kmers +read 5900000 sequences, 508386191 bases, 331386191 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 6100000 sequences, 522265327 bases, 339265327 kmers +read 6200000 sequences, 529435219 bases, 343435219 kmers +read 6300000 sequences, 536513892 bases, 347513892 kmers +read 6400000 sequences, 543669227 bases, 351669227 kmers +read 6500000 sequences, 550654427 bases, 355654427 kmers +read 6600000 sequences, 557665979 bases, 359665979 kmers +read 6700000 sequences, 564815722 bases, 363815722 kmers +read 6800000 sequences, 571787007 bases, 367787007 kmers +read 6900000 sequences, 578923485 bases, 371923485 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 7100000 sequences, 593247546 bases, 380247546 kmers +read 7200000 sequences, 600225954 bases, 384225954 kmers +read 7300000 sequences, 607331027 bases, 388331027 kmers +read 7400000 sequences, 614417238 bases, 392417238 kmers +read 7500000 sequences, 621494916 bases, 396494916 kmers +read 7600000 sequences, 628713296 bases, 400713296 kmers +read 7700000 sequences, 635875916 bases, 404875916 kmers +read 7800000 sequences, 643000132 bases, 409000132 kmers +read 7900000 sequences, 650054935 bases, 413054935 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 8100000 sequences, 664392690 bases, 421392690 kmers +read 8200000 sequences, 671575430 bases, 425575430 kmers +read 8300000 sequences, 678822397 bases, 429822397 kmers +read 8400000 sequences, 685932522 bases, 433932522 kmers +read 8500000 sequences, 693003257 bases, 438003257 kmers +read 8600000 sequences, 700264806 bases, 442264806 kmers +read 8700000 sequences, 707441916 bases, 446441916 kmers +read 8800000 sequences, 714783716 bases, 450783716 kmers +read 8900000 sequences, 722048687 bases, 455048687 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 9100000 sequences, 736820834 bases, 463820834 kmers +read 9200000 sequences, 744240551 bases, 468240551 kmers +read 9300000 sequences, 751532385 bases, 472532385 kmers +read 9400000 sequences, 758908308 bases, 476908308 kmers +read 9500000 sequences, 766152765 bases, 481152765 kmers +read 9600000 sequences, 773460104 bases, 485460104 kmers +read 9700000 sequences, 780744999 bases, 489744999 kmers +read 9800000 sequences, 788046688 bases, 494046688 kmers +read 9900000 sequences, 795444088 bases, 498444088 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 10100000 sequences, 810379702 bases, 507379702 kmers +read 10200000 sequences, 817713311 bases, 511713311 kmers +read 10300000 sequences, 825011133 bases, 516011133 kmers +read 10400000 sequences, 832292513 bases, 520292513 kmers +read 10500000 sequences, 839612784 bases, 524612784 kmers +read 10600000 sequences, 847027439 bases, 529027439 kmers +read 10700000 sequences, 854363725 bases, 533363725 kmers +read 10800000 sequences, 861721984 bases, 537721984 kmers +read 10900000 sequences, 869045250 bases, 542045250 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 11100000 sequences, 883866002 bases, 550866002 kmers +read 11200000 sequences, 891340279 bases, 555340279 kmers +read 11300000 sequences, 899036889 bases, 560036889 kmers +read 11400000 sequences, 906434241 bases, 564434241 kmers +read 11500000 sequences, 913824257 bases, 568824257 kmers +read 11600000 sequences, 921342281 bases, 573342281 kmers +read 11700000 sequences, 928719144 bases, 577719144 kmers +read 11800000 sequences, 936164765 bases, 582164765 kmers +read 11900000 sequences, 943653758 bases, 586653758 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 12100000 sequences, 958744772 bases, 595744772 kmers +read 12200000 sequences, 966275858 bases, 600275858 kmers +read 12300000 sequences, 973962686 bases, 604962686 kmers +read 12400000 sequences, 981647965 bases, 609647965 kmers +read 12500000 sequences, 989234531 bases, 614234531 kmers +read 12600000 sequences, 996919849 bases, 618919849 kmers +read 12700000 sequences, 1004488446 bases, 623488446 kmers +read 12800000 sequences, 1012083435 bases, 628083435 kmers +read 12900000 sequences, 1019844583 bases, 632844583 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 13100000 sequences, 1035458430 bases, 642458430 kmers +read 13200000 sequences, 1043299596 bases, 647299596 kmers +read 13300000 sequences, 1051100294 bases, 652100294 kmers +read 13400000 sequences, 1058940054 bases, 656940054 kmers +read 13500000 sequences, 1066735225 bases, 661735225 kmers +read 13600000 sequences, 1074662997 bases, 666662997 kmers +read 13700000 sequences, 1082381283 bases, 671381283 kmers +read 13800000 sequences, 1090055507 bases, 676055507 kmers +read 13900000 sequences, 1097835965 bases, 680835965 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 14100000 sequences, 1113495622 bases, 690495622 kmers +read 14200000 sequences, 1121380038 bases, 695380038 kmers +read 14300000 sequences, 1129522879 bases, 700522879 kmers +read 14400000 sequences, 1137515487 bases, 705515487 kmers +read 14500000 sequences, 1145547633 bases, 710547633 kmers +read 14600000 sequences, 1153636718 bases, 715636718 kmers +read 14700000 sequences, 1161507672 bases, 720507672 kmers +read 14800000 sequences, 1169638977 bases, 725638977 kmers +read 14900000 sequences, 1177765602 bases, 730765602 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 15100000 sequences, 1193966066 bases, 740966066 kmers +read 15200000 sequences, 1201992531 bases, 745992531 kmers +read 15300000 sequences, 1210139564 bases, 751139564 kmers +read 15400000 sequences, 1218303770 bases, 756303770 kmers +read 15500000 sequences, 1226563924 bases, 761563924 kmers +read 15600000 sequences, 1234769102 bases, 766769102 kmers +read 15700000 sequences, 1243038710 bases, 772038710 kmers +read 15800000 sequences, 1251312331 bases, 777312331 kmers +read 15900000 sequences, 1259505857 bases, 782505857 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 16100000 sequences, 1276258510 bases, 793258510 kmers +read 16200000 sequences, 1284600618 bases, 798600618 kmers +read 16300000 sequences, 1292910529 bases, 803910529 kmers +read 16400000 sequences, 1301315569 bases, 809315569 kmers +read 16500000 sequences, 1309948482 bases, 814948482 kmers +read 16600000 sequences, 1318536932 bases, 820536932 kmers +read 16700000 sequences, 1326901868 bases, 825901868 kmers +read 16800000 sequences, 1335658656 bases, 831658656 kmers +read 16900000 sequences, 1344318999 bases, 837318999 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 17100000 sequences, 1361738649 bases, 848738649 kmers +read 17200000 sequences, 1370441463 bases, 854441463 kmers +read 17300000 sequences, 1379104762 bases, 860104762 kmers +read 17400000 sequences, 1387857799 bases, 865857799 kmers +read 17500000 sequences, 1396827318 bases, 871827318 kmers +read 17600000 sequences, 1405624638 bases, 877624638 kmers +read 17700000 sequences, 1414580410 bases, 883580410 kmers +read 17800000 sequences, 1423596393 bases, 889596393 kmers +read 17900000 sequences, 1432608671 bases, 895608671 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 18100000 sequences, 1451131708 bases, 908131708 kmers +read 18200000 sequences, 1460386801 bases, 914386801 kmers +read 18300000 sequences, 1469583369 bases, 920583369 kmers +read 18400000 sequences, 1478759459 bases, 926759459 kmers +read 18500000 sequences, 1488122391 bases, 933122391 kmers +read 18600000 sequences, 1497569745 bases, 939569745 kmers +read 18700000 sequences, 1507030485 bases, 946030485 kmers +read 18800000 sequences, 1516707149 bases, 952707149 kmers +read 18900000 sequences, 1526397934 bases, 959397934 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 19100000 sequences, 1546342668 bases, 973342668 kmers +read 19200000 sequences, 1556281669 bases, 980281669 kmers +read 19300000 sequences, 1566271275 bases, 987271275 kmers +read 19400000 sequences, 1576402796 bases, 994402796 kmers +read 19500000 sequences, 1586440957 bases, 1001440957 kmers +read 19600000 sequences, 1596689344 bases, 1008689344 kmers +read 19700000 sequences, 1607088748 bases, 1016088748 kmers +read 19800000 sequences, 1617543387 bases, 1023543387 kmers +read 19900000 sequences, 1628261415 bases, 1031261415 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20100000 sequences, 1650338356 bases, 1047338356 kmers +read 20200000 sequences, 1661398094 bases, 1055398094 kmers +read 20300000 sequences, 1672652108 bases, 1063652108 kmers +read 20400000 sequences, 1683961135 bases, 1071961135 kmers +read 20500000 sequences, 1695700838 bases, 1080700838 kmers +read 20600000 sequences, 1707448842 bases, 1089448842 kmers +read 20700000 sequences, 1719587691 bases, 1098587691 kmers +read 20800000 sequences, 1732024822 bases, 1108024822 kmers +=== step 1.1: 'encoding input' 5.89151 [sec] (5.3028 [ns/kmer]) +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max_len 176455 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.43371 [sec] (1.29045 [ns/kmer]) +=== step 1: 'parse file' 7.32535 [sec] (6.59336 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +=== step 2.1: 'merging minimizers tuples' 15.2236 [sec] (13.7024 [ns/kmer]) +num_minimizers = 153003346 +num_minimizer_positions = 201447538 +num_super_kmers = 201447538 +building minimizers MPHF with 64 threads and 52 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.77046 [sec] (6.09392 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.59272 [sec] (6.83402 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 4.55477 [sec] (4.09964 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 16447921/153003346 (10.75%) +num_buckets_in_skew_index 10727/153003346 (0.00701096%) +max_bucket_size 71743 +log2_max_bucket_size 17 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 61815481/201447538 (30.6856%) +num_minimizer_positions_of_buckets_in_skew_index 3087359/201447538 (1.53259%) +computing minimizers offsets: 3.9153 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2530324 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1770374 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1563484 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1214204 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1091924 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1055593 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 789627 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71743: 1030596 +num_kmers_in_skew_index 11046126 (0.994234%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2530324 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2530324)... + built mphs[0] for 2530324 kmers; bits/key = 2.5599 + built positions[0] for 2530324 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1770374 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1770374)... + built mphs[1] for 1770374 kmers; bits/key = 2.56029 + built positions[1] for 1770374 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1563484 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1563484)... + built mphs[2] for 1563484 kmers; bits/key = 2.56038 + built positions[2] for 1563484 kmers; bits/key = 9.00021 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1214204 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1214204)... + built mphs[3] for 1214204 kmers; bits/key = 2.56081 + built positions[3] for 1214204 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1091924 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1091924)... + built mphs[4] for 1091924 kmers; bits/key = 2.4182 + built positions[4] for 1091924 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1055593 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1055593)... + built mphs[5] for 1055593 kmers; bits/key = 2.56108 + built positions[5] for 1055593 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 789627 + building MPHF with 64 threads and 1 partitions (avg. partition size = 789627)... + built mphs[6] for 789627 kmers; bits/key = 2.41888 + built positions[6] for 789627 kmers; bits/key = 13.0004 + lower = 8192; upper = 71743; num_bits_per_pos = 17; num_kmers_in_partition = 1030596 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1030596)... + built mphs[7] for 1030596 kmers; bits/key = 2.4183 + built positions[7] for 1030596 kmers; bits/key = 17.0004 +computing skew index took: 6.0632 [sec] +=== step 3: 'build sparse and skew index' 10.3031 [sec] (9.27357 [ns/kmer]) +=== total_time 51.77 [sec] (46.5969 [ns/kmer]) +total index size: 1416509363 [B] -- 1416.51 [MB] +SPACE BREAKDOWN: + mphf: 0.394931 [bits/kmer] (2.86775 [bits/key]) -- 3.87198% + strings_offsets: 0.337884 [bits/kmer] -- 3.31268% + control_codewords: 4.40686 [bits/kmer] -- 43.2057% + mid_load_buckets: 1.7248 [bits/kmer] -- 16.9102% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.89197e-05% + strings: 3.1245 [bits/kmer] -- 30.6332% + skew_index: 0.210737 [bits/kmer] -- 2.0661% + weights: 1.32491e-06 [bits/kmer] -- 1.29897e-05% + -------------- + total: 10.1997 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 89.2429% +buckets with 2 minimizer positions = 6.05035% +buckets with 3 minimizer positions = 1.71539% +buckets with 4 minimizer positions = 0.818195% +buckets with 5 minimizer positions = 0.497438% +buckets with 6 minimizer positions = 0.343779% +buckets with 7 minimizer positions = 0.255749% +buckets with 8 minimizer positions = 0.199702% +buckets with 9 minimizer positions = 0.159387% +buckets with 10 minimizer positions = 0.13028% +buckets with 11 minimizer positions = 0.107217% +buckets with 12 minimizer positions = 0.0878229% +buckets with 13 minimizer positions = 0.0717429% +buckets with 14 minimizer positions = 0.0589601% +buckets with 15 minimizer positions = 0.0471898% +buckets with 16 minimizer positions = 0.0377861% +max_bucket_size 71743 +2025-10-22 15:37:53: saving data structure to disk... +2025-10-22 15:37:54: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash +k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 100000 sequences, 8718431 bases, 5718431 kmers +read 200000 sequences, 17474097 bases, 11474097 kmers +read 300000 sequences, 26299449 bases, 17299449 kmers +read 400000 sequences, 35167130 bases, 23167130 kmers +read 500000 sequences, 43967965 bases, 28967965 kmers +read 600000 sequences, 52886445 bases, 34886445 kmers +read 700000 sequences, 61937196 bases, 40937196 kmers +read 800000 sequences, 71070714 bases, 47070714 kmers +read 900000 sequences, 80176912 bases, 53176912 kmers +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 1100000 sequences, 98984859 bases, 65984859 kmers +read 1200000 sequences, 108719881 bases, 72719881 kmers +read 1300000 sequences, 118280880 bases, 79280880 kmers +read 1400000 sequences, 127917770 bases, 85917770 kmers +read 1500000 sequences, 137591691 bases, 92591691 kmers +read 1600000 sequences, 147395215 bases, 99395215 kmers +read 1700000 sequences, 157335047 bases, 106335047 kmers +read 1800000 sequences, 167445213 bases, 113445213 kmers +read 1900000 sequences, 177725569 bases, 120725569 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 2100000 sequences, 198499534 bases, 135499534 kmers +read 2200000 sequences, 209053278 bases, 143053278 kmers +read 2300000 sequences, 219848016 bases, 150848016 kmers +read 2400000 sequences, 230787167 bases, 158787167 kmers +read 2500000 sequences, 242014409 bases, 167014409 kmers +read 2600000 sequences, 253501985 bases, 175501985 kmers +read 2700000 sequences, 265108770 bases, 184108770 kmers +read 2800000 sequences, 277040197 bases, 193040197 kmers +read 2900000 sequences, 289406751 bases, 202406751 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 3100000 sequences, 315168435 bases, 222168435 kmers +read 3200000 sequences, 329083083 bases, 233083083 kmers +read 3300000 sequences, 343508535 bases, 244508535 kmers +read 3400000 sequences, 358608045 bases, 256608045 kmers +read 3500000 sequences, 374790387 bases, 269790387 kmers +read 3600000 sequences, 392124136 bases, 284124136 kmers +read 3700000 sequences, 410698510 bases, 299698510 kmers +read 3800000 sequences, 431358064 bases, 317358064 kmers +read 3900000 sequences, 454179453 bases, 337179453 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 4100000 sequences, 468031549 bases, 345031549 kmers +read 4200000 sequences, 474889571 bases, 348889571 kmers +read 4300000 sequences, 481729708 bases, 352729708 kmers +read 4400000 sequences, 488721954 bases, 356721954 kmers +read 4500000 sequences, 495625078 bases, 360625078 kmers +read 4600000 sequences, 502596576 bases, 364596576 kmers +read 4700000 sequences, 509600517 bases, 368600517 kmers +read 4800000 sequences, 516484470 bases, 372484470 kmers +read 4900000 sequences, 523427219 bases, 376427219 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 5100000 sequences, 537329595 bases, 384329595 kmers +read 5200000 sequences, 544209359 bases, 388209359 kmers +read 5300000 sequences, 551189922 bases, 392189922 kmers +read 5400000 sequences, 558101939 bases, 396101939 kmers +read 5500000 sequences, 565120163 bases, 400120163 kmers +read 5600000 sequences, 572157570 bases, 404157570 kmers +read 5700000 sequences, 579064866 bases, 408064866 kmers +read 5800000 sequences, 586002711 bases, 412002711 kmers +read 5900000 sequences, 592940936 bases, 415940936 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 6100000 sequences, 607035798 bases, 424035798 kmers +read 6200000 sequences, 614208718 bases, 428208718 kmers +read 6300000 sequences, 621168245 bases, 432168245 kmers +read 6400000 sequences, 628072498 bases, 436072498 kmers +read 6500000 sequences, 635102614 bases, 440102614 kmers +read 6600000 sequences, 642120732 bases, 444120732 kmers +read 6700000 sequences, 649088967 bases, 448088967 kmers +read 6800000 sequences, 656101755 bases, 452101755 kmers +read 6900000 sequences, 663148884 bases, 456148884 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 7100000 sequences, 677027864 bases, 464027864 kmers +read 7200000 sequences, 684172202 bases, 468172202 kmers +read 7300000 sequences, 691211207 bases, 472211207 kmers +read 7400000 sequences, 698208790 bases, 476208790 kmers +read 7500000 sequences, 705328995 bases, 480328995 kmers +read 7600000 sequences, 712361023 bases, 484361023 kmers +read 7700000 sequences, 719471804 bases, 488471804 kmers +read 7800000 sequences, 726605138 bases, 492605138 kmers +read 7900000 sequences, 733774594 bases, 496774594 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 8100000 sequences, 747950180 bases, 504950180 kmers +read 8200000 sequences, 755058730 bases, 509058730 kmers +read 8300000 sequences, 762216427 bases, 513216427 kmers +read 8400000 sequences, 769353851 bases, 517353851 kmers +read 8500000 sequences, 776583161 bases, 521583161 kmers +read 8600000 sequences, 783816261 bases, 525816261 kmers +read 8700000 sequences, 791077370 bases, 530077370 kmers +read 8800000 sequences, 798157781 bases, 534157781 kmers +read 8900000 sequences, 805241016 bases, 538241016 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 9100000 sequences, 819617693 bases, 546617693 kmers +read 9200000 sequences, 826809772 bases, 550809772 kmers +read 9300000 sequences, 833919107 bases, 554919107 kmers +read 9400000 sequences, 841155666 bases, 559155666 kmers +read 9500000 sequences, 848401695 bases, 563401695 kmers +read 9600000 sequences, 855643716 bases, 567643716 kmers +read 9700000 sequences, 862872782 bases, 571872782 kmers +read 9800000 sequences, 870171741 bases, 576171741 kmers +read 9900000 sequences, 877460939 bases, 580460939 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 10100000 sequences, 891988915 bases, 588988915 kmers +read 10200000 sequences, 899332167 bases, 593332167 kmers +read 10300000 sequences, 906596132 bases, 597596132 kmers +read 10400000 sequences, 913914222 bases, 601914222 kmers +read 10500000 sequences, 921197164 bases, 606197164 kmers +read 10600000 sequences, 928621352 bases, 610621352 kmers +read 10700000 sequences, 935962590 bases, 614962590 kmers +read 10800000 sequences, 943225398 bases, 619225398 kmers +read 10900000 sequences, 950606271 bases, 623606271 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 11100000 sequences, 965609642 bases, 632609642 kmers +read 11200000 sequences, 972999574 bases, 636999574 kmers +read 11300000 sequences, 980385996 bases, 641385996 kmers +read 11400000 sequences, 987756692 bases, 645756692 kmers +read 11500000 sequences, 995228727 bases, 650228727 kmers +read 11600000 sequences, 1002716000 bases, 654716000 kmers +read 11700000 sequences, 1010163238 bases, 659163238 kmers +read 11800000 sequences, 1017604060 bases, 663604060 kmers +read 11900000 sequences, 1025150347 bases, 668150347 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 12100000 sequences, 1040213508 bases, 677213508 kmers +read 12200000 sequences, 1047864763 bases, 681864763 kmers +read 12300000 sequences, 1055370986 bases, 686370986 kmers +read 12400000 sequences, 1062882136 bases, 690882136 kmers +read 12500000 sequences, 1070457834 bases, 695457834 kmers +read 12600000 sequences, 1078056503 bases, 700056503 kmers +read 12700000 sequences, 1085619892 bases, 704619892 kmers +read 12800000 sequences, 1093220371 bases, 709220371 kmers +read 12900000 sequences, 1100938017 bases, 713938017 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 13100000 sequences, 1116117667 bases, 723117667 kmers +read 13200000 sequences, 1123791984 bases, 727791984 kmers +read 13300000 sequences, 1131456294 bases, 732456294 kmers +read 13400000 sequences, 1139167231 bases, 737167231 kmers +read 13500000 sequences, 1147084240 bases, 742084240 kmers +read 13600000 sequences, 1154903455 bases, 746903455 kmers +read 13700000 sequences, 1162719581 bases, 751719581 kmers +read 13800000 sequences, 1170515268 bases, 756515268 kmers +read 13900000 sequences, 1178310906 bases, 761310906 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 14100000 sequences, 1194143461 bases, 771143461 kmers +read 14200000 sequences, 1202037257 bases, 776037257 kmers +read 14300000 sequences, 1210016774 bases, 781016774 kmers +read 14400000 sequences, 1217929746 bases, 785929746 kmers +read 14500000 sequences, 1226009557 bases, 791009557 kmers +read 14600000 sequences, 1233936531 bases, 795936531 kmers +read 14700000 sequences, 1241953842 bases, 800953842 kmers +read 14800000 sequences, 1249971925 bases, 805971925 kmers +read 14900000 sequences, 1258012031 bases, 811012031 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 15100000 sequences, 1274149698 bases, 821149698 kmers +read 15200000 sequences, 1282474916 bases, 826474916 kmers +read 15300000 sequences, 1290768947 bases, 831768947 kmers +read 15400000 sequences, 1299121797 bases, 837121797 kmers +read 15500000 sequences, 1307304198 bases, 842304198 kmers +read 15600000 sequences, 1315661756 bases, 847661756 kmers +read 15700000 sequences, 1324089837 bases, 853089837 kmers +read 15800000 sequences, 1332318617 bases, 858318617 kmers +read 15900000 sequences, 1340760587 bases, 863760587 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16100000 sequences, 1357811757 bases, 874811757 kmers +read 16200000 sequences, 1366358226 bases, 880358226 kmers +read 16300000 sequences, 1375027036 bases, 886027036 kmers +read 16400000 sequences, 1383710258 bases, 891710258 kmers +=== step 1.1: 'encoding input' 5.00424 [sec] (5.59564 [ns/kmer]) +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max_len 117016 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 17 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.64.bin'... +=== step 1.2: 'computing minimizers tuples' 1.1442 [sec] (1.27942 [ns/kmer]) +=== step 1: 'parse file' 6.14854 [sec] (6.87518 [ns/kmer]) + == files to merge = 65 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.0613 [sec] (13.4867 [ns/kmer]) +num_minimizers = 126246665 +num_minimizer_positions = 162006751 +num_super_kmers = 162006751 +building minimizers MPHF with 64 threads and 43 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.61504 [sec] (6.27863 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.20336 [sec] (6.93648 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 6.29036 [sec] (7.03375 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 14059268/126246665 (11.1363%) +num_buckets_in_skew_index 8266/126246665 (0.0065475%) +max_bucket_size 36894 +log2_max_bucket_size 16 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 48164669/162006751 (29.73%) +num_minimizer_positions_of_buckets_in_skew_index 1662951/162006751 (1.02647%) +computing minimizers offsets: 3.16291 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2254325 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1183762 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 885561 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 591648 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 450833 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 373731 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 338406 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 36894: 388502 +num_kmers_in_skew_index 6466768 (0.723101%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2254325 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2254325)... + built mphs[0] for 2254325 kmers; bits/key = 2.56001 + built positions[0] for 2254325 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1183762 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1183762)... + built mphs[1] for 1183762 kmers; bits/key = 2.56081 + built positions[1] for 1183762 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 885561 + building MPHF with 64 threads and 1 partitions (avg. partition size = 885561)... + built mphs[2] for 885561 kmers; bits/key = 2.56147 + built positions[2] for 885561 kmers; bits/key = 9.00043 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 591648 + building MPHF with 64 threads and 1 partitions (avg. partition size = 591648)... + built mphs[3] for 591648 kmers; bits/key = 2.56263 + built positions[3] for 591648 kmers; bits/key = 10.0005 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 450833 + building MPHF with 64 threads and 1 partitions (avg. partition size = 450833)... + built mphs[4] for 450833 kmers; bits/key = 2.42098 + built positions[4] for 450833 kmers; bits/key = 11.0007 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 373731 + building MPHF with 64 threads and 1 partitions (avg. partition size = 373731)... + built mphs[5] for 373731 kmers; bits/key = 2.56484 + built positions[5] for 373731 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 338406 + building MPHF with 64 threads and 1 partitions (avg. partition size = 338406)... + built mphs[6] for 338406 kmers; bits/key = 2.4226 + built positions[6] for 338406 kmers; bits/key = 13.001 + lower = 8192; upper = 36894; num_bits_per_pos = 16; num_kmers_in_partition = 388502 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388502)... + built mphs[7] for 388502 kmers; bits/key = 2.56472 + built positions[7] for 388502 kmers; bits/key = 16.0009 +computing skew index took: 3.60778 [sec] +=== step 3: 'build sparse and skew index' 7.03857 [sec] (7.87039 [ns/kmer]) +=== total_time 43.3572 [sec] (48.4811 [ns/kmer]) +total index size: 1137030132 [B] -- 1137.03 [MB] +SPACE BREAKDOWN: + mphf: 0.405702 [bits/kmer] (2.87392 [bits/key]) -- 3.98871% + strings_offsets: 0.333373 [bits/kmer] -- 3.2776% + control_codewords: 4.51733 [bits/kmer] -- 44.4128% + mid_load_buckets: 1.66956 [bits/kmer] -- 16.4145% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.35702e-05% + strings: 3.10303 [bits/kmer] -- 30.5079% + skew_index: 0.142237 [bits/kmer] -- 1.39842% + weights: 1.64596e-06 [bits/kmer] -- 1.61825e-05% + -------------- + total: 10.1712 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 88.8571% +buckets with 2 minimizer positions = 6.64024% +buckets with 3 minimizer positions = 1.83049% +buckets with 4 minimizer positions = 0.817717% +buckets with 5 minimizer positions = 0.475524% +buckets with 6 minimizer positions = 0.319677% +buckets with 7 minimizer positions = 0.233881% +buckets with 8 minimizer positions = 0.178737% +buckets with 9 minimizer positions = 0.138965% +buckets with 10 minimizer positions = 0.107245% +buckets with 11 minimizer positions = 0.0823246% +buckets with 12 minimizer positions = 0.0632579% +buckets with 13 minimizer positions = 0.0483173% +buckets with 14 minimizer positions = 0.0365673% +buckets with 15 minimizer positions = 0.027916% +buckets with 16 minimizer positions = 0.0218604% +max_bucket_size 36894 +2025-10-22 15:38:38: saving data structure to disk... +2025-10-22 15:38:39: DONE diff --git a/benchmarks/results-22-10-25/k63/canon-bench.log b/benchmarks/results-22-10-25/k63/canon-bench.log new file mode 100644 index 0000000..c307f83 --- /dev/null +++ b/benchmarks/results-22-10-25/k63/canon-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 625.152 +avg_nanosec_per_negative_lookup 476.825 +avg_nanosec_per_access 297.102 +iterator: avg_nanosec_per_kmer 2.7503 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 625.786 +avg_nanosec_per_negative_lookup 463.014 +avg_nanosec_per_access 299 +iterator: avg_nanosec_per_kmer 2.76641 +./sshash bench -i cod.k63.canon.sshash +avg_nanosec_per_positive_lookup 619.386 +avg_nanosec_per_negative_lookup 455.896 +avg_nanosec_per_access 306.879 +iterator: avg_nanosec_per_kmer 2.8279 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 571.126 +avg_nanosec_per_negative_lookup 485.048 +avg_nanosec_per_access 343.688 +iterator: avg_nanosec_per_kmer 2.79569 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 564.902 +avg_nanosec_per_negative_lookup 484.953 +avg_nanosec_per_access 342.74 +iterator: avg_nanosec_per_kmer 2.75394 +./sshash bench -i kestrel.k63.canon.sshash +avg_nanosec_per_positive_lookup 562.664 +avg_nanosec_per_negative_lookup 481.77 +avg_nanosec_per_access 342.762 +iterator: avg_nanosec_per_kmer 2.75729 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 727.407 +avg_nanosec_per_negative_lookup 540.515 +avg_nanosec_per_access 357.969 +iterator: avg_nanosec_per_kmer 2.78199 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 707.179 +avg_nanosec_per_negative_lookup 537.748 +avg_nanosec_per_access 369.65 +iterator: avg_nanosec_per_kmer 2.98267 +./sshash bench -i human.k63.canon.sshash +avg_nanosec_per_positive_lookup 729.143 +avg_nanosec_per_negative_lookup 526.801 +avg_nanosec_per_access 367.36 +iterator: avg_nanosec_per_kmer 2.76464 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1163.11 +avg_nanosec_per_negative_lookup 620.751 +avg_nanosec_per_access 670.786 +iterator: avg_nanosec_per_kmer 2.87851 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1151.82 +avg_nanosec_per_negative_lookup 621.635 +avg_nanosec_per_access 673.045 +iterator: avg_nanosec_per_kmer 2.89931 +./sshash bench -i hprc.k63.canon.sshash +avg_nanosec_per_positive_lookup 1155.34 +avg_nanosec_per_negative_lookup 615.418 +avg_nanosec_per_access 672.742 +iterator: avg_nanosec_per_kmer 2.88102 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1488.37 +avg_nanosec_per_negative_lookup 533.721 +avg_nanosec_per_access 473.19 +iterator: avg_nanosec_per_kmer 2.96014 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1473.8 +avg_nanosec_per_negative_lookup 523.615 +avg_nanosec_per_access 507.294 +iterator: avg_nanosec_per_kmer 2.90659 +./sshash bench -i ec.k63.canon.sshash +avg_nanosec_per_positive_lookup 1492.72 +avg_nanosec_per_negative_lookup 536.841 +avg_nanosec_per_access 467.657 +iterator: avg_nanosec_per_kmer 2.90476 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1372.62 +avg_nanosec_per_negative_lookup 523.641 +avg_nanosec_per_access 431.371 +iterator: avg_nanosec_per_kmer 2.97875 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1376.07 +avg_nanosec_per_negative_lookup 508.084 +avg_nanosec_per_access 440.472 +iterator: avg_nanosec_per_kmer 2.80899 +./sshash bench -i se.k63.canon.sshash +avg_nanosec_per_positive_lookup 1407.79 +avg_nanosec_per_negative_lookup 506.944 +avg_nanosec_per_access 448.106 +iterator: avg_nanosec_per_kmer 2.8181 diff --git a/benchmarks/results-22-10-25/k63/canon-build.log b/benchmarks/results-22-10-25/k63/canon-build.log new file mode 100644 index 0000000..da7a1b6 --- /dev/null +++ b/benchmarks/results-22-10-25/k63/canon-build.log @@ -0,0 +1,2131 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.48886 [sec] (2.67498 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.436807 [sec] (0.784797 [ns/kmer]) +=== step 1: 'parse file' 1.92575 [sec] (3.45993 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.51997 [sec] (4.52755 [ns/kmer]) +num_minimizers = 29275778 +num_minimizer_positions = 34590805 +num_super_kmers = 36307176 +building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.63668 [sec] (2.94058 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.34013 [sec] (2.40776 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.693623 [sec] (1.24621 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 1189512/29275778 (4.06313%) +num_buckets_in_skew_index 5032/29275778 (0.0171883%) +max_bucket_size 815743 +log2_max_bucket_size 20 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 4643594/34590805 (13.4244%) +num_minimizer_positions_of_buckets_in_skew_index 1865977/34590805 (5.39443%) +computing minimizers offsets: 0.513675 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4850737 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3133092 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1886121 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1113398 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 945186 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1019479 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 681501 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 815743: 5508330 +num_kmers_in_skew_index 19137844 (3.43844%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4850737 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4850737 kmers; bits/key = 2.71418 + built positions[0] for 4850737 kmers; bits/key = 7.00007 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3133092 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3133092 kmers; bits/key = 3.15324 + built positions[1] for 3133092 kmers; bits/key = 8.00011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1886121 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1886121)... + built mphs[2] for 1886121 kmers; bits/key = 2.5602 + built positions[2] for 1886121 kmers; bits/key = 9.00018 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1113398 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1113398)... + built mphs[3] for 1113398 kmers; bits/key = 2.56094 + built positions[3] for 1113398 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 945186 + building MPHF with 64 threads and 1 partitions (avg. partition size = 945186)... + built mphs[4] for 945186 kmers; bits/key = 2.56129 + built positions[4] for 945186 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1019479 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1019479)... + built mphs[5] for 1019479 kmers; bits/key = 2.56115 + built positions[5] for 1019479 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 681501 + building MPHF with 64 threads and 1 partitions (avg. partition size = 681501)... + built mphs[6] for 681501 kmers; bits/key = 2.41941 + built positions[6] for 681501 kmers; bits/key = 13.0005 + lower = 8192; upper = 815743; num_bits_per_pos = 20; num_kmers_in_partition = 5508330 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 5508330 kmers; bits/key = 2.59546 + built positions[7] for 5508330 kmers; bits/key = 20.0001 +computing skew index took: 5.81458 [sec] +=== step 3: 'build sparse and skew index' 6.38025 [sec] (11.4632 [ns/kmer]) +=== total_time 14.4964 [sec] (26.0452 [ns/kmer]) +total index size: 345440534 [B] -- 345.441 [MB] +SPACE BREAKDOWN: + mphf: 0.151285 [bits/kmer] (2.87621 [bits/key]) -- 3.04695% + strings_offsets: 0.115799 [bits/kmer] -- 2.33223% + control_codewords: 1.63057 [bits/kmer] -- 32.8403% + mid_load_buckets: 0.250291 [bits/kmer] -- 5.04096% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.75821e-05% + strings: 2.21266 [bits/kmer] -- 44.564% + skew_index: 0.604527 [bits/kmer] -- 12.1754% + weights: 2.6447e-06 [bits/kmer] -- 5.32653e-05% + -------------- + total: 4.96514 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 95.9197% +buckets with 2 minimizer positions = 2.25505% +buckets with 3 minimizer positions = 0.743143% +buckets with 4 minimizer positions = 0.33953% +buckets with 5 minimizer positions = 0.188914% +buckets with 6 minimizer positions = 0.116602% +buckets with 7 minimizer positions = 0.0799535% +buckets with 8 minimizer positions = 0.0565963% +buckets with 9 minimizer positions = 0.0427691% +buckets with 10 minimizer positions = 0.0324774% +buckets with 11 minimizer positions = 0.0259498% +buckets with 12 minimizer positions = 0.0206382% +buckets with 13 minimizer positions = 0.017038% +buckets with 14 minimizer positions = 0.0148143% +buckets with 15 minimizer positions = 0.0124232% +buckets with 16 minimizer positions = 0.0107973% +max_bucket_size 815743 +2025-10-22 15:55:06: saving data structure to disk... +2025-10-22 15:55:06: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.72496 [sec] (2.35876 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.689165 [sec] (0.59655 [ns/kmer]) +=== step 1: 'parse file' 3.41425 [sec] (2.95542 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 5.09407 [sec] (4.40949 [ns/kmer]) +num_minimizers = 68497878 +num_minimizer_positions = 69282395 +num_super_kmers = 73080845 +building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.03499 [sec] (2.62712 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.68175 [sec] (2.32136 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.37776 [sec] (1.19261 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 296941/68497878 (0.433504%) +num_buckets_in_skew_index 787/68497878 (0.00114894%) +max_bucket_size 1509 +log2_max_bucket_size 11 +skew index num_partitions 5 +num_minimizer_positions_of_buckets_larger_than_1 973386/69282395 (1.40495%) +num_minimizer_positions_of_buckets_in_skew_index 108859/69282395 (0.157124%) +computing minimizers offsets: 0.575347 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 854803 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 508726 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 353088 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 143157 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1509: 45334 +num_kmers_in_skew_index 1905108 (0.164909%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 854803 + building MPHF with 64 threads and 1 partitions (avg. partition size = 854803)... + built mphs[0] for 854803 kmers; bits/key = 2.5616 + built positions[0] for 854803 kmers; bits/key = 7.00044 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 508726 + building MPHF with 64 threads and 1 partitions (avg. partition size = 508726)... + built mphs[1] for 508726 kmers; bits/key = 2.42032 + built positions[1] for 508726 kmers; bits/key = 8.00066 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 353088 + building MPHF with 64 threads and 1 partitions (avg. partition size = 353088)... + built mphs[2] for 353088 kmers; bits/key = 2.56521 + built positions[2] for 353088 kmers; bits/key = 9.00091 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 143157 + building MPHF with 64 threads and 1 partitions (avg. partition size = 143157)... + built mphs[3] for 143157 kmers; bits/key = 2.4309 + built positions[3] for 143157 kmers; bits/key = 10.0026 + lower = 1024; upper = 1509; num_bits_per_pos = 11; num_kmers_in_partition = 45334 + building MPHF with 64 threads and 1 partitions (avg. partition size = 45334)... + built mphs[4] for 45334 kmers; bits/key = 2.46173 + built positions[4] for 45334 kmers; bits/key = 11.0074 +computing skew index took: 1.06363 [sec] +=== step 3: 'build sparse and skew index' 1.72241 [sec] (1.49094 [ns/kmer]) +=== total_time 17.3252 [sec] (14.9969 [ns/kmer]) +total index size: 610013381 [B] -- 610.013 [MB] +SPACE BREAKDOWN: + mphf: 0.16806 [bits/kmer] (2.83441 [bits/key]) -- 3.97842% + strings_offsets: 0.0958241 [bits/kmer] -- 2.26841% + control_codewords: 1.89737 [bits/kmer] -- 44.9157% + mid_load_buckets: 0.0261201 [bits/kmer] -- 0.618333% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.39335e-05% + strings: 2.01672 [bits/kmer] -- 47.7411% + skew_index: 0.0201901 [bits/kmer] -- 0.477952% + weights: 1.27418e-06 [bits/kmer] -- 3.01633e-05% + -------------- + total: 4.22428 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.5653% +buckets with 2 minimizer positions = 0.296122% +buckets with 3 minimizer positions = 0.0602092% +buckets with 4 minimizer positions = 0.0251672% +buckets with 5 minimizer positions = 0.0136895% +buckets with 6 minimizer positions = 0.00842362% +buckets with 7 minimizer positions = 0.00572864% +buckets with 8 minimizer positions = 0.00416071% +buckets with 9 minimizer positions = 0.00301323% +buckets with 10 minimizer positions = 0.00248183% +buckets with 11 minimizer positions = 0.00184093% +buckets with 12 minimizer positions = 0.00158691% +buckets with 13 minimizer positions = 0.00117084% +buckets with 14 minimizer positions = 0.00105697% +buckets with 15 minimizer positions = 0.000887619% +buckets with 16 minimizer positions = 0.000756228% +max_bucket_size 1509 +2025-10-22 15:55:23: saving data structure to disk... +2025-10-22 15:55:24: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 7.01186 [sec] (2.53015 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.56781 [sec] (0.565729 [ns/kmer]) +=== step 1: 'parse file' 8.57981 [sec] (3.09593 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.5318 [sec] (4.52197 [ns/kmer]) +num_minimizers = 149769567 +num_minimizer_positions = 173272792 +num_super_kmers = 182565576 +building minimizers MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 6.18506 [sec] (2.23182 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.3913 [sec] (2.30623 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.74666 [sec] (1.35194 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 4082749/149769567 (2.72602%) +num_buckets_in_skew_index 35781/149769567 (0.0238907%) +max_bucket_size 284250 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 16495406/173272792 (9.51991%) +num_minimizer_positions_of_buckets_in_skew_index 11126349/173272792 (6.42129%) +computing minimizers offsets: 2.12159 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 26742724 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 24475836 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 21113117 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19260150 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17989259 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15443443 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 12315344 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 284250: 28690575 +num_kmers_in_skew_index 166030448 (5.99103%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26742724 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 26742724 kmers; bits/key = 2.56429 + built positions[0] for 26742724 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 24475836 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 24475836 kmers; bits/key = 2.62316 + built positions[1] for 24475836 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 21113117 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 21113117 kmers; bits/key = 2.6904 + built positions[2] for 21113117 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 19260150 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 19260150 kmers; bits/key = 2.59757 + built positions[3] for 19260150 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17989259 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17989259 kmers; bits/key = 2.53715 + built positions[4] for 17989259 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 15443443 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[5] for 15443443 kmers; bits/key = 2.69254 + built positions[5] for 15443443 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 12315344 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 12315344 kmers; bits/key = 2.67895 + built positions[6] for 12315344 kmers; bits/key = 13 + lower = 8192; upper = 284250; num_bits_per_pos = 19; num_kmers_in_partition = 28690575 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[7] for 28690575 kmers; bits/key = 2.55295 + built positions[7] for 28690575 kmers; bits/key = 19 +computing skew index took: 21.6427 [sec] +=== step 3: 'build sparse and skew index' 24.0033 [sec] (8.66133 [ns/kmer]) +=== total_time 61.4379 [sec] (22.1692 [ns/kmer]) +total index size: 1839839288 [B] -- 1839.84 [MB] +SPACE BREAKDOWN: + mphf: 0.152644 [bits/kmer] (2.82451 [bits/key]) -- 2.87406% + strings_offsets: 0.11255 [bits/kmer] -- 2.11915% + control_codewords: 1.78341 [bits/kmer] -- 33.579% + mid_load_buckets: 0.19047 [bits/kmer] -- 3.58627% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.45665e-05% + strings: 2.11826 [bits/kmer] -- 39.8836% + skew_index: 0.95376 [bits/kmer] -- 17.9579% + weights: 5.31156e-07 [bits/kmer] -- 1.00009e-05% + -------------- + total: 5.31109 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.2501% +buckets with 2 minimizer positions = 1.59767% +buckets with 3 minimizer positions = 0.444706% +buckets with 4 minimizer positions = 0.198987% +buckets with 5 minimizer positions = 0.113029% +buckets with 6 minimizer positions = 0.07244% +buckets with 7 minimizer positions = 0.0504562% +buckets with 8 minimizer positions = 0.0370322% +buckets with 9 minimizer positions = 0.0281472% +buckets with 10 minimizer positions = 0.0224598% +buckets with 11 minimizer positions = 0.0182414% +buckets with 12 minimizer positions = 0.0149463% +buckets with 13 minimizer positions = 0.0124745% +buckets with 14 minimizer positions = 0.0107405% +buckets with 15 minimizer positions = 0.00923686% +buckets with 16 minimizer positions = 0.00803234% +max_bucket_size 284250 +2025-10-22 15:56:26: saving data structure to disk... +2025-10-22 15:56:27: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.7347 [sec] (4.67955 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.82.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.83.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.84.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.85.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.86.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.87.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.88.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.89.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.90.bin'... +=== step 1.2: 'computing minimizers tuples' 11.09 [sec] (1.87116 [ns/kmer]) +=== step 1: 'parse file' 38.8247 [sec] (6.55073 [ns/kmer]) + == files to merge = 91 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.1: 'merging minimizers tuples' 37.899 [sec] (6.39453 [ns/kmer]) +num_minimizers = 295344565 +num_minimizer_positions = 485764487 +num_super_kmers = 507036670 +building minimizers MPHF with 64 threads and 99 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 12.3942 [sec] (2.09122 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.1.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.3753 [sec] (2.93165 [ns/kmer]) + == files to merge = 2 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +num_super_kmers = 450000000 +num_super_kmers = 500000000 +=== step 2.4: 'merging minimizers tuples ' 22.3015 [sec] (3.76284 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 76095635/295344565 (25.765%) +num_buckets_in_skew_index 164193/295344565 (0.0555937%) +max_bucket_size 265182 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 218504008/485764487 (44.9815%) +num_minimizer_positions_of_buckets_in_skew_index 48175742/485764487 (9.91751%) +computing minimizers offsets: 13.3273 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 91237805 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 81089595 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 71244043 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 64999827 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 55340829 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 44026748 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 33883659 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 265182: 85368523 +num_kmers_in_skew_index 527191029 (8.89506%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 91237805 + building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... + built mphs[0] for 91237805 kmers; bits/key = 2.54472 + built positions[0] for 91237805 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 81089595 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[1] for 81089595 kmers; bits/key = 2.56263 + built positions[1] for 81089595 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 71244043 + building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... + built mphs[2] for 71244043 kmers; bits/key = 2.56439 + built positions[2] for 71244043 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 64999827 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[3] for 64999827 kmers; bits/key = 2.54652 + built positions[3] for 64999827 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 55340829 + building MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... + built mphs[4] for 55340829 kmers; bits/key = 2.53877 + built positions[4] for 55340829 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 44026748 + building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... + built mphs[5] for 44026748 kmers; bits/key = 2.53894 + built positions[5] for 44026748 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 33883659 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[6] for 33883659 kmers; bits/key = 2.5671 + built positions[6] for 33883659 kmers; bits/key = 13 + lower = 8192; upper = 265182; num_bits_per_pos = 19; num_kmers_in_partition = 85368523 + building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... + built mphs[7] for 85368523 kmers; bits/key = 2.56049 + built positions[7] for 85368523 kmers; bits/key = 19 +computing skew index took: 73.1911 [sec] +=== step 3: 'build sparse and skew index' 87.5243 [sec] (14.7676 [ns/kmer]) +=== total_time 216.319 [sec] (36.4985 [ns/kmer]) +total index size: 6028576012 [B] -- 6028.58 [MB] +SPACE BREAKDOWN: + mphf: 0.141443 [bits/kmer] (2.83839 [bits/key]) -- 1.73819% + strings_offsets: 0.273643 [bits/kmer] -- 3.36278% + control_codewords: 1.74413 [bits/kmer] -- 21.4335% + mid_load_buckets: 1.25348 [bits/kmer] -- 15.404% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.44549e-06% + strings: 3.2463 [bits/kmer] -- 39.8936% + skew_index: 1.4784 [bits/kmer] -- 18.168% + weights: 2.48364e-07 [bits/kmer] -- 3.05213e-06% + -------------- + total: 8.1374 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 74.1794% +buckets with 2 minimizer positions = 17.5493% +buckets with 3 minimizer positions = 4.9171% +buckets with 4 minimizer positions = 1.47166% +buckets with 5 minimizer positions = 0.573611% +buckets with 6 minimizer positions = 0.301038% +buckets with 7 minimizer positions = 0.190827% +buckets with 8 minimizer positions = 0.133018% +buckets with 9 minimizer positions = 0.0984907% +buckets with 10 minimizer positions = 0.0753777% +buckets with 11 minimizer positions = 0.0590937% +buckets with 12 minimizer positions = 0.0475793% +buckets with 13 minimizer positions = 0.0389636% +buckets with 14 minimizer positions = 0.0324661% +buckets with 15 minimizer positions = 0.0273305% +buckets with 16 minimizer positions = 0.0232809% +max_bucket_size 265182 +2025-10-22 16:00:05: saving data structure to disk... +2025-10-22 16:00:08: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 100000 sequences, 14595280 bases, 8395280 kmers +read 200000 sequences, 29023453 bases, 16623453 kmers +read 300000 sequences, 43790922 bases, 25190922 kmers +read 400000 sequences, 58362099 bases, 33562099 kmers +read 500000 sequences, 72908170 bases, 41908170 kmers +read 600000 sequences, 87446702 bases, 50246702 kmers +read 700000 sequences, 102099804 bases, 58699804 kmers +read 800000 sequences, 117134400 bases, 67534400 kmers +read 900000 sequences, 131713463 bases, 75913463 kmers +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 1100000 sequences, 161101660 bases, 92901660 kmers +read 1200000 sequences, 175910768 bases, 101510768 kmers +read 1300000 sequences, 190897904 bases, 110297904 kmers +read 1400000 sequences, 205802973 bases, 119002973 kmers +read 1500000 sequences, 221158148 bases, 128158148 kmers +read 1600000 sequences, 236346274 bases, 137146274 kmers +read 1700000 sequences, 251304432 bases, 145904432 kmers +read 1800000 sequences, 266473950 bases, 154873950 kmers +read 1900000 sequences, 281471604 bases, 163671604 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 2100000 sequences, 312420706 bases, 182220706 kmers +read 2200000 sequences, 327946210 bases, 191546210 kmers +read 2300000 sequences, 343525540 bases, 200925540 kmers +read 2400000 sequences, 358949847 bases, 210149847 kmers +read 2500000 sequences, 374380009 bases, 219380009 kmers +read 2600000 sequences, 390142304 bases, 228942304 kmers +read 2700000 sequences, 405642535 bases, 238242535 kmers +read 2800000 sequences, 421259989 bases, 247659989 kmers +read 2900000 sequences, 436893769 bases, 257093769 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 3100000 sequences, 468090902 bases, 275890902 kmers +read 3200000 sequences, 483923930 bases, 285523930 kmers +read 3300000 sequences, 499749509 bases, 295149509 kmers +read 3400000 sequences, 515726709 bases, 304926709 kmers +read 3500000 sequences, 532169207 bases, 315169207 kmers +read 3600000 sequences, 548394020 bases, 325194020 kmers +read 3700000 sequences, 564809686 bases, 335409686 kmers +read 3800000 sequences, 581403559 bases, 345803559 kmers +read 3900000 sequences, 597837340 bases, 356037340 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 4100000 sequences, 630803806 bases, 376603806 kmers +read 4200000 sequences, 647222216 bases, 386822216 kmers +read 4300000 sequences, 663750824 bases, 397150824 kmers +read 4400000 sequences, 680423234 bases, 407623234 kmers +read 4500000 sequences, 696967173 bases, 417967173 kmers +read 4600000 sequences, 714107161 bases, 428907161 kmers +read 4700000 sequences, 731190344 bases, 439790344 kmers +read 4800000 sequences, 748610325 bases, 451010325 kmers +read 4900000 sequences, 765806425 bases, 462006425 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 5100000 sequences, 800681271 bases, 484481271 kmers +read 5200000 sequences, 818515777 bases, 496115777 kmers +read 5300000 sequences, 836324012 bases, 507724012 kmers +read 5400000 sequences, 854771265 bases, 519971265 kmers +read 5500000 sequences, 873098069 bases, 532098069 kmers +read 5600000 sequences, 891182426 bases, 543982426 kmers +read 5700000 sequences, 910053448 bases, 556653448 kmers +read 5800000 sequences, 928444429 bases, 568844429 kmers +read 5900000 sequences, 947244294 bases, 581444294 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 6100000 sequences, 985974168 bases, 607774168 kmers +read 6200000 sequences, 1005630833 bases, 621230833 kmers +read 6300000 sequences, 1026020245 bases, 635420245 kmers +read 6400000 sequences, 1046696751 bases, 649896751 kmers +read 6500000 sequences, 1067596462 bases, 664596462 kmers +read 6600000 sequences, 1088718265 bases, 679518265 kmers +read 6700000 sequences, 1110387368 bases, 694987368 kmers +read 6800000 sequences, 1132578732 bases, 710978732 kmers +read 6900000 sequences, 1155047095 bases, 727247095 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 7100000 sequences, 1201726249 bases, 761526249 kmers +read 7200000 sequences, 1226646751 bases, 780246751 kmers +read 7300000 sequences, 1252079351 bases, 799479351 kmers +read 7400000 sequences, 1279261003 bases, 820461003 kmers +read 7500000 sequences, 1307802702 bases, 842802702 kmers +read 7600000 sequences, 1338212409 bases, 867012409 kmers +read 7700000 sequences, 1370354710 bases, 892954710 kmers +read 7800000 sequences, 1383049738 bases, 899449738 kmers +read 7900000 sequences, 1395810952 bases, 906010952 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 8100000 sequences, 1421220952 bases, 919020952 kmers +read 8200000 sequences, 1433887434 bases, 925487434 kmers +read 8300000 sequences, 1446445917 bases, 931845917 kmers +read 8400000 sequences, 1459153909 bases, 938353909 kmers +read 8500000 sequences, 1471877671 bases, 944877671 kmers +read 8600000 sequences, 1484865624 bases, 951665624 kmers +read 8700000 sequences, 1497567228 bases, 958167228 kmers +read 8800000 sequences, 1510543060 bases, 964943060 kmers +read 8900000 sequences, 1523371874 bases, 971571874 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 9100000 sequences, 1548860619 bases, 984660619 kmers +read 9200000 sequences, 1561712707 bases, 991312707 kmers +read 9300000 sequences, 1574401520 bases, 997801520 kmers +read 9400000 sequences, 1586885001 bases, 1004085001 kmers +read 9500000 sequences, 1599621412 bases, 1010621412 kmers +read 9600000 sequences, 1612397675 bases, 1017197675 kmers +read 9700000 sequences, 1625388385 bases, 1023988385 kmers +read 9800000 sequences, 1638536946 bases, 1030936946 kmers +read 9900000 sequences, 1651980650 bases, 1038180650 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 10100000 sequences, 1677570910 bases, 1051370910 kmers +read 10200000 sequences, 1690246890 bases, 1057846890 kmers +read 10300000 sequences, 1703230366 bases, 1064630366 kmers +read 10400000 sequences, 1716086552 bases, 1071286552 kmers +read 10500000 sequences, 1729082411 bases, 1078082411 kmers +read 10600000 sequences, 1741944091 bases, 1084744091 kmers +read 10700000 sequences, 1754780793 bases, 1091380793 kmers +read 10800000 sequences, 1767537304 bases, 1097937304 kmers +read 10900000 sequences, 1780512088 bases, 1104712088 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 11100000 sequences, 1807103354 bases, 1118903354 kmers +read 11200000 sequences, 1819865542 bases, 1125465542 kmers +read 11300000 sequences, 1832952701 bases, 1132352701 kmers +read 11400000 sequences, 1846108191 bases, 1139308191 kmers +read 11500000 sequences, 1859202023 bases, 1146202023 kmers +read 11600000 sequences, 1872125111 bases, 1152925111 kmers +read 11700000 sequences, 1884949294 bases, 1159549294 kmers +read 11800000 sequences, 1897879213 bases, 1166279213 kmers +read 11900000 sequences, 1910688502 bases, 1172888502 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 12100000 sequences, 1936528765 bases, 1186328765 kmers +read 12200000 sequences, 1949822939 bases, 1193422939 kmers +read 12300000 sequences, 1962607705 bases, 1200007705 kmers +read 12400000 sequences, 1975528951 bases, 1206728951 kmers +read 12500000 sequences, 1988356507 bases, 1213356507 kmers +read 12600000 sequences, 2001310116 bases, 1220110116 kmers +read 12700000 sequences, 2014316977 bases, 1226916977 kmers +read 12800000 sequences, 2027300676 bases, 1233700676 kmers +read 12900000 sequences, 2040283112 bases, 1240483112 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 13100000 sequences, 2066357392 bases, 1254157392 kmers +read 13200000 sequences, 2079514117 bases, 1261114117 kmers +read 13300000 sequences, 2092587055 bases, 1267987055 kmers +read 13400000 sequences, 2105687861 bases, 1274887861 kmers +read 13500000 sequences, 2118896002 bases, 1281896002 kmers +read 13600000 sequences, 2131841724 bases, 1288641724 kmers +read 13700000 sequences, 2144909308 bases, 1295509308 kmers +read 13800000 sequences, 2157799174 bases, 1302199174 kmers +read 13900000 sequences, 2170824760 bases, 1309024760 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 14100000 sequences, 2196888939 bases, 1322688939 kmers +read 14200000 sequences, 2209993052 bases, 1329593052 kmers +read 14300000 sequences, 2223177518 bases, 1336577518 kmers +read 14400000 sequences, 2236324767 bases, 1343524767 kmers +read 14500000 sequences, 2249926194 bases, 1350926194 kmers +read 14600000 sequences, 2263244067 bases, 1358044067 kmers +read 14700000 sequences, 2276666210 bases, 1365266210 kmers +read 14800000 sequences, 2289846389 bases, 1372246389 kmers +read 14900000 sequences, 2303142205 bases, 1379342205 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 15100000 sequences, 2329658257 bases, 1393458257 kmers +read 15200000 sequences, 2342799874 bases, 1400399874 kmers +read 15300000 sequences, 2355936598 bases, 1407336598 kmers +read 15400000 sequences, 2369202825 bases, 1414402825 kmers +read 15500000 sequences, 2382453933 bases, 1421453933 kmers +read 15600000 sequences, 2395606868 bases, 1428406868 kmers +read 15700000 sequences, 2408903524 bases, 1435503524 kmers +read 15800000 sequences, 2422488600 bases, 1442888600 kmers +read 15900000 sequences, 2435763741 bases, 1449963741 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 16100000 sequences, 2462152775 bases, 1463952775 kmers +read 16200000 sequences, 2475426803 bases, 1471026803 kmers +read 16300000 sequences, 2488985859 bases, 1478385859 kmers +read 16400000 sequences, 2502322646 bases, 1485522646 kmers +read 16500000 sequences, 2515682566 bases, 1492682566 kmers +read 16600000 sequences, 2529274259 bases, 1500074259 kmers +read 16700000 sequences, 2542622794 bases, 1507222794 kmers +read 16800000 sequences, 2556056912 bases, 1514456912 kmers +read 16900000 sequences, 2569267145 bases, 1521467145 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 17100000 sequences, 2596061102 bases, 1535861102 kmers +read 17200000 sequences, 2609459388 bases, 1543059388 kmers +read 17300000 sequences, 2622881245 bases, 1550281245 kmers +read 17400000 sequences, 2636336794 bases, 1557536794 kmers +read 17500000 sequences, 2649678629 bases, 1564678629 kmers +read 17600000 sequences, 2663341782 bases, 1572141782 kmers +read 17700000 sequences, 2676693590 bases, 1579293590 kmers +read 17800000 sequences, 2690200716 bases, 1586600716 kmers +read 17900000 sequences, 2703543489 bases, 1593743489 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 18100000 sequences, 2730783796 bases, 1608583796 kmers +read 18200000 sequences, 2744196467 bases, 1615796467 kmers +read 18300000 sequences, 2757894852 bases, 1623294852 kmers +read 18400000 sequences, 2771403521 bases, 1630603521 kmers +read 18500000 sequences, 2784930678 bases, 1637930678 kmers +read 18600000 sequences, 2798778608 bases, 1645578608 kmers +read 18700000 sequences, 2812434788 bases, 1653034788 kmers +read 18800000 sequences, 2826041925 bases, 1660441925 kmers +read 18900000 sequences, 2839594143 bases, 1667794143 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 19100000 sequences, 2866645368 bases, 1682445368 kmers +read 19200000 sequences, 2880162017 bases, 1689762017 kmers +read 19300000 sequences, 2893733500 bases, 1697133500 kmers +read 19400000 sequences, 2907861888 bases, 1705061888 kmers +read 19500000 sequences, 2921431859 bases, 1712431859 kmers +read 19600000 sequences, 2934950257 bases, 1719750257 kmers +read 19700000 sequences, 2948908590 bases, 1727508590 kmers +read 19800000 sequences, 2962655324 bases, 1735055324 kmers +read 19900000 sequences, 2976658842 bases, 1742858842 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 20100000 sequences, 3004463124 bases, 1758263124 kmers +read 20200000 sequences, 3018263669 bases, 1765863669 kmers +read 20300000 sequences, 3032235817 bases, 1773635817 kmers +read 20400000 sequences, 3045926851 bases, 1781126851 kmers +read 20500000 sequences, 3059718085 bases, 1788718085 kmers +read 20600000 sequences, 3073465760 bases, 1796265760 kmers +read 20700000 sequences, 3087374365 bases, 1803974365 kmers +read 20800000 sequences, 3101202279 bases, 1811602279 kmers +read 20900000 sequences, 3115301042 bases, 1819501042 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 21100000 sequences, 3143428950 bases, 1835228950 kmers +read 21200000 sequences, 3157337269 bases, 1842937269 kmers +read 21300000 sequences, 3171218453 bases, 1850618453 kmers +read 21400000 sequences, 3185386330 bases, 1858586330 kmers +read 21500000 sequences, 3199499619 bases, 1866499619 kmers +read 21600000 sequences, 3213699144 bases, 1874499144 kmers +read 21700000 sequences, 3227725083 bases, 1882325083 kmers +read 21800000 sequences, 3241636024 bases, 1890036024 kmers +read 21900000 sequences, 3255686690 bases, 1897886690 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 22100000 sequences, 3284189309 bases, 1913989309 kmers +read 22200000 sequences, 3298558467 bases, 1922158467 kmers +read 22300000 sequences, 3312627222 bases, 1930027222 kmers +read 22400000 sequences, 3326674715 bases, 1937874715 kmers +read 22500000 sequences, 3340769161 bases, 1945769161 kmers +read 22600000 sequences, 3355403951 bases, 1954203951 kmers +read 22700000 sequences, 3369592323 bases, 1962192323 kmers +read 22800000 sequences, 3383749832 bases, 1970149832 kmers +read 22900000 sequences, 3398280808 bases, 1978480808 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23100000 sequences, 3427105278 bases, 1994905278 kmers +read 23200000 sequences, 3441898165 bases, 2003498165 kmers +read 23300000 sequences, 3456307790 bases, 2011707790 kmers +read 23400000 sequences, 3470437552 bases, 2019637552 kmers +=== step 1.1: 'encoding input' 10.3603 [sec] (5.10952 [ns/kmer]) +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max_len 643923 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 20 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.54498 [sec] (0.761952 [ns/kmer]) +=== step 1: 'parse file' 11.9055 [sec] (5.87155 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +=== step 2.1: 'merging minimizers tuples' 12.7517 [sec] (6.2889 [ns/kmer]) +num_minimizers = 86631941 +num_minimizer_positions = 169264838 +num_super_kmers = 176725324 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 4.0348 [sec] (1.98988 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.80174 [sec] (2.8613 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 3.47564 [sec] (1.71412 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 14311872/86631941 (16.5203%) +num_buckets_in_skew_index 167883/86631941 (0.193789%) +max_bucket_size 475227 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 74713236/169264838 (44.1398%) +num_minimizer_positions_of_buckets_in_skew_index 22399416/169264838 (13.2334%) +computing minimizers offsets: 4.11465 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 164308993 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 48058096 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13657562 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6137831 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4414714 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 4433156 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 4082117 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 475227: 35954358 +num_kmers_in_skew_index 281046827 (13.8607%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 164308993 + building MPHF with 64 threads and 55 partitions (avg. partition size = 3000000)... + built mphs[0] for 164308993 kmers; bits/key = 2.56349 + built positions[0] for 164308993 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 48058096 + building MPHF with 64 threads and 17 partitions (avg. partition size = 3000000)... + built mphs[1] for 48058096 kmers; bits/key = 2.53932 + built positions[1] for 48058096 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13657562 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13657562 kmers; bits/key = 2.61351 + built positions[2] for 13657562 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6137831 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6137831 kmers; bits/key = 2.93085 + built positions[3] for 6137831 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4414714 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4414714 kmers; bits/key = 2.84407 + built positions[4] for 4414714 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 4433156 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 4433156 kmers; bits/key = 2.73731 + built positions[5] for 4433156 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 4082117 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 4082117 kmers; bits/key = 2.9369 + built positions[6] for 4082117 kmers; bits/key = 13.0001 + lower = 8192; upper = 475227; num_bits_per_pos = 19; num_kmers_in_partition = 35954358 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[7] for 35954358 kmers; bits/key = 2.55049 + built positions[7] for 35954358 kmers; bits/key = 19 +computing skew index took: 41.8865 [sec] +=== step 3: 'build sparse and skew index' 46.2928 [sec] (22.8307 [ns/kmer]) +=== total_time 84.2622 [sec] (41.5564 [ns/kmer]) +total index size: 2131440126 [B] -- 2131.44 [MB] +SPACE BREAKDOWN: + mphf: 0.120785 [bits/kmer] (2.82702 [bits/key]) -- 1.43629% + strings_offsets: 0.291878 [bits/kmer] -- 3.47083% + control_codewords: 1.40993 [bits/kmer] -- 16.766% + mid_load_buckets: 1.17911 [bits/kmer] -- 14.0212% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.25737e-05% + strings: 3.43556 [bits/kmer] -- 40.8534% + skew_index: 1.97221 [bits/kmer] -- 23.4523% + weights: 7.25961e-07 [bits/kmer] -- 8.63266e-06% + -------------- + total: 8.40947 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 83.2859% +buckets with 2 minimizer positions = 8.38918% +buckets with 3 minimizer positions = 2.77772% +buckets with 4 minimizer positions = 1.31798% +buckets with 5 minimizer positions = 0.776307% +buckets with 6 minimizer positions = 0.518707% +buckets with 7 minimizer positions = 0.374551% +buckets with 8 minimizer positions = 0.285226% +buckets with 9 minimizer positions = 0.226981% +buckets with 10 minimizer positions = 0.183834% +buckets with 11 minimizer positions = 0.15397% +buckets with 12 minimizer positions = 0.131367% +buckets with 13 minimizer positions = 0.113066% +buckets with 14 minimizer positions = 0.0987326% +buckets with 15 minimizer positions = 0.0868144% +buckets with 16 minimizer positions = 0.0771828% +max_bucket_size 475227 +2025-10-22 16:01:33: saving data structure to disk... +2025-10-22 16:01:35: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 100000 sequences, 29016680 bases, 22816680 kmers +read 200000 sequences, 59512851 bases, 47112851 kmers +read 300000 sequences, 93672898 bases, 75072898 kmers +read 400000 sequences, 116504758 bases, 91704758 kmers +read 500000 sequences, 129640784 bases, 98640784 kmers +read 600000 sequences, 142888339 bases, 105688339 kmers +read 700000 sequences, 156121559 bases, 112721559 kmers +read 800000 sequences, 169296181 bases, 119696181 kmers +read 900000 sequences, 182473664 bases, 126673664 kmers +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 1100000 sequences, 208767883 bases, 140567883 kmers +read 1200000 sequences, 222206242 bases, 147806242 kmers +read 1300000 sequences, 235299002 bases, 154699002 kmers +read 1400000 sequences, 248482676 bases, 161682676 kmers +read 1500000 sequences, 261589002 bases, 168589002 kmers +read 1600000 sequences, 275055224 bases, 175855224 kmers +read 1700000 sequences, 288035899 bases, 182635899 kmers +read 1800000 sequences, 301349839 bases, 189749839 kmers +read 1900000 sequences, 314875402 bases, 197075402 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 2100000 sequences, 341368638 bases, 211168638 kmers +read 2200000 sequences, 354712561 bases, 218312561 kmers +read 2300000 sequences, 368072063 bases, 225472063 kmers +read 2400000 sequences, 381369139 bases, 232569139 kmers +read 2500000 sequences, 395076735 bases, 240076735 kmers +read 2600000 sequences, 408571236 bases, 247371236 kmers +read 2700000 sequences, 421770941 bases, 254370941 kmers +read 2800000 sequences, 434931097 bases, 261331097 kmers +read 2900000 sequences, 448299063 bases, 268499063 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 3100000 sequences, 474884907 bases, 282684907 kmers +read 3200000 sequences, 488437875 bases, 290037875 kmers +read 3300000 sequences, 501681623 bases, 297081623 kmers +read 3400000 sequences, 514981749 bases, 304181749 kmers +read 3500000 sequences, 528308911 bases, 311308911 kmers +read 3600000 sequences, 541636977 bases, 318436977 kmers +read 3700000 sequences, 555162428 bases, 325762428 kmers +read 3800000 sequences, 568696864 bases, 333096864 kmers +read 3900000 sequences, 581917367 bases, 340117367 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 4100000 sequences, 608987326 bases, 354787326 kmers +read 4200000 sequences, 622285230 bases, 361885230 kmers +read 4300000 sequences, 635647937 bases, 369047937 kmers +read 4400000 sequences, 648992641 bases, 376192641 kmers +read 4500000 sequences, 662513085 bases, 383513085 kmers +read 4600000 sequences, 675930708 bases, 390730708 kmers +read 4700000 sequences, 689630997 bases, 398230997 kmers +read 4800000 sequences, 702998525 bases, 405398525 kmers +read 4900000 sequences, 716509106 bases, 412709106 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 5100000 sequences, 743782200 bases, 427582200 kmers +read 5200000 sequences, 757644345 bases, 435244345 kmers +read 5300000 sequences, 771125199 bases, 442525199 kmers +read 5400000 sequences, 784691064 bases, 449891064 kmers +read 5500000 sequences, 798294855 bases, 457294855 kmers +read 5600000 sequences, 811868593 bases, 464668593 kmers +read 5700000 sequences, 825311254 bases, 471911254 kmers +read 5800000 sequences, 838965535 bases, 479365535 kmers +read 5900000 sequences, 852651369 bases, 486851369 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 6100000 sequences, 879791139 bases, 501591139 kmers +read 6200000 sequences, 893568574 bases, 509168574 kmers +read 6300000 sequences, 907221132 bases, 516621132 kmers +read 6400000 sequences, 920850746 bases, 524050746 kmers +read 6500000 sequences, 934451496 bases, 531451496 kmers +read 6600000 sequences, 948058192 bases, 538858192 kmers +read 6700000 sequences, 961672076 bases, 546272076 kmers +read 6800000 sequences, 975396607 bases, 553796607 kmers +read 6900000 sequences, 989058970 bases, 561258970 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 7100000 sequences, 1016671875 bases, 576471875 kmers +read 7200000 sequences, 1030411659 bases, 584011659 kmers +read 7300000 sequences, 1044405182 bases, 591805182 kmers +read 7400000 sequences, 1058406016 bases, 599606016 kmers +read 7500000 sequences, 1072419258 bases, 607419258 kmers +read 7600000 sequences, 1086161571 bases, 614961571 kmers +read 7700000 sequences, 1100358439 bases, 622958439 kmers +read 7800000 sequences, 1114261097 bases, 630661097 kmers +read 7900000 sequences, 1128307808 bases, 638507808 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 8100000 sequences, 1156357087 bases, 654157087 kmers +read 8200000 sequences, 1170571919 bases, 662171919 kmers +read 8300000 sequences, 1184451177 bases, 669851177 kmers +read 8400000 sequences, 1198299415 bases, 677499415 kmers +read 8500000 sequences, 1212442446 bases, 685442446 kmers +read 8600000 sequences, 1226405386 bases, 693205386 kmers +read 8700000 sequences, 1240703127 bases, 701303127 kmers +read 8800000 sequences, 1254656983 bases, 709056983 kmers +read 8900000 sequences, 1268621397 bases, 716821397 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 9100000 sequences, 1297350868 bases, 733150868 kmers +read 9200000 sequences, 1311516008 bases, 741116008 kmers +read 9300000 sequences, 1325689722 bases, 749089722 kmers +read 9400000 sequences, 1339681966 bases, 756881966 kmers +read 9500000 sequences, 1353794378 bases, 764794378 kmers +read 9600000 sequences, 1368052593 bases, 772852593 kmers +read 9700000 sequences, 1382481060 bases, 781081060 kmers +read 9800000 sequences, 1397029165 bases, 789429165 kmers +read 9900000 sequences, 1411261935 bases, 797461935 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 10100000 sequences, 1439978158 bases, 813778158 kmers +read 10200000 sequences, 1454566042 bases, 822166042 kmers +read 10300000 sequences, 1469140008 bases, 830540008 kmers +read 10400000 sequences, 1483590209 bases, 838790209 kmers +read 10500000 sequences, 1497966729 bases, 846966729 kmers +read 10600000 sequences, 1512656712 bases, 855456712 kmers +read 10700000 sequences, 1527179954 bases, 863779954 kmers +read 10800000 sequences, 1541782827 bases, 872182827 kmers +read 10900000 sequences, 1556446263 bases, 880646263 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 11100000 sequences, 1585817113 bases, 897617113 kmers +read 11200000 sequences, 1600557391 bases, 906157391 kmers +read 11300000 sequences, 1615262703 bases, 914662703 kmers +read 11400000 sequences, 1629999627 bases, 923199627 kmers +read 11500000 sequences, 1644860568 bases, 931860568 kmers +read 11600000 sequences, 1659779614 bases, 940579614 kmers +read 11700000 sequences, 1674792374 bases, 949392374 kmers +read 11800000 sequences, 1689736749 bases, 958136749 kmers +read 11900000 sequences, 1704892610 bases, 967092610 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 12100000 sequences, 1735135576 bases, 984935576 kmers +read 12200000 sequences, 1750297083 bases, 993897083 kmers +read 12300000 sequences, 1765691330 bases, 1003091330 kmers +read 12400000 sequences, 1781168609 bases, 1012368609 kmers +read 12500000 sequences, 1796591819 bases, 1021591819 kmers +read 12600000 sequences, 1811901104 bases, 1030701104 kmers +read 12700000 sequences, 1827876510 bases, 1040476510 kmers +read 12800000 sequences, 1843393773 bases, 1049793773 kmers +read 12900000 sequences, 1858842782 bases, 1059042782 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 13100000 sequences, 1890244268 bases, 1078044268 kmers +read 13200000 sequences, 1905959273 bases, 1087559273 kmers +read 13300000 sequences, 1922228338 bases, 1097628338 kmers +read 13400000 sequences, 1938520111 bases, 1107720111 kmers +read 13500000 sequences, 1954665049 bases, 1117665049 kmers +read 13600000 sequences, 1970696591 bases, 1127496591 kmers +read 13700000 sequences, 1987164795 bases, 1137764795 kmers +read 13800000 sequences, 2003371475 bases, 1147771475 kmers +read 13900000 sequences, 2019649864 bases, 1157849864 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 14100000 sequences, 2052986091 bases, 1178786091 kmers +read 14200000 sequences, 2069712172 bases, 1189312172 kmers +read 14300000 sequences, 2086760589 bases, 1200160589 kmers +read 14400000 sequences, 2103719627 bases, 1210919627 kmers +read 14500000 sequences, 2120768565 bases, 1221768565 kmers +read 14600000 sequences, 2137973642 bases, 1232773642 kmers +read 14700000 sequences, 2155333528 bases, 1243933528 kmers +read 14800000 sequences, 2173029002 bases, 1255429002 kmers +read 14900000 sequences, 2190761957 bases, 1266961957 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 15100000 sequences, 2226994114 bases, 1290794114 kmers +read 15200000 sequences, 2245240873 bases, 1302840873 kmers +read 15300000 sequences, 2264078057 bases, 1315478057 kmers +read 15400000 sequences, 2282789468 bases, 1327989468 kmers +read 15500000 sequences, 2301835717 bases, 1340835717 kmers +read 15600000 sequences, 2321337137 bases, 1354137137 kmers +read 15700000 sequences, 2341431175 bases, 1368031175 kmers +read 15800000 sequences, 2361547906 bases, 1381947906 kmers +read 15900000 sequences, 2382126087 bases, 1396326087 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16100000 sequences, 2424934550 bases, 1426734550 kmers +read 16200000 sequences, 2447209476 bases, 1442809476 kmers +read 16300000 sequences, 2470231832 bases, 1459631832 kmers +read 16400000 sequences, 2494281037 bases, 1477481037 kmers +read 16500000 sequences, 2519161670 bases, 1496161670 kmers +read 16600000 sequences, 2545406869 bases, 1516206869 kmers +=== step 1.1: 'encoding input' 7.51924 [sec] (4.93096 [ns/kmer]) +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max_len 499189 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 19 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.15614 [sec] (0.758174 [ns/kmer]) +=== step 1: 'parse file' 8.67553 [sec] (5.68923 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 9.67185 [sec] (6.3426 [ns/kmer]) +num_minimizers = 69577229 +num_minimizer_positions = 126350163 +num_super_kmers = 131966527 +building minimizers MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.24873 [sec] (2.13045 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.42341 [sec] (2.90078 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.55747 [sec] (1.67713 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 12190335/69577229 (17.5206%) +num_buckets_in_skew_index 86973/69577229 (0.125002%) +max_bucket_size 245177 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 57511599/126350163 (45.5176%) +num_minimizer_positions_of_buckets_in_skew_index 11538643/126350163 (9.13227%) +computing minimizers offsets: 3.17096 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 77399356 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26776297 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13974034 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6504754 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3263868 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2527517 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2420664 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 245177: 10756294 +num_kmers_in_skew_index 143622784 (9.41848%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 77399356 + building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... + built mphs[0] for 77399356 kmers; bits/key = 2.54863 + built positions[0] for 77399356 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26776297 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26776297 kmers; bits/key = 2.54559 + built positions[1] for 26776297 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13974034 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13974034 kmers; bits/key = 2.56375 + built positions[2] for 13974034 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6504754 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6504754 kmers; bits/key = 2.78902 + built positions[3] for 6504754 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 3263868 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 3263868 kmers; bits/key = 3.30619 + built positions[4] for 3263868 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2527517 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2527517)... + built mphs[5] for 2527517 kmers; bits/key = 2.55992 + built positions[5] for 2527517 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2420664 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2420664)... + built mphs[6] for 2420664 kmers; bits/key = 2.55997 + built positions[6] for 2420664 kmers; bits/key = 13.0001 + lower = 8192; upper = 245177; num_bits_per_pos = 18; num_kmers_in_partition = 10756294 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[7] for 10756294 kmers; bits/key = 2.64819 + built positions[7] for 10756294 kmers; bits/key = 18 +computing skew index took: 22.3367 [sec] +=== step 3: 'build sparse and skew index' 25.7206 [sec] (16.867 [ns/kmer]) +=== total_time 54.2976 [sec] (35.6072 [ns/kmer]) +total index size: 1481048952 [B] -- 1481.05 [MB] +SPACE BREAKDOWN: + mphf: 0.132337 [bits/kmer] (2.9004 [bits/key]) -- 1.7032% + strings_offsets: 0.274587 [bits/kmer] -- 3.53397% + control_codewords: 1.5057 [bits/kmer] -- 19.3786% + mid_load_buckets: 1.20688 [bits/kmer] -- 15.5327% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.80953e-05% + strings: 3.35283 [bits/kmer] -- 43.1513% + skew_index: 1.2976 [bits/kmer] -- 16.7002% + weights: 9.65307e-07 [bits/kmer] -- 1.24236e-05% + -------------- + total: 7.76993 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 82.3544% +buckets with 2 minimizer positions = 9.17598% +buckets with 3 minimizer positions = 3.08546% +buckets with 4 minimizer positions = 1.44294% +buckets with 5 minimizer positions = 0.830594% +buckets with 6 minimizer positions = 0.537643% +buckets with 7 minimizer positions = 0.377841% +buckets with 8 minimizer positions = 0.278926% +buckets with 9 minimizer positions = 0.215933% +buckets with 10 minimizer positions = 0.171191% +buckets with 11 minimizer positions = 0.139152% +buckets with 12 minimizer positions = 0.116435% +buckets with 13 minimizer positions = 0.0976368% +buckets with 14 minimizer positions = 0.0839542% +buckets with 15 minimizer positions = 0.0727882% +buckets with 16 minimizer positions = 0.064557% +max_bucket_size 245177 +2025-10-22 16:02:30: saving data structure to disk... +2025-10-22 16:02:30: DONE diff --git a/benchmarks/results-22-10-25/k63/regular-bench.log b/benchmarks/results-22-10-25/k63/regular-bench.log new file mode 100644 index 0000000..9a920b8 --- /dev/null +++ b/benchmarks/results-22-10-25/k63/regular-bench.log @@ -0,0 +1,90 @@ +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 764.647 +avg_nanosec_per_negative_lookup 760.908 +avg_nanosec_per_access 308.694 +iterator: avg_nanosec_per_kmer 2.80883 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 772.997 +avg_nanosec_per_negative_lookup 751.757 +avg_nanosec_per_access 302.239 +iterator: avg_nanosec_per_kmer 2.81303 +./sshash bench -i cod.k63.sshash +avg_nanosec_per_positive_lookup 761.568 +avg_nanosec_per_negative_lookup 747.962 +avg_nanosec_per_access 309.91 +iterator: avg_nanosec_per_kmer 2.82223 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 699.997 +avg_nanosec_per_negative_lookup 811.046 +avg_nanosec_per_access 330.173 +iterator: avg_nanosec_per_kmer 2.77744 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 693.577 +avg_nanosec_per_negative_lookup 810.535 +avg_nanosec_per_access 339.368 +iterator: avg_nanosec_per_kmer 2.79808 +./sshash bench -i kestrel.k63.sshash +avg_nanosec_per_positive_lookup 699.101 +avg_nanosec_per_negative_lookup 823.88 +avg_nanosec_per_access 330.99 +iterator: avg_nanosec_per_kmer 2.76731 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 954.247 +avg_nanosec_per_negative_lookup 885.886 +avg_nanosec_per_access 361.74 +iterator: avg_nanosec_per_kmer 2.78076 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 947.631 +avg_nanosec_per_negative_lookup 887.378 +avg_nanosec_per_access 358.481 +iterator: avg_nanosec_per_kmer 2.76542 +./sshash bench -i human.k63.sshash +avg_nanosec_per_positive_lookup 930.492 +avg_nanosec_per_negative_lookup 887.168 +avg_nanosec_per_access 361.001 +iterator: avg_nanosec_per_kmer 2.85186 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1421.12 +avg_nanosec_per_negative_lookup 1028.13 +avg_nanosec_per_access 680.06 +iterator: avg_nanosec_per_kmer 2.90325 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1396.7 +avg_nanosec_per_negative_lookup 1042.07 +avg_nanosec_per_access 655.762 +iterator: avg_nanosec_per_kmer 2.99233 +./sshash bench -i hprc.k63.sshash +avg_nanosec_per_positive_lookup 1423.04 +avg_nanosec_per_negative_lookup 1023.61 +avg_nanosec_per_access 669.37 +iterator: avg_nanosec_per_kmer 2.85262 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 2042.97 +avg_nanosec_per_negative_lookup 898.233 +avg_nanosec_per_access 514.323 +iterator: avg_nanosec_per_kmer 2.92814 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 2056.41 +avg_nanosec_per_negative_lookup 887.389 +avg_nanosec_per_access 465.931 +iterator: avg_nanosec_per_kmer 2.89742 +./sshash bench -i ec.k63.sshash +avg_nanosec_per_positive_lookup 2050.85 +avg_nanosec_per_negative_lookup 887.758 +avg_nanosec_per_access 498.662 +iterator: avg_nanosec_per_kmer 2.87881 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1802.93 +avg_nanosec_per_negative_lookup 880.058 +avg_nanosec_per_access 431.093 +iterator: avg_nanosec_per_kmer 2.85792 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1751.88 +avg_nanosec_per_negative_lookup 870.091 +avg_nanosec_per_access 430.992 +iterator: avg_nanosec_per_kmer 2.83586 +./sshash bench -i se.k63.sshash +avg_nanosec_per_positive_lookup 1759.84 +avg_nanosec_per_negative_lookup 875.743 +avg_nanosec_per_access 426.542 +iterator: avg_nanosec_per_kmer 2.79805 diff --git a/benchmarks/results-22-10-25/k63/regular-build.log b/benchmarks/results-22-10-25/k63/regular-build.log new file mode 100644 index 0000000..3112811 --- /dev/null +++ b/benchmarks/results-22-10-25/k63/regular-build.log @@ -0,0 +1,2101 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 100000 sequences, 61951464 bases, 55751464 kmers +read 200000 sequences, 122972958 bases, 110572958 kmers +read 300000 sequences, 183599874 bases, 164999874 kmers +read 400000 sequences, 245141781 bases, 220341781 kmers +read 500000 sequences, 306871742 bases, 275871742 kmers +read 600000 sequences, 368255372 bases, 331055372 kmers +read 700000 sequences, 430272672 bases, 386872672 kmers +read 800000 sequences, 496894673 bases, 447294673 kmers +read 900000 sequences, 580551939 bases, 524751939 kmers +=== step 1.1: 'encoding input' 1.6516 [sec] (2.96739 [ns/kmer]) +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max_len 46783 +num. bits per_absolute_offset 30 +num. bits per_relative_offset 16 +num. bits per_string_id 20 +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.382691 [sec] (0.687569 [ns/kmer]) +=== step 1: 'parse file' 2.04558 [sec] (3.67523 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.bin' +=== step 2.1: 'merging minimizers tuples' 2.0119 [sec] (3.61472 [ns/kmer]) +num_minimizers = 24306363 +num_minimizer_positions = 28148872 +num_super_kmers = 28148872 +building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 1.33758 [sec] (2.40319 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.10606 [sec] (1.98723 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 0.523687 [sec] (0.940892 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) +num_buckets_in_skew_index 3271/24306363 (0.0134574%) +max_bucket_size 414759 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) +num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) +computing minimizers offsets: 0.365877 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 +num_kmers_in_skew_index 14306719 (2.57044%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3558021 kmers; bits/key = 3.06724 + built positions[0] for 3558021 kmers; bits/key = 7.0001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... + built mphs[1] for 2129998 kmers; bits/key = 2.56007 + built positions[1] for 2129998 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... + built mphs[2] for 1247229 kmers; bits/key = 2.56071 + built positions[2] for 1247229 kmers; bits/key = 9.00028 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... + built mphs[3] for 1130328 kmers; bits/key = 2.56088 + built positions[3] for 1130328 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... + built mphs[4] for 1022110 kmers; bits/key = 2.41826 + built positions[4] for 1022110 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 + building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... + built mphs[5] for 790746 kmers; bits/key = 2.4189 + built positions[5] for 790746 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 + building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... + built mphs[6] for 666283 kmers; bits/key = 2.5622 + built positions[6] for 666283 kmers; bits/key = 13.0005 + lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3762004 kmers; bits/key = 2.9235 + built positions[7] for 3762004 kmers; bits/key = 19.0001 +computing skew index took: 4.84342 [sec] +=== step 3: 'build sparse and skew index' 5.24445 [sec] (9.42254 [ns/kmer]) +=== total_time 12.2693 [sec] (22.0438 [ns/kmer]) +total index size: 308878208 [B] -- 308.878 [MB] +SPACE BREAKDOWN: + mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.93534% + strings_offsets: 0.115799 [bits/kmer] -- 2.6083% + control_codewords: 1.35379 [bits/kmer] -- 30.4933% + mid_load_buckets: 0.196907 [bits/kmer] -- 4.43522% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.67656e-05% + strings: 2.21266 [bits/kmer] -- 49.8391% + skew_index: 0.430136 [bits/kmer] -- 9.68858% + weights: 2.6447e-06 [bits/kmer] -- 5.95704e-05% + -------------- + total: 4.43961 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 96.0459% +buckets with 2 minimizer positions = 2.25565% +buckets with 3 minimizer positions = 0.699874% +buckets with 4 minimizer positions = 0.315284% +buckets with 5 minimizer positions = 0.173597% +buckets with 6 minimizer positions = 0.108305% +buckets with 7 minimizer positions = 0.0716932% +buckets with 8 minimizer positions = 0.0520522% +buckets with 9 minimizer positions = 0.0388458% +buckets with 10 minimizer positions = 0.0301485% +buckets with 11 minimizer positions = 0.0240019% +buckets with 12 minimizer positions = 0.0204144% +buckets with 13 minimizer positions = 0.0165265% +buckets with 14 minimizer positions = 0.013984% +buckets with 15 minimizer positions = 0.0120051% +buckets with 16 minimizer positions = 0.00972996% +max_bucket_size 414759 +2025-10-22 15:49:07: saving data structure to disk... +2025-10-22 15:49:08: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash +k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 100000 sequences, 726199646 bases, 719999646 kmers +=== step 1.1: 'encoding input' 2.94438 [sec] (2.54869 [ns/kmer]) +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max_len 261876 +num. bits per_absolute_offset 31 +num. bits per_relative_offset 18 +num. bits per_string_id 18 +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.533174 [sec] (0.461522 [ns/kmer]) +=== step 1: 'parse file' 3.50733 [sec] (3.03599 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.bin' +num_super_kmers = 50000000 +=== step 2.1: 'merging minimizers tuples' 4.05157 [sec] (3.50709 [ns/kmer]) +num_minimizers = 55464592 +num_minimizer_positions = 56006004 +num_super_kmers = 56006004 +building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.55136 [sec] (2.20849 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.12257 [sec] (1.83732 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.03531 [sec] (0.89618 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) +num_buckets_in_skew_index 490/55464592 (0.000883447%) +max_bucket_size 794 +log2_max_bucket_size 10 +skew index num_partitions 4 +num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) +num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) +computing minimizers offsets: 0.438045 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 +num_kmers_in_skew_index 1294137 (0.112022%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 + building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... + built mphs[0] for 604884 kmers; bits/key = 2.41964 + built positions[0] for 604884 kmers; bits/key = 7.00061 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 + building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... + built mphs[1] for 417805 kmers; bits/key = 2.42142 + built positions[1] for 417805 kmers; bits/key = 8.00082 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 + building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... + built mphs[2] for 221219 kmers; bits/key = 2.42569 + built positions[2] for 221219 kmers; bits/key = 9.00147 + lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... + built mphs[3] for 50229 kmers; bits/key = 2.45946 + built positions[3] for 50229 kmers; bits/key = 10.0073 +computing skew index took: 0.730156 [sec] +=== step 3: 'build sparse and skew index' 1.23687 [sec] (1.07065 [ns/kmer]) +=== total_time 14.505 [sec] (12.5557 [ns/kmer]) +total index size: 551471055 [B] -- 551.471 [MB] +SPACE BREAKDOWN: + mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.62484% + strings_offsets: 0.0958241 [bits/kmer] -- 2.50922% + control_codewords: 1.53635 [bits/kmer] -- 40.2303% + mid_load_buckets: 0.0184383 [bits/kmer] -- 0.482819% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.85973e-05% + strings: 2.01672 [bits/kmer] -- 52.8092% + skew_index: 0.0131204 [bits/kmer] -- 0.343567% + weights: 1.27418e-06 [bits/kmer] -- 3.33653e-05% + -------------- + total: 3.81888 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 99.6239% +buckets with 2 minimizer positions = 0.253291% +buckets with 3 minimizer positions = 0.0530717% +buckets with 4 minimizer positions = 0.0227569% +buckets with 5 minimizer positions = 0.012325% +buckets with 6 minimizer positions = 0.00748405% +buckets with 7 minimizer positions = 0.00509695% +buckets with 8 minimizer positions = 0.00359148% +buckets with 9 minimizer positions = 0.00270803% +buckets with 10 minimizer positions = 0.0021383% +buckets with 11 minimizer positions = 0.00159201% +buckets with 12 minimizer positions = 0.00125666% +buckets with 13 minimizer positions = 0.00109619% +buckets with 14 minimizer positions = 0.000941141% +buckets with 15 minimizer positions = 0.000795102% +buckets with 16 minimizer positions = 0.000685122% +max_bucket_size 794 +2025-10-22 15:49:22: saving data structure to disk... +2025-10-22 15:49:23: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash +k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 100000 sequences, 156072740 bases, 149872740 kmers +read 200000 sequences, 358422405 bases, 346022405 kmers +read 300000 sequences, 483978582 bases, 465378582 kmers +read 400000 sequences, 579661931 bases, 554861931 kmers +read 500000 sequences, 676698600 bases, 645698600 kmers +read 600000 sequences, 771042638 bases, 733842638 kmers +read 700000 sequences, 867362074 bases, 823962074 kmers +read 800000 sequences, 963948852 bases, 914348852 kmers +read 900000 sequences, 1061594001 bases, 1005794001 kmers +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 1100000 sequences, 1258471425 bases, 1190271425 kmers +read 1200000 sequences, 1356700171 bases, 1282300171 kmers +read 1300000 sequences, 1455269127 bases, 1374669127 kmers +read 1400000 sequences, 1554765943 bases, 1467965943 kmers +read 1500000 sequences, 1655325717 bases, 1562325717 kmers +read 1600000 sequences, 1756677781 bases, 1657477781 kmers +read 1700000 sequences, 1857972693 bases, 1752572693 kmers +read 1800000 sequences, 1959726014 bases, 1848126014 kmers +read 1900000 sequences, 2064608823 bases, 1946808823 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2100000 sequences, 2280350234 bases, 2150150234 kmers +read 2200000 sequences, 2390845461 bases, 2254445461 kmers +read 2300000 sequences, 2504102196 bases, 2361502196 kmers +read 2400000 sequences, 2621983328 bases, 2473183328 kmers +read 2500000 sequences, 2745888150 bases, 2590888150 kmers +read 2600000 sequences, 2875580515 bases, 2714380515 kmers +=== step 1.1: 'encoding input' 7.74566 [sec] (2.79494 [ns/kmer]) +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max_len 124282 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 17 +num. bits per_string_id 22 +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.11804 [sec] (0.403432 [ns/kmer]) +=== step 1: 'parse file' 8.88067 [sec] (3.2045 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 9.74037 [sec] (3.51471 [ns/kmer]) +num_minimizers = 122838669 +num_minimizer_positions = 140756047 +num_super_kmers = 140756047 +building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 5.06657 [sec] (1.82822 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.10846 [sec] (1.84333 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.71827 [sec] (0.980859 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) +num_buckets_in_skew_index 28203/122838669 (0.0229594%) +max_bucket_size 147936 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) +num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) +computing minimizers offsets: 1.60499 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 +num_kmers_in_skew_index 145458128 (5.2487%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 25196923 kmers; bits/key = 2.56001 + built positions[0] for 25196923 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21919654 kmers; bits/key = 2.60671 + built positions[1] for 21919654 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19634878 kmers; bits/key = 2.55594 + built positions[2] for 19634878 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 18051454 kmers; bits/key = 2.60116 + built positions[3] for 18051454 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17018125 kmers; bits/key = 2.58264 + built positions[4] for 17018125 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 14085569 kmers; bits/key = 2.54674 + built positions[5] for 14085569 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 9296403 kmers; bits/key = 2.72206 + built positions[6] for 9296403 kmers; bits/key = 13 + lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20255122 kmers; bits/key = 2.57505 + built positions[7] for 20255122 kmers; bits/key = 18 +computing skew index took: 18.2783 [sec] +=== step 3: 'build sparse and skew index' 20.0766 [sec] (7.24443 [ns/kmer]) +=== total_time 51.5909 [sec] (18.616 [ns/kmer]) +total index size: 1647878152 [B] -- 1647.88 [MB] +SPACE BREAKDOWN: + mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.63218% + strings_offsets: 0.11255 [bits/kmer] -- 2.36601% + control_codewords: 1.46273 [bits/kmer] -- 30.7492% + mid_load_buckets: 0.146928 [bits/kmer] -- 3.08869% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.62633e-05% + strings: 2.11826 [bits/kmer] -- 44.5296% + skew_index: 0.791283 [bits/kmer] -- 16.6342% + weights: 5.31156e-07 [bits/kmer] -- 1.11659e-05% + -------------- + total: 4.75695 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 97.4557% +buckets with 2 minimizer positions = 1.46862% +buckets with 3 minimizer positions = 0.405135% +buckets with 4 minimizer positions = 0.185188% +buckets with 5 minimizer positions = 0.10523% +buckets with 6 minimizer positions = 0.0680771% +buckets with 7 minimizer positions = 0.0480598% +buckets with 8 minimizer positions = 0.0352926% +buckets with 9 minimizer positions = 0.0271502% +buckets with 10 minimizer positions = 0.0217871% +buckets with 11 minimizer positions = 0.0176866% +buckets with 12 minimizer positions = 0.014607% +buckets with 13 minimizer positions = 0.0121411% +buckets with 14 minimizer positions = 0.0105985% +buckets with 15 minimizer positions = 0.00909811% +buckets with 16 minimizer positions = 0.00794457% +max_bucket_size 147936 +2025-10-22 15:50:15: saving data structure to disk... +2025-10-22 15:50:16: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 100000 sequences, 12340553 bases, 6140553 kmers +read 200000 sequences, 24646589 bases, 12246589 kmers +read 300000 sequences, 37018141 bases, 18418141 kmers +read 400000 sequences, 49395114 bases, 24595114 kmers +read 500000 sequences, 61758878 bases, 30758878 kmers +read 600000 sequences, 74141190 bases, 36941190 kmers +read 700000 sequences, 86514611 bases, 43114611 kmers +read 800000 sequences, 98874544 bases, 49274544 kmers +read 900000 sequences, 111243181 bases, 55443181 kmers +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 1100000 sequences, 136042606 bases, 67842606 kmers +read 1200000 sequences, 148420872 bases, 74020872 kmers +read 1300000 sequences, 160881064 bases, 80281064 kmers +read 1400000 sequences, 173297356 bases, 86497356 kmers +read 1500000 sequences, 185720140 bases, 92720140 kmers +read 1600000 sequences, 198143865 bases, 98943865 kmers +read 1700000 sequences, 210604176 bases, 105204176 kmers +read 1800000 sequences, 223059063 bases, 111459063 kmers +read 1900000 sequences, 235529518 bases, 117729518 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 2100000 sequences, 260467973 bases, 130267973 kmers +read 2200000 sequences, 272924559 bases, 136524559 kmers +read 2300000 sequences, 285441345 bases, 142841345 kmers +read 2400000 sequences, 297932660 bases, 149132660 kmers +read 2500000 sequences, 310464064 bases, 155464064 kmers +read 2600000 sequences, 323014693 bases, 161814693 kmers +read 2700000 sequences, 335527821 bases, 168127821 kmers +read 2800000 sequences, 348042847 bases, 174442847 kmers +read 2900000 sequences, 360581974 bases, 180781974 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 3100000 sequences, 385714233 bases, 193514233 kmers +read 3200000 sequences, 398281117 bases, 199881117 kmers +read 3300000 sequences, 410870987 bases, 206270987 kmers +read 3400000 sequences, 423450505 bases, 212650505 kmers +read 3500000 sequences, 436046870 bases, 219046870 kmers +read 3600000 sequences, 448679908 bases, 225479908 kmers +read 3700000 sequences, 461321441 bases, 231921441 kmers +read 3800000 sequences, 473931444 bases, 238331444 kmers +read 3900000 sequences, 486569454 bases, 244769454 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 4100000 sequences, 511895907 bases, 257695907 kmers +read 4200000 sequences, 524602572 bases, 264202572 kmers +read 4300000 sequences, 537274994 bases, 270674994 kmers +read 4400000 sequences, 549984374 bases, 277184374 kmers +read 4500000 sequences, 562700061 bases, 283700061 kmers +read 4600000 sequences, 575434925 bases, 290234925 kmers +read 4700000 sequences, 588209946 bases, 296809946 kmers +read 4800000 sequences, 600967911 bases, 303367911 kmers +read 4900000 sequences, 613729236 bases, 309929236 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 5100000 sequences, 639246819 bases, 323046819 kmers +read 5200000 sequences, 652025682 bases, 329625682 kmers +read 5300000 sequences, 664852310 bases, 336252310 kmers +read 5400000 sequences, 677687649 bases, 342887649 kmers +read 5500000 sequences, 690503316 bases, 349503316 kmers +read 5600000 sequences, 703329176 bases, 356129176 kmers +read 5700000 sequences, 716216681 bases, 362816681 kmers +read 5800000 sequences, 729051812 bases, 369451812 kmers +read 5900000 sequences, 741932077 bases, 376132077 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 6100000 sequences, 767765140 bases, 389565140 kmers +read 6200000 sequences, 780677776 bases, 396277776 kmers +read 6300000 sequences, 793620694 bases, 403020694 kmers +read 6400000 sequences, 806637996 bases, 409837996 kmers +read 6500000 sequences, 819598935 bases, 416598935 kmers +read 6600000 sequences, 832595328 bases, 423395328 kmers +read 6700000 sequences, 845581546 bases, 430181546 kmers +read 6800000 sequences, 858575854 bases, 436975854 kmers +read 6900000 sequences, 871622929 bases, 443822929 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 7100000 sequences, 897672996 bases, 457472996 kmers +read 7200000 sequences, 910733015 bases, 464333015 kmers +read 7300000 sequences, 923812942 bases, 471212942 kmers +read 7400000 sequences, 936909625 bases, 478109625 kmers +read 7500000 sequences, 949997159 bases, 484997159 kmers +read 7600000 sequences, 963108020 bases, 491908020 kmers +read 7700000 sequences, 976263436 bases, 498863436 kmers +read 7800000 sequences, 989391405 bases, 505791405 kmers +read 7900000 sequences, 1002542485 bases, 512742485 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 8100000 sequences, 1028930197 bases, 526730197 kmers +read 8200000 sequences, 1042133468 bases, 533733468 kmers +read 8300000 sequences, 1055343127 bases, 540743127 kmers +read 8400000 sequences, 1068571427 bases, 547771427 kmers +read 8500000 sequences, 1081782196 bases, 554782196 kmers +read 8600000 sequences, 1095081437 bases, 561881437 kmers +read 8700000 sequences, 1108381806 bases, 568981806 kmers +read 8800000 sequences, 1121704584 bases, 576104584 kmers +read 8900000 sequences, 1135025841 bases, 583225841 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 9100000 sequences, 1161802584 bases, 597602584 kmers +read 9200000 sequences, 1175228394 bases, 604828394 kmers +read 9300000 sequences, 1188646412 bases, 612046412 kmers +read 9400000 sequences, 1202107297 bases, 619307297 kmers +read 9500000 sequences, 1215616980 bases, 626616980 kmers +read 9600000 sequences, 1229082437 bases, 633882437 kmers +read 9700000 sequences, 1242623591 bases, 641223591 kmers +read 9800000 sequences, 1256182433 bases, 648582433 kmers +read 9900000 sequences, 1269727668 bases, 655927668 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 10100000 sequences, 1296926205 bases, 670726205 kmers +read 10200000 sequences, 1310557071 bases, 678157071 kmers +read 10300000 sequences, 1324233675 bases, 685633675 kmers +read 10400000 sequences, 1337906923 bases, 693106923 kmers +read 10500000 sequences, 1351643244 bases, 700643244 kmers +read 10600000 sequences, 1365331150 bases, 708131150 kmers +read 10700000 sequences, 1379108550 bases, 715708550 kmers +read 10800000 sequences, 1392877827 bases, 723277827 kmers +read 10900000 sequences, 1406644102 bases, 730844102 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 11100000 sequences, 1434208379 bases, 746008379 kmers +read 11200000 sequences, 1448044972 bases, 753644972 kmers +read 11300000 sequences, 1461973854 bases, 761373854 kmers +read 11400000 sequences, 1475908509 bases, 769108509 kmers +read 11500000 sequences, 1489828724 bases, 776828724 kmers +read 11600000 sequences, 1503804264 bases, 784604264 kmers +read 11700000 sequences, 1517825235 bases, 792425235 kmers +read 11800000 sequences, 1531854974 bases, 800254974 kmers +read 11900000 sequences, 1545912508 bases, 808112508 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 12100000 sequences, 1574126683 bases, 823926683 kmers +read 12200000 sequences, 1588254047 bases, 831854047 kmers +read 12300000 sequences, 1602371782 bases, 839771782 kmers +read 12400000 sequences, 1616537282 bases, 847737282 kmers +read 12500000 sequences, 1630788706 bases, 855788706 kmers +read 12600000 sequences, 1644978439 bases, 863778439 kmers +read 12700000 sequences, 1659241271 bases, 871841271 kmers +read 12800000 sequences, 1673584186 bases, 879984186 kmers +read 12900000 sequences, 1687940640 bases, 888140640 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 13100000 sequences, 1716759629 bases, 904559629 kmers +read 13200000 sequences, 1731228745 bases, 912828745 kmers +read 13300000 sequences, 1745703705 bases, 921103705 kmers +read 13400000 sequences, 1760203272 bases, 929403272 kmers +read 13500000 sequences, 1774792711 bases, 937792711 kmers +read 13600000 sequences, 1789438714 bases, 946238714 kmers +read 13700000 sequences, 1804059654 bases, 954659654 kmers +read 13800000 sequences, 1818743992 bases, 963143992 kmers +read 13900000 sequences, 1833395678 bases, 971595678 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 14100000 sequences, 1862998607 bases, 988798607 kmers +read 14200000 sequences, 1877912070 bases, 997512070 kmers +read 14300000 sequences, 1892816876 bases, 1006216876 kmers +read 14400000 sequences, 1907719938 bases, 1014919938 kmers +read 14500000 sequences, 1922766653 bases, 1023766653 kmers +read 14600000 sequences, 1937831375 bases, 1032631375 kmers +read 14700000 sequences, 1952937615 bases, 1041537615 kmers +read 14800000 sequences, 1968048356 bases, 1050448356 kmers +read 14900000 sequences, 1983251476 bases, 1059451476 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 15100000 sequences, 2013788359 bases, 1077588359 kmers +read 15200000 sequences, 2029113772 bases, 1086713772 kmers +read 15300000 sequences, 2044464755 bases, 1095864755 kmers +read 15400000 sequences, 2059908505 bases, 1105108505 kmers +read 15500000 sequences, 2075403120 bases, 1114403120 kmers +read 15600000 sequences, 2090966312 bases, 1123766312 kmers +read 15700000 sequences, 2106543902 bases, 1133143902 kmers +read 15800000 sequences, 2122217109 bases, 1142617109 kmers +read 15900000 sequences, 2137840183 bases, 1152040183 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 16100000 sequences, 2169260701 bases, 1171060701 kmers +read 16200000 sequences, 2185177055 bases, 1180777055 kmers +read 16300000 sequences, 2201140740 bases, 1190540740 kmers +read 16400000 sequences, 2217102579 bases, 1200302579 kmers +read 16500000 sequences, 2233154655 bases, 1210154655 kmers +read 16600000 sequences, 2249289287 bases, 1220089287 kmers +read 16700000 sequences, 2265555086 bases, 1230155086 kmers +read 16800000 sequences, 2281740139 bases, 1240140139 kmers +read 16900000 sequences, 2298108132 bases, 1250308132 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 17100000 sequences, 2331031402 bases, 1270831402 kmers +read 17200000 sequences, 2347660397 bases, 1281260397 kmers +read 17300000 sequences, 2364281513 bases, 1291681513 kmers +read 17400000 sequences, 2381151087 bases, 1302351087 kmers +read 17500000 sequences, 2398014935 bases, 1313014935 kmers +read 17600000 sequences, 2414848597 bases, 1323648597 kmers +read 17700000 sequences, 2431827823 bases, 1334427823 kmers +read 17800000 sequences, 2448880533 bases, 1345280533 kmers +read 17900000 sequences, 2466079483 bases, 1356279483 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 18100000 sequences, 2500735835 bases, 1378535835 kmers +read 18200000 sequences, 2518182436 bases, 1389782436 kmers +read 18300000 sequences, 2535777011 bases, 1401177011 kmers +read 18400000 sequences, 2553420319 bases, 1412620319 kmers +read 18500000 sequences, 2571217551 bases, 1424217551 kmers +read 18600000 sequences, 2589036591 bases, 1435836591 kmers +read 18700000 sequences, 2607070590 bases, 1447670590 kmers +read 18800000 sequences, 2625277186 bases, 1459677186 kmers +read 18900000 sequences, 2643374333 bases, 1471574333 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 19100000 sequences, 2680149797 bases, 1495949797 kmers +read 19200000 sequences, 2698694657 bases, 1508294657 kmers +read 19300000 sequences, 2717352983 bases, 1520752983 kmers +read 19400000 sequences, 2736256974 bases, 1533456974 kmers +read 19500000 sequences, 2755257180 bases, 1546257180 kmers +read 19600000 sequences, 2774351367 bases, 1559151367 kmers +read 19700000 sequences, 2793728312 bases, 1572328312 kmers +read 19800000 sequences, 2813220961 bases, 1585620961 kmers +read 19900000 sequences, 2832722443 bases, 1598922443 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 20100000 sequences, 2872347566 bases, 1626147566 kmers +read 20200000 sequences, 2892389807 bases, 1639989807 kmers +read 20300000 sequences, 2912735414 bases, 1654135414 kmers +read 20400000 sequences, 2933385426 bases, 1668585426 kmers +read 20500000 sequences, 2954091535 bases, 1683091535 kmers +read 20600000 sequences, 2974925338 bases, 1697725338 kmers +read 20700000 sequences, 2995915917 bases, 1712515917 kmers +read 20800000 sequences, 3017122691 bases, 1727522691 kmers +read 20900000 sequences, 3038531782 bases, 1742731782 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 21100000 sequences, 3081907101 bases, 1773707101 kmers +read 21200000 sequences, 3104086740 bases, 1789686740 kmers +read 21300000 sequences, 3126473358 bases, 1805873358 kmers +read 21400000 sequences, 3149108015 bases, 1822308015 kmers +read 21500000 sequences, 3171928734 bases, 1838928734 kmers +read 21600000 sequences, 3194958136 bases, 1855758136 kmers +read 21700000 sequences, 3218341306 bases, 1872941306 kmers +read 21800000 sequences, 3241998625 bases, 1890398625 kmers +read 21900000 sequences, 3265867648 bases, 1908067648 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 22100000 sequences, 3314774267 bases, 1944574267 kmers +read 22200000 sequences, 3339683962 bases, 1963283962 kmers +read 22300000 sequences, 3365026242 bases, 1982426242 kmers +read 22400000 sequences, 3390524916 bases, 2001724916 kmers +read 22500000 sequences, 3416602911 bases, 2021602911 kmers +read 22600000 sequences, 3443068815 bases, 2041868815 kmers +read 22700000 sequences, 3469843783 bases, 2062443783 kmers +read 22800000 sequences, 3496984552 bases, 2083384552 kmers +read 22900000 sequences, 3524534540 bases, 2104734540 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 23100000 sequences, 3581192379 bases, 2148992379 kmers +read 23200000 sequences, 3610381847 bases, 2171981847 kmers +read 23300000 sequences, 3639851051 bases, 2195251051 kmers +read 23400000 sequences, 3669893600 bases, 2219093600 kmers +read 23500000 sequences, 3700753305 bases, 2243753305 kmers +read 23600000 sequences, 3732004106 bases, 2268804106 kmers +read 23700000 sequences, 3763988610 bases, 2294588610 kmers +read 23800000 sequences, 3796342561 bases, 2320742561 kmers +read 23900000 sequences, 3829617231 bases, 2347817231 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 24100000 sequences, 3898564027 bases, 2404364027 kmers +read 24200000 sequences, 3934105190 bases, 2433705190 kmers +read 24300000 sequences, 3970664280 bases, 2464064280 kmers +read 24400000 sequences, 4008289233 bases, 2495489233 kmers +read 24500000 sequences, 4046653113 bases, 2527653113 kmers +read 24600000 sequences, 4085474513 bases, 2560274513 kmers +read 24700000 sequences, 4125325954 bases, 2593925954 kmers +read 24800000 sequences, 4166644470 bases, 2629044470 kmers +read 24900000 sequences, 4209157187 bases, 2665357187 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 25100000 sequences, 4298306053 bases, 2742106053 kmers +read 25200000 sequences, 4345043044 bases, 2782643044 kmers +read 25300000 sequences, 4392932896 bases, 2824332896 kmers +read 25400000 sequences, 4442655136 bases, 2867855136 kmers +read 25500000 sequences, 4494211117 bases, 2913211117 kmers +read 25600000 sequences, 4547341661 bases, 2960141661 kmers +read 25700000 sequences, 4602288756 bases, 3008888756 kmers +read 25800000 sequences, 4659271424 bases, 3059671424 kmers +read 25900000 sequences, 4718698784 bases, 3112898784 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 26100000 sequences, 4845831097 bases, 3227631097 kmers +read 26200000 sequences, 4913892154 bases, 3289492154 kmers +read 26300000 sequences, 4985279757 bases, 3354679757 kmers +read 26400000 sequences, 5059260801 bases, 3422460801 kmers +read 26500000 sequences, 5137444413 bases, 3494444413 kmers +read 26600000 sequences, 5220218222 bases, 3571018222 kmers +read 26700000 sequences, 5307644834 bases, 3652244834 kmers +read 26800000 sequences, 5400268964 bases, 3738668964 kmers +read 26900000 sequences, 5498821243 bases, 3831021243 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 27100000 sequences, 5717045846 bases, 4036845846 kmers +read 27200000 sequences, 5833611115 bases, 4147211115 kmers +read 27300000 sequences, 5846284956 bases, 4153684956 kmers +read 27400000 sequences, 5857666261 bases, 4158866261 kmers +read 27500000 sequences, 5869033274 bases, 4164033274 kmers +read 27600000 sequences, 5880412056 bases, 4169212056 kmers +read 27700000 sequences, 5891780133 bases, 4174380133 kmers +read 27800000 sequences, 5903175638 bases, 4179575638 kmers +read 27900000 sequences, 5914554494 bases, 4184754494 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 28100000 sequences, 5937330032 bases, 4195130032 kmers +read 28200000 sequences, 5948710754 bases, 4200310754 kmers +read 28300000 sequences, 5960084167 bases, 4205484167 kmers +read 28400000 sequences, 5971480727 bases, 4210680727 kmers +read 28500000 sequences, 5982848912 bases, 4215848912 kmers +read 28600000 sequences, 5994224416 bases, 4221024416 kmers +read 28700000 sequences, 6005620576 bases, 4226220576 kmers +read 28800000 sequences, 6016990505 bases, 4231390505 kmers +read 28900000 sequences, 6028385718 bases, 4236585718 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 29100000 sequences, 6051178807 bases, 4246978807 kmers +read 29200000 sequences, 6062557962 bases, 4252157962 kmers +read 29300000 sequences, 6073940879 bases, 4257340879 kmers +read 29400000 sequences, 6085331369 bases, 4262531369 kmers +read 29500000 sequences, 6096728471 bases, 4267728471 kmers +read 29600000 sequences, 6108103103 bases, 4272903103 kmers +read 29700000 sequences, 6119481434 bases, 4278081434 kmers +read 29800000 sequences, 6130856274 bases, 4283256274 kmers +read 29900000 sequences, 6142238370 bases, 4288438370 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 30100000 sequences, 6165020174 bases, 4298820174 kmers +read 30200000 sequences, 6176433592 bases, 4304033592 kmers +read 30300000 sequences, 6187857678 bases, 4309257678 kmers +read 30400000 sequences, 6199252279 bases, 4314452279 kmers +read 30500000 sequences, 6210672636 bases, 4319672636 kmers +read 30600000 sequences, 6222092039 bases, 4324892039 kmers +read 30700000 sequences, 6233490560 bases, 4330090560 kmers +read 30800000 sequences, 6244878932 bases, 4335278932 kmers +read 30900000 sequences, 6256282501 bases, 4340482501 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 31100000 sequences, 6279097938 bases, 4350897938 kmers +read 31200000 sequences, 6290508477 bases, 4356108477 kmers +read 31300000 sequences, 6301930335 bases, 4361330335 kmers +read 31400000 sequences, 6313323332 bases, 4366523332 kmers +read 31500000 sequences, 6324738742 bases, 4371738742 kmers +read 31600000 sequences, 6336131699 bases, 4376931699 kmers +read 31700000 sequences, 6347524619 bases, 4382124619 kmers +read 31800000 sequences, 6358957080 bases, 4387357080 kmers +read 31900000 sequences, 6370375111 bases, 4392575111 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 32100000 sequences, 6393225045 bases, 4403025045 kmers +read 32200000 sequences, 6404646009 bases, 4408246009 kmers +read 32300000 sequences, 6416049898 bases, 4413449898 kmers +read 32400000 sequences, 6427468559 bases, 4418668559 kmers +read 32500000 sequences, 6438906261 bases, 4423906261 kmers +read 32600000 sequences, 6450334779 bases, 4429134779 kmers +read 32700000 sequences, 6461755133 bases, 4434355133 kmers +read 32800000 sequences, 6473195712 bases, 4439595712 kmers +read 32900000 sequences, 6484644292 bases, 4444844292 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 33100000 sequences, 6507511566 bases, 4455311566 kmers +read 33200000 sequences, 6518945251 bases, 4460545251 kmers +read 33300000 sequences, 6530384550 bases, 4465784550 kmers +read 33400000 sequences, 6541805344 bases, 4471005344 kmers +read 33500000 sequences, 6553237577 bases, 4476237577 kmers +read 33600000 sequences, 6564689207 bases, 4481489207 kmers +read 33700000 sequences, 6576122207 bases, 4486722207 kmers +read 33800000 sequences, 6587572349 bases, 4491972349 kmers +read 33900000 sequences, 6599018868 bases, 4497218868 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 34100000 sequences, 6621897412 bases, 4507697412 kmers +read 34200000 sequences, 6633348684 bases, 4512948684 kmers +read 34300000 sequences, 6644797017 bases, 4518197017 kmers +read 34400000 sequences, 6656241948 bases, 4523441948 kmers +read 34500000 sequences, 6667691134 bases, 4528691134 kmers +read 34600000 sequences, 6679157324 bases, 4533957324 kmers +read 34700000 sequences, 6690642313 bases, 4539242313 kmers +read 34800000 sequences, 6702109598 bases, 4544509598 kmers +read 34900000 sequences, 6713569428 bases, 4549769428 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 35100000 sequences, 6736483973 bases, 4560283973 kmers +read 35200000 sequences, 6747950658 bases, 4565550658 kmers +read 35300000 sequences, 6759387045 bases, 4570787045 kmers +read 35400000 sequences, 6770873555 bases, 4576073555 kmers +read 35500000 sequences, 6782328921 bases, 4581328921 kmers +read 35600000 sequences, 6793801691 bases, 4586601691 kmers +read 35700000 sequences, 6805289064 bases, 4591889064 kmers +read 35800000 sequences, 6816766724 bases, 4597166724 kmers +read 35900000 sequences, 6828221729 bases, 4602421729 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 36100000 sequences, 6851168093 bases, 4612968093 kmers +read 36200000 sequences, 6862661164 bases, 4618261164 kmers +read 36300000 sequences, 6874122285 bases, 4623522285 kmers +read 36400000 sequences, 6885602001 bases, 4628802001 kmers +read 36500000 sequences, 6897091095 bases, 4634091095 kmers +read 36600000 sequences, 6908577172 bases, 4639377172 kmers +read 36700000 sequences, 6920070520 bases, 4644670520 kmers +read 36800000 sequences, 6931583091 bases, 4649983091 kmers +read 36900000 sequences, 6943075024 bases, 4655275024 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 37100000 sequences, 6966070577 bases, 4665870577 kmers +read 37200000 sequences, 6977560540 bases, 4671160540 kmers +read 37300000 sequences, 6989067050 bases, 4676467050 kmers +read 37400000 sequences, 7000566525 bases, 4681766525 kmers +read 37500000 sequences, 7012064234 bases, 4687064234 kmers +read 37600000 sequences, 7023579053 bases, 4692379053 kmers +read 37700000 sequences, 7035113872 bases, 4697713872 kmers +read 37800000 sequences, 7046611242 bases, 4703011242 kmers +read 37900000 sequences, 7058113038 bases, 4708313038 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 38100000 sequences, 7081124727 bases, 4718924727 kmers +read 38200000 sequences, 7092641699 bases, 4724241699 kmers +read 38300000 sequences, 7104173446 bases, 4729573446 kmers +read 38400000 sequences, 7115693874 bases, 4734893874 kmers +read 38500000 sequences, 7127223462 bases, 4740223462 kmers +read 38600000 sequences, 7138742897 bases, 4745542897 kmers +read 38700000 sequences, 7150288045 bases, 4750888045 kmers +read 38800000 sequences, 7161816796 bases, 4756216796 kmers +read 38900000 sequences, 7173324459 bases, 4761524459 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 39100000 sequences, 7196427393 bases, 4772227393 kmers +read 39200000 sequences, 7207963192 bases, 4777563192 kmers +read 39300000 sequences, 7219512149 bases, 4782912149 kmers +read 39400000 sequences, 7231059051 bases, 4788259051 kmers +read 39500000 sequences, 7242615872 bases, 4793615872 kmers +read 39600000 sequences, 7254152078 bases, 4798952078 kmers +read 39700000 sequences, 7265709373 bases, 4804309373 kmers +read 39800000 sequences, 7277261623 bases, 4809661623 kmers +read 39900000 sequences, 7288796039 bases, 4814996039 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 40100000 sequences, 7311909288 bases, 4825709288 kmers +read 40200000 sequences, 7323455205 bases, 4831055205 kmers +read 40300000 sequences, 7335021154 bases, 4836421154 kmers +read 40400000 sequences, 7346572879 bases, 4841772879 kmers +read 40500000 sequences, 7358141934 bases, 4847141934 kmers +read 40600000 sequences, 7369701078 bases, 4852501078 kmers +read 40700000 sequences, 7381268609 bases, 4857868609 kmers +read 40800000 sequences, 7392842975 bases, 4863242975 kmers +read 40900000 sequences, 7404426134 bases, 4868626134 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 41100000 sequences, 7427575222 bases, 4879375222 kmers +read 41200000 sequences, 7439175574 bases, 4884775574 kmers +read 41300000 sequences, 7450739591 bases, 4890139591 kmers +read 41400000 sequences, 7462314068 bases, 4895514068 kmers +read 41500000 sequences, 7473895691 bases, 4900895691 kmers +read 41600000 sequences, 7485498997 bases, 4906298997 kmers +read 41700000 sequences, 7497097716 bases, 4911697716 kmers +read 41800000 sequences, 7508699398 bases, 4917099398 kmers +read 41900000 sequences, 7520283511 bases, 4922483511 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 42100000 sequences, 7543485297 bases, 4933285297 kmers +read 42200000 sequences, 7555088471 bases, 4938688471 kmers +read 42300000 sequences, 7566689783 bases, 4944089783 kmers +read 42400000 sequences, 7578300843 bases, 4949500843 kmers +read 42500000 sequences, 7589917091 bases, 4954917091 kmers +read 42600000 sequences, 7601521329 bases, 4960321329 kmers +read 42700000 sequences, 7613130662 bases, 4965730662 kmers +read 42800000 sequences, 7624734831 bases, 4971134831 kmers +read 42900000 sequences, 7636365711 bases, 4976565711 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 43100000 sequences, 7659607458 bases, 4987407458 kmers +read 43200000 sequences, 7671221602 bases, 4992821602 kmers +read 43300000 sequences, 7682851139 bases, 4998251139 kmers +read 43400000 sequences, 7694478123 bases, 5003678123 kmers +read 43500000 sequences, 7706091778 bases, 5009091778 kmers +read 43600000 sequences, 7717739307 bases, 5014539307 kmers +read 43700000 sequences, 7729380054 bases, 5019980054 kmers +read 43800000 sequences, 7741005863 bases, 5025405863 kmers +read 43900000 sequences, 7752654882 bases, 5030854882 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 44100000 sequences, 7775977379 bases, 5041777379 kmers +read 44200000 sequences, 7787629796 bases, 5047229796 kmers +read 44300000 sequences, 7799282513 bases, 5052682513 kmers +read 44400000 sequences, 7810951322 bases, 5058151322 kmers +read 44500000 sequences, 7822598496 bases, 5063598496 kmers +read 44600000 sequences, 7834244811 bases, 5069044811 kmers +read 44700000 sequences, 7845891393 bases, 5074491393 kmers +read 44800000 sequences, 7857565644 bases, 5079965644 kmers +read 44900000 sequences, 7869252433 bases, 5085452433 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 45100000 sequences, 7892577075 bases, 5096377075 kmers +read 45200000 sequences, 7904242054 bases, 5101842054 kmers +read 45300000 sequences, 7915920783 bases, 5107320783 kmers +read 45400000 sequences, 7927605586 bases, 5112805586 kmers +read 45500000 sequences, 7939292913 bases, 5118292913 kmers +read 45600000 sequences, 7950976081 bases, 5123776081 kmers +read 45700000 sequences, 7962667096 bases, 5129267096 kmers +read 45800000 sequences, 7974342012 bases, 5134742012 kmers +read 45900000 sequences, 7986038737 bases, 5140238737 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 46100000 sequences, 8009477824 bases, 5151277824 kmers +read 46200000 sequences, 8021166352 bases, 5156766352 kmers +read 46300000 sequences, 8032854246 bases, 5162254246 kmers +read 46400000 sequences, 8044556080 bases, 5167756080 kmers +read 46500000 sequences, 8056240574 bases, 5173240574 kmers +read 46600000 sequences, 8067931755 bases, 5178731755 kmers +read 46700000 sequences, 8079649033 bases, 5184249033 kmers +read 46800000 sequences, 8091384786 bases, 5189784786 kmers +read 46900000 sequences, 8103124165 bases, 5195324165 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 47100000 sequences, 8126577498 bases, 5206377498 kmers +read 47200000 sequences, 8138321232 bases, 5211921232 kmers +read 47300000 sequences, 8150083009 bases, 5217483009 kmers +read 47400000 sequences, 8161823465 bases, 5223023465 kmers +read 47500000 sequences, 8173558457 bases, 5228558457 kmers +read 47600000 sequences, 8185297265 bases, 5234097265 kmers +read 47700000 sequences, 8197020963 bases, 5239620963 kmers +read 47800000 sequences, 8208783912 bases, 5245183912 kmers +read 47900000 sequences, 8220547911 bases, 5250747911 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 48100000 sequences, 8244054559 bases, 5261854559 kmers +read 48200000 sequences, 8255808811 bases, 5267408811 kmers +read 48300000 sequences, 8267574548 bases, 5272974548 kmers +read 48400000 sequences, 8279340938 bases, 5278540938 kmers +read 48500000 sequences, 8291110439 bases, 5284110439 kmers +read 48600000 sequences, 8302889397 bases, 5289689397 kmers +read 48700000 sequences, 8314649020 bases, 5295249020 kmers +read 48800000 sequences, 8326414270 bases, 5300814270 kmers +read 48900000 sequences, 8338207427 bases, 5306407427 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 49100000 sequences, 8361791437 bases, 5317591437 kmers +read 49200000 sequences, 8373582890 bases, 5323182890 kmers +read 49300000 sequences, 8385394696 bases, 5328794696 kmers +read 49400000 sequences, 8397203106 bases, 5334403106 kmers +read 49500000 sequences, 8409020385 bases, 5340020385 kmers +read 49600000 sequences, 8420828940 bases, 5345628940 kmers +read 49700000 sequences, 8432643406 bases, 5351243406 kmers +read 49800000 sequences, 8444451802 bases, 5356851802 kmers +read 49900000 sequences, 8456260306 bases, 5362460306 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 50100000 sequences, 8479897357 bases, 5373697357 kmers +read 50200000 sequences, 8491729387 bases, 5379329387 kmers +read 50300000 sequences, 8503563532 bases, 5384963532 kmers +read 50400000 sequences, 8515408230 bases, 5390608230 kmers +read 50500000 sequences, 8527227002 bases, 5396227002 kmers +read 50600000 sequences, 8539067794 bases, 5401867794 kmers +read 50700000 sequences, 8550900112 bases, 5407500112 kmers +read 50800000 sequences, 8562770632 bases, 5413170632 kmers +read 50900000 sequences, 8574595670 bases, 5418795670 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 51100000 sequences, 8598316350 bases, 5430116350 kmers +read 51200000 sequences, 8610172384 bases, 5435772384 kmers +read 51300000 sequences, 8622055840 bases, 5441455840 kmers +read 51400000 sequences, 8633927375 bases, 5447127375 kmers +read 51500000 sequences, 8645823649 bases, 5452823649 kmers +read 51600000 sequences, 8657691480 bases, 5458491480 kmers +read 51700000 sequences, 8669585688 bases, 5464185688 kmers +read 51800000 sequences, 8681474383 bases, 5469874383 kmers +read 51900000 sequences, 8693381973 bases, 5475581973 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 52100000 sequences, 8717209576 bases, 5487009576 kmers +read 52200000 sequences, 8729118994 bases, 5492718994 kmers +read 52300000 sequences, 8741023578 bases, 5498423578 kmers +read 52400000 sequences, 8752969801 bases, 5504169801 kmers +read 52500000 sequences, 8764903801 bases, 5509903801 kmers +read 52600000 sequences, 8776822939 bases, 5515622939 kmers +read 52700000 sequences, 8788751140 bases, 5521351140 kmers +read 52800000 sequences, 8800669845 bases, 5527069845 kmers +read 52900000 sequences, 8812598474 bases, 5532798474 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 53100000 sequences, 8836519008 bases, 5544319008 kmers +read 53200000 sequences, 8848466460 bases, 5550066460 kmers +read 53300000 sequences, 8860413233 bases, 5555813233 kmers +read 53400000 sequences, 8872384304 bases, 5561584304 kmers +read 53500000 sequences, 8884332260 bases, 5567332260 kmers +read 53600000 sequences, 8896284636 bases, 5573084636 kmers +read 53700000 sequences, 8908270656 bases, 5578870656 kmers +read 53800000 sequences, 8920268107 bases, 5584668107 kmers +read 53900000 sequences, 8932246098 bases, 5590446098 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 54100000 sequences, 8956269394 bases, 5602069394 kmers +read 54200000 sequences, 8968276927 bases, 5607876927 kmers +read 54300000 sequences, 8980258970 bases, 5613658970 kmers +read 54400000 sequences, 8992247866 bases, 5619447866 kmers +read 54500000 sequences, 9004254206 bases, 5625254206 kmers +read 54600000 sequences, 9016278401 bases, 5631078401 kmers +read 54700000 sequences, 9028312154 bases, 5636912154 kmers +read 54800000 sequences, 9040331981 bases, 5642731981 kmers +read 54900000 sequences, 9052350829 bases, 5648550829 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 55100000 sequences, 9076390853 bases, 5660190853 kmers +read 55200000 sequences, 9088446181 bases, 5666046181 kmers +read 55300000 sequences, 9100525911 bases, 5671925911 kmers +read 55400000 sequences, 9112587250 bases, 5677787250 kmers +read 55500000 sequences, 9124623806 bases, 5683623806 kmers +read 55600000 sequences, 9136715507 bases, 5689515507 kmers +read 55700000 sequences, 9148800858 bases, 5695400858 kmers +read 55800000 sequences, 9160843772 bases, 5701243772 kmers +read 55900000 sequences, 9172925342 bases, 5707125342 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 56100000 sequences, 9197117149 bases, 5718917149 kmers +read 56200000 sequences, 9209230596 bases, 5724830596 kmers +read 56300000 sequences, 9221344558 bases, 5730744558 kmers +read 56400000 sequences, 9233465406 bases, 5736665406 kmers +read 56500000 sequences, 9245571958 bases, 5742571958 kmers +read 56600000 sequences, 9257641670 bases, 5748441670 kmers +read 56700000 sequences, 9269746246 bases, 5754346246 kmers +read 56800000 sequences, 9281862497 bases, 5760262497 kmers +read 56900000 sequences, 9294025360 bases, 5766225360 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 57100000 sequences, 9318287606 bases, 5778087606 kmers +read 57200000 sequences, 9330445614 bases, 5784045614 kmers +read 57300000 sequences, 9342615044 bases, 5790015044 kmers +read 57400000 sequences, 9354790676 bases, 5795990676 kmers +read 57500000 sequences, 9366968309 bases, 5801968309 kmers +read 57600000 sequences, 9379136177 bases, 5807936177 kmers +read 57700000 sequences, 9391324421 bases, 5813924421 kmers +read 57800000 sequences, 9403503043 bases, 5819903043 kmers +read 57900000 sequences, 9415684703 bases, 5825884703 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 58100000 sequences, 9440085397 bases, 5837885397 kmers +read 58200000 sequences, 9452280546 bases, 5843880546 kmers +read 58300000 sequences, 9464471942 bases, 5849871942 kmers +read 58400000 sequences, 9476715998 bases, 5855915998 kmers +read 58500000 sequences, 9488920051 bases, 5861920051 kmers +read 58600000 sequences, 9501146210 bases, 5867946210 kmers +read 58700000 sequences, 9513406566 bases, 5874006566 kmers +read 58800000 sequences, 9525653288 bases, 5880053288 kmers +read 58900000 sequences, 9537898122 bases, 5886098122 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59100000 sequences, 9562418780 bases, 5898218780 kmers +read 59200000 sequences, 9574665051 bases, 5904265051 kmers +read 59300000 sequences, 9586958666 bases, 5910358666 kmers +read 59400000 sequences, 9599304794 bases, 5916504794 kmers +read 59500000 sequences, 9611573081 bases, 5922573081 kmers +=== step 1.1: 'encoding input' 27.6126 [sec] (4.65895 [ns/kmer]) +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max_len 27681 +num. bits per_absolute_offset 34 +num. bits per_relative_offset 15 +num. bits per_string_id 26 +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.63.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.64.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.65.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.66.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.67.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.68.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.69.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.70.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.71.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.72.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.73.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.74.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.75.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.76.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.77.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.78.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.79.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.80.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.81.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.82.bin'... +=== step 1.2: 'computing minimizers tuples' 6.87492 [sec] (1.15997 [ns/kmer]) +=== step 1: 'parse file' 34.4876 [sec] (5.81894 [ns/kmer]) + == files to merge = 83 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +num_super_kmers = 150000000 +num_super_kmers = 200000000 +num_super_kmers = 250000000 +num_super_kmers = 300000000 +num_super_kmers = 350000000 +num_super_kmers = 400000000 +=== step 2.1: 'merging minimizers tuples' 31.0569 [sec] (5.2401 [ns/kmer]) +num_minimizers = 274429863 +num_minimizer_positions = 406062800 +num_super_kmers = 406062800 +building minimizers MPHF with 64 threads and 92 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 11.9786 [sec] (2.02109 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.0434 [sec] (2.36948 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 5.84638 [sec] (0.986433 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 51299487/274429863 (18.6931%) +num_buckets_in_skew_index 131946/274429863 (0.04808%) +max_bucket_size 176220 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 146053805/406062800 (35.9683%) +num_minimizer_positions_of_buckets_in_skew_index 37010565/406062800 (9.11449%) +computing minimizers offsets: 9.1496 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 83316513 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 74231522 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 67271777 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 57125353 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 46013184 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 37921473 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 28349062 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 176220: 62824185 +num_kmers_in_skew_index 457053069 (7.71165%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 83316513 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[0] for 83316513 kmers; bits/key = 2.55669 + built positions[0] for 83316513 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 74231522 + building MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... + built mphs[1] for 74231522 kmers; bits/key = 2.57033 + built positions[1] for 74231522 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 67271777 + building MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... + built mphs[2] for 67271777 kmers; bits/key = 2.54468 + built positions[2] for 67271777 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 57125353 + building MPHF with 64 threads and 20 partitions (avg. partition size = 3000000)... + built mphs[3] for 57125353 kmers; bits/key = 2.53252 + built positions[3] for 57125353 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46013184 + building MPHF with 64 threads and 16 partitions (avg. partition size = 3000000)... + built mphs[4] for 46013184 kmers; bits/key = 2.53117 + built positions[4] for 46013184 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 37921473 + building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... + built mphs[5] for 37921473 kmers; bits/key = 2.56414 + built positions[5] for 37921473 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 28349062 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[6] for 28349062 kmers; bits/key = 2.56358 + built positions[6] for 28349062 kmers; bits/key = 13 + lower = 8192; upper = 176220; num_bits_per_pos = 18; num_kmers_in_partition = 62824185 + building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... + built mphs[7] for 62824185 kmers; bits/key = 2.55204 + built positions[7] for 62824185 kmers; bits/key = 18 +computing skew index took: 61.3503 [sec] +=== step 3: 'build sparse and skew index' 71.2392 [sec] (12.0199 [ns/kmer]) +=== total_time 168.652 [sec] (28.4559 [ns/kmer]) +total index size: 5431161966 [B] -- 5431.16 [MB] +SPACE BREAKDOWN: + mphf: 0.131165 [bits/kmer] (2.83273 [bits/key]) -- 1.78918% + strings_offsets: 0.273643 [bits/kmer] -- 3.73268% + control_codewords: 1.62062 [bits/kmer] -- 22.1063% + mid_load_buckets: 0.837862 [bits/kmer] -- 11.429% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.93449e-06% + strings: 3.2463 [bits/kmer] -- 44.2818% + skew_index: 1.22142 [bits/kmer] -- 16.661% + weights: 2.48364e-07 [bits/kmer] -- 3.38786e-06% + -------------- + total: 7.33101 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 81.2588% +buckets with 2 minimizer positions = 13.7158% +buckets with 3 minimizer positions = 2.82467% +buckets with 4 minimizer positions = 0.819903% +buckets with 5 minimizer positions = 0.371916% +buckets with 6 minimizer positions = 0.218785% +buckets with 7 minimizer positions = 0.143859% +buckets with 8 minimizer positions = 0.101665% +buckets with 9 minimizer positions = 0.0751737% +buckets with 10 minimizer positions = 0.0573965% +buckets with 11 minimizer positions = 0.0451926% +buckets with 12 minimizer positions = 0.0368258% +buckets with 13 minimizer positions = 0.0299698% +buckets with 14 minimizer positions = 0.025193% +buckets with 15 minimizer positions = 0.0214499% +buckets with 16 minimizer positions = 0.0183803% +max_bucket_size 176220 +2025-10-22 15:53:06: saving data structure to disk... +2025-10-22 15:53:08: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 100000 sequences, 14595280 bases, 8395280 kmers +read 200000 sequences, 29023453 bases, 16623453 kmers +read 300000 sequences, 43790922 bases, 25190922 kmers +read 400000 sequences, 58362099 bases, 33562099 kmers +read 500000 sequences, 72908170 bases, 41908170 kmers +read 600000 sequences, 87446702 bases, 50246702 kmers +read 700000 sequences, 102099804 bases, 58699804 kmers +read 800000 sequences, 117134400 bases, 67534400 kmers +read 900000 sequences, 131713463 bases, 75913463 kmers +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 1100000 sequences, 161101660 bases, 92901660 kmers +read 1200000 sequences, 175910768 bases, 101510768 kmers +read 1300000 sequences, 190897904 bases, 110297904 kmers +read 1400000 sequences, 205802973 bases, 119002973 kmers +read 1500000 sequences, 221158148 bases, 128158148 kmers +read 1600000 sequences, 236346274 bases, 137146274 kmers +read 1700000 sequences, 251304432 bases, 145904432 kmers +read 1800000 sequences, 266473950 bases, 154873950 kmers +read 1900000 sequences, 281471604 bases, 163671604 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 2100000 sequences, 312420706 bases, 182220706 kmers +read 2200000 sequences, 327946210 bases, 191546210 kmers +read 2300000 sequences, 343525540 bases, 200925540 kmers +read 2400000 sequences, 358949847 bases, 210149847 kmers +read 2500000 sequences, 374380009 bases, 219380009 kmers +read 2600000 sequences, 390142304 bases, 228942304 kmers +read 2700000 sequences, 405642535 bases, 238242535 kmers +read 2800000 sequences, 421259989 bases, 247659989 kmers +read 2900000 sequences, 436893769 bases, 257093769 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 3100000 sequences, 468090902 bases, 275890902 kmers +read 3200000 sequences, 483923930 bases, 285523930 kmers +read 3300000 sequences, 499749509 bases, 295149509 kmers +read 3400000 sequences, 515726709 bases, 304926709 kmers +read 3500000 sequences, 532169207 bases, 315169207 kmers +read 3600000 sequences, 548394020 bases, 325194020 kmers +read 3700000 sequences, 564809686 bases, 335409686 kmers +read 3800000 sequences, 581403559 bases, 345803559 kmers +read 3900000 sequences, 597837340 bases, 356037340 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 4100000 sequences, 630803806 bases, 376603806 kmers +read 4200000 sequences, 647222216 bases, 386822216 kmers +read 4300000 sequences, 663750824 bases, 397150824 kmers +read 4400000 sequences, 680423234 bases, 407623234 kmers +read 4500000 sequences, 696967173 bases, 417967173 kmers +read 4600000 sequences, 714107161 bases, 428907161 kmers +read 4700000 sequences, 731190344 bases, 439790344 kmers +read 4800000 sequences, 748610325 bases, 451010325 kmers +read 4900000 sequences, 765806425 bases, 462006425 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 5100000 sequences, 800681271 bases, 484481271 kmers +read 5200000 sequences, 818515777 bases, 496115777 kmers +read 5300000 sequences, 836324012 bases, 507724012 kmers +read 5400000 sequences, 854771265 bases, 519971265 kmers +read 5500000 sequences, 873098069 bases, 532098069 kmers +read 5600000 sequences, 891182426 bases, 543982426 kmers +read 5700000 sequences, 910053448 bases, 556653448 kmers +read 5800000 sequences, 928444429 bases, 568844429 kmers +read 5900000 sequences, 947244294 bases, 581444294 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 6100000 sequences, 985974168 bases, 607774168 kmers +read 6200000 sequences, 1005630833 bases, 621230833 kmers +read 6300000 sequences, 1026020245 bases, 635420245 kmers +read 6400000 sequences, 1046696751 bases, 649896751 kmers +read 6500000 sequences, 1067596462 bases, 664596462 kmers +read 6600000 sequences, 1088718265 bases, 679518265 kmers +read 6700000 sequences, 1110387368 bases, 694987368 kmers +read 6800000 sequences, 1132578732 bases, 710978732 kmers +read 6900000 sequences, 1155047095 bases, 727247095 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 7100000 sequences, 1201726249 bases, 761526249 kmers +read 7200000 sequences, 1226646751 bases, 780246751 kmers +read 7300000 sequences, 1252079351 bases, 799479351 kmers +read 7400000 sequences, 1279261003 bases, 820461003 kmers +read 7500000 sequences, 1307802702 bases, 842802702 kmers +read 7600000 sequences, 1338212409 bases, 867012409 kmers +read 7700000 sequences, 1370354710 bases, 892954710 kmers +read 7800000 sequences, 1383049738 bases, 899449738 kmers +read 7900000 sequences, 1395810952 bases, 906010952 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 8100000 sequences, 1421220952 bases, 919020952 kmers +read 8200000 sequences, 1433887434 bases, 925487434 kmers +read 8300000 sequences, 1446445917 bases, 931845917 kmers +read 8400000 sequences, 1459153909 bases, 938353909 kmers +read 8500000 sequences, 1471877671 bases, 944877671 kmers +read 8600000 sequences, 1484865624 bases, 951665624 kmers +read 8700000 sequences, 1497567228 bases, 958167228 kmers +read 8800000 sequences, 1510543060 bases, 964943060 kmers +read 8900000 sequences, 1523371874 bases, 971571874 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 9100000 sequences, 1548860619 bases, 984660619 kmers +read 9200000 sequences, 1561712707 bases, 991312707 kmers +read 9300000 sequences, 1574401520 bases, 997801520 kmers +read 9400000 sequences, 1586885001 bases, 1004085001 kmers +read 9500000 sequences, 1599621412 bases, 1010621412 kmers +read 9600000 sequences, 1612397675 bases, 1017197675 kmers +read 9700000 sequences, 1625388385 bases, 1023988385 kmers +read 9800000 sequences, 1638536946 bases, 1030936946 kmers +read 9900000 sequences, 1651980650 bases, 1038180650 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 10100000 sequences, 1677570910 bases, 1051370910 kmers +read 10200000 sequences, 1690246890 bases, 1057846890 kmers +read 10300000 sequences, 1703230366 bases, 1064630366 kmers +read 10400000 sequences, 1716086552 bases, 1071286552 kmers +read 10500000 sequences, 1729082411 bases, 1078082411 kmers +read 10600000 sequences, 1741944091 bases, 1084744091 kmers +read 10700000 sequences, 1754780793 bases, 1091380793 kmers +read 10800000 sequences, 1767537304 bases, 1097937304 kmers +read 10900000 sequences, 1780512088 bases, 1104712088 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 11100000 sequences, 1807103354 bases, 1118903354 kmers +read 11200000 sequences, 1819865542 bases, 1125465542 kmers +read 11300000 sequences, 1832952701 bases, 1132352701 kmers +read 11400000 sequences, 1846108191 bases, 1139308191 kmers +read 11500000 sequences, 1859202023 bases, 1146202023 kmers +read 11600000 sequences, 1872125111 bases, 1152925111 kmers +read 11700000 sequences, 1884949294 bases, 1159549294 kmers +read 11800000 sequences, 1897879213 bases, 1166279213 kmers +read 11900000 sequences, 1910688502 bases, 1172888502 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 12100000 sequences, 1936528765 bases, 1186328765 kmers +read 12200000 sequences, 1949822939 bases, 1193422939 kmers +read 12300000 sequences, 1962607705 bases, 1200007705 kmers +read 12400000 sequences, 1975528951 bases, 1206728951 kmers +read 12500000 sequences, 1988356507 bases, 1213356507 kmers +read 12600000 sequences, 2001310116 bases, 1220110116 kmers +read 12700000 sequences, 2014316977 bases, 1226916977 kmers +read 12800000 sequences, 2027300676 bases, 1233700676 kmers +read 12900000 sequences, 2040283112 bases, 1240483112 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 13100000 sequences, 2066357392 bases, 1254157392 kmers +read 13200000 sequences, 2079514117 bases, 1261114117 kmers +read 13300000 sequences, 2092587055 bases, 1267987055 kmers +read 13400000 sequences, 2105687861 bases, 1274887861 kmers +read 13500000 sequences, 2118896002 bases, 1281896002 kmers +read 13600000 sequences, 2131841724 bases, 1288641724 kmers +read 13700000 sequences, 2144909308 bases, 1295509308 kmers +read 13800000 sequences, 2157799174 bases, 1302199174 kmers +read 13900000 sequences, 2170824760 bases, 1309024760 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 14100000 sequences, 2196888939 bases, 1322688939 kmers +read 14200000 sequences, 2209993052 bases, 1329593052 kmers +read 14300000 sequences, 2223177518 bases, 1336577518 kmers +read 14400000 sequences, 2236324767 bases, 1343524767 kmers +read 14500000 sequences, 2249926194 bases, 1350926194 kmers +read 14600000 sequences, 2263244067 bases, 1358044067 kmers +read 14700000 sequences, 2276666210 bases, 1365266210 kmers +read 14800000 sequences, 2289846389 bases, 1372246389 kmers +read 14900000 sequences, 2303142205 bases, 1379342205 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 15100000 sequences, 2329658257 bases, 1393458257 kmers +read 15200000 sequences, 2342799874 bases, 1400399874 kmers +read 15300000 sequences, 2355936598 bases, 1407336598 kmers +read 15400000 sequences, 2369202825 bases, 1414402825 kmers +read 15500000 sequences, 2382453933 bases, 1421453933 kmers +read 15600000 sequences, 2395606868 bases, 1428406868 kmers +read 15700000 sequences, 2408903524 bases, 1435503524 kmers +read 15800000 sequences, 2422488600 bases, 1442888600 kmers +read 15900000 sequences, 2435763741 bases, 1449963741 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 16100000 sequences, 2462152775 bases, 1463952775 kmers +read 16200000 sequences, 2475426803 bases, 1471026803 kmers +read 16300000 sequences, 2488985859 bases, 1478385859 kmers +read 16400000 sequences, 2502322646 bases, 1485522646 kmers +read 16500000 sequences, 2515682566 bases, 1492682566 kmers +read 16600000 sequences, 2529274259 bases, 1500074259 kmers +read 16700000 sequences, 2542622794 bases, 1507222794 kmers +read 16800000 sequences, 2556056912 bases, 1514456912 kmers +read 16900000 sequences, 2569267145 bases, 1521467145 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 17100000 sequences, 2596061102 bases, 1535861102 kmers +read 17200000 sequences, 2609459388 bases, 1543059388 kmers +read 17300000 sequences, 2622881245 bases, 1550281245 kmers +read 17400000 sequences, 2636336794 bases, 1557536794 kmers +read 17500000 sequences, 2649678629 bases, 1564678629 kmers +read 17600000 sequences, 2663341782 bases, 1572141782 kmers +read 17700000 sequences, 2676693590 bases, 1579293590 kmers +read 17800000 sequences, 2690200716 bases, 1586600716 kmers +read 17900000 sequences, 2703543489 bases, 1593743489 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 18100000 sequences, 2730783796 bases, 1608583796 kmers +read 18200000 sequences, 2744196467 bases, 1615796467 kmers +read 18300000 sequences, 2757894852 bases, 1623294852 kmers +read 18400000 sequences, 2771403521 bases, 1630603521 kmers +read 18500000 sequences, 2784930678 bases, 1637930678 kmers +read 18600000 sequences, 2798778608 bases, 1645578608 kmers +read 18700000 sequences, 2812434788 bases, 1653034788 kmers +read 18800000 sequences, 2826041925 bases, 1660441925 kmers +read 18900000 sequences, 2839594143 bases, 1667794143 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 19100000 sequences, 2866645368 bases, 1682445368 kmers +read 19200000 sequences, 2880162017 bases, 1689762017 kmers +read 19300000 sequences, 2893733500 bases, 1697133500 kmers +read 19400000 sequences, 2907861888 bases, 1705061888 kmers +read 19500000 sequences, 2921431859 bases, 1712431859 kmers +read 19600000 sequences, 2934950257 bases, 1719750257 kmers +read 19700000 sequences, 2948908590 bases, 1727508590 kmers +read 19800000 sequences, 2962655324 bases, 1735055324 kmers +read 19900000 sequences, 2976658842 bases, 1742858842 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 20100000 sequences, 3004463124 bases, 1758263124 kmers +read 20200000 sequences, 3018263669 bases, 1765863669 kmers +read 20300000 sequences, 3032235817 bases, 1773635817 kmers +read 20400000 sequences, 3045926851 bases, 1781126851 kmers +read 20500000 sequences, 3059718085 bases, 1788718085 kmers +read 20600000 sequences, 3073465760 bases, 1796265760 kmers +read 20700000 sequences, 3087374365 bases, 1803974365 kmers +read 20800000 sequences, 3101202279 bases, 1811602279 kmers +read 20900000 sequences, 3115301042 bases, 1819501042 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 21100000 sequences, 3143428950 bases, 1835228950 kmers +read 21200000 sequences, 3157337269 bases, 1842937269 kmers +read 21300000 sequences, 3171218453 bases, 1850618453 kmers +read 21400000 sequences, 3185386330 bases, 1858586330 kmers +read 21500000 sequences, 3199499619 bases, 1866499619 kmers +read 21600000 sequences, 3213699144 bases, 1874499144 kmers +read 21700000 sequences, 3227725083 bases, 1882325083 kmers +read 21800000 sequences, 3241636024 bases, 1890036024 kmers +read 21900000 sequences, 3255686690 bases, 1897886690 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 22100000 sequences, 3284189309 bases, 1913989309 kmers +read 22200000 sequences, 3298558467 bases, 1922158467 kmers +read 22300000 sequences, 3312627222 bases, 1930027222 kmers +read 22400000 sequences, 3326674715 bases, 1937874715 kmers +read 22500000 sequences, 3340769161 bases, 1945769161 kmers +read 22600000 sequences, 3355403951 bases, 1954203951 kmers +read 22700000 sequences, 3369592323 bases, 1962192323 kmers +read 22800000 sequences, 3383749832 bases, 1970149832 kmers +read 22900000 sequences, 3398280808 bases, 1978480808 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23100000 sequences, 3427105278 bases, 1994905278 kmers +read 23200000 sequences, 3441898165 bases, 2003498165 kmers +read 23300000 sequences, 3456307790 bases, 2011707790 kmers +read 23400000 sequences, 3470437552 bases, 2019637552 kmers +=== step 1.1: 'encoding input' 11.3166 [sec] (5.58111 [ns/kmer]) +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max_len 643923 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 20 +num. bits per_string_id 25 +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 1.09069 [sec] (0.537907 [ns/kmer]) +=== step 1: 'parse file' 12.4197 [sec] (6.12516 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 10.4309 [sec] (5.1443 [ns/kmer]) +num_minimizers = 76630489 +num_minimizer_positions = 141268659 +num_super_kmers = 141268659 +building minimizers MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 3.69853 [sec] (1.82404 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.77704 [sec] (2.35594 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 2.10531 [sec] (1.0383 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 12031601/76630489 (15.7008%) +num_buckets_in_skew_index 62262/76630489 (0.0812496%) +max_bucket_size 281880 +log2_max_bucket_size 19 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 66085279/141268659 (46.7799%) +num_minimizer_positions_of_buckets_in_skew_index 10646754/141268659 (7.53653%) +computing minimizers offsets: 3.27945 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 65292887 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16768176 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 6866326 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4652668 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4307414 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3858894 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5911410 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 281880: 31685511 +num_kmers_in_skew_index 139343286 (6.87214%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 65292887 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[0] for 65292887 kmers; bits/key = 2.55008 + built positions[0] for 65292887 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16768176 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16768176 kmers; bits/key = 2.56383 + built positions[1] for 16768176 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 6866326 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 6866326 kmers; bits/key = 2.72645 + built positions[2] for 6866326 kmers; bits/key = 9.00006 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4652668 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4652668 kmers; bits/key = 2.812 + built positions[3] for 4652668 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4307414 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4307414 kmers; bits/key = 2.80506 + built positions[4] for 4307414 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3858894 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3858894 kmers; bits/key = 3.08272 + built positions[5] for 3858894 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5911410 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 5911410 kmers; bits/key = 2.51936 + built positions[6] for 5911410 kmers; bits/key = 13.0001 + lower = 8192; upper = 281880; num_bits_per_pos = 19; num_kmers_in_partition = 31685511 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[7] for 31685511 kmers; bits/key = 2.52689 + built positions[7] for 31685511 kmers; bits/key = 19 +computing skew index took: 20.2379 [sec] +=== step 3: 'build sparse and skew index' 23.7471 [sec] (11.7116 [ns/kmer]) +=== total_time 57.1785 [sec] (28.1993 [ns/kmer]) +total index size: 1824281552 [B] -- 1824.28 [MB] +SPACE BREAKDOWN: + mphf: 0.108372 [bits/kmer] (2.86754 [bits/key]) -- 1.50567% + strings_offsets: 0.291878 [bits/kmer] -- 4.05522% + control_codewords: 1.24716 [bits/kmer] -- 17.3274% + mid_load_buckets: 1.04294 [bits/kmer] -- 14.4902% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.46907e-05% + strings: 3.43556 [bits/kmer] -- 47.732% + skew_index: 1.07169 [bits/kmer] -- 14.8895% + weights: 7.25961e-07 [bits/kmer] -- 1.00862e-05% + -------------- + total: 7.1976 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 84.2179% +buckets with 2 minimizer positions = 7.76108% +buckets with 3 minimizer positions = 2.50949% +buckets with 4 minimizer positions = 1.23307% +buckets with 5 minimizer positions = 0.750442% +buckets with 6 minimizer positions = 0.516927% +buckets with 7 minimizer positions = 0.38172% +buckets with 8 minimizer positions = 0.296813% +buckets with 9 minimizer positions = 0.239214% +buckets with 10 minimizer positions = 0.197673% +buckets with 11 minimizer positions = 0.166211% +buckets with 12 minimizer positions = 0.142668% +buckets with 13 minimizer positions = 0.124415% +buckets with 14 minimizer positions = 0.108818% +buckets with 15 minimizer positions = 0.0962646% +buckets with 16 minimizer positions = 0.0863325% +max_bucket_size 281880 +2025-10-22 15:54:07: saving data structure to disk... +2025-10-22 15:54:08: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash +k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 100000 sequences, 29016680 bases, 22816680 kmers +read 200000 sequences, 59512851 bases, 47112851 kmers +read 300000 sequences, 93672898 bases, 75072898 kmers +read 400000 sequences, 116504758 bases, 91704758 kmers +read 500000 sequences, 129640784 bases, 98640784 kmers +read 600000 sequences, 142888339 bases, 105688339 kmers +read 700000 sequences, 156121559 bases, 112721559 kmers +read 800000 sequences, 169296181 bases, 119696181 kmers +read 900000 sequences, 182473664 bases, 126673664 kmers +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 1100000 sequences, 208767883 bases, 140567883 kmers +read 1200000 sequences, 222206242 bases, 147806242 kmers +read 1300000 sequences, 235299002 bases, 154699002 kmers +read 1400000 sequences, 248482676 bases, 161682676 kmers +read 1500000 sequences, 261589002 bases, 168589002 kmers +read 1600000 sequences, 275055224 bases, 175855224 kmers +read 1700000 sequences, 288035899 bases, 182635899 kmers +read 1800000 sequences, 301349839 bases, 189749839 kmers +read 1900000 sequences, 314875402 bases, 197075402 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 2100000 sequences, 341368638 bases, 211168638 kmers +read 2200000 sequences, 354712561 bases, 218312561 kmers +read 2300000 sequences, 368072063 bases, 225472063 kmers +read 2400000 sequences, 381369139 bases, 232569139 kmers +read 2500000 sequences, 395076735 bases, 240076735 kmers +read 2600000 sequences, 408571236 bases, 247371236 kmers +read 2700000 sequences, 421770941 bases, 254370941 kmers +read 2800000 sequences, 434931097 bases, 261331097 kmers +read 2900000 sequences, 448299063 bases, 268499063 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 3100000 sequences, 474884907 bases, 282684907 kmers +read 3200000 sequences, 488437875 bases, 290037875 kmers +read 3300000 sequences, 501681623 bases, 297081623 kmers +read 3400000 sequences, 514981749 bases, 304181749 kmers +read 3500000 sequences, 528308911 bases, 311308911 kmers +read 3600000 sequences, 541636977 bases, 318436977 kmers +read 3700000 sequences, 555162428 bases, 325762428 kmers +read 3800000 sequences, 568696864 bases, 333096864 kmers +read 3900000 sequences, 581917367 bases, 340117367 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 4100000 sequences, 608987326 bases, 354787326 kmers +read 4200000 sequences, 622285230 bases, 361885230 kmers +read 4300000 sequences, 635647937 bases, 369047937 kmers +read 4400000 sequences, 648992641 bases, 376192641 kmers +read 4500000 sequences, 662513085 bases, 383513085 kmers +read 4600000 sequences, 675930708 bases, 390730708 kmers +read 4700000 sequences, 689630997 bases, 398230997 kmers +read 4800000 sequences, 702998525 bases, 405398525 kmers +read 4900000 sequences, 716509106 bases, 412709106 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 5100000 sequences, 743782200 bases, 427582200 kmers +read 5200000 sequences, 757644345 bases, 435244345 kmers +read 5300000 sequences, 771125199 bases, 442525199 kmers +read 5400000 sequences, 784691064 bases, 449891064 kmers +read 5500000 sequences, 798294855 bases, 457294855 kmers +read 5600000 sequences, 811868593 bases, 464668593 kmers +read 5700000 sequences, 825311254 bases, 471911254 kmers +read 5800000 sequences, 838965535 bases, 479365535 kmers +read 5900000 sequences, 852651369 bases, 486851369 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 6100000 sequences, 879791139 bases, 501591139 kmers +read 6200000 sequences, 893568574 bases, 509168574 kmers +read 6300000 sequences, 907221132 bases, 516621132 kmers +read 6400000 sequences, 920850746 bases, 524050746 kmers +read 6500000 sequences, 934451496 bases, 531451496 kmers +read 6600000 sequences, 948058192 bases, 538858192 kmers +read 6700000 sequences, 961672076 bases, 546272076 kmers +read 6800000 sequences, 975396607 bases, 553796607 kmers +read 6900000 sequences, 989058970 bases, 561258970 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 7100000 sequences, 1016671875 bases, 576471875 kmers +read 7200000 sequences, 1030411659 bases, 584011659 kmers +read 7300000 sequences, 1044405182 bases, 591805182 kmers +read 7400000 sequences, 1058406016 bases, 599606016 kmers +read 7500000 sequences, 1072419258 bases, 607419258 kmers +read 7600000 sequences, 1086161571 bases, 614961571 kmers +read 7700000 sequences, 1100358439 bases, 622958439 kmers +read 7800000 sequences, 1114261097 bases, 630661097 kmers +read 7900000 sequences, 1128307808 bases, 638507808 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 8100000 sequences, 1156357087 bases, 654157087 kmers +read 8200000 sequences, 1170571919 bases, 662171919 kmers +read 8300000 sequences, 1184451177 bases, 669851177 kmers +read 8400000 sequences, 1198299415 bases, 677499415 kmers +read 8500000 sequences, 1212442446 bases, 685442446 kmers +read 8600000 sequences, 1226405386 bases, 693205386 kmers +read 8700000 sequences, 1240703127 bases, 701303127 kmers +read 8800000 sequences, 1254656983 bases, 709056983 kmers +read 8900000 sequences, 1268621397 bases, 716821397 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 9100000 sequences, 1297350868 bases, 733150868 kmers +read 9200000 sequences, 1311516008 bases, 741116008 kmers +read 9300000 sequences, 1325689722 bases, 749089722 kmers +read 9400000 sequences, 1339681966 bases, 756881966 kmers +read 9500000 sequences, 1353794378 bases, 764794378 kmers +read 9600000 sequences, 1368052593 bases, 772852593 kmers +read 9700000 sequences, 1382481060 bases, 781081060 kmers +read 9800000 sequences, 1397029165 bases, 789429165 kmers +read 9900000 sequences, 1411261935 bases, 797461935 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 10100000 sequences, 1439978158 bases, 813778158 kmers +read 10200000 sequences, 1454566042 bases, 822166042 kmers +read 10300000 sequences, 1469140008 bases, 830540008 kmers +read 10400000 sequences, 1483590209 bases, 838790209 kmers +read 10500000 sequences, 1497966729 bases, 846966729 kmers +read 10600000 sequences, 1512656712 bases, 855456712 kmers +read 10700000 sequences, 1527179954 bases, 863779954 kmers +read 10800000 sequences, 1541782827 bases, 872182827 kmers +read 10900000 sequences, 1556446263 bases, 880646263 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 11100000 sequences, 1585817113 bases, 897617113 kmers +read 11200000 sequences, 1600557391 bases, 906157391 kmers +read 11300000 sequences, 1615262703 bases, 914662703 kmers +read 11400000 sequences, 1629999627 bases, 923199627 kmers +read 11500000 sequences, 1644860568 bases, 931860568 kmers +read 11600000 sequences, 1659779614 bases, 940579614 kmers +read 11700000 sequences, 1674792374 bases, 949392374 kmers +read 11800000 sequences, 1689736749 bases, 958136749 kmers +read 11900000 sequences, 1704892610 bases, 967092610 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 12100000 sequences, 1735135576 bases, 984935576 kmers +read 12200000 sequences, 1750297083 bases, 993897083 kmers +read 12300000 sequences, 1765691330 bases, 1003091330 kmers +read 12400000 sequences, 1781168609 bases, 1012368609 kmers +read 12500000 sequences, 1796591819 bases, 1021591819 kmers +read 12600000 sequences, 1811901104 bases, 1030701104 kmers +read 12700000 sequences, 1827876510 bases, 1040476510 kmers +read 12800000 sequences, 1843393773 bases, 1049793773 kmers +read 12900000 sequences, 1858842782 bases, 1059042782 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 13100000 sequences, 1890244268 bases, 1078044268 kmers +read 13200000 sequences, 1905959273 bases, 1087559273 kmers +read 13300000 sequences, 1922228338 bases, 1097628338 kmers +read 13400000 sequences, 1938520111 bases, 1107720111 kmers +read 13500000 sequences, 1954665049 bases, 1117665049 kmers +read 13600000 sequences, 1970696591 bases, 1127496591 kmers +read 13700000 sequences, 1987164795 bases, 1137764795 kmers +read 13800000 sequences, 2003371475 bases, 1147771475 kmers +read 13900000 sequences, 2019649864 bases, 1157849864 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 14100000 sequences, 2052986091 bases, 1178786091 kmers +read 14200000 sequences, 2069712172 bases, 1189312172 kmers +read 14300000 sequences, 2086760589 bases, 1200160589 kmers +read 14400000 sequences, 2103719627 bases, 1210919627 kmers +read 14500000 sequences, 2120768565 bases, 1221768565 kmers +read 14600000 sequences, 2137973642 bases, 1232773642 kmers +read 14700000 sequences, 2155333528 bases, 1243933528 kmers +read 14800000 sequences, 2173029002 bases, 1255429002 kmers +read 14900000 sequences, 2190761957 bases, 1266961957 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 15100000 sequences, 2226994114 bases, 1290794114 kmers +read 15200000 sequences, 2245240873 bases, 1302840873 kmers +read 15300000 sequences, 2264078057 bases, 1315478057 kmers +read 15400000 sequences, 2282789468 bases, 1327989468 kmers +read 15500000 sequences, 2301835717 bases, 1340835717 kmers +read 15600000 sequences, 2321337137 bases, 1354137137 kmers +read 15700000 sequences, 2341431175 bases, 1368031175 kmers +read 15800000 sequences, 2361547906 bases, 1381947906 kmers +read 15900000 sequences, 2382126087 bases, 1396326087 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16100000 sequences, 2424934550 bases, 1426734550 kmers +read 16200000 sequences, 2447209476 bases, 1442809476 kmers +read 16300000 sequences, 2470231832 bases, 1459631832 kmers +read 16400000 sequences, 2494281037 bases, 1477481037 kmers +read 16500000 sequences, 2519161670 bases, 1496161670 kmers +read 16600000 sequences, 2545406869 bases, 1516206869 kmers +=== step 1.1: 'encoding input' 8.10293 [sec] (5.31373 [ns/kmer]) +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max_len 499189 +num. bits per_absolute_offset 32 +num. bits per_relative_offset 19 +num. bits per_string_id 24 +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.0.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.1.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.2.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.3.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.4.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.5.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.6.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.7.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.8.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.9.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.10.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.11.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.12.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.13.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.14.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.15.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.16.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.17.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.18.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.19.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.20.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.21.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.22.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.23.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.24.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.25.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.26.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.27.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.28.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.29.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.30.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.31.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.32.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.33.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.34.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.35.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.36.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.37.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.38.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.39.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.40.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.41.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.42.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.43.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.44.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.45.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.46.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.47.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.48.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.49.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.50.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.51.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.52.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.53.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.54.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.55.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.56.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.57.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.58.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.59.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.60.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.61.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.62.bin'... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.63.bin'... +=== step 1.2: 'computing minimizers tuples' 0.865644 [sec] (0.567671 [ns/kmer]) +=== step 1: 'parse file' 8.98579 [sec] (5.89269 [ns/kmer]) + == files to merge = 64 +saving tuples to 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.bin' +num_super_kmers = 50000000 +num_super_kmers = 100000000 +=== step 2.1: 'merging minimizers tuples' 7.8027 [sec] (5.11685 [ns/kmer]) +num_minimizers = 61951224 +num_minimizer_positions = 105337248 +num_super_kmers = 105337248 +building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... +=== step 2.2: 'build minimizers mphf' 2.96761 [sec] (1.9461 [ns/kmer]) +re-sorting minimizer tuples... +saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.0.bin'... +=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.61928 [sec] (2.37345 [ns/kmer]) +=== step 2.4: 'merging minimizers tuples ' 1.97215 [sec] (1.2933 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 9999764/61951224 (16.1414%) +num_buckets_in_skew_index 36489/61951224 (0.0588996%) +max_bucket_size 144478 +log2_max_bucket_size 18 +skew index num_partitions 8 +num_minimizer_positions_of_buckets_larger_than_1 47622255/105337248 (45.2093%) +num_minimizer_positions_of_buckets_in_skew_index 5800022/105337248 (5.50615%) +computing minimizers offsets: 2.44727 [sec] +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 32078766 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16092632 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 8174536 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3454318 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2781070 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2981930 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2815305 + partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 144478: 7418130 +num_kmers_in_skew_index 75796687 (4.97059%) +building partitions... + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 32078766 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[0] for 32078766 kmers; bits/key = 2.51437 + built positions[0] for 32078766 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16092632 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16092632 kmers; bits/key = 2.65398 + built positions[1] for 16092632 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8174536 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 8174536 kmers; bits/key = 2.61889 + built positions[2] for 8174536 kmers; bits/key = 9.00005 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3454318 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3454318 kmers; bits/key = 3.14686 + built positions[3] for 3454318 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2781070 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2781070)... + built mphs[4] for 2781070 kmers; bits/key = 2.55987 + built positions[4] for 2781070 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2981930 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2981930)... + built mphs[5] for 2981930 kmers; bits/key = 2.55978 + built positions[5] for 2981930 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2815305 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2815305)... + built mphs[6] for 2815305 kmers; bits/key = 2.55984 + built positions[6] for 2815305 kmers; bits/key = 13.0001 + lower = 8192; upper = 144478; num_bits_per_pos = 18; num_kmers_in_partition = 7418130 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[7] for 7418130 kmers; bits/key = 2.72795 + built positions[7] for 7418130 kmers; bits/key = 18.0001 +computing skew index took: 13.7477 [sec] +=== step 3: 'build sparse and skew index' 16.3602 [sec] (10.7286 [ns/kmer]) +=== total_time 41.7077 [sec] (27.351 [ns/kmer]) +total index size: 1294767210 [B] -- 1294.77 [MB] +SPACE BREAKDOWN: + mphf: 0.116088 [bits/kmer] (2.85745 [bits/key]) -- 1.70902% + strings_offsets: 0.274587 [bits/kmer] -- 4.04241% + control_codewords: 1.34067 [bits/kmer] -- 19.737% + mid_load_buckets: 0.99935 [bits/kmer] -- 14.7122% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 2.06987e-05% + strings: 3.35283 [bits/kmer] -- 49.3596% + skew_index: 0.709128 [bits/kmer] -- 10.4396% + weights: 9.65307e-07 [bits/kmer] -- 1.4211e-05% + -------------- + total: 6.79265 [bits/kmer] + === bucket statistics (less) === +buckets with 1 minimizer positions = 83.7998% +buckets with 2 minimizer positions = 8.4968% +buckets with 3 minimizer positions = 2.71676% +buckets with 4 minimizer positions = 1.2809% +buckets with 5 minimizer positions = 0.745569% +buckets with 6 minimizer positions = 0.487324% +buckets with 7 minimizer positions = 0.345178% +buckets with 8 minimizer positions = 0.259136% +buckets with 9 minimizer positions = 0.202319% +buckets with 10 minimizer positions = 0.163595% +buckets with 11 minimizer positions = 0.136582% +buckets with 12 minimizer positions = 0.116401% +buckets with 13 minimizer positions = 0.100962% +buckets with 14 minimizer positions = 0.0888166% +buckets with 15 minimizer positions = 0.0782793% +buckets with 16 minimizer positions = 0.0706992% +max_bucket_size 144478 +2025-10-22 15:54:50: saving data structure to disk... +2025-10-22 15:54:51: DONE From db02c17678baa79fcfc3f515b6e99f081857245b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 24 Oct 2025 22:37:37 +0200 Subject: [PATCH 063/112] compute min by scan is actually faster than using a min-heap --- include/builder/file_merging_iterator.hpp | 66 +++++++++++++++++------ include/builder/parse_file.cpp | 2 +- include/builder/util.hpp | 4 ++ script/build.sh | 8 +++ 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/include/builder/file_merging_iterator.hpp b/include/builder/file_merging_iterator.hpp index 9336d7a..9423ac2 100644 --- a/include/builder/file_merging_iterator.hpp +++ b/include/builder/file_merging_iterator.hpp @@ -7,12 +7,15 @@ namespace sshash { template struct file_merging_iterator // { + const uint64_t scan_threshold = 32; + template file_merging_iterator(FileNamesIterator file_names_iterator, uint64_t num_files_to_merge) : m_mm_files(num_files_to_merge) { if (num_files_to_merge == 0) return; assert(num_files_to_merge > 0); + m_min_idx = 0; m_iterators.reserve(num_files_to_merge); m_idx_heap.reserve(num_files_to_merge); @@ -23,12 +26,18 @@ struct file_merging_iterator // {m_mm_files[i].data(), m_mm_files[i].data() + m_mm_files[i].size()}); m_idx_heap.push_back(i); } - std::make_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); + + if (num_files_to_merge <= scan_threshold) { + compute_min(); + } else { + std::make_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); + m_min_idx = m_idx_heap.front(); + } } bool has_next() { return !m_idx_heap.empty(); } void next() { advance_heap_head(); } - T operator*() const { return *(m_iterators[m_idx_heap.front()].begin); } + T operator*() const { return *(m_iterators[m_min_idx].begin); } void close() { for (uint64_t i = 0; i != m_mm_files.size(); ++i) m_mm_files[i].close(); @@ -45,6 +54,7 @@ struct file_merging_iterator // std::vector m_iterators; std::vector m_idx_heap; std::vector> m_mm_files; + uint64_t m_min_idx; std::function heap_idx_comparator = [&](uint32_t i, uint32_t j) { assert(i < m_iterators.size() and j < m_iterators.size()); @@ -54,23 +64,47 @@ struct file_merging_iterator // }; void advance_heap_head() { - uint32_t idx = m_idx_heap.front(); - m_iterators[idx].begin += 1; - if (m_iterators[idx].begin != m_iterators[idx].end) { // if iterator has next - uint64_t pos = 0; - uint64_t size = m_idx_heap.size(); - while (2 * pos + 1 < size) { - uint64_t i = 2 * pos + 1; - if (i + 1 < size and heap_idx_comparator(m_idx_heap[i], m_idx_heap[i + 1])) ++i; - if (heap_idx_comparator(m_idx_heap[i], m_idx_heap[pos])) break; - std::swap(m_idx_heap[pos], m_idx_heap[i]); - pos = i; + auto& it = m_iterators[m_min_idx]; + it.begin += 1; + if (m_iterators.size() <= scan_threshold) { // linear scan + if (it.begin == it.end) { + m_iterators.erase(m_iterators.begin() + m_min_idx); + m_idx_heap.pop_back(); + m_min_idx = 0; + if (m_iterators.empty()) return; } - } else { - std::pop_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); - m_idx_heap.pop_back(); + compute_min(); + } else { // min-heap code + if (it.begin != it.end) { // if iterator has next + uint64_t pos = 0; + uint64_t size = m_idx_heap.size(); + while (2 * pos + 1 < size) { + uint64_t i = 2 * pos + 1; + if (i + 1 < size and heap_idx_comparator(m_idx_heap[i], m_idx_heap[i + 1])) ++i; + if (heap_idx_comparator(m_idx_heap[i], m_idx_heap[pos])) break; + std::swap(m_idx_heap[pos], m_idx_heap[i]); + pos = i; + } + } else { + std::pop_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); + m_idx_heap.pop_back(); + } + m_min_idx = m_idx_heap.front(); } }; + + void compute_min() { + m_min_idx = 0; + auto min_val = *m_iterators.front().begin; + for (uint64_t i = 1; i != m_iterators.size(); ++i) { + assert(m_iterators[i].begin != m_iterators[i].end); + auto val = *m_iterators[i].begin; + if (val < min_val) { + min_val = val; + m_min_idx = i; + } + } + } }; } // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index 085c772..e6c3077 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -125,7 +125,7 @@ void dictionary_builder::parse_file(std::istream& is, throw std::runtime_error("file is malformed"); } - if (strings_offsets_builder.size() % 100'000 == 0) { + if (strings_offsets_builder.size() % 1'000'000 == 0) { std::cout << "read " << strings_offsets_builder.size() << " sequences, " << num_bases << " bases, " << num_kmers << " kmers" << std::endl; } diff --git a/include/builder/util.hpp b/include/builder/util.hpp index f88bd4a..06332c1 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -74,6 +74,10 @@ struct minimizer_tuple { if (minimizer != other.minimizer) return minimizer > other.minimizer; return pos_in_seq > other.pos_in_seq; } + bool operator<(minimizer_tuple other) const { + if (minimizer != other.minimizer) return minimizer < other.minimizer; + return pos_in_seq < other.pos_in_seq; + } uint64_t minimizer; uint64_t pos_in_seq; diff --git a/script/build.sh b/script/build.sh index 95c0913..003866d 100644 --- a/script/build.sh +++ b/script/build.sh @@ -11,16 +11,20 @@ mkdir results-$1/k31 results-$1/k63 rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o axolotl.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash >> results-$1/k31/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d tmp_dir -o ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j @@ -28,16 +32,20 @@ make -j rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o axolotl.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash >> results-$1/k63/regular-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d tmp_dir -o ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash >> results-$1/k63/canon-build.log rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From e67257e6b73ac273b69d4760983e7a06e4072c8f Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 25 Oct 2025 13:01:11 +0200 Subject: [PATCH 064/112] scripts updated --- script/bench.sh | 75 +++++++++++++++++++++++++++++++++---------------- script/build.sh | 74 +++++++++++++++++++++++++----------------------- 2 files changed, 90 insertions(+), 59 deletions(-) diff --git a/script/bench.sh b/script/bench.sh index db98722..d2c81af 100644 --- a/script/bench.sh +++ b/script/bench.sh @@ -1,91 +1,118 @@ #!/bin/bash echo "output log file =" $1 +echo "input dir for indexes =" $2 cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j mkdir results-$1 mkdir results-$1/k31 results-$1/k63 +mkdir $2 +prefix=/mnt/hd2/pibiri/DNA for i in {1..3}; do - ./sshash bench -i cod.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/cod.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i kestrel.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/kestrel.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i human.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/human.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i hprc.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/axolotl.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i ec.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/hprc.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i se.k31.sshash >> results-$1/k31/regular-bench.log + ./sshash bench -i $2/ec.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/se.k31.sshash >> results-$1/k31/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-bench.log done for i in {1..3}; do - ./sshash bench -i cod.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/cod.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/human.k31.canon.sshash >> results-$1/k31/canon-bench.log done for i in {1..3}; do - ./sshash bench -i kestrel.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-bench.log done for i in {1..3}; do - ./sshash bench -i human.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/hprc.k31.canon.sshash >> results-$1/k31/canon-bench.log done for i in {1..3}; do - ./sshash bench -i hprc.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/ec.k31.canon.sshash >> results-$1/k31/canon-bench.log done for i in {1..3}; do - ./sshash bench -i ec.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/se.k31.canon.sshash >> results-$1/k31/canon-bench.log done for i in {1..3}; do - ./sshash bench -i se.k31.canon.sshash >> results-$1/k31/canon-bench.log + ./sshash bench -i $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-bench.log done cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j for i in {1..3}; do - ./sshash bench -i cod.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/cod.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i kestrel.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/kestrel.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i human.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/human.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i hprc.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/axolotl.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i ec.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/hprc.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i se.k63.sshash >> results-$1/k63/regular-bench.log + ./sshash bench -i $2/ec.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/se.k63.sshash >> results-$1/k63/regular-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-bench.log done for i in {1..3}; do - ./sshash bench -i cod.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/cod.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-bench.log +done +for i in {1..3}; do + ./sshash bench -i $2/human.k63.canon.sshash >> results-$1/k63/canon-bench.log done for i in {1..3}; do - ./sshash bench -i kestrel.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-bench.log done for i in {1..3}; do - ./sshash bench -i human.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/hprc.k63.canon.sshash >> results-$1/k63/canon-bench.log done for i in {1..3}; do - ./sshash bench -i hprc.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/ec.k63.canon.sshash >> results-$1/k63/canon-bench.log done for i in {1..3}; do - ./sshash bench -i ec.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/se.k63.canon.sshash >> results-$1/k63/canon-bench.log done for i in {1..3}; do - ./sshash bench -i se.k63.canon.sshash >> results-$1/k63/canon-bench.log + ./sshash bench -i $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-bench.log done cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off diff --git a/script/build.sh b/script/build.sh index 003866d..ed8ff44 100644 --- a/script/build.sh +++ b/script/build.sh @@ -1,51 +1,55 @@ #!/bin/bash echo "output log file =" $1 +echo "output dir for indexes =" $2 cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j mkdir results-$1 mkdir results-$1/k31 results-$1/k63 - -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o axolotl.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash >> results-$1/k31/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d tmp_dir -o ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log - -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log +mkdir $2 + +prefix=/mnt/hd2/pibiri/DNA + +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log + +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o axolotl.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash >> results-$1/k63/regular-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d tmp_dir -o ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log - -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf tmp_dir/; ./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log + +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From e9a525de28aa4429f16ccd76fcf418cdcf27d8b1 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 25 Oct 2025 16:32:44 +0200 Subject: [PATCH 065/112] simplified file_merging_iterator --- include/builder/file_merging_iterator.hpp | 51 +++++++++-------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/include/builder/file_merging_iterator.hpp b/include/builder/file_merging_iterator.hpp index 9423ac2..f6d1893 100644 --- a/include/builder/file_merging_iterator.hpp +++ b/include/builder/file_merging_iterator.hpp @@ -11,38 +11,33 @@ struct file_merging_iterator // template file_merging_iterator(FileNamesIterator file_names_iterator, uint64_t num_files_to_merge) - : m_mm_files(num_files_to_merge) { + : m_mm_files(num_files_to_merge) // + { if (num_files_to_merge == 0) return; - assert(num_files_to_merge > 0); - - m_min_idx = 0; - m_iterators.reserve(num_files_to_merge); - m_idx_heap.reserve(num_files_to_merge); /* create the input iterators and make the heap */ + m_iterators.reserve(num_files_to_merge); for (uint64_t i = 0; i != num_files_to_merge; ++i, ++file_names_iterator) { m_mm_files[i].open(*file_names_iterator, mm::advice::sequential); m_iterators.push_back( {m_mm_files[i].data(), m_mm_files[i].data() + m_mm_files[i].size()}); - m_idx_heap.push_back(i); } - if (num_files_to_merge <= scan_threshold) { + m_min_idx = 0; + if (m_iterators.size() <= scan_threshold) { compute_min(); } else { - std::make_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); - m_min_idx = m_idx_heap.front(); + std::make_heap(m_iterators.begin(), m_iterators.end(), heap_comparator); } } - bool has_next() { return !m_idx_heap.empty(); } + bool has_next() { return m_iterators.size() != 0; } void next() { advance_heap_head(); } T operator*() const { return *(m_iterators[m_min_idx].begin); } void close() { for (uint64_t i = 0; i != m_mm_files.size(); ++i) m_mm_files[i].close(); m_iterators.clear(); - m_idx_heap.clear(); m_mm_files.clear(); } @@ -52,44 +47,38 @@ struct file_merging_iterator // T const* end; }; std::vector m_iterators; - std::vector m_idx_heap; std::vector> m_mm_files; uint64_t m_min_idx; - std::function heap_idx_comparator = [&](uint32_t i, uint32_t j) { - assert(i < m_iterators.size() and j < m_iterators.size()); - assert(m_iterators[i].begin != m_iterators[i].end and - m_iterators[j].begin != m_iterators[j].end); - return *(m_iterators[i].begin) > *(m_iterators[j].begin); - }; + std::function heap_comparator = + [](pointer_pair x, pointer_pair y) { return *(x.begin) > *(y.begin); }; void advance_heap_head() { auto& it = m_iterators[m_min_idx]; it.begin += 1; - if (m_iterators.size() <= scan_threshold) { // linear scan + if (m_iterators.size() <= scan_threshold) { // compute min with a linear scan if (it.begin == it.end) { m_iterators.erase(m_iterators.begin() + m_min_idx); - m_idx_heap.pop_back(); m_min_idx = 0; - if (m_iterators.empty()) return; + if (m_iterators.size() == 0) return; } compute_min(); - } else { // min-heap code - if (it.begin != it.end) { // if iterator has next + } else { // update the min-heap + if (it.begin != it.end) { uint64_t pos = 0; - uint64_t size = m_idx_heap.size(); + uint64_t size = m_iterators.size(); while (2 * pos + 1 < size) { uint64_t i = 2 * pos + 1; - if (i + 1 < size and heap_idx_comparator(m_idx_heap[i], m_idx_heap[i + 1])) ++i; - if (heap_idx_comparator(m_idx_heap[i], m_idx_heap[pos])) break; - std::swap(m_idx_heap[pos], m_idx_heap[i]); + if (i + 1 < size and heap_comparator(m_iterators[i], m_iterators[i + 1])) ++i; + if (heap_comparator(m_iterators[i], m_iterators[pos])) break; + std::swap(m_iterators[pos], m_iterators[i]); pos = i; } } else { - std::pop_heap(m_idx_heap.begin(), m_idx_heap.end(), heap_idx_comparator); - m_idx_heap.pop_back(); + std::pop_heap(m_iterators.begin(), m_iterators.end(), heap_comparator); + m_iterators.pop_back(); } - m_min_idx = m_idx_heap.front(); + assert(m_min_idx == 0); } }; From ff33ec7e6f7b5b2d088603802d48bdd6a93e0af7 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 25 Oct 2025 22:25:55 +0200 Subject: [PATCH 066/112] optimized merging with a looser tree (faster then a min-heap because it has one comparison per level of the tree instead of two) --- include/builder/file_merging_iterator.hpp | 103 ++++++++++++++++------ include/builder/parse_file.cpp | 4 +- include/util.hpp | 3 - tools/build.cpp | 2 - 4 files changed, 76 insertions(+), 36 deletions(-) diff --git a/include/builder/file_merging_iterator.hpp b/include/builder/file_merging_iterator.hpp index f6d1893..9750d79 100644 --- a/include/builder/file_merging_iterator.hpp +++ b/include/builder/file_merging_iterator.hpp @@ -1,13 +1,11 @@ #pragma once -#include - namespace sshash { template struct file_merging_iterator // { - const uint64_t scan_threshold = 32; + const uint64_t scan_threshold = 16; template file_merging_iterator(FileNamesIterator file_names_iterator, uint64_t num_files_to_merge) @@ -23,22 +21,34 @@ struct file_merging_iterator // {m_mm_files[i].data(), m_mm_files[i].data() + m_mm_files[i].size()}); } + m_num_files_to_merge = num_files_to_merge; m_min_idx = 0; if (m_iterators.size() <= scan_threshold) { compute_min(); } else { - std::make_heap(m_iterators.begin(), m_iterators.end(), heap_comparator); + /* build a looser tree */ + uint64_t n = num_files_to_merge; + uint64_t m = 2 * n - 1; + m_size = n; + m_tree.resize(m); + m_begin = (1ULL << uint64_t(std::ceil(std::log2(n)))) - 1; + uint64_t i = 0; + for (; m_begin + i != m; ++i) m_tree[m_begin + i] = i; + for (uint64_t j = 0; i != n; ++i, ++j) m_tree[n - 1 + j] = i; + build(0); + m_min_idx = m_tree[0]; } } - bool has_next() { return m_iterators.size() != 0; } - void next() { advance_heap_head(); } + bool has_next() { return m_num_files_to_merge != 0; } + void next() { update(); } T operator*() const { return *(m_iterators[m_min_idx].begin); } void close() { - for (uint64_t i = 0; i != m_mm_files.size(); ++i) m_mm_files[i].close(); + for (auto& mm_file : m_mm_files) mm_file.close(); m_iterators.clear(); m_mm_files.clear(); + m_tree.clear(); } private: @@ -48,40 +58,75 @@ struct file_merging_iterator // }; std::vector m_iterators; std::vector> m_mm_files; - uint64_t m_min_idx; + std::vector m_tree; - std::function heap_comparator = - [](pointer_pair x, pointer_pair y) { return *(x.begin) > *(y.begin); }; + uint64_t m_begin, m_size; + uint64_t m_min_idx, m_num_files_to_merge; - void advance_heap_head() { - auto& it = m_iterators[m_min_idx]; - it.begin += 1; + void update() { if (m_iterators.size() <= scan_threshold) { // compute min with a linear scan + auto& it = m_iterators[m_min_idx]; + it.begin += 1; if (it.begin == it.end) { m_iterators.erase(m_iterators.begin() + m_min_idx); m_min_idx = 0; - if (m_iterators.size() == 0) return; + --m_num_files_to_merge; + if (m_num_files_to_merge == 0) return; } compute_min(); - } else { // update the min-heap - if (it.begin != it.end) { - uint64_t pos = 0; - uint64_t size = m_iterators.size(); - while (2 * pos + 1 < size) { - uint64_t i = 2 * pos + 1; - if (i + 1 < size and heap_comparator(m_iterators[i], m_iterators[i + 1])) ++i; - if (heap_comparator(m_iterators[i], m_iterators[pos])) break; - std::swap(m_iterators[pos], m_iterators[i]); - pos = i; + } else { // update the looser tree + m_min_idx = m_tree[0]; + assert(m_min_idx < m_iterators.size()); + auto& it = m_iterators[m_min_idx]; + it.begin += 1; + uint64_t p = m_begin + m_min_idx; + p -= (p >= m_tree.size()) * m_size; // p is the index of the leaf + if (it.begin == it.end) { + m_tree[p] = uint32_t(-1); + --m_num_files_to_merge; + } + while (p) { + uint64_t l = p; + uint64_t r = p + 1; + if ((p & 1) == 0) { // p is right child + --l; + --r; + } + uint32_t i = 0; + l = m_tree[l]; + r = m_tree[r]; + if (l == uint32_t(-1)) { + i = r; + } else if (r == uint32_t(-1)) { + i = l; + } else { + i = *(m_iterators[l].begin) < *(m_iterators[r].begin) ? l : r; } - } else { - std::pop_heap(m_iterators.begin(), m_iterators.end(), heap_comparator); - m_iterators.pop_back(); + uint64_t parent = (p - 1) / 2; + m_tree[parent] = i; + p = parent; } - assert(m_min_idx == 0); + m_min_idx = m_tree[0]; } }; + uint32_t build(uint32_t p) { + if (p >= m_tree.size()) return uint32_t(-1); + if (p >= m_size - 1) return m_tree[p]; // leaf + uint32_t l = build(2 * p + 1); + uint32_t r = build(2 * p + 2); + uint32_t i = 0; + if (l == uint32_t(-1)) { + i = r; + } else if (r == uint32_t(-1)) { + i = l; + } else { + i = *(m_iterators[l].begin) < *(m_iterators[r].begin) ? l : r; + } + m_tree[p] = i; + return i; + } + void compute_min() { m_min_idx = 0; auto min_val = *m_iterators.front().begin; @@ -94,6 +139,6 @@ struct file_merging_iterator // } } } -}; +}; // namespace sshash } // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index e6c3077..f735992 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -202,8 +202,8 @@ void dictionary_builder::parse_file(std::istream& is, std::cout << "num. bits per_relative_offset " << nb.per_relative_offset << std::endl; std::cout << "num. bits per_string_id " << nb.per_string_id << std::endl; - if (build_config.fast and nb.per_string_id + nb.per_relative_offset > 64) { - throw std::runtime_error("minimier offset does not fit within 64 bits"); + if (nb.per_string_id + nb.per_relative_offset > 64) { + throw std::runtime_error("minimizer offset does not fit within 64 bits"); } strings_offsets_builder.set_num_bits(nb); diff --git a/include/util.hpp b/include/util.hpp index 941d2f3..784bb9b 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -153,7 +153,6 @@ struct build_configuration { , canonical(false) , weighted(false) , verbose(true) - , fast(false) , tmp_dirname(constants::default_tmp_dirname) @@ -170,7 +169,6 @@ struct build_configuration { bool canonical; bool weighted; bool verbose; - bool fast; std::string tmp_dirname; @@ -184,7 +182,6 @@ struct build_configuration { << ", canonical = " << (canonical ? "true" : "false") // << ", weighted = " << (weighted ? "true" : "false") // << ", verbose = " << (verbose ? "true" : "false") // - << ", fast = " << (fast ? "true" : "false") // << ", tmp_dirname = '" << tmp_dirname << "'" << std::endl; // } }; diff --git a/tools/build.cpp b/tools/build.cpp index b43d986..6d90f7a 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -47,7 +47,6 @@ int build(int argc, char** argv) { parser.add("check", "Check correctness after construction.", "--check", false, true); parser.add("bench", "Run performance benchmark after construction.", "--bench", false, true); parser.add("verbose", "Verbose output during construction.", "--verbose", false, true); - parser.add("fast", "Increase space for faster lookup queries.", "--fast", false, true); if (!parser.parse()) return 0; @@ -66,7 +65,6 @@ int build(int argc, char** argv) { build_config.canonical = parser.get("canonical"); build_config.weighted = parser.get("weighted"); build_config.verbose = parser.get("verbose"); - build_config.fast = parser.get("fast"); if (parser.parsed("tmp_dirname")) { build_config.tmp_dirname = parser.get("tmp_dirname"); essentials::create_directory(build_config.tmp_dirname); From 7f0b05d18f12d2207ccc88afd43724aed392d61c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 27 Oct 2025 16:11:11 +0100 Subject: [PATCH 067/112] avoid branch in tight loop --- include/builder/file_merging_iterator.hpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/include/builder/file_merging_iterator.hpp b/include/builder/file_merging_iterator.hpp index 9750d79..34f2b03 100644 --- a/include/builder/file_merging_iterator.hpp +++ b/include/builder/file_merging_iterator.hpp @@ -13,7 +13,7 @@ struct file_merging_iterator // { if (num_files_to_merge == 0) return; - /* create the input iterators and make the heap */ + /* open files and create the input iterators */ m_iterators.reserve(num_files_to_merge); for (uint64_t i = 0; i != num_files_to_merge; ++i, ++file_names_iterator) { m_mm_files[i].open(*file_names_iterator, mm::advice::sequential); @@ -86,15 +86,10 @@ struct file_merging_iterator // --m_num_files_to_merge; } while (p) { - uint64_t l = p; - uint64_t r = p + 1; - if ((p & 1) == 0) { // p is right child - --l; - --r; - } + uint64_t is_right_child = (p & 1) == 0; uint32_t i = 0; - l = m_tree[l]; - r = m_tree[r]; + uint32_t l = m_tree[p - is_right_child]; + uint32_t r = m_tree[p + 1 - is_right_child]; if (l == uint32_t(-1)) { i = r; } else if (r == uint32_t(-1)) { From ac0460901f9e1e9110a6778e43a7c8e697e2fb4e Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 27 Oct 2025 16:27:11 +0100 Subject: [PATCH 068/112] wrong namespace --- include/builder/file_merging_iterator.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/builder/file_merging_iterator.hpp b/include/builder/file_merging_iterator.hpp index 34f2b03..6db0b36 100644 --- a/include/builder/file_merging_iterator.hpp +++ b/include/builder/file_merging_iterator.hpp @@ -134,6 +134,6 @@ struct file_merging_iterator // } } } -}; // namespace sshash +}; } // namespace sshash \ No newline at end of file From 0ee2aa752e4f176661242a17a73e4dfecf120f7c Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 31 Oct 2025 12:10:28 +0100 Subject: [PATCH 069/112] minor --- include/builder/build_sparse_and_skew_index.cpp | 2 +- include/builder/util.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index 530eaa6..2b35574 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -81,7 +81,7 @@ dictionary_builder::build_sparse_and_skew_index(dictionary Date: Fri, 31 Oct 2025 15:38:57 +0100 Subject: [PATCH 070/112] quiet build --- .../builder/build_sparse_and_skew_index.cpp | 144 ++++++++++-------- include/builder/dictionary_builder.hpp | 51 ++++--- include/skew_index.hpp | 81 ---------- include/sparse_and_skew_index.hpp | 76 ++++++++- 4 files changed, 190 insertions(+), 162 deletions(-) delete mode 100644 include/skew_index.hpp diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index 2b35574..d02fcc9 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -4,15 +4,17 @@ namespace sshash { template -buckets_statistics // -dictionary_builder::build_sparse_and_skew_index(dictionary& d) // +void dictionary_builder::build_sparse_and_skew_index( + dictionary& d) // { const uint64_t num_minimizer_positions = minimizers.num_minimizer_positions(); const uint64_t num_minimizers = minimizers.num_minimizers(); const uint64_t min_size = 1ULL << constants::min_l; const uint64_t num_bits_per_offset = strings_offsets_builder.num_bits_per_offset(); - std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; + if (build_config.verbose) { + std::cout << "num_bits_per_offset = " << num_bits_per_offset << std::endl; + } bits::compact_vector::builder control_codewords_builder; control_codewords_builder.resize(num_minimizers, num_bits_per_offset + 1); @@ -68,15 +70,6 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary buckets; buckets.reserve(num_buckets_larger_than_1_not_in_skew_index + num_buckets_in_skew_index); @@ -119,21 +125,23 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary upper) { - std::cout << " partition_id = " << partition_id - << ": num_kmers belonging to buckets of size > " << lower - << " and <= " << upper << ": " << num_kmers_in_partition[partition_id] - << std::endl; - num_kmers_in_skew_index += num_kmers_in_partition[partition_id]; + while (i == buckets.size() or buckets[i].size() > upper) // + { + if (build_config.verbose) { + std::cout << " partition = " << partition_id + << ": num kmers in buckets of size > " << lower << " and <= " << upper + << ": " << num_kmers_in_partition[partition_id] << std::endl; + num_kmers_in_skew_index += num_kmers_in_partition[partition_id]; + } if (i == buckets.size()) break; @@ -257,17 +271,19 @@ dictionary_builder::build_sparse_and_skew_index(dictionary::build_sparse_and_skew_index(dictionary upper) { - std::cout << " lower = " << lower << "; upper = " << upper - << "; num_bits_per_pos = " << num_bits_per_pos - << "; num_kmers_in_partition = " << kmers.size() << std::endl; + while (i == buckets.size() or buckets[i].size() > upper) // + { + if (build_config.verbose) { + std::cout << " lower = " << lower << "; upper = " << upper + << "; num_bits_per_pos = " << num_bits_per_pos + << "; num_kmers_in_partition = " << kmers.size() << std::endl; + } assert(num_kmers_in_partition[partition_id] == kmers.size()); assert(num_kmers_in_partition[partition_id] == positions_in_bucket.size()); @@ -318,10 +336,12 @@ dictionary_builder::build_sparse_and_skew_index(dictionary& d); + void build_sparse_and_skew_index(dictionary& d); }; } // namespace sshash \ No newline at end of file diff --git a/include/skew_index.hpp b/include/skew_index.hpp deleted file mode 100644 index 01e3382..0000000 --- a/include/skew_index.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#pragma once - -#include "util.hpp" - -namespace sshash { - -template -struct skew_index // -{ - skew_index() { - mphfs.resize(0); - positions.resize(0); - } - - /* Returns the number of kmers in the index. */ - uint64_t print_info() const { - uint64_t num_partitions = mphfs.size(); - uint64_t lower = 1ULL << constants::min_l; - uint64_t upper = 2 * lower; - uint64_t num_kmers_in_skew_index = 0; - for (uint64_t partition_id = 0; partition_id != num_partitions; ++partition_id) { - uint64_t n = mphfs[partition_id].num_keys(); - assert(n == positions[partition_id].size()); - std::cout << "num_kmers belonging to buckets of size > " << lower << " and <= " << upper - << ": " << n << "; "; - std::cout << "bits/kmer = " << static_cast(mphfs[partition_id].num_bits()) / n - << " (mphf) + " << (positions[partition_id].num_bytes() * 8.0) / n - << " (positions)\n"; - num_kmers_in_skew_index += n; - lower = upper; - upper = 2 * lower; - } - return num_kmers_in_skew_index; - } - - uint64_t lookup(const Kmer uint_kmer, uint64_t code) const { - code >>= 2; - uint64_t partition_id = code & 7; - uint64_t begin = code >> 3; - assert(partition_id < mphfs.size()); - auto const& f = mphfs[partition_id]; - auto const& p = positions[partition_id]; - uint64_t pos_in_bucket = p.access(f(uint_kmer)); - uint64_t offset = heavy_load_buckets.access(begin + pos_in_bucket); - return offset; - } - - uint64_t num_bits() const { - uint64_t n = (2 * sizeof(size_t)) * 8; /* for std::vector::size */ - for (uint64_t partition_id = 0; partition_id != mphfs.size(); ++partition_id) { - auto const& f = mphfs[partition_id]; - auto const& p = positions[partition_id]; - n += f.num_bits() + p.num_bytes() * 8; - } - return n + 8 * heavy_load_buckets.num_bytes(); - } - - template - void visit(Visitor& visitor) const { - visit_impl(visitor, *this); - } - - template - void visit(Visitor& visitor) { - visit_impl(visitor, *this); - } - - std::vector> mphfs; - std::vector positions; - bits::compact_vector heavy_load_buckets; - -private: - template - static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.mphfs); - visitor.visit(t.positions); - visitor.visit(t.heavy_load_buckets); - } -}; - -} // namespace sshash diff --git a/include/sparse_and_skew_index.hpp b/include/sparse_and_skew_index.hpp index a186601..d2ede11 100644 --- a/include/sparse_and_skew_index.hpp +++ b/include/sparse_and_skew_index.hpp @@ -1,10 +1,84 @@ #pragma once +#include "util.hpp" #include "minimizers_control_map.hpp" -#include "skew_index.hpp" namespace sshash { +template +struct skew_index // +{ + skew_index() { + mphfs.resize(0); + positions.resize(0); + } + + /* Returns the number of kmers in the index. */ + uint64_t print_info() const { + uint64_t num_partitions = mphfs.size(); + uint64_t lower = 1ULL << constants::min_l; + uint64_t upper = 2 * lower; + uint64_t num_kmers_in_skew_index = 0; + for (uint64_t partition_id = 0; partition_id != num_partitions; ++partition_id) { + uint64_t n = mphfs[partition_id].num_keys(); + assert(n == positions[partition_id].size()); + std::cout << "num_kmers belonging to buckets of size > " << lower << " and <= " << upper + << ": " << n << "; "; + std::cout << "bits/kmer = " << static_cast(mphfs[partition_id].num_bits()) / n + << " (mphf) + " << (positions[partition_id].num_bytes() * 8.0) / n + << " (positions)\n"; + num_kmers_in_skew_index += n; + lower = upper; + upper = 2 * lower; + } + return num_kmers_in_skew_index; + } + + uint64_t lookup(const Kmer uint_kmer, uint64_t code) const { + code >>= 2; + uint64_t partition_id = code & 7; + uint64_t begin = code >> 3; + assert(partition_id < mphfs.size()); + auto const& f = mphfs[partition_id]; + auto const& p = positions[partition_id]; + uint64_t pos_in_bucket = p.access(f(uint_kmer)); + uint64_t offset = heavy_load_buckets.access(begin + pos_in_bucket); + return offset; + } + + uint64_t num_bits() const { + uint64_t n = (2 * sizeof(size_t)) * 8; /* for std::vector::size */ + for (uint64_t partition_id = 0; partition_id != mphfs.size(); ++partition_id) { + auto const& f = mphfs[partition_id]; + auto const& p = positions[partition_id]; + n += f.num_bits() + p.num_bytes() * 8; + } + return n + 8 * heavy_load_buckets.num_bytes(); + } + + template + void visit(Visitor& visitor) const { + visit_impl(visitor, *this); + } + + template + void visit(Visitor& visitor) { + visit_impl(visitor, *this); + } + + std::vector> mphfs; + std::vector positions; + bits::compact_vector heavy_load_buckets; + +private: + template + static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.mphfs); + visitor.visit(t.positions); + visitor.visit(t.heavy_load_buckets); + } +}; + template struct sparse_and_skew_index // { From 70ceef15a503b3452b08ca20ca2dbe089ff8bd7a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 31 Oct 2025 19:12:05 +0100 Subject: [PATCH 071/112] quiet build --- .../builder/build_sparse_and_skew_index.cpp | 3 +- include/builder/parse_file.cpp | 37 +++++++++++-------- include/builder/util.hpp | 32 ++++++++-------- tools/build.cpp | 9 +++-- 4 files changed, 45 insertions(+), 36 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index d02fcc9..8c3f5da 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -252,9 +252,10 @@ void dictionary_builder::build_sparse_and_skew_index( std::cout << " partition = " << partition_id << ": num kmers in buckets of size > " << lower << " and <= " << upper << ": " << num_kmers_in_partition[partition_id] << std::endl; - num_kmers_in_skew_index += num_kmers_in_partition[partition_id]; } + num_kmers_in_skew_index += num_kmers_in_partition[partition_id]; + if (i == buckets.size()) break; lower = upper; diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index f735992..f882e9e 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -125,7 +125,7 @@ void dictionary_builder::parse_file(std::istream& is, throw std::runtime_error("file is malformed"); } - if (strings_offsets_builder.size() % 1'000'000 == 0) { + if (build_config.verbose and strings_offsets_builder.size() % 1'000'000 == 0) { std::cout << "read " << strings_offsets_builder.size() << " sequences, " << num_bases << " bases, " << num_kmers << " kmers" << std::endl; } @@ -160,14 +160,16 @@ void dictionary_builder::parse_file(std::istream& is, } timer.stop(); - print_time(timer.elapsed(), num_kmers, "step 1.1: 'encoding input'"); - std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " << num_kmers - << " kmers" << std::endl; - std::cout << "num_kmers " << num_kmers << std::endl; - std::cout << "cost: 2.0 + " - << static_cast(Kmer::bits_per_char * num_sequences * (k - 1)) / num_kmers - << " [bits/kmer]" << std::endl; + if (build_config.verbose) { + print_time(timer.elapsed(), num_kmers, "step 1.1: 'encoding input'"); + std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " + << num_kmers << " kmers" << std::endl; + std::cout << "num_kmers " << num_kmers << std::endl; + std::cout << "cost: 2.0 + " + << static_cast(Kmer::bits_per_char * num_sequences * (k - 1)) / num_kmers + << " [bits/kmer]" << std::endl; + } /* The parameter m (minimizer length) should be at least @@ -177,7 +179,7 @@ void dictionary_builder::parse_file(std::istream& is, */ const uint64_t s = uint64_t(1) << Kmer::bits_per_char; const uint64_t lower_bound_on_m = std::ceil(std::log(num_bases) / std::log(s)) + 1; - if (m < lower_bound_on_m) { + if (build_config.verbose and m < lower_bound_on_m) { std::cout << "\n--> WARNING: using minimizer length " << m << " but it should be at least ceil(log_" << s << "(" << num_bases << "))+1 = " << lower_bound_on_m << '\n' @@ -197,10 +199,12 @@ void dictionary_builder::parse_file(std::istream& is, nb.per_relative_offset = std::ceil(std::log2(max_len - m + 1)); nb.per_string_id = std::ceil(std::log2(num_sequences)); - std::cout << "max_len " << max_len << std::endl; - std::cout << "num. bits per_absolute_offset " << nb.per_absolute_offset << std::endl; - std::cout << "num. bits per_relative_offset " << nb.per_relative_offset << std::endl; - std::cout << "num. bits per_string_id " << nb.per_string_id << std::endl; + if (build_config.verbose) { + std::cout << "max string length = " << max_len << std::endl; + std::cout << "num bits per_absolute_offset = " << nb.per_absolute_offset << std::endl; + std::cout << "num bits per_relative_offset = " << nb.per_relative_offset << std::endl; + std::cout << "num bits per_string_id = " << nb.per_string_id << std::endl; + } if (nb.per_string_id + nb.per_relative_offset > 64) { throw std::runtime_error("minimizer offset does not fit within 64 bits"); @@ -308,7 +312,10 @@ void dictionary_builder::parse_file(std::istream& is, } timer.stop(); - print_time(timer.elapsed(), num_kmers, "step 1.2: 'computing minimizers tuples'"); + + if (build_config.verbose) { + print_time(timer.elapsed(), num_kmers, "step 1.2: 'computing minimizers tuples'"); + } if (build_config.weighted) { weights_builder.push_weight_interval(weight_value, weight_length); @@ -321,7 +328,7 @@ void dictionary_builder::parse_file(std::string const& filename) { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); - std::cout << "reading file '" << filename << "'..." << std::endl; + if (build_config.verbose) std::cout << "reading file '" << filename << "'..." << std::endl; if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { diff --git a/include/builder/util.hpp b/include/builder/util.hpp index 960e1d2..5f2c115 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -200,8 +200,7 @@ struct minimizers_tuples { , m_num_minimizer_positions(0) , m_num_super_kmers(0) , m_run_identifier(pthash::clock_type::now().time_since_epoch().count()) - , m_num_threads(build_config.num_threads) - , m_tmp_dirname(build_config.tmp_dirname) // + , m_build_config(build_config) // { init(); } @@ -209,14 +208,16 @@ struct minimizers_tuples { void init() { m_num_files_to_merge = 0; } void sort_and_flush(std::vector& buffer) { - parallel_sort(buffer, m_num_threads, + parallel_sort(buffer, m_build_config.num_threads, [](minimizer_tuple const& x, minimizer_tuple const& y) { return (x.minimizer < y.minimizer) or (x.minimizer == y.minimizer and x.pos_in_seq < y.pos_in_seq); }); uint64_t id = m_num_files_to_merge.fetch_add(1); auto tmp_output_filename = get_tmp_output_filename(id); - std::cout << "saving to file '" << tmp_output_filename << "'..." << std::endl; + if (m_build_config.verbose) { + std::cout << "saving to file '" << tmp_output_filename << "'..." << std::endl; + } std::ofstream out(tmp_output_filename.c_str(), std::ofstream::binary); if (!out.is_open()) throw std::runtime_error("cannot open file"); out.write(reinterpret_cast(buffer.data()), @@ -228,7 +229,8 @@ struct minimizers_tuples { std::string get_minimizers_filename() const { assert(m_num_files_to_merge > 0); std::stringstream filename; - filename << m_tmp_dirname << "/sshash.tmp.run_" << m_run_identifier << ".minimizers.bin"; + filename << m_build_config.tmp_dirname << "/sshash.tmp.run_" << m_run_identifier + << ".minimizers.bin"; return filename.str(); } @@ -261,25 +263,25 @@ struct minimizers_tuples { it.has_next(); it.next()) // { auto bucket = it.bucket(); + m_num_minimizers += 1; m_num_minimizer_positions += bucket.size(); m_num_super_kmers += bucket.num_super_kmers(); - ++m_num_minimizers; } input.close(); return; } - std::cout << " == files to merge = " << m_num_files_to_merge << std::endl; - assert(m_num_files_to_merge > 1); - file_merging_iterator fm_iterator(files_name_iterator_begin(), m_num_files_to_merge); - std::cout << "saving tuples to '" << get_minimizers_filename() << "'" << std::endl; std::ofstream out(get_minimizers_filename().c_str()); if (!out.is_open()) throw std::runtime_error("cannot open file"); + if (m_build_config.verbose) { + std::cout << "saving to file '" << get_minimizers_filename() << "'" << std::endl; + } + m_num_minimizers = 0; m_num_minimizer_positions = 0; m_num_super_kmers = 0; @@ -297,7 +299,7 @@ struct minimizers_tuples { out.write(reinterpret_cast(&mt), sizeof(minimizer_tuple)); prev_pos_in_seq = mt.pos_in_seq; ++m_num_super_kmers; - if (m_num_super_kmers % 50000000 == 0) { + if (m_build_config.verbose and m_num_super_kmers % 10'000'000 == 0) { std::cout << "processed " << m_num_super_kmers << " minimizer tuples" << std::endl; } fm_iterator.next(); @@ -325,15 +327,13 @@ struct minimizers_tuples { uint64_t m_num_minimizers; uint64_t m_num_minimizer_positions; uint64_t m_num_super_kmers; - uint64_t m_run_identifier; - uint64_t m_num_threads; - std::string m_tmp_dirname; + build_configuration m_build_config; std::string get_tmp_output_filename(uint64_t id) const { std::stringstream filename; - filename << m_tmp_dirname << "/sshash.tmp.run_" << m_run_identifier << ".minimizers." << id - << ".bin"; + filename << m_build_config.tmp_dirname << "/sshash.tmp.run_" << m_run_identifier + << ".minimizers." << id << ".bin"; return filename.str(); } }; diff --git a/tools/build.cpp b/tools/build.cpp index 6d90f7a..3e70956 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -54,8 +54,6 @@ int build(int argc, char** argv) { auto k = parser.get("k"); auto m = parser.get("m"); - dictionary_type dict; - build_configuration build_config; build_config.k = k; build_config.m = m; @@ -74,10 +72,11 @@ int build(int argc, char** argv) { } if (parser.parsed("t")) build_config.num_threads = parser.get("t"); - build_config.print(); + // build_config.print(); + essentials::logger("building data structure..."); + dictionary_type dict; dict.build(input_filename, build_config); - assert(dict.k() == k); bool check = parser.get("check"); if (check) { @@ -88,12 +87,14 @@ int build(int argc, char** argv) { check_correctness_kmer_iterator(dict); check_correctness_string_iterator(dict); } + bool bench = parser.get("bench"); if (bench) { perf_test_lookup_access(dict); if (dict.weighted()) perf_test_lookup_weight(dict); perf_test_iterator(dict); } + if (parser.parsed("output_filename")) { auto output_filename = parser.get("output_filename"); essentials::logger("saving data structure to disk..."); From 2ae21fcf6cf135e73d6132c2416f0022e698b75d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 2 Nov 2025 01:16:07 +0100 Subject: [PATCH 072/112] refctoring of build steps --- include/builder/compute_minimizer_tuples.cpp | 121 +++++++++ include/builder/dictionary_builder.hpp | 260 ++++++++++--------- include/builder/parse_file.cpp | 143 +--------- src/build.cpp | 1 + 4 files changed, 274 insertions(+), 251 deletions(-) create mode 100644 include/builder/compute_minimizer_tuples.cpp diff --git a/include/builder/compute_minimizer_tuples.cpp b/include/builder/compute_minimizer_tuples.cpp new file mode 100644 index 0000000..91ec162 --- /dev/null +++ b/include/builder/compute_minimizer_tuples.cpp @@ -0,0 +1,121 @@ +#include "dictionary_builder.hpp" +#include "util.hpp" +#include "include/kmer_iterator.hpp" +#include "include/minimizer_iterator.hpp" + +namespace sshash { + +template +void dictionary_builder::compute_minimizer_tuples() // +{ + const uint64_t num_threads = build_config.num_threads; + const uint64_t num_sequences = strings_offsets_builder.size() - 1; + const uint64_t num_sequences_per_thread = (num_sequences + num_threads - 1) / num_threads; + const uint64_t k = build_config.k; + const uint64_t m = build_config.m; + + std::vector threads; + threads.reserve(num_threads); + + for (uint64_t t = 0; t * num_sequences_per_thread < num_sequences; ++t) // + { + threads.emplace_back([&, t] { + std::vector buffer; + const uint64_t buffer_size = (build_config.ram_limit_in_GiB * essentials::GiB) / + (2 * sizeof(minimizer_tuple) * num_threads); + buffer.reserve(buffer_size); + + auto save = [&](minimizer_info mini_info, + uint64_t num_kmers_in_super_kmer) // + { + assert(num_kmers_in_super_kmer <= k - m + 1 /* max num kmers in super-kmer */); + if (!buffer.empty() and // + buffer.back().minimizer == mini_info.minimizer and // + buffer.back().pos_in_seq == mini_info.pos_in_seq and // + buffer.back().pos_in_kmer == mini_info.pos_in_kmer) // + { + buffer.back().num_kmers_in_super_kmer += num_kmers_in_super_kmer; + return; + } + if (buffer.size() == buffer_size) { + minimizers.sort_and_flush(buffer); + buffer.clear(); + } + buffer.emplace_back(mini_info, num_kmers_in_super_kmer); + }; + + const uint64_t index_begin = t * num_sequences_per_thread; + const uint64_t index_end = + std::min(index_begin + num_sequences_per_thread, num_sequences); + + kmer_iterator kmer_it(strings_builder, k); + hasher_type hasher(build_config.seed); + minimizer_iterator minimizer_it(k, m, hasher); + minimizer_iterator_rc minimizer_it_rc(k, m, hasher); + + for (uint64_t i = index_begin; i < index_end; ++i) // + { + const uint64_t begin = strings_offsets_builder[i]; + const uint64_t end = strings_offsets_builder[i + 1]; + const uint64_t sequence_len = end - begin; + assert(sequence_len >= k); + + minimizer_info prev_mini_info; + assert(prev_mini_info.minimizer == constants::invalid_uint64); + uint64_t num_kmers_in_super_kmer = 0; + + kmer_it.at(Kmer::bits_per_char * begin); + minimizer_it.set_position(begin); + minimizer_it_rc.set_position(begin); + + for (uint64_t j = 0; j != sequence_len - k + 1; ++j) { + auto uint_kmer = kmer_it.get(); + auto mini_info = minimizer_it.next(uint_kmer); + assert(mini_info.pos_in_seq < end - m + 1); + assert(mini_info.pos_in_kmer < k - m + 1); + + if (build_config.canonical) { + auto uint_kmer_rc = uint_kmer; + uint_kmer_rc.reverse_complement_inplace(k); + auto mini_info_rc = minimizer_it_rc.next(uint_kmer_rc); + assert(mini_info_rc.pos_in_seq < end - m + 1); + assert(mini_info_rc.pos_in_kmer < k - m + 1); + if (mini_info_rc.minimizer < mini_info.minimizer) { + mini_info = mini_info_rc; + mini_info.pos_in_kmer = k - m - mini_info.pos_in_kmer; + } + } + + mini_info.pos_in_seq = + strings_offsets_builder.encode(mini_info.pos_in_seq, begin, i); + + if (prev_mini_info.minimizer == constants::invalid_uint64) { + prev_mini_info = mini_info; + } + + if (mini_info.minimizer != prev_mini_info.minimizer or + mini_info.pos_in_seq != prev_mini_info.pos_in_seq) // + { + save(prev_mini_info, num_kmers_in_super_kmer); + prev_mini_info = mini_info; + num_kmers_in_super_kmer = 0; + } + + num_kmers_in_super_kmer += 1; + kmer_it.next(); + } + + save(prev_mini_info, num_kmers_in_super_kmer); + } + + /* flush leftover */ + if (!buffer.empty()) minimizers.sort_and_flush(buffer); + }); + } + + for (auto& t : threads) { + if (t.joinable()) t.join(); + } +} + +} // namespace sshash diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index 7db9436..68c124a 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -26,159 +26,115 @@ struct dictionary_builder // d.m_hasher.seed(build_config.seed); std::vector timings; - timings.reserve(6); + timings.reserve(7); + essentials::timer_type timer; + // TODO: json_lines /* - step 1: parse the input file, encode sequences (1.1), and compute minimizer tuples (1.2) + step 1: encode strings */ timer.start(); - parse_file(filename); + encode_strings(filename); d.m_num_kmers = num_kmers; assert(strings_offsets_builder.size() >= 2); d.m_num_strings = strings_offsets_builder.size() - 1; - if (build_config.weighted) { - essentials::timer_type timer; - timer.start(); - weights_builder.build(d.m_weights); - timer.stop(); - if (build_config.verbose) { - print_time(timer.elapsed(), num_kmers, "step 1.3: 'build weights'"); - } - if (build_config.verbose) { - double entropy_weights = weights_builder.print_info(num_kmers); - double avg_bits_per_weight = - static_cast(d.m_weights.num_bits()) / num_kmers; - std::cout << "weights: " << avg_bits_per_weight << " [bits/kmer]" << std::endl; - std::cout << " (" << entropy_weights / avg_bits_per_weight - << "x smaller than the empirical entropy)" << std::endl; - } - } timer.stop(); timings.push_back(timer.elapsed()); - if (build_config.verbose) print_time(timings.back(), num_kmers, "step 1: 'parse file'"); + if (build_config.verbose) { + print_time(timings.back(), num_kmers, "step 1: 'encode strings'"); + } timer.reset(); - /******/ - - /* step 2: merge minimizer tuples and build MPHF ***/ - { - timer.start(); - minimizers.merge(); - timer.stop(); - timings.push_back(timer.elapsed()); - - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 2.1: 'merging minimizers tuples'"); - std::cout << "num_minimizers = " << minimizers.num_minimizers() << std::endl; - std::cout << "num_minimizer_positions = " << minimizers.num_minimizer_positions() - << std::endl; - std::cout << "num_super_kmers = " << minimizers.num_super_kmers() << std::endl; - } - - timer.reset(); + /* + step 1.1: build weights (if dictionary is weighted) + */ + if (build_config.weighted) { timer.start(); - const uint64_t num_minimizers = minimizers.num_minimizers(); - mm::file_source input(minimizers.get_minimizers_filename(), - mm::advice::sequential); - minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); - d.m_ssi.codewords.build(iterator, num_minimizers, build_config); - input.close(); - assert(d.m_ssi.codewords.size() == num_minimizers); + weights_builder.build(d.m_weights); timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 2.2: 'build minimizers mphf'"); + print_time(timings.back(), num_kmers, "step 1.1: 'build weights'"); } - timer.reset(); } - { - if (build_config.verbose) std::cout << "re-sorting minimizer tuples..." << std::endl; + /* + step 2: compute minimizer tuples + */ + timer.start(); + compute_minimizer_tuples(); + timer.stop(); + timings.push_back(timer.elapsed()); + if (build_config.verbose) { + print_time(timings.back(), num_kmers, "step 2: 'compute minimizer tuples'"); + } + timer.reset(); - timer.start(); + /* + step 3: merge minimizer tuples + */ + timer.start(); + minimizers.merge(); + timer.stop(); + timings.push_back(timer.elapsed()); + if (build_config.verbose) { + print_time(timings.back(), num_kmers, "step 3: 'merging minimizers tuples'"); + std::cout << "num_minimizers = " << minimizers.num_minimizers() << std::endl; + std::cout << "num_minimizer_positions = " << minimizers.num_minimizer_positions() + << std::endl; + std::cout << "num_super_kmers = " << minimizers.num_super_kmers() << std::endl; + } + timer.reset(); - std::string filename = minimizers.get_minimizers_filename(); - std::ifstream input(filename, std::ifstream::binary); - - auto const& f = d.m_ssi.codewords.mphf; - const uint64_t num_threads = build_config.num_threads; - const uint64_t num_files_to_merge = minimizers.num_files_to_merge(); - - minimizers.init(); - - const uint64_t num_super_kmers = minimizers.num_super_kmers(); - const uint64_t buffer_size = num_files_to_merge == 1 - ? num_super_kmers - : ((build_config.ram_limit_in_GiB * essentials::GiB) / - (2 * sizeof(minimizer_tuple))); - const uint64_t num_blocks = (num_super_kmers + buffer_size - 1) / buffer_size; - assert(num_super_kmers > (num_blocks - 1) * buffer_size); - - std::vector threads; - threads.reserve(num_threads); - - std::vector buffer; - for (uint64_t i = 0; i != num_blocks; ++i) { - const uint64_t n = (i == num_blocks - 1) - ? num_super_kmers - (num_blocks - 1) * buffer_size - : buffer_size; - buffer.resize(n); - input.read(reinterpret_cast(buffer.data()), - buffer.size() * sizeof(minimizer_tuple)); - const uint64_t chunk_size = (n + num_threads - 1) / num_threads; - for (uint64_t t = 0; t * chunk_size < n; ++t) { - uint64_t begin = t * chunk_size; - uint64_t end = std::min(n, begin + chunk_size); - threads.emplace_back([begin, end, &buffer, &f]() { - for (uint64_t i = begin; i < end; ++i) { - buffer[i].minimizer = f(buffer[i].minimizer); - } - }); - } - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - threads.clear(); - minimizers.sort_and_flush(buffer); - } - assert(buffer.empty()); + /* + step 4: build mphf + */ + timer.start(); + build_mphf(d); + timer.stop(); + timings.push_back(timer.elapsed()); + if (build_config.verbose) { print_time(timings.back(), num_kmers, "step 4: 'build mphf'"); } + timer.reset(); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, - "step 2.3: 'replacing minimizer values with MPHF hashes'"); - } - timer.reset(); + /* + step 5: hash minimizers + */ + timer.start(); + hash_minimizers(d); + timer.stop(); + timings.push_back(timer.elapsed()); + if (build_config.verbose) { + print_time(timings.back(), num_kmers, + "step 5: 'replacing minimizer values with MPHF hashes'"); + } + timer.reset(); - timer.start(); - minimizers.merge(); - input.close(); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 2.4: 'merging minimizers tuples '"); - } - timer.reset(); + /* + step 6: merge minimizer tuples + */ + timer.start(); + minimizers.merge(); + timer.stop(); + timings.push_back(timer.elapsed()); + if (build_config.verbose) { + print_time(timings.back(), num_kmers, "step 6: 'merging minimizers tuples '"); } - /******/ + timer.reset(); - /* step 3: build sparse and skew index ***/ + /* + step 7: build sparse and skew index + */ timer.start(); build_sparse_and_skew_index(d); assert(strings_offsets_builder.size() == 0); timer.stop(); timings.push_back(timer.elapsed()); if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 3: 'build sparse and skew index'"); + print_time(timings.back(), num_kmers, "step 7: 'build sparse and skew index'"); } timer.reset(); - /******/ - assert(timings.size() == 6); double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); if (build_config.verbose) { print_time(total_time, num_kmers, "total_time"); @@ -195,10 +151,72 @@ struct dictionary_builder // bits::bit_vector::builder strings_builder; weights::builder weights_builder; + essentials::json_lines build_stats; + private: - void parse_file(std::string const& filename); - void parse_file(std::istream& is, const input_file_t fmt); + void encode_strings(std::string const& filename); + void encode_strings(std::istream& is, const input_file_t fmt); + void compute_minimizer_tuples(); void build_sparse_and_skew_index(dictionary& d); + + void build_mphf(dictionary& d) { + const uint64_t num_minimizers = minimizers.num_minimizers(); + mm::file_source input(minimizers.get_minimizers_filename(), + mm::advice::sequential); + minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); + d.m_ssi.codewords.build(iterator, num_minimizers, build_config); + input.close(); + assert(d.m_ssi.codewords.size() == num_minimizers); + } + + void hash_minimizers(dictionary& d) { + std::string filename = minimizers.get_minimizers_filename(); + std::ifstream input(filename, std::ifstream::binary); + + auto const& f = d.m_ssi.codewords.mphf; + const uint64_t num_threads = build_config.num_threads; + const uint64_t num_files_to_merge = minimizers.num_files_to_merge(); + + minimizers.init(); + + const uint64_t num_super_kmers = minimizers.num_super_kmers(); + const uint64_t buffer_size = num_files_to_merge == 1 + ? num_super_kmers + : ((build_config.ram_limit_in_GiB * essentials::GiB) / + (2 * sizeof(minimizer_tuple))); + const uint64_t num_blocks = (num_super_kmers + buffer_size - 1) / buffer_size; + assert(num_super_kmers > (num_blocks - 1) * buffer_size); + + std::vector threads; + threads.reserve(num_threads); + + std::vector buffer; + for (uint64_t i = 0; i != num_blocks; ++i) { + const uint64_t n = (i == num_blocks - 1) + ? num_super_kmers - (num_blocks - 1) * buffer_size + : buffer_size; + buffer.resize(n); + input.read(reinterpret_cast(buffer.data()), + buffer.size() * sizeof(minimizer_tuple)); + const uint64_t chunk_size = (n + num_threads - 1) / num_threads; + for (uint64_t t = 0; t * chunk_size < n; ++t) { + uint64_t begin = t * chunk_size; + uint64_t end = std::min(n, begin + chunk_size); + threads.emplace_back([begin, end, &buffer, &f]() { + for (uint64_t i = begin; i < end; ++i) { + buffer[i].minimizer = f(buffer[i].minimizer); + } + }); + } + for (auto& t : threads) { + if (t.joinable()) t.join(); + } + threads.clear(); + minimizers.sort_and_flush(buffer); + } + + input.close(); + } }; } // namespace sshash \ No newline at end of file diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index f882e9e..6eab94d 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -1,13 +1,12 @@ #include "dictionary_builder.hpp" #include "util.hpp" #include "external/gz/zip_stream.hpp" -#include "include/minimizer_iterator.hpp" namespace sshash { template -void dictionary_builder::parse_file(std::istream& is, - const input_file_t fmt) // +void dictionary_builder::encode_strings(std::istream& is, + const input_file_t fmt) // { essentials::timer_type timer; timer.start(); @@ -34,10 +33,6 @@ void dictionary_builder::parse_file(std::istream& is, std::string sequence; uint64_t num_bases = 0; uint64_t max_len = 0; - - hasher_type hasher(build_config.seed); - minimizer_iterator minimizer_it(k, m, hasher); - minimizer_iterator_rc minimizer_it_rc(k, m, hasher); uint64_t seq_len = 0; weights_builder.init(); @@ -150,7 +145,6 @@ void dictionary_builder::parse_file(std::istream& is, strings_offsets_builder.push_back(strings_builder.num_bits() / Kmer::bits_per_char); assert(strings_offsets_builder.front() == 0); assert(strings_offsets_builder.size() >= 2); - const uint64_t num_sequences = strings_offsets_builder.size() - 1; /* Push a final sentinel (dummy) value to avoid bounds' checking in kmer_iterator::fill_buff(). */ @@ -161,6 +155,8 @@ void dictionary_builder::parse_file(std::istream& is, timer.stop(); + const uint64_t num_sequences = strings_offsets_builder.size() - 1; + if (build_config.verbose) { print_time(timer.elapsed(), num_kmers, "step 1.1: 'encoding input'"); std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " @@ -186,13 +182,10 @@ void dictionary_builder::parse_file(std::istream& is, << std::endl; } - timer.reset(); - timer.start(); - - const uint64_t num_threads = build_config.num_threads; - const uint64_t num_sequences_per_thread = (num_sequences + num_threads - 1) / num_threads; - std::vector threads; - threads.reserve(num_threads); + if (build_config.weighted) { + weights_builder.push_weight_interval(weight_value, weight_length); + weights_builder.finalize(num_kmers); + } num_bits nb; nb.per_absolute_offset = std::ceil(std::log2(strings_offsets_builder.back())); @@ -211,120 +204,10 @@ void dictionary_builder::parse_file(std::istream& is, } strings_offsets_builder.set_num_bits(nb); - - for (uint64_t t = 0; t * num_sequences_per_thread < num_sequences; ++t) // - { - threads.emplace_back([&, t] { - std::vector buffer; - const uint64_t buffer_size = (build_config.ram_limit_in_GiB * essentials::GiB) / - (2 * sizeof(minimizer_tuple) * num_threads); - buffer.reserve(buffer_size); - - auto save = [&](minimizer_info mini_info, - uint64_t num_kmers_in_super_kmer) // - { - assert(num_kmers_in_super_kmer <= max_num_kmers_in_super_kmer); - if (!buffer.empty() and // - buffer.back().minimizer == mini_info.minimizer and // - buffer.back().pos_in_seq == mini_info.pos_in_seq and // - buffer.back().pos_in_kmer == mini_info.pos_in_kmer) // - { - buffer.back().num_kmers_in_super_kmer += num_kmers_in_super_kmer; - return; - } - if (buffer.size() == buffer_size) { - minimizers.sort_and_flush(buffer); - buffer.clear(); - } - buffer.emplace_back(mini_info, num_kmers_in_super_kmer); - }; - - const uint64_t index_begin = t * num_sequences_per_thread; - const uint64_t index_end = - std::min(index_begin + num_sequences_per_thread, num_sequences); - - kmer_iterator kmer_it(strings_builder, k); - minimizer_iterator minimizer_it(k, m, hasher); - minimizer_iterator_rc minimizer_it_rc(k, m, hasher); - - for (uint64_t i = index_begin; i < index_end; ++i) // - { - const uint64_t begin = strings_offsets_builder[i]; - const uint64_t end = strings_offsets_builder[i + 1]; - const uint64_t sequence_len = end - begin; - assert(sequence_len >= k); - - minimizer_info prev_mini_info; - assert(prev_mini_info.minimizer == constants::invalid_uint64); - uint64_t num_kmers_in_super_kmer = 0; - - kmer_it.at(Kmer::bits_per_char * begin); - minimizer_it.set_position(begin); - minimizer_it_rc.set_position(begin); - - for (uint64_t j = 0; j != sequence_len - k + 1; ++j) { - auto uint_kmer = kmer_it.get(); - auto mini_info = minimizer_it.next(uint_kmer); - assert(mini_info.pos_in_seq < end - m + 1); - assert(mini_info.pos_in_kmer < k - m + 1); - - if (build_config.canonical) { - auto uint_kmer_rc = uint_kmer; - uint_kmer_rc.reverse_complement_inplace(k); - auto mini_info_rc = minimizer_it_rc.next(uint_kmer_rc); - assert(mini_info_rc.pos_in_seq < end - m + 1); - assert(mini_info_rc.pos_in_kmer < k - m + 1); - if (mini_info_rc.minimizer < mini_info.minimizer) { - mini_info = mini_info_rc; - mini_info.pos_in_kmer = k - m - mini_info.pos_in_kmer; - } - } - - mini_info.pos_in_seq = - strings_offsets_builder.encode(mini_info.pos_in_seq, begin, i); - - if (prev_mini_info.minimizer == constants::invalid_uint64) { - prev_mini_info = mini_info; - } - - if (mini_info.minimizer != prev_mini_info.minimizer or - mini_info.pos_in_seq != prev_mini_info.pos_in_seq) // - { - save(prev_mini_info, num_kmers_in_super_kmer); - prev_mini_info = mini_info; - num_kmers_in_super_kmer = 0; - } - - num_kmers_in_super_kmer += 1; - kmer_it.next(); - } - - save(prev_mini_info, num_kmers_in_super_kmer); - } - - /* flush leftover */ - if (!buffer.empty()) minimizers.sort_and_flush(buffer); - }); - } - - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - - timer.stop(); - - if (build_config.verbose) { - print_time(timer.elapsed(), num_kmers, "step 1.2: 'computing minimizers tuples'"); - } - - if (build_config.weighted) { - weights_builder.push_weight_interval(weight_value, weight_length); - weights_builder.finalize(num_kmers); - } } template -void dictionary_builder::parse_file(std::string const& filename) // +void dictionary_builder::encode_strings(std::string const& filename) // { std::ifstream is(filename.c_str()); if (!is.good()) throw std::runtime_error("error in opening the file '" + filename + "'"); @@ -332,15 +215,15 @@ void dictionary_builder::parse_file(std::string const& filename) if (util::ends_with(filename, ".gz")) { zip_istream zis(is); if (util::ends_with(filename, ".cf_seg.gz")) { - parse_file(zis, input_file_t::cf_seg); + encode_strings(zis, input_file_t::cf_seg); } else { - parse_file(zis, input_file_t::fasta); + encode_strings(zis, input_file_t::fasta); } } else { if (util::ends_with(filename, ".cf_seg")) { - parse_file(is, input_file_t::cf_seg); + encode_strings(is, input_file_t::cf_seg); } else { - parse_file(is, input_file_t::fasta); + encode_strings(is, input_file_t::fasta); } } is.close(); diff --git a/src/build.cpp b/src/build.cpp index 5180e07..4962bc1 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -2,6 +2,7 @@ #include "include/builder/parse_file.cpp" #include "include/builder/build_sparse_and_skew_index.cpp" +#include "include/builder/compute_minimizer_tuples.cpp" namespace sshash { From 007ca312b0d19f542ddebf70f68b3cef18e0835b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 3 Nov 2025 14:46:33 +0100 Subject: [PATCH 073/112] json stats and refactored dictionary_builder --- include/builder/dictionary_builder.hpp | 142 ++++++++----------------- include/builder/parse_file.cpp | 46 ++++++-- include/builder/util.hpp | 40 ------- script/build.sh | 72 +++++++------ 4 files changed, 123 insertions(+), 177 deletions(-) diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index 68c124a..cc419da 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -14,7 +14,7 @@ template struct dictionary_builder // { dictionary_builder(build_configuration const& build_config) - : build_config(build_config), num_kmers(0), minimizers(build_config) {} + : build_config(build_config), num_kmers(0), minimizers(build_config), total_time_musec(0) {} void build(dictionary& d, std::string const& filename) // { @@ -25,123 +25,54 @@ struct dictionary_builder // d.m_canonical = build_config.canonical; d.m_hasher.seed(build_config.seed); - std::vector timings; - timings.reserve(7); + build_stats.add("input_filename", filename.c_str()); + build_stats.add("k", d.m_k); + build_stats.add("m", d.m_m); + build_stats.add("canonical", d.m_canonical ? "true" : "false"); + build_stats.add("seed", build_config.seed); - essentials::timer_type timer; - // TODO: json_lines + total_time_musec = 0; - /* - step 1: encode strings - */ - timer.start(); - encode_strings(filename); - d.m_num_kmers = num_kmers; - assert(strings_offsets_builder.size() >= 2); - d.m_num_strings = strings_offsets_builder.size() - 1; - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 1: 'encode strings'"); - } - timer.reset(); + do_step("step 1: encode strings", [&]() { + encode_strings(filename); + d.m_num_kmers = num_kmers; + assert(strings_offsets_builder.size() >= 2); + d.m_num_strings = strings_offsets_builder.size() - 1; + }); - /* - step 1.1: build weights (if dictionary is weighted) - */ if (build_config.weighted) { - timer.start(); - weights_builder.build(d.m_weights); - timer.stop(); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 1.1: 'build weights'"); - } - timer.reset(); + do_step("step 1.1: build weights", [&]() { weights_builder.build(d.m_weights); }); } - /* - step 2: compute minimizer tuples - */ - timer.start(); - compute_minimizer_tuples(); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 2: 'compute minimizer tuples'"); - } - timer.reset(); + do_step("step 2: compute minimizer tuples", [&]() { compute_minimizer_tuples(); }); - /* - step 3: merge minimizer tuples - */ - timer.start(); - minimizers.merge(); - timer.stop(); - timings.push_back(timer.elapsed()); + do_step("step 3: merging minimizer tuples", [&]() { minimizers.merge(); }); if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 3: 'merging minimizers tuples'"); std::cout << "num_minimizers = " << minimizers.num_minimizers() << std::endl; std::cout << "num_minimizer_positions = " << minimizers.num_minimizer_positions() << std::endl; std::cout << "num_super_kmers = " << minimizers.num_super_kmers() << std::endl; } - timer.reset(); - /* - step 4: build mphf - */ - timer.start(); - build_mphf(d); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { print_time(timings.back(), num_kmers, "step 4: 'build mphf'"); } - timer.reset(); + do_step("step 4: build mphf", [&]() { build_mphf(d); }); - /* - step 5: hash minimizers - */ - timer.start(); - hash_minimizers(d); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, - "step 5: 'replacing minimizer values with MPHF hashes'"); - } - timer.reset(); + do_step("step 5: replacing minimizer values with MPHF hashes", + [&]() { hash_minimizers(d); }); - /* - step 6: merge minimizer tuples - */ - timer.start(); - minimizers.merge(); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 6: 'merging minimizers tuples '"); - } - timer.reset(); + do_step("step 6: merging minimizers tuples", [&]() { minimizers.merge(); }); - /* - step 7: build sparse and skew index - */ - timer.start(); - build_sparse_and_skew_index(d); - assert(strings_offsets_builder.size() == 0); - timer.stop(); - timings.push_back(timer.elapsed()); - if (build_config.verbose) { - print_time(timings.back(), num_kmers, "step 7: 'build sparse and skew index'"); - } - timer.reset(); + do_step("step 7: build sparse and skew index", [&]() { + build_sparse_and_skew_index(d); + minimizers.remove_tmp_file(); + assert(strings_offsets_builder.size() == 0); + }); - double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); if (build_config.verbose) { - print_time(total_time, num_kmers, "total_time"); + print_time(total_time_musec, "total time"); d.print_space_breakdown(); } - minimizers.remove_tmp_file(); + build_stats.print(); } build_configuration build_config; @@ -151,9 +82,28 @@ struct dictionary_builder // bits::bit_vector::builder strings_builder; weights::builder weights_builder; + essentials::timer_type timer; essentials::json_lines build_stats; + uint64_t total_time_musec; private: + void print_time(double time_in_musec, std::string const& message) { + std::cout << "=== " << message << " " << time_in_musec / 1'000'000 << " [sec] (" + << (time_in_musec * 1000) / num_kmers << " [ns/kmer])" << std::endl; + } + + template + void do_step(std::string const& step, Callback f) { + timer.start(); + f(); + timer.stop(); + uint64_t step_elapsed_time_musec = timer.elapsed(); + total_time_musec += step_elapsed_time_musec; + if (build_config.verbose) print_time(step_elapsed_time_musec, step); + build_stats.add(step, step_elapsed_time_musec); + timer.reset(); + } + void encode_strings(std::string const& filename); void encode_strings(std::istream& is, const input_file_t fmt); void compute_minimizer_tuples(); diff --git a/include/builder/parse_file.cpp b/include/builder/parse_file.cpp index 6eab94d..21e5e07 100644 --- a/include/builder/parse_file.cpp +++ b/include/builder/parse_file.cpp @@ -2,15 +2,50 @@ #include "util.hpp" #include "external/gz/zip_stream.hpp" +#if defined(__AVX2__) +#include +#include +#endif + namespace sshash { +namespace util { + +#if defined(__AVX2__) +/* + This function takes 32 bytes and packs the two bits + in positions 1 and 2 (from right) of each byte into + a single 64-bit word. + + This works with the map: + A -> 00; C -> 01; G -> 11; T -> 10. +*/ +inline uint64_t pack2bits_shift1(__m256i v) { + // shift >> 1, then mask by 3 to isolate the relevant bits + __m256i shifted = _mm256_srli_epi16(v, 1); + __m256i values = _mm256_and_si256(shifted, _mm256_set1_epi8(3)); + + // collect bit-0 plane + __m256i bit0 = _mm256_slli_epi16(values, 7); + uint32_t mask0 = _mm256_movemask_epi8(bit0); + + // collect bit-1 plane + __m256i bit1 = _mm256_slli_epi16(values, 6); + uint32_t mask1 = _mm256_movemask_epi8(bit1); + + // interleave into the 64-bit result + uint64_t even = _pdep_u64(mask0, 0x5555555555555555ULL); // 010101... + uint64_t odd = _pdep_u64(mask1, 0xAAAAAAAAAAAAAAAAULL); // 101010... + return even | odd; +} +#endif + +} // namespace util + template void dictionary_builder::encode_strings(std::istream& is, const input_file_t fmt) // { - essentials::timer_type timer; - timer.start(); - const uint64_t k = build_config.k; const uint64_t m = build_config.m; assert(k > 0 and k >= m); @@ -132,7 +167,7 @@ void dictionary_builder::encode_strings(std::istream& is, /* process 32 bytes at a time */ for (; i + 32 <= n; i += 32) { __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(&sequence[i])); - uint64_t word = pack2bits_shift1(v); + uint64_t word = util::pack2bits_shift1(v); strings_builder.append_bits(word, 64); } #endif @@ -153,12 +188,9 @@ void dictionary_builder::encode_strings(std::istream& is, strings_builder.append_bits(0, 64); } - timer.stop(); - const uint64_t num_sequences = strings_offsets_builder.size() - 1; if (build_config.verbose) { - print_time(timer.elapsed(), num_kmers, "step 1.1: 'encoding input'"); std::cout << "read " << num_sequences << " sequences, " << num_bases << " bases, " << num_kmers << " kmers" << std::endl; std::cout << "num_kmers " << num_kmers << std::endl; diff --git a/include/builder/util.hpp b/include/builder/util.hpp index 5f2c115..e8d311a 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -3,22 +3,11 @@ #include #include -#if defined(__AVX2__) -#include -#include -#endif - #include "file_merging_iterator.hpp" #include "parallel_sort.hpp" namespace sshash { -[[maybe_unused]] static void print_time(double time, uint64_t num_kmers, - std::string const& message) { - std::cout << "=== " << message << " " << time / 1000000 << " [sec] (" - << (time * 1000) / num_kmers << " [ns/kmer])" << std::endl; -} - struct parse_runtime_error : public std::runtime_error { parse_runtime_error() : std::runtime_error("did you provide an input file with weights?") {} }; @@ -30,35 +19,6 @@ struct parse_runtime_error : public std::runtime_error { } } -#if defined(__AVX2__) -/* - This function takes 32 bytes and packs the two bits - in positions 1 and 2 (from right) of each byte into - a single 64-bit word. - - This works with the map: - A -> 00; C -> 01; G -> 11; T -> 10. -*/ -inline uint64_t pack2bits_shift1(__m256i v) { - // shift >> 1, then mask by 3 to isolate the relevant bits - __m256i shifted = _mm256_srli_epi16(v, 1); - __m256i values = _mm256_and_si256(shifted, _mm256_set1_epi8(3)); - - // collect bit-0 plane - __m256i bit0 = _mm256_slli_epi16(values, 7); - uint32_t mask0 = _mm256_movemask_epi8(bit0); - - // collect bit-1 plane - __m256i bit1 = _mm256_slli_epi16(values, 6); - uint32_t mask1 = _mm256_movemask_epi8(bit1); - - // interleave into the 64-bit result - uint64_t even = _pdep_u64(mask0, 0x5555555555555555ULL); // 010101... - uint64_t odd = _pdep_u64(mask1, 0xAAAAAAAAAAAAAAAAULL); // 101010... - return even | odd; -} -#endif - typedef uint8_t num_kmers_in_super_kmer_uint_type; #pragma pack(push, 2) diff --git a/script/build.sh b/script/build.sh index ed8ff44..b874096 100644 --- a/script/build.sh +++ b/script/build.sh @@ -12,44 +12,48 @@ mkdir $2 prefix=/mnt/hd2/pibiri/DNA -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log - -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json + +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log - -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json + +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From c31d22f102d0892b5ca90d76b389ee5c0e112d2d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 3 Nov 2025 15:12:05 +0100 Subject: [PATCH 074/112] minor --- include/builder/util.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/builder/util.hpp b/include/builder/util.hpp index e8d311a..d58ee58 100644 --- a/include/builder/util.hpp +++ b/include/builder/util.hpp @@ -259,7 +259,7 @@ struct minimizers_tuples { out.write(reinterpret_cast(&mt), sizeof(minimizer_tuple)); prev_pos_in_seq = mt.pos_in_seq; ++m_num_super_kmers; - if (m_build_config.verbose and m_num_super_kmers % 10'000'000 == 0) { + if (m_build_config.verbose and m_num_super_kmers % 100'000'000 == 0) { std::cout << "processed " << m_num_super_kmers << " minimizer tuples" << std::endl; } fm_iterator.next(); From e275d514467b1b04c3fab1cae0bcb037856ecbdd Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 3 Nov 2025 15:37:26 +0100 Subject: [PATCH 075/112] prefetching experiment: a little gain --- include/spectrum_preserving_string_set.hpp | 23 +++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 7e06c43..aae79ce 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -60,14 +60,31 @@ struct spectrum_preserving_string_set // } } + typename Offsets::decoded_offset next_p; + if (size > 1) { + ++it; + next_p = strings_offsets.decode(*it); + __builtin_prefetch( + &(strings.data()[(Kmer::bits_per_char * (next_p.absolute_offset - (k - m))) / 64]), + 0, 3); + } + lookup_result res; if (_lookup_regular(res, p, kmer, mini_info)) return res; + p = next_p; + for (uint64_t i = 1; i != size; ++i) { - ++it; - minimizer_offset = *it; - p = strings_offsets.decode(minimizer_offset); + if (i + 1 < size) { + ++it; + next_p = strings_offsets.decode(*it); + __builtin_prefetch( + &(strings + .data()[(Kmer::bits_per_char * (next_p.absolute_offset - (k - m))) / 64]), + 0, 3); + } if (_lookup_regular(res, p, kmer, mini_info)) return res; + p = next_p; } return lookup_result(); From c41bdb83c2b9bd57afc588051ff23638b1df5ea7 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 3 Nov 2025 16:31:20 +0100 Subject: [PATCH 076/112] json stats for perf benchmark --- tools/build.cpp | 8 -------- tools/perf.hpp | 26 ++++++++++++++++---------- tools/sshash.cpp | 14 +++++++++++--- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/tools/build.cpp b/tools/build.cpp index 3e70956..f0dab7e 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -45,7 +45,6 @@ int build(int argc, char** argv) { parser.add("weighted", "Also store the weights in compressed format.", "--weighted", false, true); parser.add("check", "Check correctness after construction.", "--check", false, true); - parser.add("bench", "Run performance benchmark after construction.", "--bench", false, true); parser.add("verbose", "Verbose output during construction.", "--verbose", false, true); if (!parser.parse()) return 0; @@ -88,13 +87,6 @@ int build(int argc, char** argv) { check_correctness_string_iterator(dict); } - bool bench = parser.get("bench"); - if (bench) { - perf_test_lookup_access(dict); - if (dict.weighted()) perf_test_lookup_weight(dict); - perf_test_iterator(dict); - } - if (parser.parsed("output_filename")) { auto output_filename = parser.get("output_filename"); essentials::logger("saving data structure to disk..."); diff --git a/tools/perf.hpp b/tools/perf.hpp index 74bcd65..b86eff9 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -7,7 +7,7 @@ using timer_type = essentials::timer -void perf_test_iterator(Dict const& dict) { +void perf_test_iterator(Dict const& dict, essentials::json_lines& perf_stats) { perf::timer_type t; t.start(); auto it = dict.begin(); @@ -19,12 +19,13 @@ void perf_test_iterator(Dict const& dict) { } t.stop(); double avg_nanosec = t.elapsed() / n; - std::cout << "iterator: avg_nanosec_per_kmer " << avg_nanosec << std::endl; + std::cout << "iterator (avg_nanosec_per_kmer) = " << avg_nanosec << std::endl; + perf_stats.add("iterator (avg_nanosec_per_kmer)", avg_nanosec); } // template // void perf_test_lookup_by_list_size(Dict const& dict) { -// constexpr uint64_t num_queries = 1000000; +// constexpr uint64_t num_queries = 1'000'000; // constexpr uint64_t runs = 5; // const uint64_t k = dict.k(); @@ -93,7 +94,7 @@ void perf_test_iterator(Dict const& dict) { // } template -void perf_test_lookup_access(Dict const& dict) // +void perf_test_lookup_access(Dict const& dict, essentials::json_lines& perf_stats) // { using kmer_t = typename Dict::kmer_type; constexpr uint64_t num_queries = 1'000'000; @@ -132,7 +133,8 @@ void perf_test_lookup_access(Dict const& dict) // } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; + std::cout << "positive lookup (avg_nanosec_per_kmer) = " << nanosec_per_lookup << std::endl; + perf_stats.add("positive lookup (avg_nanosec_per_kmer)", nanosec_per_lookup); // std::vector lookup_queries_uint; // lookup_queries_uint.reserve(num_queries); @@ -246,7 +248,8 @@ void perf_test_lookup_access(Dict const& dict) // } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_negative_lookup " << nanosec_per_lookup << std::endl; + std::cout << "negative lookup (avg_nanosec_per_kmer) " << nanosec_per_lookup << std::endl; + perf_stats.add("negative lookup (avg_nanosec_per_kmer)", nanosec_per_lookup); } { @@ -264,13 +267,14 @@ void perf_test_lookup_access(Dict const& dict) // } t.stop(); double nanosec_per_access = t.elapsed() / static_cast(runs * access_queries.size()); - std::cout << "avg_nanosec_per_access " << nanosec_per_access << std::endl; + std::cout << "access (avg_nanosec_per_kmer) = " << nanosec_per_access << std::endl; + perf_stats.add("access (avg_nanosec_per_kmer)", nanosec_per_access); } } // namespace sshash template -void perf_test_lookup_weight(Dict const& dict) // +void perf_test_lookup_weight(Dict const& dict, essentials::json_lines& perf_stats) // { using kmer_t = typename Dict::kmer_type; @@ -279,7 +283,7 @@ void perf_test_lookup_weight(Dict const& dict) // return; } - constexpr uint64_t num_queries = 1000000; + constexpr uint64_t num_queries = 1'000'000; constexpr uint64_t runs = 5; essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, essentials::get_random_seed()); @@ -312,7 +316,9 @@ void perf_test_lookup_weight(Dict const& dict) // } t.stop(); double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - std::cout << "avg_nanosec_per_positive_lookup_with_weight " << nanosec_per_lookup << std::endl; + std::cout << "positive lookup + weight (avg_nanosec_per_kmer) = " << nanosec_per_lookup + << std::endl; + perf_stats.add("positive lookup + weight (avg_nanosec_per_kmer)", nanosec_per_lookup); } } // namespace sshash \ No newline at end of file diff --git a/tools/sshash.cpp b/tools/sshash.cpp index 8b424db..e8e83e4 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -43,11 +43,19 @@ int bench(int argc, char** argv) { dictionary_type dict; load_dictionary(dict, index_filename, verbose); + essentials::json_lines perf_stats; + perf_stats.add("index_filename", index_filename.c_str()); + perf_stats.add("k", dict.k()); + perf_stats.add("m", dict.m()); + perf_stats.add("canonical", dict.canonical() ? "true" : "false"); + // perf_test_lookup_by_list_size(dict); - perf_test_lookup_access(dict); - if (dict.weighted()) perf_test_lookup_weight(dict); - perf_test_iterator(dict); + perf_test_lookup_access(dict, perf_stats); + if (dict.weighted()) perf_test_lookup_weight(dict, perf_stats); + perf_test_iterator(dict, perf_stats); + + perf_stats.print(); return 0; } From 2efb5d427e7173d2f1ef1180d463919870bcdcb0 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 3 Nov 2025 22:24:47 +0100 Subject: [PATCH 077/112] prefetching helps indeed random lookup --- include/spectrum_preserving_string_set.hpp | 47 +++++++++------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index aae79ce..82bbdf3 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -34,13 +34,28 @@ struct spectrum_preserving_string_set // const uint64_t size = it.size(); assert(size > 0); - uint64_t minimizer_offset = *it; - auto p = strings_offsets.decode(minimizer_offset); + static thread_local // + std::array + v; + + { + /* prefetch all memory locations */ + uint64_t const* addr = strings.data().data(); + for (uint64_t i = 0; i != size; ++i, ++it) { + uint64_t minimizer_offset = *it; + auto p = strings_offsets.decode(minimizer_offset); + __builtin_prefetch( + addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // + 0, 3 // + ); + v[i] = p; + } + } { /* check minimizer first */ uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, Kmer::bits_per_char * p.absolute_offset)); + util::read_kmer_at(strings, m, Kmer::bits_per_char * v[0].absolute_offset)); if (read_mmer != mini_info.minimizer) // { /* @@ -60,31 +75,9 @@ struct spectrum_preserving_string_set // } } - typename Offsets::decoded_offset next_p; - if (size > 1) { - ++it; - next_p = strings_offsets.decode(*it); - __builtin_prefetch( - &(strings.data()[(Kmer::bits_per_char * (next_p.absolute_offset - (k - m))) / 64]), - 0, 3); - } - lookup_result res; - if (_lookup_regular(res, p, kmer, mini_info)) return res; - - p = next_p; - - for (uint64_t i = 1; i != size; ++i) { - if (i + 1 < size) { - ++it; - next_p = strings_offsets.decode(*it); - __builtin_prefetch( - &(strings - .data()[(Kmer::bits_per_char * (next_p.absolute_offset - (k - m))) / 64]), - 0, 3); - } - if (_lookup_regular(res, p, kmer, mini_info)) return res; - p = next_p; + for (uint64_t i = 0; i != size; ++i) { + if (_lookup_regular(res, v[i], kmer, mini_info)) return res; } return lookup_result(); From 7530305fddadf8bf30102bf4cabbba4a12ecbd5b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 4 Nov 2025 11:37:19 +0100 Subject: [PATCH 078/112] prefetching also for canonical lookup --- include/buckets_statistics.hpp | 8 +-- include/builder/dictionary_builder.hpp | 19 +++--- include/spectrum_preserving_string_set.hpp | 77 ++++++++++++---------- 3 files changed, 57 insertions(+), 47 deletions(-) diff --git a/include/buckets_statistics.hpp b/include/buckets_statistics.hpp index e0ba5e8..05e7a3e 100644 --- a/include/buckets_statistics.hpp +++ b/include/buckets_statistics.hpp @@ -51,7 +51,7 @@ struct buckets_statistics { uint64_t max_bucket_size() const { return m_max_bucket_size; } void print_full() const { - std::cout << " === bucket statistics (full) === \n"; + std::cout << "=== bucket statistics (full) === \n"; for (uint64_t bucket_size = 1, prev_bucket_size = 0, prev_kmers_in_buckets = 0, kmers_in_buckets = 0; bucket_size != MAX_BUCKET_SIZE + 1; ++bucket_size) { @@ -90,7 +90,7 @@ struct buckets_statistics { } } - std::cout << " === super_kmer statistics === \n"; + std::cout << "=== super_kmer statistics === \n"; uint64_t total_super_kmers = 0; uint64_t total_kmers = 0; for (uint64_t string_size = 1; string_size != MAX_STRING_SIZE + 1; ++string_size) { @@ -116,7 +116,7 @@ struct buckets_statistics { } void print_less() const { - std::cout << " === bucket statistics (less) === \n"; + std::cout << "=== bucket statistics (less) === \n"; for (uint64_t bucket_size = 1; bucket_size != 16 + 1; ++bucket_size) { if (m_bucket_sizes[bucket_size] > 0) { std::cout << "buckets with " << bucket_size << " minimizer positions = " @@ -124,7 +124,7 @@ struct buckets_statistics { << std::endl; } } - std::cout << "max_bucket_size " << m_max_bucket_size << std::endl; + std::cout << "max_bucket_size = " << m_max_bucket_size << std::endl; } void operator+=(buckets_statistics const& rhs) { diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index cc419da..2c1108d 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -30,10 +30,11 @@ struct dictionary_builder // build_stats.add("m", d.m_m); build_stats.add("canonical", d.m_canonical ? "true" : "false"); build_stats.add("seed", build_config.seed); + build_stats.add("num_threads", build_config.num_threads); total_time_musec = 0; - do_step("step 1: encode strings", [&]() { + do_step("step 1 (encode strings)", [&]() { encode_strings(filename); d.m_num_kmers = num_kmers; assert(strings_offsets_builder.size() >= 2); @@ -41,12 +42,12 @@ struct dictionary_builder // }); if (build_config.weighted) { - do_step("step 1.1: build weights", [&]() { weights_builder.build(d.m_weights); }); + do_step("step 1.1 (build weights)", [&]() { weights_builder.build(d.m_weights); }); } - do_step("step 2: compute minimizer tuples", [&]() { compute_minimizer_tuples(); }); + do_step("step 2 (compute minimizer tuples)", [&]() { compute_minimizer_tuples(); }); - do_step("step 3: merging minimizer tuples", [&]() { minimizers.merge(); }); + do_step("step 3 (merging minimizer tuples)", [&]() { minimizers.merge(); }); if (build_config.verbose) { std::cout << "num_minimizers = " << minimizers.num_minimizers() << std::endl; std::cout << "num_minimizer_positions = " << minimizers.num_minimizer_positions() @@ -54,14 +55,14 @@ struct dictionary_builder // std::cout << "num_super_kmers = " << minimizers.num_super_kmers() << std::endl; } - do_step("step 4: build mphf", [&]() { build_mphf(d); }); + do_step("step 4 (build mphf)", [&]() { build_mphf(d); }); - do_step("step 5: replacing minimizer values with MPHF hashes", + do_step("step 5 (replacing minimizer values with MPHF hashes)", [&]() { hash_minimizers(d); }); - do_step("step 6: merging minimizers tuples", [&]() { minimizers.merge(); }); + do_step("step 6 (merging minimizers tuples)", [&]() { minimizers.merge(); }); - do_step("step 7: build sparse and skew index", [&]() { + do_step("step 7 (build sparse and skew index)", [&]() { build_sparse_and_skew_index(d); minimizers.remove_tmp_file(); assert(strings_offsets_builder.size() == 0); @@ -88,7 +89,7 @@ struct dictionary_builder // private: void print_time(double time_in_musec, std::string const& message) { - std::cout << "=== " << message << " " << time_in_musec / 1'000'000 << " [sec] (" + std::cout << "=== " << message << ": " << time_in_musec / 1'000'000 << " [sec] (" << (time_in_musec * 1000) / num_kmers << " [ns/kmer])" << std::endl; } diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 82bbdf3..0e86c24 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -52,27 +52,25 @@ struct spectrum_preserving_string_set // } } - { - /* check minimizer first */ - uint64_t read_mmer = uint64_t( + /* check minimizer first */ + if (uint64_t read_mmer = uint64_t( util::read_kmer_at(strings, m, Kmer::bits_per_char * v[0].absolute_offset)); - if (read_mmer != mini_info.minimizer) // - { - /* - The function `lookup_regular` determines if the minimizer is found at the - offset `Kmer::bits_per_char * p.absolute_offset`, not whether the minimizer - does not appear at all. In fact, it can happen that the minimizer appear but - not at the specified offset, so it would be wrong to set `res.minimizer_found` - to `false`. This can happen for HEAVYLOAD buckets only because their lookup is - resolved via the skew index and `pos_in_bucket` might be larger than the size - of the bucket (which we do not know for a HEAVYLOAD bucket). Since for streaming - queries we keep track of the presence of minimizers (i.e., whether they appear - in the index or not), only in this special case we set - `res.minimizer_found` to `true` to indicate that we do not know whether the - minimizer appears in the index or not. - */ - return lookup_result(it.bucket_type() != bucket_t::HEAVYLOAD ? false : true); - } + read_mmer != mini_info.minimizer) // + { + /* + The function `lookup_regular` determines if the minimizer is found at the + offset `Kmer::bits_per_char * p.absolute_offset`, not whether the minimizer + does not appear at all. In fact, it can happen that the minimizer appear but + not at the specified offset, so it would be wrong to set `res.minimizer_found` + to `false`. This can happen for HEAVYLOAD buckets only because their lookup is + resolved via the skew index and `pos_in_bucket` might be larger than the size + of the bucket (which we do not know for a HEAVYLOAD bucket). Since for streaming + queries we keep track of the presence of minimizers (i.e., whether they appear + in the index or not), only in this special case we set + `res.minimizer_found` to `true` to indicate that we do not know whether the + minimizer appears in the index or not. + */ + return lookup_result(it.bucket_type() != bucket_t::HEAVYLOAD ? false : true); } lookup_result res; @@ -91,30 +89,41 @@ struct spectrum_preserving_string_set // const uint64_t size = it.size(); assert(size > 0); - uint64_t minimizer_offset = *it; - auto p = strings_offsets.decode(minimizer_offset); + static thread_local // + std::array + v; + + { + /* prefetch all memory locations */ + uint64_t const* addr = strings.data().data(); + for (uint64_t i = 0; i != size; ++i, ++it) { + uint64_t minimizer_offset = *it; + auto p = strings_offsets.decode(minimizer_offset); + __builtin_prefetch( + addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // + 0, 3 // + ); + v[i] = p; + } + } + /* check minimizer first */ + if (uint64_t read_mmer = uint64_t( + util::read_kmer_at(strings, m, Kmer::bits_per_char * v[0].absolute_offset)); + read_mmer != mini_info.minimizer) // { - /* check minimizer first */ - uint64_t read_mmer = uint64_t( - util::read_kmer_at(strings, m, Kmer::bits_per_char * p.absolute_offset)); - auto tmp = Kmer(mini_info.minimizer); + Kmer tmp = mini_info.minimizer; tmp.reverse_complement_inplace(m); uint64_t minimizer_rc = uint64_t(tmp); - if (read_mmer != mini_info.minimizer and read_mmer != minimizer_rc) { + if (read_mmer != minimizer_rc) { /* Same note as for the function `lookup_regular`. */ return lookup_result(it.bucket_type() != bucket_t::HEAVYLOAD ? false : true); } } lookup_result res; - if (_lookup_canonical(res, p, kmer, kmer_rc, mini_info)) return res; - - for (uint64_t i = 1; i != size; ++i) { - ++it; - minimizer_offset = *it; - p = strings_offsets.decode(minimizer_offset); - if (_lookup_canonical(res, p, kmer, kmer_rc, mini_info)) return res; + for (uint64_t i = 0; i != size; ++i) { + if (_lookup_canonical(res, v[i], kmer, kmer_rc, mini_info)) return res; } return lookup_result(); From 0c53a23b6594f63f1cbf59fee8ee022ff893440d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 4 Nov 2025 14:15:29 +0100 Subject: [PATCH 079/112] updated external/pthash and refactored offsets.hpp --- external/pthash | 2 +- include/offsets.hpp | 201 ++++++++++++++------------------------------ 2 files changed, 66 insertions(+), 137 deletions(-) diff --git a/external/pthash b/external/pthash index 304378a..13e0572 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit 304378a7045eb0982fad92e32cfaff9fc63291ff +Subproject commit 13e0572dd92582c29f8c33ed2b21ddb64058bc96 diff --git a/include/offsets.hpp b/include/offsets.hpp index 0b5648c..2d84531 100644 --- a/include/offsets.hpp +++ b/include/offsets.hpp @@ -12,61 +12,31 @@ struct num_bits { uint64_t per_string_id; }; -struct decoded_offsets // +template +struct offsets // { struct builder { builder() {} void reserve(uint64_t n) { m_v.reserve(n); } void push_back(uint64_t val) { m_v.push_back(val); } + uint64_t operator[](uint64_t i) { assert(i < m_v.size()); return m_v[i]; } + uint64_t front() const { return m_v.front(); } uint64_t back() const { return m_v.back(); } uint64_t size() const { return m_v.size(); } - uint64_t num_bits_per_offset() const { return m_num_bits_per_offset; } - - void set_num_bits(num_bits nb) { m_num_bits_per_offset = nb.per_absolute_offset; } - uint64_t encode(uint64_t offset, uint64_t, uint64_t) { return offset; } - - void build(decoded_offsets& e) { - assert(std::is_sorted(m_v.begin(), m_v.end())); - e.m_seq.encode(m_v.begin(), m_v.size(), m_v.back()); - std::vector().swap(m_v); - } + void set_num_bits(num_bits nb) { m_nb = nb; } - private: - uint64_t m_num_bits_per_offset; + protected: + num_bits m_nb; std::vector m_v; }; - struct decoded_offset { - uint64_t absolute_offset; - }; - - decoded_offset decode(const uint64_t encoded_offset) const { return {encoded_offset}; } - - void offset_to_id(lookup_result& res, decoded_offset /* p */, const uint64_t k) const // - { - assert(res.kmer_offset != constants::invalid_uint64); - - auto q = m_seq.locate(res.kmer_offset); - res.string_id = q.first.pos; - res.string_begin = q.first.val; - res.string_end = q.second.val; - res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id - res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id - - assert(res.string_id < m_seq.size()); - assert(res.string_begin < res.string_end); - assert(res.kmer_offset >= res.string_id * (k - 1)); - assert(res.string_begin <= res.kmer_offset); - assert(res.kmer_offset < res.string_end); - } - std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // { constexpr uint64_t linear_scan_threshold = 32; @@ -85,8 +55,8 @@ struct decoded_offsets // } assert(lo < hi); assert(hi < m_seq.size()); - for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, it.next()) { - uint64_t val = it.value() - lo * (k - 1); + for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, ++it) { + uint64_t val = *it - lo * (k - 1); if (val > kmer_id) break; } assert(lo > 0); @@ -100,17 +70,19 @@ struct decoded_offsets // uint64_t size() const { return m_seq.size(); } - uint64_t num_bytes() const { return m_seq.num_bytes(); } + uint64_t num_bytes() const { + return sizeof(m_num_bits_per_relative_offset) + m_seq.num_bytes(); + } struct iterator { iterator() {} - iterator(decoded_offsets const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } + iterator(offsets const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } - uint64_t value() const { return m_it.value(); } - void next() { m_it.next(); } + uint64_t value() const { return *m_it; } + void next() { ++m_it; } private: - bits::endpoints_sequence<>::iterator m_it; + typename Seq::iterator m_it; }; iterator get_iterator_at(uint64_t pos) const { @@ -128,35 +100,69 @@ struct decoded_offsets // visit_impl(visitor, *this); } -private: - bits::endpoints_sequence<> m_seq; +protected: + Seq m_seq; + uint64_t m_num_bits_per_relative_offset; template static void visit_impl(Visitor& visitor, T&& t) { + visitor.visit(t.m_num_bits_per_relative_offset); visitor.visit(t.m_seq); } }; -struct encoded_offsets // +struct decoded_offsets + : public offsets> // { - struct builder { - builder() {} + struct builder + : public offsets>::builder // + { + uint64_t num_bits_per_offset() const { return m_nb.per_absolute_offset; } - void reserve(uint64_t n) { m_v.reserve(n); } - void push_back(uint64_t val) { m_v.push_back(val); } - uint64_t operator[](uint64_t i) { - assert(i < m_v.size()); - return m_v[i]; + uint64_t encode(uint64_t offset, uint64_t, uint64_t) { return offset; } + + void build(decoded_offsets& e) { + assert(std::is_sorted(m_v.begin(), m_v.end())); + e.m_seq.encode(m_v.begin(), m_v.size(), m_v.back()); + std::vector().swap(m_v); } - uint64_t front() const { return m_v.front(); } - uint64_t back() const { return m_v.back(); } - uint64_t size() const { return m_v.size(); } + }; + + struct decoded_offset { + uint64_t absolute_offset; + }; + + decoded_offset decode(const uint64_t encoded_offset) const { return {encoded_offset}; } + + void offset_to_id(lookup_result& res, decoded_offset /* p */, const uint64_t k) const // + { + assert(res.kmer_offset != constants::invalid_uint64); + + auto q = m_seq.locate(res.kmer_offset); + res.string_id = q.first.pos; + res.string_begin = q.first.val; + res.string_end = q.second.val; + res.kmer_id = res.kmer_offset - res.string_id * (k - 1); // absolute kmer id + res.kmer_id_in_string = res.kmer_offset - res.string_begin; // relative kmer id + + assert(res.string_id < m_seq.size()); + assert(res.string_begin < res.string_end); + assert(res.kmer_offset >= res.string_id * (k - 1)); + assert(res.string_begin <= res.kmer_offset); + assert(res.kmer_offset < res.string_end); + } +}; + +struct encoded_offsets + : public offsets // +{ + struct builder + : public offsets::builder // + { uint64_t num_bits_per_offset() const { return m_nb.per_string_id + m_nb.per_relative_offset; } - void set_num_bits(num_bits nb) { m_nb = nb; } - uint64_t encode(uint64_t offset, uint64_t begin, uint64_t string_id) { /* encode offset as | string-id | relative offset | */ assert(string_id < m_v.size()); @@ -172,10 +178,6 @@ struct encoded_offsets // e.m_num_bits_per_relative_offset = m_nb.per_relative_offset; std::vector().swap(m_v); } - - private: - num_bits m_nb; - std::vector m_v; }; struct decoded_offset { @@ -208,79 +210,6 @@ struct encoded_offsets // assert(res.string_id < m_seq.size()); assert(res.string_begin < res.string_end); } - - std::pair id_to_offset(const uint64_t kmer_id, const uint64_t k) const // - { - constexpr uint64_t linear_scan_threshold = 32; - uint64_t lo = 0; - uint64_t hi = m_seq.size() - 1; - assert(m_seq.access(0) == 0); - while (hi - lo > linear_scan_threshold) { - uint64_t mid = lo + (hi - lo) / 2; - uint64_t val = m_seq.access(mid); - assert(val >= mid * (k - 1)); - if (kmer_id <= val - mid * (k - 1)) { - hi = mid; - } else { - lo = mid + 1; - } - } - assert(lo < hi); - assert(hi < m_seq.size()); - for (auto it = m_seq.get_iterator_at(lo); lo <= hi; ++lo, ++it) { - uint64_t val = *it - lo * (k - 1); - if (val > kmer_id) break; - } - assert(lo > 0); - return {lo, kmer_id + (lo - 1) * (k - 1)}; - } - - uint64_t access(uint64_t i) const { - assert(i < size()); - return m_seq.access(i); - } - - uint64_t size() const { return m_seq.size(); } - - uint64_t num_bytes() const { - return sizeof(m_num_bits_per_relative_offset) + m_seq.num_bytes(); - } - - struct iterator { - iterator() {} - iterator(encoded_offsets const* e, uint64_t pos) { m_it = e->m_seq.get_iterator_at(pos); } - - uint64_t value() const { return *m_it; } - void next() { ++m_it; } - - private: - bits::compact_vector::iterator m_it; - }; - - iterator get_iterator_at(uint64_t pos) const { - assert(pos < size()); - return {this, pos}; - } - - template - void visit(Visitor& visitor) const { - visit_impl(visitor, *this); - } - - template - void visit(Visitor& visitor) { - visit_impl(visitor, *this); - } - -private: - uint64_t m_num_bits_per_relative_offset; - bits::compact_vector m_seq; - - template - static void visit_impl(Visitor& visitor, T&& t) { - visitor.visit(t.m_num_bits_per_relative_offset); - visitor.visit(t.m_seq); - } }; } // namespace sshash \ No newline at end of file From e644a94e6542d1a427f5d45e4e92d785cf9c86f2 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 4 Nov 2025 15:50:31 +0100 Subject: [PATCH 080/112] step 7.1 and 7.2 timed as well --- .../builder/build_sparse_and_skew_index.cpp | 143 +++++++++--------- 1 file changed, 75 insertions(+), 68 deletions(-) diff --git a/include/builder/build_sparse_and_skew_index.cpp b/include/builder/build_sparse_and_skew_index.cpp index 8c3f5da..9e9f1ce 100644 --- a/include/builder/build_sparse_and_skew_index.cpp +++ b/include/builder/build_sparse_and_skew_index.cpp @@ -7,6 +7,9 @@ template void dictionary_builder::build_sparse_and_skew_index( dictionary& d) // { + essentials::timer_type timer; + timer.start(); + const uint64_t num_minimizer_positions = minimizers.num_minimizer_positions(); const uint64_t num_minimizers = minimizers.num_minimizers(); const uint64_t min_size = 1ULL << constants::min_l; @@ -22,9 +25,6 @@ void dictionary_builder::build_sparse_and_skew_index( mm::file_source input(minimizers.get_minimizers_filename(), mm::advice::sequential); - essentials::timer_type timer; - timer.start(); - buckets_statistics buckets_stats(num_minimizers, num_kmers, num_minimizer_positions); uint64_t num_buckets_larger_than_1_not_in_skew_index = 0; @@ -74,7 +74,7 @@ void dictionary_builder::build_sparse_and_skew_index( strings_offsets_builder.build(d.m_spss.strings_offsets); strings_builder.build(d.m_spss.strings); - /* displace offsets */ + /* step 1. build sparse index */ assert(buckets_stats.num_buckets() == num_minimizers); const uint64_t max_bucket_size = buckets_stats.max_bucket_size(); @@ -128,7 +128,7 @@ void dictionary_builder::build_sparse_and_skew_index( assert(num_partitions <= 8); // so that we need 3 bits to encode a partition_id if (build_config.verbose) { - std::cout << "skew index num_partitions " << num_partitions << std::endl; + std::cout << "num_partitions in skew index " << num_partitions << std::endl; std::cout << "num_minimizer_positions_of_buckets_larger_than_1 " << num_minimizer_positions_of_buckets_larger_than_1 << "/" << num_minimizer_positions << " (" @@ -150,66 +150,68 @@ void dictionary_builder::build_sparse_and_skew_index( heavy_load_buckets_builder.resize(num_minimizer_positions_of_buckets_in_skew_index, num_bits_per_offset); - uint64_t curr_bucket_size = 2; - uint64_t list_id = 0; - d.m_ssi.begin_buckets_of_size.resize(min_size + 1, 0); - uint64_t offsets2_curr_size = 0; - uint64_t offsets3_curr_size = 0; - uint64_t partition_id = 0; - uint64_t lower = min_size; - uint64_t upper = 2 * lower; + { + uint64_t curr_bucket_size = 2; + uint64_t list_id = 0; + uint64_t mid_load_buckets_size = 0; + uint64_t heavy_load_buckets_size = 0; - for (auto bucket : buckets) { - const uint64_t bucket_size = bucket.size(); - assert(bucket_size >= 2); + uint64_t partition_id = 0; + uint64_t lower = min_size; + uint64_t upper = 2 * lower; - if (bucket_size > curr_bucket_size) { - while (bucket_size > curr_bucket_size) ++curr_bucket_size; - if (curr_bucket_size <= min_size) { - d.m_ssi.begin_buckets_of_size[curr_bucket_size] = offsets2_curr_size; - } else { - while (curr_bucket_size > upper) { - lower = upper; - upper = 2 * lower; - partition_id += 1; - if (partition_id == num_partitions - 1) upper = max_bucket_size; + for (auto bucket : buckets) { + const uint64_t bucket_size = bucket.size(); + assert(bucket_size >= 2); + + if (bucket_size > curr_bucket_size) { + while (bucket_size > curr_bucket_size) ++curr_bucket_size; + if (curr_bucket_size <= min_size) { + d.m_ssi.begin_buckets_of_size[curr_bucket_size] = mid_load_buckets_size; + } else { + while (curr_bucket_size > upper) { + lower = upper; + upper = 2 * lower; + partition_id += 1; + if (partition_id == num_partitions - 1) upper = max_bucket_size; + } } + list_id = 0; } - list_id = 0; - } - if (curr_bucket_size <= min_size) { - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (prev_pos_in_seq == constants::invalid_uint64) { // only once - uint64_t p = (list_id << constants::min_l) | (curr_bucket_size - 2); - uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - control_codewords_builder.set(mt.minimizer, code); - } - if (mt.pos_in_seq != prev_pos_in_seq) { - mid_load_buckets_builder.push_back(mt.pos_in_seq); - prev_pos_in_seq = mt.pos_in_seq; - offsets2_curr_size += 1; - } - } - ++list_id; - } else { - uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : bucket) { - if (prev_pos_in_seq == constants::invalid_uint64) { // only once - assert(partition_id < 8); - uint64_t p = (offsets3_curr_size << 3) | partition_id; - uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 - assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); - control_codewords_builder.set(mt.minimizer, code); + if (curr_bucket_size <= min_size) { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + uint64_t p = (list_id << constants::min_l) | (curr_bucket_size - 2); + uint64_t code = (p << 2) | 1; // first two LS bits encode status code: 01 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + control_codewords_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + mid_load_buckets_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + mid_load_buckets_size += 1; + } } - if (mt.pos_in_seq != prev_pos_in_seq) { - heavy_load_buckets_builder.push_back(mt.pos_in_seq); - prev_pos_in_seq = mt.pos_in_seq; - offsets3_curr_size += 1; + ++list_id; + } else { + uint64_t prev_pos_in_seq = constants::invalid_uint64; + for (auto mt : bucket) { + if (prev_pos_in_seq == constants::invalid_uint64) { // only once + assert(partition_id < 8); + uint64_t p = (heavy_load_buckets_size << 3) | partition_id; + uint64_t code = (p << 2) | 3; // first two LS bits encode status code: 11 + assert(code < (uint64_t(1) << (num_bits_per_offset + 1))); + control_codewords_builder.set(mt.minimizer, code); + } + if (mt.pos_in_seq != prev_pos_in_seq) { + heavy_load_buckets_builder.push_back(mt.pos_in_seq); + prev_pos_in_seq = mt.pos_in_seq; + heavy_load_buckets_size += 1; + } } } } @@ -221,9 +223,10 @@ void dictionary_builder::build_sparse_and_skew_index( timer.stop(); + build_stats.add("step 7.1 (build sparse index)", uint64_t(timer.elapsed())); + if (build_config.verbose) { - std::cout << "computing minimizers offsets: " << timer.elapsed() / 1000000 << " [sec]" - << std::endl; + print_time(uint64_t(timer.elapsed()), "step 7.1 (build sparse index)"); } timer.reset(); @@ -233,7 +236,7 @@ void dictionary_builder::build_sparse_and_skew_index( return; } - /* build skew index */ + /* step 2. build skew index */ timer.start(); std::vector num_kmers_in_partition(num_partitions, 0); d.m_ssi.ski.mphfs.resize(num_partitions); @@ -244,9 +247,11 @@ void dictionary_builder::build_sparse_and_skew_index( uint64_t lower = min_size; uint64_t upper = 2 * lower; uint64_t num_kmers_in_skew_index = 0; + for (uint64_t i = buckets.size() - num_buckets_in_skew_index; i <= buckets.size(); ++i) // { - while (i == buckets.size() or buckets[i].size() > upper) // + auto const& bucket = buckets[i]; + while (i == buckets.size() or bucket.size() > upper) // { if (build_config.verbose) { std::cout << " partition = " << partition_id @@ -266,8 +271,8 @@ void dictionary_builder::build_sparse_and_skew_index( if (i == buckets.size()) break; - assert(buckets[i].size() > lower and buckets[i].size() <= upper); - for (auto mt : buckets[i]) { + assert(bucket.size() > lower and bucket.size() <= upper); + for (auto mt : bucket) { num_kmers_in_partition[partition_id] += mt.num_kmers_in_super_kmer; } } @@ -310,7 +315,8 @@ void dictionary_builder::build_sparse_and_skew_index( for (uint64_t i = buckets.size() - num_buckets_in_skew_index, k = build_config.k; i <= buckets.size(); ++i) // { - while (i == buckets.size() or buckets[i].size() > upper) // + auto const& bucket = buckets[i]; + while (i == buckets.size() or bucket.size() > upper) // { if (build_config.verbose) { std::cout << " lower = " << lower << "; upper = " << upper @@ -380,10 +386,10 @@ void dictionary_builder::build_sparse_and_skew_index( if (i == buckets.size()) break; - assert(buckets[i].size() > lower and buckets[i].size() <= upper); + assert(bucket.size() > lower and bucket.size() <= upper); uint64_t pos_in_bucket = -1; uint64_t prev_pos_in_seq = constants::invalid_uint64; - for (auto mt : buckets[i]) // + for (auto mt : bucket) // { if (mt.pos_in_seq != prev_pos_in_seq) { prev_pos_in_seq = mt.pos_in_seq; @@ -415,9 +421,10 @@ void dictionary_builder::build_sparse_and_skew_index( timer.stop(); + build_stats.add("step 7.2 (build skew index)", uint64_t(timer.elapsed())); + if (build_config.verbose) { - std::cout << "computing skew index took: " << timer.elapsed() / 1000000 << " [sec]" - << std::endl; + print_time(uint64_t(timer.elapsed()), "step 7.2 (build skew index)"); buckets_stats.print_less(); } } From 6fb7925c88c9f7be4b04f119d4cc71657af8c0c4 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 4 Nov 2025 21:30:59 +0100 Subject: [PATCH 081/112] minor --- include/builder/dictionary_builder.hpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index 2c1108d..c6ebd01 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -6,8 +6,6 @@ #include "include/builder/util.hpp" #include "include/buckets_statistics.hpp" -#include // for std::accumulate - namespace sshash { template @@ -94,7 +92,7 @@ struct dictionary_builder // } template - void do_step(std::string const& step, Callback f) { + void do_step(std::string const& step, Callback const& f) { timer.start(); f(); timer.stop(); From 7d293021fd315939b33a9d75658104963cf4c400 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 5 Nov 2025 19:02:46 +0100 Subject: [PATCH 082/112] examples in the readme updated --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 64f894b..ad27756 100644 --- a/README.md +++ b/README.md @@ -178,15 +178,15 @@ such collections of stitched unitigs can be obtained from raw FASTA files. ### Example 1 - ./sshash build -i ../data/unitigs_stitched/salmonella_enterica_k31_ust.fa.gz -k 31 -m 13 --check --bench -o salmonella_enterica.index + ./sshash build -i ../data/unitigs_stitched/salmonella_enterica_k31_ust.fa.gz -k 31 -m 13 --check --bench -o salmonella_enterica.sshash This example builds a dictionary for the k-mers read from the file `../data/unitigs_stitched/salmonella_enterica_k31_ust.fa.gz`, -with k = 31 and m = 13. It also check the correctness of the dictionary (`--check` option), run a performance benchmark (`--bench` option), and serializes the index on disk to the file `salmonella_enterica.index`. +with k = 31 and m = 13. It also check the correctness of the dictionary (`--check` option), run a performance benchmark (`--bench` option), and serializes the index on disk to the file `salmonella_enterica.sshash`. To run a performance benchmark after construction of the index, use: - ./sshash bench -i salmonella_enterica.index + ./sshash bench -i salmonella_enterica.sshash To also store the weights, use the option `--weighted`: @@ -194,34 +194,34 @@ To also store the weights, use the option `--weighted`: ### Example 2 - ./sshash build -i ../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz -k 31 -m 15 -l 2 -o salmonella_100.index + ./sshash build -i ../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz -k 31 -m 15 -o salmonella_100.sshash -This example builds a dictionary from the input file `../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz` (a pangenome consisting in 100 genomes of *Salmonella Enterica*), with k = 31, m = 15, and l = 2. It also serializes the index on disk to the file `salmonella_100.index`. +This example builds a dictionary from the input file `../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz` (a pangenome consisting in 100 genomes of *Salmonella Enterica*), with k = 31, m = 15, and l = 2. It also serializes the index on disk to the file `salmonella_100.sshash`. To perform some streaming membership queries, use: - ./sshash query -i salmonella_100.index -q ../data/queries/SRR5833294.10K.fastq.gz + ./sshash query -i salmonella_100.sshash -q ../data/queries/SRR5833294.10K.fastq.gz if your queries are meant to be read from a FASTQ file, or - ./sshash query -i salmonella_100.index -q ../data/queries/salmonella_enterica.fasta.gz --multiline + ./sshash query -i salmonella_100.sshash -q ../data/queries/salmonella_enterica.fasta.gz --multiline if your queries are to be read from a (multi-line) FASTA file. ### Example 3 - ./sshash build -i ../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz -k 31 -m 13 -l 4 -s 347692 --canonical -o salmonella_100.canon.index + ./sshash build -i ../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz -k 31 -m 13 --canonical -o salmonella_100.canon.sshash -This example builds a dictionary from the input file `../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz` (same used in Example 2), with k = 31, m = 13, l = 4, using a seed 347692 for construction (`-s 347692`), and with the canonical parsing modality (option `--canonical`). The dictionary is serialized on disk to the file `salmonella_100.canon.index`. +This example builds a dictionary from the input file `../data/unitigs_stitched/salmonella_100_k31_ust.fa.gz` (same used in Example 2), with k = 31, m = 13, and with the canonical parsing modality (option `--canonical`). The dictionary is serialized on disk to the file `salmonella_100.canon.sshash`. -The "canonical" version of the dictionary offers more speed for only a little space increase (for a suitable choice of parameters m and l), especially under low-hit workloads -- when the majority of k-mers are not found in the dictionary. (For all details, refer to the paper.) +The "canonical" version of the dictionary offers more speed for only a little space increase, especially under low-hit workloads -- when the majority of k-mers are not found in the dictionary. (For all details, refer to the paper.) Below a comparison between the dictionary built in Example 2 (not canonical) and the one just built (Example 3, canonical). - ./sshash query -i salmonella_100.index -q ../data/queries/SRR5833294.10K.fastq.gz + ./sshash query -i salmonella_100.sshash -q ../data/queries/SRR5833294.10K.fastq.gz - ./sshash query -i salmonella_100.canon.index -q ../data/queries/SRR5833294.10K.fastq.gz + ./sshash query -i salmonella_100.canon.sshash -q ../data/queries/SRR5833294.10K.fastq.gz Both queries should originate the following report (reported here for reference): From fe05a417bf7948c3e1d6c27ab39bb6d483ed955e Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 10:26:16 +0100 Subject: [PATCH 083/112] minor --- tools/perf.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index b86eff9..5bf7fec 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -270,8 +270,7 @@ void perf_test_lookup_access(Dict const& dict, essentials::json_lines& perf_stat std::cout << "access (avg_nanosec_per_kmer) = " << nanosec_per_access << std::endl; perf_stats.add("access (avg_nanosec_per_kmer)", nanosec_per_access); } - -} // namespace sshash +} template void perf_test_lookup_weight(Dict const& dict, essentials::json_lines& perf_stats) // From f264b9b7ecd5a54e720fbf2744670530137d09a6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 16:51:56 +0100 Subject: [PATCH 084/112] minor --- src/query.cpp | 11 +++++------ tools/query.cpp | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/query.cpp b/src/query.cpp index b32a696..aa69b39 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -88,7 +88,7 @@ streaming_query_report streaming_query_from_fastq_file(Dict const* dict, std::is if (line.size() >= k) { const uint64_t num_kmers = line.size() - k + 1; report.num_kmers += num_kmers; - for (uint64_t i = 0; i != line.size() - k + 1; ++i) { + for (uint64_t i = 0; i != num_kmers; ++i) { char const* kmer = line.data() + i; query.lookup(kmer); } @@ -114,12 +114,12 @@ streaming_query_report streaming_query_from_fasta_file(Dict const* dict, std::is return streaming_query_from_fasta_file(dict, is); } -template +template streaming_query_report // -dictionary::streaming_query_from_file(std::string const& filename, - bool multiline) const // +dictionary::streaming_query_from_file(std::string const& filename, + bool multiline) const // { - using dictionary_type = dictionary; + using dictionary_type = dictionary; using regular_query = streaming_query; using canonical_query = streaming_query; @@ -129,7 +129,6 @@ dictionary::streaming_query_from_file(std::string const& file if (util::ends_with(filename, ".fa.gz") or util::ends_with(filename, ".fasta.gz")) { zip_istream zis(is); - if (canonical()) { report = streaming_query_from_fasta_file(this, zis, multiline); diff --git a/tools/query.cpp b/tools/query.cpp index a8a4279..1fa46ba 100644 --- a/tools/query.cpp +++ b/tools/query.cpp @@ -47,8 +47,8 @@ int query(int argc, char** argv) { << " (" << (report.num_extensions * 100.0) / report.num_positive_kmers << "%)" << std::endl; std::cout << "elapsed = " << t.elapsed() / 1000 << " millisec / "; - std::cout << t.elapsed() / 1000000 << " sec / "; - std::cout << t.elapsed() / 1000000 / 60 << " min / "; + std::cout << t.elapsed() / 1'000'000 << " sec / "; + std::cout << t.elapsed() / 1'000'000 / 60 << " min / "; std::cout << (t.elapsed() * 1000) / report.num_kmers << " ns/kmer" << std::endl; return 0; From 5a12f4071e423147045b948da1e20b6cf4d11339 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 23:14:28 +0100 Subject: [PATCH 085/112] build.py --- script/build.py | 118 ++++++++++++++++++++++++++++++++++++++++++++++++ script/build.sh | 76 +++++++++++++++---------------- 2 files changed, 156 insertions(+), 38 deletions(-) create mode 100644 script/build.py diff --git a/script/build.py b/script/build.py new file mode 100644 index 0000000..8c3739a --- /dev/null +++ b/script/build.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 + +import os +import subprocess +import sys +from pathlib import Path + +if len(sys.argv) < 3: + print("Usage: run_sshash_builds.py ") + sys.exit(1) + +log_label = sys.argv[1] +index_dir = Path(sys.argv[2]).resolve() + +prefix = Path("/mnt/hd2/pibiri/DNA") +tmp_dir = prefix / "tmp_dir" +results_dir = Path(f"results-{log_label}") +threads = 64 +g = 16 + +datasets = [ + "cod", "kestrel", "human", "axolotl", "hprc", + "ec", "se", "ncbi-virus", "jgi_fungi.batch-0" +] + +m_values_k31 = { + "cod": 20, "kestrel": 20, "human": 21, "axolotl": 21, + "hprc": 21, "ec": 21, "se": 21, "ncbi-virus": 19, "jgi_fungi.batch-0": 21 +} + +m_values_k63 = { + "cod": 24, "kestrel": 24, "human": 25, "axolotl": 25, + "hprc": 31, "ec": 31, "se": 31, "ncbi-virus": 23, "jgi_fungi.batch-0": 25 +} + +# --- Utilities --- +def run_cmd(cmd, cwd=None, append_to=None): + print(f"[RUN] {' '.join(cmd)}") + if append_to: + with open(append_to, "a") as f: + subprocess.run(cmd, cwd=cwd, stdout=f, stderr=f, check=True) + else: + subprocess.run(cmd, cwd=cwd, check=True) + + +def build_project(max_k63: bool): + flag = "On" if max_k63 else "Off" + print(f"\n=== Building SSHASH (MAX_KMER_LENGTH_63={flag}) ===\n") + run_cmd([ + "cmake", "..", + "-DCMAKE_BUILD_TYPE=Release", + "-DCMAKE_CXX_COMPILER=/usr/bin/g++", + "-DSSHASH_USE_ARCH_NATIVE=On", + "-DSSHASH_USE_SANITIZERS=Off", + f"-DSSHASH_USE_MAX_KMER_LENGTH_63={flag}" + ]) + run_cmd(["make", "-j"]) + + +def build_sshash(k, canonical_flag, mode, m_values): + """Perform sshash builds for a given k, mode, and canonical flag.""" + mode_dir = results_dir / f"k{k}" + mode_dir.mkdir(parents=True, exist_ok=True) + + log_file = mode_dir / f"{mode}-build.log" + json_file = mode_dir / f"{mode}-build.json" + time_file = mode_dir / f"{mode}-build.time.log" + + for dataset in datasets: + m_val = m_values[dataset] + input_file = prefix / f"eulertigs/{dataset}.k{k}.eulertigs.fa.gz" + output_file = index_dir / f"{dataset}.k{k}" + if canonical_flag: + output_file = output_file.with_suffix(".canon") + + print(f"\n>>> Building {dataset} (k={k}, m={m_val}, mode={mode})\n") + + # Clean tmp directory + subprocess.run(["rm", "-rf", str(tmp_dir / "*")], shell=True) + + cmd = [ + "/usr/bin/time", "-v", "-a", "-o", str(time_file), + "./sshash", "build", + "-i", str(input_file), + "-k", str(k), + "-m", str(m_val), + "-g", str(g), + "-t", str(threads), + "--verbose", + "-d", str(tmp_dir), + "-o", f"{output_file}.sshash" + ] + if canonical_flag: + cmd.append("--canonical") + + # Append stdout to .log, stderr to .json + with open(log_file, "a") as log, open(json_file, "a") as js: + subprocess.run(cmd, stdout=log, stderr=js, check=True) + + +# --- Main pipeline --- +index_dir.mkdir(parents=True, exist_ok=True) +results_dir.mkdir(parents=True, exist_ok=True) + +# k = 31 +build_project(max_k63=False) +build_sshash(31, canonical_flag=False, mode="regular", m_values=m_values_k31) +build_sshash(31, canonical_flag=True, mode="canon", m_values=m_values_k31) + +# k = 63 +build_project(max_k63=True) +build_sshash(63, canonical_flag=False, mode="regular", m_values=m_values_k63) +build_sshash(63, canonical_flag=True, mode="canon", m_values=m_values_k63) + +# rebuild back to default +build_project(max_k63=False) + +print("\n All SSHash indexes built successfully.\n") diff --git a/script/build.sh b/script/build.sh index b874096..032e9df 100644 --- a/script/build.sh +++ b/script/build.sh @@ -12,48 +12,48 @@ mkdir $2 prefix=/mnt/hd2/pibiri/DNA -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json - -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json + +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On make -j -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json - -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json + +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json +rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off make -j From 9219105d17a4f779895eb822b60e207448971634 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 23:21:10 +0100 Subject: [PATCH 086/112] bench.py --- script/bench.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ script/build.py | 2 +- 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 script/bench.py diff --git a/script/bench.py b/script/bench.py new file mode 100644 index 0000000..dedff0f --- /dev/null +++ b/script/bench.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import os +import subprocess +import sys +from pathlib import Path + +# ------------------------------ +# Argument parsing +# ------------------------------ +if len(sys.argv) < 3: + print("Usage: python3 bench.py ") + sys.exit(1) + +log_label = sys.argv[1] +index_dir = Path(sys.argv[2]).resolve() + +# ------------------------------ +# Global configuration +# ------------------------------ +results_dir = Path(f"results-{log_label}") + +datasets = [ + "cod", "kestrel", "human", "axolotl", "hprc", + "ec", "se", "ncbi-virus", "jgi_fungi.batch-0" +] + +# ------------------------------ +# Utility functions +# ------------------------------ +def run_cmd(cmd, cwd=None): + """Run a shell command and print it.""" + print(f"[RUN] {' '.join(cmd)}") + subprocess.run(cmd, cwd=cwd, check=True) + + +def build_project(max_k63: bool): + """Run cmake + make with max_k63 = True/False.""" + flag = "On" if max_k63 else "Off" + print(f"\n=== Building SSHASH (MAX_KMER_LENGTH_63={flag}) ===\n") + run_cmd([ + "cmake", "..", + "-DCMAKE_BUILD_TYPE=Release", + "-DCMAKE_CXX_COMPILER=/usr/bin/g++", + "-DSSHASH_USE_ARCH_NATIVE=On", + "-DSSHASH_USE_SANITIZERS=Off", + f"-DSSHASH_USE_MAX_KMER_LENGTH_63={flag}" + ]) + run_cmd(["make", "-j"]) + + +def run_bench(k: int, canonical: bool, repetitions: int = 3): + """Run SSHASH benchmark for all datasets.""" + mode = "canon" if canonical else "regular" + out_dir = results_dir / f"k{k}" + out_dir.mkdir(parents=True, exist_ok=True) + log_file = out_dir / f"{mode}-bench.log" + + for dataset in datasets: + suffix = f".k{k}.canon.sshash" if canonical else f".k{k}.sshash" + index_path = index_dir / f"{dataset}{suffix}" + + print(f"\n>>> Benchmarking {dataset} (k={k}, mode={mode})\n") + for i in range(repetitions): + print(f" → Run {i+1}/{repetitions}") + with open(log_file, "a") as f: + subprocess.run( + ["./sshash", "bench", "-i", str(index_path)], + stdout=f, + stderr=f, + check=True + ) + +# ------------------------------ +# Prepare directories +# ------------------------------ +results_dir.mkdir(parents=True, exist_ok=True) +(index_dir).mkdir(parents=True, exist_ok=True) + +(results_dir / "k31").mkdir(exist_ok=True) +(results_dir / "k63").mkdir(exist_ok=True) + +# ------------------------------ +# Run benchmarks +# ------------------------------ + +# --- Build for k=31 --- +build_project(max_k63=False) +run_bench(k=31, canonical=False) +run_bench(k=31, canonical=True) + +# --- Build for k=63 --- +build_project(max_k63=True) +run_bench(k=63, canonical=False) +run_bench(k=63, canonical=True) + +# --- Restore to default --- +build_project(max_k63=False) + +print("\n All SSHash benchmark runs completed successfully.\n") diff --git a/script/build.py b/script/build.py index 8c3739a..34ffe32 100644 --- a/script/build.py +++ b/script/build.py @@ -6,7 +6,7 @@ from pathlib import Path if len(sys.argv) < 3: - print("Usage: run_sshash_builds.py ") + print("Usage: python3 build.py ") sys.exit(1) log_label = sys.argv[1] From 3e01643938a2d679186699a8dc8d919b448bcd16 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 23:29:54 +0100 Subject: [PATCH 087/112] build.py --- script/build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/build.py b/script/build.py index 34ffe32..ed7130c 100644 --- a/script/build.py +++ b/script/build.py @@ -75,8 +75,8 @@ def build_sshash(k, canonical_flag, mode, m_values): print(f"\n>>> Building {dataset} (k={k}, m={m_val}, mode={mode})\n") - # Clean tmp directory - subprocess.run(["rm", "-rf", str(tmp_dir / "*")], shell=True) + # Clean tmp directory (should be empty after each build anyway) + subprocess.run(f"rm -rf {tmp_dir}/*", shell=True, check=True) cmd = [ "/usr/bin/time", "-v", "-a", "-o", str(time_file), From d5fb57c2dbfcedc953e6a3ab62e61c6c5abb80f6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 6 Nov 2025 23:41:58 +0100 Subject: [PATCH 088/112] deleted old scripts --- script/bench.sh | 119 ------------------------------------------------ script/build.sh | 59 ------------------------ 2 files changed, 178 deletions(-) delete mode 100644 script/bench.sh delete mode 100644 script/build.sh diff --git a/script/bench.sh b/script/bench.sh deleted file mode 100644 index d2c81af..0000000 --- a/script/bench.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/bash - -echo "output log file =" $1 -echo "input dir for indexes =" $2 - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off -make -j - -mkdir results-$1 -mkdir results-$1/k31 results-$1/k63 -mkdir $2 - -prefix=/mnt/hd2/pibiri/DNA - -for i in {1..3}; do - ./sshash bench -i $2/cod.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/kestrel.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/human.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/axolotl.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/hprc.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ec.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/se.k31.sshash >> results-$1/k31/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-bench.log -done - -for i in {1..3}; do - ./sshash bench -i $2/cod.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/human.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/hprc.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ec.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/se.k31.canon.sshash >> results-$1/k31/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-bench.log -done - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On -make -j - -for i in {1..3}; do - ./sshash bench -i $2/cod.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/kestrel.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/human.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/axolotl.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/hprc.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ec.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/se.k63.sshash >> results-$1/k63/regular-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-bench.log -done - -for i in {1..3}; do - ./sshash bench -i $2/cod.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/human.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/hprc.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ec.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/se.k63.canon.sshash >> results-$1/k63/canon-bench.log -done -for i in {1..3}; do - ./sshash bench -i $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-bench.log -done - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off -make -j diff --git a/script/build.sh b/script/build.sh deleted file mode 100644 index 032e9df..0000000 --- a/script/build.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash - -echo "output log file =" $1 -echo "output dir for indexes =" $2 - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off -make -j - -mkdir results-$1 -mkdir results-$1/k31 results-$1/k63 -mkdir $2 - -prefix=/mnt/hd2/pibiri/DNA - -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/regular-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.sshash >> results-$1/k31/regular-build.log 2>> results-$1/k31/regular-build.json - -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k31/canon-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k31.canon.sshash >> results-$1/k31/canon-build.log 2>> results-$1/k31/canon-build.json - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=On -make -j - -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/cod.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/human.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/hprc.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ec.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/se.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/regular-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.sshash >> results-$1/k63/regular-build.log 2>> results-$1/k63/regular-build.json - -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/cod.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/kestrel.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/human.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/axolotl.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/hprc.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ec.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/se.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/ncbi-virus.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json -rm -rf $prefix/tmp_dir/*; /usr/bin/time -v -a -o results-$1/k63/canon-build.time.log ./sshash build -i $prefix/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d $prefix/tmp_dir -o $2/jgi_fungi.batch-0.k63.canon.sshash >> results-$1/k63/canon-build.log 2>> results-$1/k63/canon-build.json - -cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DSSHASH_USE_ARCH_NATIVE=On -DSSHASH_USE_SANITIZERS=Off -DSSHASH_USE_MAX_KMER_LENGTH_63=Off -make -j From 2b751b2ff5cd88815f4f3851d596c1df55f55a11 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 7 Nov 2025 08:50:29 +0100 Subject: [PATCH 089/112] fix build.py script --- script/build.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/script/build.py b/script/build.py index ed7130c..d062c82 100644 --- a/script/build.py +++ b/script/build.py @@ -57,11 +57,11 @@ def build_project(max_k63: bool): run_cmd(["make", "-j"]) -def build_sshash(k, canonical_flag, mode, m_values): - """Perform sshash builds for a given k, mode, and canonical flag.""" +def build_sshash(k, canonical, m_values): mode_dir = results_dir / f"k{k}" mode_dir.mkdir(parents=True, exist_ok=True) + mode = "canon" if canonical else "regular" log_file = mode_dir / f"{mode}-build.log" json_file = mode_dir / f"{mode}-build.json" time_file = mode_dir / f"{mode}-build.time.log" @@ -70,8 +70,8 @@ def build_sshash(k, canonical_flag, mode, m_values): m_val = m_values[dataset] input_file = prefix / f"eulertigs/{dataset}.k{k}.eulertigs.fa.gz" output_file = index_dir / f"{dataset}.k{k}" - if canonical_flag: - output_file = output_file.with_suffix(".canon") + if canonical: + output_file = output_file + ".canon" print(f"\n>>> Building {dataset} (k={k}, m={m_val}, mode={mode})\n") @@ -90,7 +90,7 @@ def build_sshash(k, canonical_flag, mode, m_values): "-d", str(tmp_dir), "-o", f"{output_file}.sshash" ] - if canonical_flag: + if canonical: cmd.append("--canonical") # Append stdout to .log, stderr to .json @@ -104,15 +104,15 @@ def build_sshash(k, canonical_flag, mode, m_values): # k = 31 build_project(max_k63=False) -build_sshash(31, canonical_flag=False, mode="regular", m_values=m_values_k31) -build_sshash(31, canonical_flag=True, mode="canon", m_values=m_values_k31) +build_sshash(31, canonical=False, m_values_k31) +build_sshash(31, canonical=True, m_values_k31) # k = 63 build_project(max_k63=True) -build_sshash(63, canonical_flag=False, mode="regular", m_values=m_values_k63) -build_sshash(63, canonical_flag=True, mode="canon", m_values=m_values_k63) +build_sshash(63, canonical=False, m_values_k63) +build_sshash(63, canonical=True, m_values_k63) # rebuild back to default build_project(max_k63=False) -print("\n All SSHash indexes built successfully.\n") +print("\n All SSHash indexes built successfully. \n") From bd8be444f92a280f743738ff375f02d9127090cb Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 7 Nov 2025 08:55:20 +0100 Subject: [PATCH 090/112] fix build.py script --- script/build.py | 8 +++--- script/download_and_preprocess_datasets.sh | 33 ---------------------- 2 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 script/download_and_preprocess_datasets.sh diff --git a/script/build.py b/script/build.py index d062c82..9a99716 100644 --- a/script/build.py +++ b/script/build.py @@ -104,13 +104,13 @@ def build_sshash(k, canonical, m_values): # k = 31 build_project(max_k63=False) -build_sshash(31, canonical=False, m_values_k31) -build_sshash(31, canonical=True, m_values_k31) +build_sshash(31, False, m_values_k31) +build_sshash(31, True, m_values_k31) # k = 63 build_project(max_k63=True) -build_sshash(63, canonical=False, m_values_k63) -build_sshash(63, canonical=True, m_values_k63) +build_sshash(63, False, m_values_k63) +build_sshash(63, True, m_values_k63) # rebuild back to default build_project(max_k63=False) diff --git a/script/download_and_preprocess_datasets.sh b/script/download_and_preprocess_datasets.sh deleted file mode 100644 index dbffdd7..0000000 --- a/script/download_and_preprocess_datasets.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -mkdir DNA_datasets - -wget http://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz -O DNA_datasets/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz -~/bcalm/build/bcalm -in ~/DNA_datasets/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz -kmer-size 31 -abundance-min 1 -nb-cores 64 -~/UST/ust -k 31 -i ~/Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa -gzip Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa.ust.fa -mv Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa.ust.fa.gz DNA_datasets/ - -wget http://ftp.ensembl.org/pub/current_fasta/gadus_morhua/dna/Gadus_morhua.gadMor3.0.dna.toplevel.fa.gz -O DNA_datasets/Gadus_morhua.gadMor3.0.dna.toplevel.fa.gz -~/bcalm/build/bcalm -in ~/DNA_datasets/Gadus_morhua.gadMor3.0.dna.toplevel.fa.gz -kmer-size 31 -abundance-min 1 -nb-cores 64 -~/UST/ust -k 31 -i ~/Gadus_morhua.gadMor3.0.dna.toplevel.fa.unitigs.fa -gzip Gadus_morhua.gadMor3.0.dna.toplevel.fa.unitigs.fa.ust.fa -mv Gadus_morhua.gadMor3.0.dna.toplevel.fa.unitigs.fa.ust.fa.gz DNA_datasets/ - -wget http://ftp.ensembl.org/pub/current_fasta/falco_tinnunculus/dna/Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.gz -O DNA_datasets/Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.gz -~/bcalm/build/bcalm -in ~/DNA_datasets/Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.gz -kmer-size 31 -abundance-min 1 -nb-cores 64 -~/UST/ust -k 31 -i ~/Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.unitigs.fa -gzip Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.unitigs.fa.ust.fa -mv Falco_tinnunculus.FalTin1.0.dna.toplevel.fa.unitigs.fa.ust.fa.gz DNA_datasets/ - -wget http://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.toplevel.fa.gz -O DNA_datasets/Homo_sapiens.GRCh38.dna.toplevel.fa.gz -~/bcalm/build/bcalm -in ~/DNA_datasets/Homo_sapiens.GRCh38.dna.toplevel.fa.gz -kmer-size 31 -abundance-min 1 -nb-cores 64 -~/UST/ust -k 31 -i ~/Homo_sapiens.GRCh38.dna.toplevel.fa.unitigs.fa -gzip Homo_sapiens.GRCh38.dna.toplevel.fa.unitigs.fa.ust.fa -mv Homo_sapiens.GRCh38.dna.toplevel.fa.unitigs.fa.ust.fa.gz DNA_datasets/ - -wget https://zenodo.org/record/995689/files/bacterial.genome.fixed.fa -O DNA_datasets/bacterial.genome.fixed.fa -~/bcalm/build/bcalm -in ~/DNA_datasets/bacterial.genome.fixed.fa -kmer-size 31 -abundance-min 1 -nb-cores 64 -~/UST/ust -k 31 -i ~/bacterial.genome.fixed.fa -gzip bacterial.genome.fixed.fa.unitigs.fa.ust.fa -mv bacterial.genome.fixed.fa.unitigs.fa.ust.fa.gz DNA_datasets/ From 8c8562a18340fb91e47b97fec7df85e49fff6c7d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 7 Nov 2025 09:07:44 +0100 Subject: [PATCH 091/112] fix script --- script/bench.py | 16 ++++++++-------- script/build.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/script/bench.py b/script/bench.py index dedff0f..447b42a 100644 --- a/script/bench.py +++ b/script/bench.py @@ -48,7 +48,7 @@ def build_project(max_k63: bool): run_cmd(["make", "-j"]) -def run_bench(k: int, canonical: bool, repetitions: int = 3): +def run_bench(k, canonical, runs = 3): """Run SSHASH benchmark for all datasets.""" mode = "canon" if canonical else "regular" out_dir = results_dir / f"k{k}" @@ -60,8 +60,8 @@ def run_bench(k: int, canonical: bool, repetitions: int = 3): index_path = index_dir / f"{dataset}{suffix}" print(f"\n>>> Benchmarking {dataset} (k={k}, mode={mode})\n") - for i in range(repetitions): - print(f" → Run {i+1}/{repetitions}") + for i in range(runs): + print(f" ==> run {i+1}/{runs}") with open(log_file, "a") as f: subprocess.run( ["./sshash", "bench", "-i", str(index_path)], @@ -85,15 +85,15 @@ def run_bench(k: int, canonical: bool, repetitions: int = 3): # --- Build for k=31 --- build_project(max_k63=False) -run_bench(k=31, canonical=False) -run_bench(k=31, canonical=True) +run_bench(31, False) +run_bench(31, True) # --- Build for k=63 --- build_project(max_k63=True) -run_bench(k=63, canonical=False) -run_bench(k=63, canonical=True) +run_bench(63, False) +run_bench(63, True) # --- Restore to default --- build_project(max_k63=False) -print("\n All SSHash benchmark runs completed successfully.\n") +print("\n All SSHash benchmark runs completed successfully. \n") diff --git a/script/build.py b/script/build.py index 9a99716..3c10486 100644 --- a/script/build.py +++ b/script/build.py @@ -71,7 +71,7 @@ def build_sshash(k, canonical, m_values): input_file = prefix / f"eulertigs/{dataset}.k{k}.eulertigs.fa.gz" output_file = index_dir / f"{dataset}.k{k}" if canonical: - output_file = output_file + ".canon" + output_file = str(output_file) + ".canon" print(f"\n>>> Building {dataset} (k={k}, m={m_val}, mode={mode})\n") From eefc24ea83db005deea23cb693b1cb46f76da521 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 10 Nov 2025 18:36:33 +0100 Subject: [PATCH 092/112] updated essentials; fixed script --- benchmarks/download-datasets.sh | 23 +++++++++++++++++++++-- external/pthash | 2 +- script/bench.py | 12 +++++------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/benchmarks/download-datasets.sh b/benchmarks/download-datasets.sh index 3892936..a3dd9a9 100644 --- a/benchmarks/download-datasets.sh +++ b/benchmarks/download-datasets.sh @@ -9,8 +9,27 @@ wget https://zenodo.org/records/7239205/files/human.k31.unitigs.fa.ust.fa.gz wget https://zenodo.org/records/7239205/files/human.k63.unitigs.fa.ust.fa.gz # queries -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR583/004/SRR5833294/SRR5833294.fastq.gz + +# cod wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR128/049/SRR12858649/SRR12858649.fastq.gz + +# kestrel wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR114/043/SRR11449743/SRR11449743_1.fastq.gz -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR801/SRR801268/SRR801268_1.fastq.gz + +# human, hprc +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR583/004/SRR5833294/SRR5833294.fastq.gz + +# axolotl +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR216/001/ERR2163351/ERR2163351.fastq.gz + +# EC wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR590/005/SRR5901135/SRR5901135_1.fastq.gz + +# SE +wget wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR801/SRR801268/SRR801268_1.fastq.gz + +# ncbi-virus: it's actually low hit... +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR321/ERR321482/ERR321482_1.fastq.gz + +# for jgi-fungi: it's actually low hit... +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR106/023/SRR10664323/SRR10664323_1.fastq.gz diff --git a/external/pthash b/external/pthash index 13e0572..cdeee6e 160000 --- a/external/pthash +++ b/external/pthash @@ -1 +1 @@ -Subproject commit 13e0572dd92582c29f8c33ed2b21ddb64058bc96 +Subproject commit cdeee6ef1cc97d7cdb022e5d2d0013981335ee3e diff --git a/script/bench.py b/script/bench.py index 447b42a..78237ef 100644 --- a/script/bench.py +++ b/script/bench.py @@ -54,6 +54,7 @@ def run_bench(k, canonical, runs = 3): out_dir = results_dir / f"k{k}" out_dir.mkdir(parents=True, exist_ok=True) log_file = out_dir / f"{mode}-bench.log" + json_file = out_dir / f"{mode}-bench.json" for dataset in datasets: suffix = f".k{k}.canon.sshash" if canonical else f".k{k}.sshash" @@ -62,13 +63,10 @@ def run_bench(k, canonical, runs = 3): print(f"\n>>> Benchmarking {dataset} (k={k}, mode={mode})\n") for i in range(runs): print(f" ==> run {i+1}/{runs}") - with open(log_file, "a") as f: - subprocess.run( - ["./sshash", "bench", "-i", str(index_path)], - stdout=f, - stderr=f, - check=True - ) + cmd = ["./sshash", "bench", "-i", str(index_path)] + # Append stdout to .log, stderr to .json + with open(log_file, "a") as log, open(json_file, "a") as js: + subprocess.run(cmd, stdout=log, stderr=js, check=True) # ------------------------------ # Prepare directories From efc3212d06d0fb27e2c7d8a47ce509b0576ddb9f Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 10 Nov 2025 21:55:08 +0100 Subject: [PATCH 093/112] fix streaming query multiline fasta --- include/util.hpp | 56 ++++++------------------------------------------ src/query.cpp | 1 + 2 files changed, 7 insertions(+), 50 deletions(-) diff --git a/include/util.hpp b/include/util.hpp index 784bb9b..c7a2662 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -314,67 +314,23 @@ minimizer_info compute_minimizer(kmer_t kmer, const uint64_t k, const uint64_t m } // namespace util -// taken from tlx -static inline std::istream& appendline(std::istream& is, std::string& str, char delim = '\n') { - size_t size = str.size(); - size_t capacity = str.capacity(); - std::streamsize rest = capacity - size; - - if (rest == 0) { - // if rest is zero, already expand string - capacity = std::max(static_cast(8), capacity * 2); - rest = capacity - size; - } - - // give getline access to all of capacity - str.resize(capacity); - - // get until delim or rest is filled - is.getline(const_cast(str.data()) + size, rest, delim); - - // gcount includes the delimiter - size_t new_size = size + is.gcount(); - - // is failbit set? - if (!is) { - // if string ran out of space, expand, and retry - if (is.gcount() + 1 == rest) { - is.clear(); - str.resize(new_size); - str.reserve(capacity * 2); - return appendline(is, str, delim); - } - // else fall through and deliver error - } else if (!is.eof()) { - // subtract delimiter - --new_size; - } - - // resize string to fit its contents - str.resize(new_size); - return is; -} - struct buffered_lines_iterator { static const uint64_t BUFFER_SIZE = 1024; buffered_lines_iterator(std::istream& is, uint64_t buffer_size = BUFFER_SIZE) : m_is(is), m_buffer_size(buffer_size), m_read_chars(0) {} - bool fill_buffer(std::string& buffer, - bool force = false /* force reading of m_buffer_size characters */ - ) { + bool fill_buffer(std::string& buffer) { + if (buffer.size() >= m_buffer_size) return false; + bool empty_line_was_read = false; uint64_t size = buffer.size(); - uint64_t target_size = size + m_buffer_size; - if (force) target_size += m_buffer_size; - - buffer.resize(target_size); + buffer.resize(m_buffer_size); char* ptr = buffer.data() + size; - while (size != target_size) { + while (size < m_buffer_size) { // read until '\n' or rest is filled - uint64_t rest = target_size - size; + uint64_t rest = m_buffer_size - size; m_is.getline(ptr, rest, '\n'); uint64_t read_chars = m_is.gcount(); m_read_chars += read_chars; diff --git a/src/query.cpp b/src/query.cpp index aa69b39..4175b1f 100644 --- a/src/query.cpp +++ b/src/query.cpp @@ -18,6 +18,7 @@ streaming_query_report streaming_query_from_fasta_file_multiline(Dict const* dic query.reset(); while (!it.eof()) { bool empty_line_was_read = it.fill_buffer(buffer); + if (buffer.size() == 0) continue; const uint64_t num_kmers = buffer.size() - k + 1; report.num_kmers += num_kmers; for (uint64_t i = 0; i != num_kmers; ++i) { From b7f815f7ccdcc3037be2bdc3314ce93e64de7ed3 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 10 Nov 2025 22:38:37 +0100 Subject: [PATCH 094/112] more stats to json --- include/builder/dictionary_builder.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/builder/dictionary_builder.hpp b/include/builder/dictionary_builder.hpp index c6ebd01..65703c0 100644 --- a/include/builder/dictionary_builder.hpp +++ b/include/builder/dictionary_builder.hpp @@ -71,6 +71,10 @@ struct dictionary_builder // d.print_space_breakdown(); } + build_stats.add("total_build_time_in_microsec", total_time_musec); + build_stats.add("index_size_in_bytes", (d.num_bits() + 7) / 8); + build_stats.add("num_kmers", d.num_kmers()); + build_stats.print(); } From 2e6c05bf6abbf7dd1fc3bdcad5a22e6979a284b5 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 10 Nov 2025 22:51:33 +0100 Subject: [PATCH 095/112] bench results 10/11/25 --- .../results-10-11-25/k31/canon-bench.json | 27 ++++ .../results-10-11-25/k31/canon-bench.log | 135 ++++++++++++++++++ .../results-10-11-25/k31/regular-bench.json | 27 ++++ .../results-10-11-25/k31/regular-bench.log | 135 ++++++++++++++++++ .../results-10-11-25/k63/canon-bench.json | 27 ++++ .../results-10-11-25/k63/canon-bench.log | 135 ++++++++++++++++++ .../results-10-11-25/k63/regular-bench.json | 27 ++++ .../results-10-11-25/k63/regular-bench.log | 135 ++++++++++++++++++ 8 files changed, 648 insertions(+) create mode 100644 benchmarks/results-10-11-25/k31/canon-bench.json create mode 100644 benchmarks/results-10-11-25/k31/canon-bench.log create mode 100644 benchmarks/results-10-11-25/k31/regular-bench.json create mode 100644 benchmarks/results-10-11-25/k31/regular-bench.log create mode 100644 benchmarks/results-10-11-25/k63/canon-bench.json create mode 100644 benchmarks/results-10-11-25/k63/canon-bench.log create mode 100644 benchmarks/results-10-11-25/k63/regular-bench.json create mode 100644 benchmarks/results-10-11-25/k63/regular-bench.log diff --git a/benchmarks/results-10-11-25/k31/canon-bench.json b/benchmarks/results-10-11-25/k31/canon-bench.json new file mode 100644 index 0000000..b0d06f8 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-bench.json @@ -0,0 +1,27 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "437.640303", "negative lookup (avg_nanosec_per_kmer)": "368.735412", "access (avg_nanosec_per_kmer)": "275.079856", "iterator (avg_nanosec_per_kmer)": "2.499007"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "454.028618", "negative lookup (avg_nanosec_per_kmer)": "371.439905", "access (avg_nanosec_per_kmer)": "277.998081", "iterator (avg_nanosec_per_kmer)": "2.557738"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "439.052926", "negative lookup (avg_nanosec_per_kmer)": "364.553518", "access (avg_nanosec_per_kmer)": "278.494305", "iterator (avg_nanosec_per_kmer)": "2.542095"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "442.814541", "negative lookup (avg_nanosec_per_kmer)": "394.080458", "access (avg_nanosec_per_kmer)": "277.356330", "iterator (avg_nanosec_per_kmer)": "2.551238"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "438.393034", "negative lookup (avg_nanosec_per_kmer)": "397.279347", "access (avg_nanosec_per_kmer)": "276.140528", "iterator (avg_nanosec_per_kmer)": "2.578091"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash", "k": "31", "m": "20", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "444.467988", "negative lookup (avg_nanosec_per_kmer)": "395.111831", "access (avg_nanosec_per_kmer)": "275.241797", "iterator (avg_nanosec_per_kmer)": "2.516939"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "607.905103", "negative lookup (avg_nanosec_per_kmer)": "424.479846", "access (avg_nanosec_per_kmer)": "351.518291", "iterator (avg_nanosec_per_kmer)": "2.595285"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "604.119962", "negative lookup (avg_nanosec_per_kmer)": "424.261657", "access (avg_nanosec_per_kmer)": "352.599607", "iterator (avg_nanosec_per_kmer)": "2.513324"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "614.129887", "negative lookup (avg_nanosec_per_kmer)": "424.319141", "access (avg_nanosec_per_kmer)": "351.839341", "iterator (avg_nanosec_per_kmer)": "2.570409"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "964.312976", "negative lookup (avg_nanosec_per_kmer)": "590.478722", "access (avg_nanosec_per_kmer)": "878.720946", "iterator (avg_nanosec_per_kmer)": "2.500330"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "965.664933", "negative lookup (avg_nanosec_per_kmer)": "600.547251", "access (avg_nanosec_per_kmer)": "880.682088", "iterator (avg_nanosec_per_kmer)": "2.529999"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "962.638510", "negative lookup (avg_nanosec_per_kmer)": "592.798034", "access (avg_nanosec_per_kmer)": "887.008503", "iterator (avg_nanosec_per_kmer)": "2.522038"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "804.471276", "negative lookup (avg_nanosec_per_kmer)": "464.980411", "access (avg_nanosec_per_kmer)": "538.081542", "iterator (avg_nanosec_per_kmer)": "2.542060"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "799.616952", "negative lookup (avg_nanosec_per_kmer)": "456.482477", "access (avg_nanosec_per_kmer)": "534.852676", "iterator (avg_nanosec_per_kmer)": "2.502930"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "802.152088", "negative lookup (avg_nanosec_per_kmer)": "461.817978", "access (avg_nanosec_per_kmer)": "549.113821", "iterator (avg_nanosec_per_kmer)": "2.537954"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "787.872622", "negative lookup (avg_nanosec_per_kmer)": "411.104772", "access (avg_nanosec_per_kmer)": "384.002101", "iterator (avg_nanosec_per_kmer)": "2.553101"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "798.311633", "negative lookup (avg_nanosec_per_kmer)": "410.851839", "access (avg_nanosec_per_kmer)": "388.069527", "iterator (avg_nanosec_per_kmer)": "2.513800"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "789.019697", "negative lookup (avg_nanosec_per_kmer)": "411.631504", "access (avg_nanosec_per_kmer)": "386.654014", "iterator (avg_nanosec_per_kmer)": "2.509549"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "692.848571", "negative lookup (avg_nanosec_per_kmer)": "400.421416", "access (avg_nanosec_per_kmer)": "365.651520", "iterator (avg_nanosec_per_kmer)": "2.470192"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "699.180468", "negative lookup (avg_nanosec_per_kmer)": "399.504994", "access (avg_nanosec_per_kmer)": "361.013311", "iterator (avg_nanosec_per_kmer)": "2.458981"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "703.840309", "negative lookup (avg_nanosec_per_kmer)": "406.306273", "access (avg_nanosec_per_kmer)": "360.361614", "iterator (avg_nanosec_per_kmer)": "2.460564"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash", "k": "31", "m": "19", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "406.652311", "negative lookup (avg_nanosec_per_kmer)": "354.570676", "access (avg_nanosec_per_kmer)": "261.789137", "iterator (avg_nanosec_per_kmer)": "2.543308"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash", "k": "31", "m": "19", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "408.743713", "negative lookup (avg_nanosec_per_kmer)": "356.006719", "access (avg_nanosec_per_kmer)": "260.019499", "iterator (avg_nanosec_per_kmer)": "2.557492"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash", "k": "31", "m": "19", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "407.029910", "negative lookup (avg_nanosec_per_kmer)": "358.602815", "access (avg_nanosec_per_kmer)": "260.672789", "iterator (avg_nanosec_per_kmer)": "2.553014"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "749.156047", "negative lookup (avg_nanosec_per_kmer)": "552.016283", "access (avg_nanosec_per_kmer)": "679.750339", "iterator (avg_nanosec_per_kmer)": "2.528279"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "750.656001", "negative lookup (avg_nanosec_per_kmer)": "550.621588", "access (avg_nanosec_per_kmer)": "675.161470", "iterator (avg_nanosec_per_kmer)": "2.515422"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash", "k": "31", "m": "21", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "749.104199", "negative lookup (avg_nanosec_per_kmer)": "556.790046", "access (avg_nanosec_per_kmer)": "683.967747", "iterator (avg_nanosec_per_kmer)": "2.602998"} diff --git a/benchmarks/results-10-11-25/k31/canon-bench.log b/benchmarks/results-10-11-25/k31/canon-bench.log new file mode 100644 index 0000000..e40f300 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-bench.log @@ -0,0 +1,135 @@ +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 437.64 +negative lookup (avg_nanosec_per_kmer) 368.735 +access (avg_nanosec_per_kmer) = 275.08 +iterator (avg_nanosec_per_kmer) = 2.49901 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 454.029 +negative lookup (avg_nanosec_per_kmer) 371.44 +access (avg_nanosec_per_kmer) = 277.998 +iterator (avg_nanosec_per_kmer) = 2.55774 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 439.053 +negative lookup (avg_nanosec_per_kmer) 364.554 +access (avg_nanosec_per_kmer) = 278.494 +iterator (avg_nanosec_per_kmer) = 2.5421 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 442.815 +negative lookup (avg_nanosec_per_kmer) 394.08 +access (avg_nanosec_per_kmer) = 277.356 +iterator (avg_nanosec_per_kmer) = 2.55124 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 438.393 +negative lookup (avg_nanosec_per_kmer) 397.279 +access (avg_nanosec_per_kmer) = 276.141 +iterator (avg_nanosec_per_kmer) = 2.57809 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 444.468 +negative lookup (avg_nanosec_per_kmer) 395.112 +access (avg_nanosec_per_kmer) = 275.242 +iterator (avg_nanosec_per_kmer) = 2.51694 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 607.905 +negative lookup (avg_nanosec_per_kmer) 424.48 +access (avg_nanosec_per_kmer) = 351.518 +iterator (avg_nanosec_per_kmer) = 2.59528 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 604.12 +negative lookup (avg_nanosec_per_kmer) 424.262 +access (avg_nanosec_per_kmer) = 352.6 +iterator (avg_nanosec_per_kmer) = 2.51332 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 614.13 +negative lookup (avg_nanosec_per_kmer) 424.319 +access (avg_nanosec_per_kmer) = 351.839 +iterator (avg_nanosec_per_kmer) = 2.57041 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 964.313 +negative lookup (avg_nanosec_per_kmer) 590.479 +access (avg_nanosec_per_kmer) = 878.721 +iterator (avg_nanosec_per_kmer) = 2.50033 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 965.665 +negative lookup (avg_nanosec_per_kmer) 600.547 +access (avg_nanosec_per_kmer) = 880.682 +iterator (avg_nanosec_per_kmer) = 2.53 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 962.639 +negative lookup (avg_nanosec_per_kmer) 592.798 +access (avg_nanosec_per_kmer) = 887.009 +iterator (avg_nanosec_per_kmer) = 2.52204 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 804.471 +negative lookup (avg_nanosec_per_kmer) 464.98 +access (avg_nanosec_per_kmer) = 538.082 +iterator (avg_nanosec_per_kmer) = 2.54206 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 799.617 +negative lookup (avg_nanosec_per_kmer) 456.482 +access (avg_nanosec_per_kmer) = 534.853 +iterator (avg_nanosec_per_kmer) = 2.50293 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 802.152 +negative lookup (avg_nanosec_per_kmer) 461.818 +access (avg_nanosec_per_kmer) = 549.114 +iterator (avg_nanosec_per_kmer) = 2.53795 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 787.873 +negative lookup (avg_nanosec_per_kmer) 411.105 +access (avg_nanosec_per_kmer) = 384.002 +iterator (avg_nanosec_per_kmer) = 2.5531 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 798.312 +negative lookup (avg_nanosec_per_kmer) 410.852 +access (avg_nanosec_per_kmer) = 388.07 +iterator (avg_nanosec_per_kmer) = 2.5138 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 789.02 +negative lookup (avg_nanosec_per_kmer) 411.632 +access (avg_nanosec_per_kmer) = 386.654 +iterator (avg_nanosec_per_kmer) = 2.50955 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 692.849 +negative lookup (avg_nanosec_per_kmer) 400.421 +access (avg_nanosec_per_kmer) = 365.652 +iterator (avg_nanosec_per_kmer) = 2.47019 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 699.18 +negative lookup (avg_nanosec_per_kmer) 399.505 +access (avg_nanosec_per_kmer) = 361.013 +iterator (avg_nanosec_per_kmer) = 2.45898 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 703.84 +negative lookup (avg_nanosec_per_kmer) 406.306 +access (avg_nanosec_per_kmer) = 360.362 +iterator (avg_nanosec_per_kmer) = 2.46056 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 406.652 +negative lookup (avg_nanosec_per_kmer) 354.571 +access (avg_nanosec_per_kmer) = 261.789 +iterator (avg_nanosec_per_kmer) = 2.54331 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 408.744 +negative lookup (avg_nanosec_per_kmer) 356.007 +access (avg_nanosec_per_kmer) = 260.019 +iterator (avg_nanosec_per_kmer) = 2.55749 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 407.03 +negative lookup (avg_nanosec_per_kmer) 358.603 +access (avg_nanosec_per_kmer) = 260.673 +iterator (avg_nanosec_per_kmer) = 2.55301 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 749.156 +negative lookup (avg_nanosec_per_kmer) 552.016 +access (avg_nanosec_per_kmer) = 679.75 +iterator (avg_nanosec_per_kmer) = 2.52828 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 750.656 +negative lookup (avg_nanosec_per_kmer) 550.622 +access (avg_nanosec_per_kmer) = 675.161 +iterator (avg_nanosec_per_kmer) = 2.51542 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 749.104 +negative lookup (avg_nanosec_per_kmer) 556.79 +access (avg_nanosec_per_kmer) = 683.968 +iterator (avg_nanosec_per_kmer) = 2.603 diff --git a/benchmarks/results-10-11-25/k31/regular-bench.json b/benchmarks/results-10-11-25/k31/regular-bench.json new file mode 100644 index 0000000..3377f8b --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-bench.json @@ -0,0 +1,27 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "593.468372", "negative lookup (avg_nanosec_per_kmer)": "669.693262", "access (avg_nanosec_per_kmer)": "276.835679", "iterator (avg_nanosec_per_kmer)": "2.538931"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "595.468905", "negative lookup (avg_nanosec_per_kmer)": "674.647963", "access (avg_nanosec_per_kmer)": "277.032749", "iterator (avg_nanosec_per_kmer)": "2.567583"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "595.824805", "negative lookup (avg_nanosec_per_kmer)": "675.654607", "access (avg_nanosec_per_kmer)": "275.144576", "iterator (avg_nanosec_per_kmer)": "2.547010"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "605.924314", "negative lookup (avg_nanosec_per_kmer)": "743.327657", "access (avg_nanosec_per_kmer)": "278.247136", "iterator (avg_nanosec_per_kmer)": "2.608827"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "607.134942", "negative lookup (avg_nanosec_per_kmer)": "735.006204", "access (avg_nanosec_per_kmer)": "277.400333", "iterator (avg_nanosec_per_kmer)": "2.515158"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash", "k": "31", "m": "20", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "606.580916", "negative lookup (avg_nanosec_per_kmer)": "739.803977", "access (avg_nanosec_per_kmer)": "279.166931", "iterator (avg_nanosec_per_kmer)": "2.571017"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "813.941644", "negative lookup (avg_nanosec_per_kmer)": "801.526599", "access (avg_nanosec_per_kmer)": "351.348360", "iterator (avg_nanosec_per_kmer)": "2.545131"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "827.115043", "negative lookup (avg_nanosec_per_kmer)": "798.392897", "access (avg_nanosec_per_kmer)": "379.988941", "iterator (avg_nanosec_per_kmer)": "2.509446"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "815.452368", "negative lookup (avg_nanosec_per_kmer)": "796.054816", "access (avg_nanosec_per_kmer)": "349.788425", "iterator (avg_nanosec_per_kmer)": "2.525423"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1279.524666", "negative lookup (avg_nanosec_per_kmer)": "1140.356605", "access (avg_nanosec_per_kmer)": "911.249444", "iterator (avg_nanosec_per_kmer)": "2.617473"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1280.785104", "negative lookup (avg_nanosec_per_kmer)": "1130.026929", "access (avg_nanosec_per_kmer)": "882.075007", "iterator (avg_nanosec_per_kmer)": "2.520366"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1281.807215", "negative lookup (avg_nanosec_per_kmer)": "1135.152370", "access (avg_nanosec_per_kmer)": "884.420808", "iterator (avg_nanosec_per_kmer)": "2.547944"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1054.962798", "negative lookup (avg_nanosec_per_kmer)": "849.982934", "access (avg_nanosec_per_kmer)": "546.170974", "iterator (avg_nanosec_per_kmer)": "2.529945"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1053.023746", "negative lookup (avg_nanosec_per_kmer)": "854.227562", "access (avg_nanosec_per_kmer)": "538.476049", "iterator (avg_nanosec_per_kmer)": "2.497507"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1059.839346", "negative lookup (avg_nanosec_per_kmer)": "865.469048", "access (avg_nanosec_per_kmer)": "546.279808", "iterator (avg_nanosec_per_kmer)": "2.541977"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "981.367394", "negative lookup (avg_nanosec_per_kmer)": "763.714532", "access (avg_nanosec_per_kmer)": "389.740954", "iterator (avg_nanosec_per_kmer)": "2.483201"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "991.675857", "negative lookup (avg_nanosec_per_kmer)": "770.689714", "access (avg_nanosec_per_kmer)": "388.704925", "iterator (avg_nanosec_per_kmer)": "2.546658"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "980.133409", "negative lookup (avg_nanosec_per_kmer)": "764.223274", "access (avg_nanosec_per_kmer)": "389.881518", "iterator (avg_nanosec_per_kmer)": "2.501424"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "901.917992", "negative lookup (avg_nanosec_per_kmer)": "756.057889", "access (avg_nanosec_per_kmer)": "362.369540", "iterator (avg_nanosec_per_kmer)": "2.521895"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "898.436881", "negative lookup (avg_nanosec_per_kmer)": "753.081349", "access (avg_nanosec_per_kmer)": "364.493503", "iterator (avg_nanosec_per_kmer)": "2.486766"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "899.569776", "negative lookup (avg_nanosec_per_kmer)": "756.405967", "access (avg_nanosec_per_kmer)": "360.164163", "iterator (avg_nanosec_per_kmer)": "2.613320"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash", "k": "31", "m": "19", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "541.245229", "negative lookup (avg_nanosec_per_kmer)": "653.133132", "access (avg_nanosec_per_kmer)": "262.337790", "iterator (avg_nanosec_per_kmer)": "2.551707"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash", "k": "31", "m": "19", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "541.255620", "negative lookup (avg_nanosec_per_kmer)": "645.457730", "access (avg_nanosec_per_kmer)": "266.065450", "iterator (avg_nanosec_per_kmer)": "2.564080"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash", "k": "31", "m": "19", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "540.294952", "negative lookup (avg_nanosec_per_kmer)": "649.277321", "access (avg_nanosec_per_kmer)": "262.223913", "iterator (avg_nanosec_per_kmer)": "2.537130"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "988.726663", "negative lookup (avg_nanosec_per_kmer)": "1040.039111", "access (avg_nanosec_per_kmer)": "684.857732", "iterator (avg_nanosec_per_kmer)": "2.550971"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "993.003917", "negative lookup (avg_nanosec_per_kmer)": "1049.810215", "access (avg_nanosec_per_kmer)": "679.543637", "iterator (avg_nanosec_per_kmer)": "2.545148"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash", "k": "31", "m": "21", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "993.312118", "negative lookup (avg_nanosec_per_kmer)": "1038.729618", "access (avg_nanosec_per_kmer)": "680.134008", "iterator (avg_nanosec_per_kmer)": "2.543616"} diff --git a/benchmarks/results-10-11-25/k31/regular-bench.log b/benchmarks/results-10-11-25/k31/regular-bench.log new file mode 100644 index 0000000..4e6146c --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-bench.log @@ -0,0 +1,135 @@ +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 593.468 +negative lookup (avg_nanosec_per_kmer) 669.693 +access (avg_nanosec_per_kmer) = 276.836 +iterator (avg_nanosec_per_kmer) = 2.53893 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 595.469 +negative lookup (avg_nanosec_per_kmer) 674.648 +access (avg_nanosec_per_kmer) = 277.033 +iterator (avg_nanosec_per_kmer) = 2.56758 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 595.825 +negative lookup (avg_nanosec_per_kmer) 675.655 +access (avg_nanosec_per_kmer) = 275.145 +iterator (avg_nanosec_per_kmer) = 2.54701 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 605.924 +negative lookup (avg_nanosec_per_kmer) 743.328 +access (avg_nanosec_per_kmer) = 278.247 +iterator (avg_nanosec_per_kmer) = 2.60883 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 607.135 +negative lookup (avg_nanosec_per_kmer) 735.006 +access (avg_nanosec_per_kmer) = 277.4 +iterator (avg_nanosec_per_kmer) = 2.51516 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 606.581 +negative lookup (avg_nanosec_per_kmer) 739.804 +access (avg_nanosec_per_kmer) = 279.167 +iterator (avg_nanosec_per_kmer) = 2.57102 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 813.942 +negative lookup (avg_nanosec_per_kmer) 801.527 +access (avg_nanosec_per_kmer) = 351.348 +iterator (avg_nanosec_per_kmer) = 2.54513 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 827.115 +negative lookup (avg_nanosec_per_kmer) 798.393 +access (avg_nanosec_per_kmer) = 379.989 +iterator (avg_nanosec_per_kmer) = 2.50945 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 815.452 +negative lookup (avg_nanosec_per_kmer) 796.055 +access (avg_nanosec_per_kmer) = 349.788 +iterator (avg_nanosec_per_kmer) = 2.52542 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1279.52 +negative lookup (avg_nanosec_per_kmer) 1140.36 +access (avg_nanosec_per_kmer) = 911.249 +iterator (avg_nanosec_per_kmer) = 2.61747 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1280.79 +negative lookup (avg_nanosec_per_kmer) 1130.03 +access (avg_nanosec_per_kmer) = 882.075 +iterator (avg_nanosec_per_kmer) = 2.52037 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1281.81 +negative lookup (avg_nanosec_per_kmer) 1135.15 +access (avg_nanosec_per_kmer) = 884.421 +iterator (avg_nanosec_per_kmer) = 2.54794 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1054.96 +negative lookup (avg_nanosec_per_kmer) 849.983 +access (avg_nanosec_per_kmer) = 546.171 +iterator (avg_nanosec_per_kmer) = 2.52994 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1053.02 +negative lookup (avg_nanosec_per_kmer) 854.228 +access (avg_nanosec_per_kmer) = 538.476 +iterator (avg_nanosec_per_kmer) = 2.49751 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 1059.84 +negative lookup (avg_nanosec_per_kmer) 865.469 +access (avg_nanosec_per_kmer) = 546.28 +iterator (avg_nanosec_per_kmer) = 2.54198 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 981.367 +negative lookup (avg_nanosec_per_kmer) 763.715 +access (avg_nanosec_per_kmer) = 389.741 +iterator (avg_nanosec_per_kmer) = 2.4832 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 991.676 +negative lookup (avg_nanosec_per_kmer) 770.69 +access (avg_nanosec_per_kmer) = 388.705 +iterator (avg_nanosec_per_kmer) = 2.54666 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 980.133 +negative lookup (avg_nanosec_per_kmer) 764.223 +access (avg_nanosec_per_kmer) = 389.882 +iterator (avg_nanosec_per_kmer) = 2.50142 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 901.918 +negative lookup (avg_nanosec_per_kmer) 756.058 +access (avg_nanosec_per_kmer) = 362.37 +iterator (avg_nanosec_per_kmer) = 2.5219 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 898.437 +negative lookup (avg_nanosec_per_kmer) 753.081 +access (avg_nanosec_per_kmer) = 364.494 +iterator (avg_nanosec_per_kmer) = 2.48677 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 899.57 +negative lookup (avg_nanosec_per_kmer) 756.406 +access (avg_nanosec_per_kmer) = 360.164 +iterator (avg_nanosec_per_kmer) = 2.61332 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 541.245 +negative lookup (avg_nanosec_per_kmer) 653.133 +access (avg_nanosec_per_kmer) = 262.338 +iterator (avg_nanosec_per_kmer) = 2.55171 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 541.256 +negative lookup (avg_nanosec_per_kmer) 645.458 +access (avg_nanosec_per_kmer) = 266.065 +iterator (avg_nanosec_per_kmer) = 2.56408 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 540.295 +negative lookup (avg_nanosec_per_kmer) 649.277 +access (avg_nanosec_per_kmer) = 262.224 +iterator (avg_nanosec_per_kmer) = 2.53713 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 988.727 +negative lookup (avg_nanosec_per_kmer) 1040.04 +access (avg_nanosec_per_kmer) = 684.858 +iterator (avg_nanosec_per_kmer) = 2.55097 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 993.004 +negative lookup (avg_nanosec_per_kmer) 1049.81 +access (avg_nanosec_per_kmer) = 679.544 +iterator (avg_nanosec_per_kmer) = 2.54515 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash +positive lookup (avg_nanosec_per_kmer) = 993.312 +negative lookup (avg_nanosec_per_kmer) 1038.73 +access (avg_nanosec_per_kmer) = 680.134 +iterator (avg_nanosec_per_kmer) = 2.54362 diff --git a/benchmarks/results-10-11-25/k63/canon-bench.json b/benchmarks/results-10-11-25/k63/canon-bench.json new file mode 100644 index 0000000..9250c79 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-bench.json @@ -0,0 +1,27 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "557.269099", "negative lookup (avg_nanosec_per_kmer)": "442.286796", "access (avg_nanosec_per_kmer)": "291.709738", "iterator (avg_nanosec_per_kmer)": "2.920477"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "562.071228", "negative lookup (avg_nanosec_per_kmer)": "443.072877", "access (avg_nanosec_per_kmer)": "291.651493", "iterator (avg_nanosec_per_kmer)": "2.912875"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "569.896698", "negative lookup (avg_nanosec_per_kmer)": "450.983682", "access (avg_nanosec_per_kmer)": "291.025846", "iterator (avg_nanosec_per_kmer)": "2.913137"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "534.079325", "negative lookup (avg_nanosec_per_kmer)": "476.376665", "access (avg_nanosec_per_kmer)": "328.843534", "iterator (avg_nanosec_per_kmer)": "2.963414"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "536.497629", "negative lookup (avg_nanosec_per_kmer)": "482.526724", "access (avg_nanosec_per_kmer)": "325.917173", "iterator (avg_nanosec_per_kmer)": "2.902107"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash", "k": "63", "m": "24", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "537.505202", "negative lookup (avg_nanosec_per_kmer)": "475.474755", "access (avg_nanosec_per_kmer)": "330.187994", "iterator (avg_nanosec_per_kmer)": "2.902902"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "684.323283", "negative lookup (avg_nanosec_per_kmer)": "510.931251", "access (avg_nanosec_per_kmer)": "362.611814", "iterator (avg_nanosec_per_kmer)": "2.943467"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "681.865558", "negative lookup (avg_nanosec_per_kmer)": "514.816640", "access (avg_nanosec_per_kmer)": "358.338285", "iterator (avg_nanosec_per_kmer)": "2.913519"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "690.784094", "negative lookup (avg_nanosec_per_kmer)": "519.457408", "access (avg_nanosec_per_kmer)": "357.355389", "iterator (avg_nanosec_per_kmer)": "2.901267"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1252.976566", "negative lookup (avg_nanosec_per_kmer)": "682.253411", "access (avg_nanosec_per_kmer)": "762.472543", "iterator (avg_nanosec_per_kmer)": "2.926400"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1248.655529", "negative lookup (avg_nanosec_per_kmer)": "670.957837", "access (avg_nanosec_per_kmer)": "748.885651", "iterator (avg_nanosec_per_kmer)": "3.011971"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1253.046049", "negative lookup (avg_nanosec_per_kmer)": "671.440149", "access (avg_nanosec_per_kmer)": "768.426437", "iterator (avg_nanosec_per_kmer)": "2.947120"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1101.847356", "negative lookup (avg_nanosec_per_kmer)": "576.618390", "access (avg_nanosec_per_kmer)": "636.389182", "iterator (avg_nanosec_per_kmer)": "3.072998"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1109.024011", "negative lookup (avg_nanosec_per_kmer)": "591.608500", "access (avg_nanosec_per_kmer)": "639.914436", "iterator (avg_nanosec_per_kmer)": "3.029005"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1122.059020", "negative lookup (avg_nanosec_per_kmer)": "576.365005", "access (avg_nanosec_per_kmer)": "639.753773", "iterator (avg_nanosec_per_kmer)": "3.242957"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1360.425486", "negative lookup (avg_nanosec_per_kmer)": "509.213953", "access (avg_nanosec_per_kmer)": "460.379995", "iterator (avg_nanosec_per_kmer)": "3.003176"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1367.503204", "negative lookup (avg_nanosec_per_kmer)": "508.936788", "access (avg_nanosec_per_kmer)": "463.753427", "iterator (avg_nanosec_per_kmer)": "3.010433"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1375.681829", "negative lookup (avg_nanosec_per_kmer)": "512.584564", "access (avg_nanosec_per_kmer)": "460.318823", "iterator (avg_nanosec_per_kmer)": "3.006127"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1286.918580", "negative lookup (avg_nanosec_per_kmer)": "505.491398", "access (avg_nanosec_per_kmer)": "411.809111", "iterator (avg_nanosec_per_kmer)": "2.947131"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1278.123041", "negative lookup (avg_nanosec_per_kmer)": "505.843036", "access (avg_nanosec_per_kmer)": "416.596759", "iterator (avg_nanosec_per_kmer)": "2.975711"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash", "k": "63", "m": "31", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "1272.423829", "negative lookup (avg_nanosec_per_kmer)": "503.753170", "access (avg_nanosec_per_kmer)": "408.845076", "iterator (avg_nanosec_per_kmer)": "2.959579"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash", "k": "63", "m": "23", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "518.747259", "negative lookup (avg_nanosec_per_kmer)": "437.585843", "access (avg_nanosec_per_kmer)": "283.488334", "iterator (avg_nanosec_per_kmer)": "2.923136"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash", "k": "63", "m": "23", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "530.427021", "negative lookup (avg_nanosec_per_kmer)": "441.286428", "access (avg_nanosec_per_kmer)": "282.772049", "iterator (avg_nanosec_per_kmer)": "2.913750"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash", "k": "63", "m": "23", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "518.760590", "negative lookup (avg_nanosec_per_kmer)": "437.309395", "access (avg_nanosec_per_kmer)": "279.721828", "iterator (avg_nanosec_per_kmer)": "2.918568"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "880.286325", "negative lookup (avg_nanosec_per_kmer)": "616.673906", "access (avg_nanosec_per_kmer)": "583.735908", "iterator (avg_nanosec_per_kmer)": "2.925736"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "879.150094", "negative lookup (avg_nanosec_per_kmer)": "612.251125", "access (avg_nanosec_per_kmer)": "586.975133", "iterator (avg_nanosec_per_kmer)": "2.953926"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash", "k": "63", "m": "25", "canonical": "true", "positive lookup (avg_nanosec_per_kmer)": "883.840406", "negative lookup (avg_nanosec_per_kmer)": "621.500259", "access (avg_nanosec_per_kmer)": "586.320948", "iterator (avg_nanosec_per_kmer)": "2.927535"} diff --git a/benchmarks/results-10-11-25/k63/canon-bench.log b/benchmarks/results-10-11-25/k63/canon-bench.log new file mode 100644 index 0000000..b11cfe4 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-bench.log @@ -0,0 +1,135 @@ +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 557.269 +negative lookup (avg_nanosec_per_kmer) 442.287 +access (avg_nanosec_per_kmer) = 291.71 +iterator (avg_nanosec_per_kmer) = 2.92048 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 562.071 +negative lookup (avg_nanosec_per_kmer) 443.073 +access (avg_nanosec_per_kmer) = 291.651 +iterator (avg_nanosec_per_kmer) = 2.91287 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 569.897 +negative lookup (avg_nanosec_per_kmer) 450.984 +access (avg_nanosec_per_kmer) = 291.026 +iterator (avg_nanosec_per_kmer) = 2.91314 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 534.079 +negative lookup (avg_nanosec_per_kmer) 476.377 +access (avg_nanosec_per_kmer) = 328.844 +iterator (avg_nanosec_per_kmer) = 2.96341 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 536.498 +negative lookup (avg_nanosec_per_kmer) 482.527 +access (avg_nanosec_per_kmer) = 325.917 +iterator (avg_nanosec_per_kmer) = 2.90211 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 537.505 +negative lookup (avg_nanosec_per_kmer) 475.475 +access (avg_nanosec_per_kmer) = 330.188 +iterator (avg_nanosec_per_kmer) = 2.9029 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 684.323 +negative lookup (avg_nanosec_per_kmer) 510.931 +access (avg_nanosec_per_kmer) = 362.612 +iterator (avg_nanosec_per_kmer) = 2.94347 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 681.866 +negative lookup (avg_nanosec_per_kmer) 514.817 +access (avg_nanosec_per_kmer) = 358.338 +iterator (avg_nanosec_per_kmer) = 2.91352 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 690.784 +negative lookup (avg_nanosec_per_kmer) 519.457 +access (avg_nanosec_per_kmer) = 357.355 +iterator (avg_nanosec_per_kmer) = 2.90127 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1252.98 +negative lookup (avg_nanosec_per_kmer) 682.253 +access (avg_nanosec_per_kmer) = 762.473 +iterator (avg_nanosec_per_kmer) = 2.9264 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1248.66 +negative lookup (avg_nanosec_per_kmer) 670.958 +access (avg_nanosec_per_kmer) = 748.886 +iterator (avg_nanosec_per_kmer) = 3.01197 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1253.05 +negative lookup (avg_nanosec_per_kmer) 671.44 +access (avg_nanosec_per_kmer) = 768.426 +iterator (avg_nanosec_per_kmer) = 2.94712 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1101.85 +negative lookup (avg_nanosec_per_kmer) 576.618 +access (avg_nanosec_per_kmer) = 636.389 +iterator (avg_nanosec_per_kmer) = 3.073 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1109.02 +negative lookup (avg_nanosec_per_kmer) 591.609 +access (avg_nanosec_per_kmer) = 639.914 +iterator (avg_nanosec_per_kmer) = 3.02901 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1122.06 +negative lookup (avg_nanosec_per_kmer) 576.365 +access (avg_nanosec_per_kmer) = 639.754 +iterator (avg_nanosec_per_kmer) = 3.24296 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1360.43 +negative lookup (avg_nanosec_per_kmer) 509.214 +access (avg_nanosec_per_kmer) = 460.38 +iterator (avg_nanosec_per_kmer) = 3.00318 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1367.5 +negative lookup (avg_nanosec_per_kmer) 508.937 +access (avg_nanosec_per_kmer) = 463.753 +iterator (avg_nanosec_per_kmer) = 3.01043 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1375.68 +negative lookup (avg_nanosec_per_kmer) 512.585 +access (avg_nanosec_per_kmer) = 460.319 +iterator (avg_nanosec_per_kmer) = 3.00613 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1286.92 +negative lookup (avg_nanosec_per_kmer) 505.491 +access (avg_nanosec_per_kmer) = 411.809 +iterator (avg_nanosec_per_kmer) = 2.94713 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1278.12 +negative lookup (avg_nanosec_per_kmer) 505.843 +access (avg_nanosec_per_kmer) = 416.597 +iterator (avg_nanosec_per_kmer) = 2.97571 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 1272.42 +negative lookup (avg_nanosec_per_kmer) 503.753 +access (avg_nanosec_per_kmer) = 408.845 +iterator (avg_nanosec_per_kmer) = 2.95958 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 518.747 +negative lookup (avg_nanosec_per_kmer) 437.586 +access (avg_nanosec_per_kmer) = 283.488 +iterator (avg_nanosec_per_kmer) = 2.92314 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 530.427 +negative lookup (avg_nanosec_per_kmer) 441.286 +access (avg_nanosec_per_kmer) = 282.772 +iterator (avg_nanosec_per_kmer) = 2.91375 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 518.761 +negative lookup (avg_nanosec_per_kmer) 437.309 +access (avg_nanosec_per_kmer) = 279.722 +iterator (avg_nanosec_per_kmer) = 2.91857 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 880.286 +negative lookup (avg_nanosec_per_kmer) 616.674 +access (avg_nanosec_per_kmer) = 583.736 +iterator (avg_nanosec_per_kmer) = 2.92574 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 879.15 +negative lookup (avg_nanosec_per_kmer) 612.251 +access (avg_nanosec_per_kmer) = 586.975 +iterator (avg_nanosec_per_kmer) = 2.95393 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash +positive lookup (avg_nanosec_per_kmer) = 883.84 +negative lookup (avg_nanosec_per_kmer) 621.5 +access (avg_nanosec_per_kmer) = 586.321 +iterator (avg_nanosec_per_kmer) = 2.92754 diff --git a/benchmarks/results-10-11-25/k63/regular-bench.json b/benchmarks/results-10-11-25/k63/regular-bench.json new file mode 100644 index 0000000..cf762d3 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-bench.json @@ -0,0 +1,27 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "691.263021", "negative lookup (avg_nanosec_per_kmer)": "711.377981", "access (avg_nanosec_per_kmer)": "290.806842", "iterator (avg_nanosec_per_kmer)": "2.930255"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "680.682504", "negative lookup (avg_nanosec_per_kmer)": "708.874007", "access (avg_nanosec_per_kmer)": "292.682575", "iterator (avg_nanosec_per_kmer)": "2.922057"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "695.028987", "negative lookup (avg_nanosec_per_kmer)": "709.296994", "access (avg_nanosec_per_kmer)": "292.970623", "iterator (avg_nanosec_per_kmer)": "2.933936"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "665.363182", "negative lookup (avg_nanosec_per_kmer)": "782.044145", "access (avg_nanosec_per_kmer)": "327.483650", "iterator (avg_nanosec_per_kmer)": "2.913678"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "662.942952", "negative lookup (avg_nanosec_per_kmer)": "778.503150", "access (avg_nanosec_per_kmer)": "330.263870", "iterator (avg_nanosec_per_kmer)": "2.914674"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash", "k": "63", "m": "24", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "680.109998", "negative lookup (avg_nanosec_per_kmer)": "783.560782", "access (avg_nanosec_per_kmer)": "327.780588", "iterator (avg_nanosec_per_kmer)": "2.914947"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "870.332395", "negative lookup (avg_nanosec_per_kmer)": "864.239819", "access (avg_nanosec_per_kmer)": "360.617593", "iterator (avg_nanosec_per_kmer)": "2.904160"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "870.687183", "negative lookup (avg_nanosec_per_kmer)": "860.732890", "access (avg_nanosec_per_kmer)": "357.900472", "iterator (avg_nanosec_per_kmer)": "2.908669"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "880.858612", "negative lookup (avg_nanosec_per_kmer)": "855.405769", "access (avg_nanosec_per_kmer)": "360.504765", "iterator (avg_nanosec_per_kmer)": "2.948144"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1540.573845", "negative lookup (avg_nanosec_per_kmer)": "1155.274645", "access (avg_nanosec_per_kmer)": "759.041335", "iterator (avg_nanosec_per_kmer)": "2.931861"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1544.192421", "negative lookup (avg_nanosec_per_kmer)": "1149.791899", "access (avg_nanosec_per_kmer)": "751.690975", "iterator (avg_nanosec_per_kmer)": "2.937336"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1541.785496", "negative lookup (avg_nanosec_per_kmer)": "1157.108125", "access (avg_nanosec_per_kmer)": "754.569936", "iterator (avg_nanosec_per_kmer)": "3.030462"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1313.985264", "negative lookup (avg_nanosec_per_kmer)": "978.958743", "access (avg_nanosec_per_kmer)": "648.604746", "iterator (avg_nanosec_per_kmer)": "3.129373"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1322.750639", "negative lookup (avg_nanosec_per_kmer)": "974.624480", "access (avg_nanosec_per_kmer)": "647.356619", "iterator (avg_nanosec_per_kmer)": "3.042660"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1310.681843", "negative lookup (avg_nanosec_per_kmer)": "981.352905", "access (avg_nanosec_per_kmer)": "638.633135", "iterator (avg_nanosec_per_kmer)": "3.030584"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1828.775354", "negative lookup (avg_nanosec_per_kmer)": "860.880335", "access (avg_nanosec_per_kmer)": "458.102701", "iterator (avg_nanosec_per_kmer)": "3.023876"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1820.777033", "negative lookup (avg_nanosec_per_kmer)": "865.646887", "access (avg_nanosec_per_kmer)": "457.872156", "iterator (avg_nanosec_per_kmer)": "3.076924"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1815.061634", "negative lookup (avg_nanosec_per_kmer)": "862.646866", "access (avg_nanosec_per_kmer)": "459.945051", "iterator (avg_nanosec_per_kmer)": "3.017141"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1550.438345", "negative lookup (avg_nanosec_per_kmer)": "855.393987", "access (avg_nanosec_per_kmer)": "403.945717", "iterator (avg_nanosec_per_kmer)": "2.962174"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1537.682593", "negative lookup (avg_nanosec_per_kmer)": "853.390459", "access (avg_nanosec_per_kmer)": "408.068537", "iterator (avg_nanosec_per_kmer)": "2.963759"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash", "k": "63", "m": "31", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1543.086386", "negative lookup (avg_nanosec_per_kmer)": "843.749043", "access (avg_nanosec_per_kmer)": "406.675799", "iterator (avg_nanosec_per_kmer)": "2.998486"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash", "k": "63", "m": "23", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "598.821670", "negative lookup (avg_nanosec_per_kmer)": "693.448774", "access (avg_nanosec_per_kmer)": "284.324825", "iterator (avg_nanosec_per_kmer)": "2.926867"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash", "k": "63", "m": "23", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "618.440707", "negative lookup (avg_nanosec_per_kmer)": "687.975533", "access (avg_nanosec_per_kmer)": "281.168760", "iterator (avg_nanosec_per_kmer)": "2.930572"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash", "k": "63", "m": "23", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "611.720160", "negative lookup (avg_nanosec_per_kmer)": "703.158131", "access (avg_nanosec_per_kmer)": "282.141886", "iterator (avg_nanosec_per_kmer)": "2.920330"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1078.331165", "negative lookup (avg_nanosec_per_kmer)": "1058.107574", "access (avg_nanosec_per_kmer)": "590.484979", "iterator (avg_nanosec_per_kmer)": "2.920408"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1081.961138", "negative lookup (avg_nanosec_per_kmer)": "1039.836896", "access (avg_nanosec_per_kmer)": "580.860108", "iterator (avg_nanosec_per_kmer)": "2.916847"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash", "k": "63", "m": "25", "canonical": "false", "positive lookup (avg_nanosec_per_kmer)": "1089.778363", "negative lookup (avg_nanosec_per_kmer)": "1042.536515", "access (avg_nanosec_per_kmer)": "583.649722", "iterator (avg_nanosec_per_kmer)": "2.930816"} diff --git a/benchmarks/results-10-11-25/k63/regular-bench.log b/benchmarks/results-10-11-25/k63/regular-bench.log new file mode 100644 index 0000000..56c23f4 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-bench.log @@ -0,0 +1,135 @@ +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 691.263 +negative lookup (avg_nanosec_per_kmer) 711.378 +access (avg_nanosec_per_kmer) = 290.807 +iterator (avg_nanosec_per_kmer) = 2.93025 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 680.683 +negative lookup (avg_nanosec_per_kmer) 708.874 +access (avg_nanosec_per_kmer) = 292.683 +iterator (avg_nanosec_per_kmer) = 2.92206 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 695.029 +negative lookup (avg_nanosec_per_kmer) 709.297 +access (avg_nanosec_per_kmer) = 292.971 +iterator (avg_nanosec_per_kmer) = 2.93394 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 665.363 +negative lookup (avg_nanosec_per_kmer) 782.044 +access (avg_nanosec_per_kmer) = 327.484 +iterator (avg_nanosec_per_kmer) = 2.91368 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 662.943 +negative lookup (avg_nanosec_per_kmer) 778.503 +access (avg_nanosec_per_kmer) = 330.264 +iterator (avg_nanosec_per_kmer) = 2.91467 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 680.11 +negative lookup (avg_nanosec_per_kmer) 783.561 +access (avg_nanosec_per_kmer) = 327.781 +iterator (avg_nanosec_per_kmer) = 2.91495 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 870.332 +negative lookup (avg_nanosec_per_kmer) 864.24 +access (avg_nanosec_per_kmer) = 360.618 +iterator (avg_nanosec_per_kmer) = 2.90416 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 870.687 +negative lookup (avg_nanosec_per_kmer) 860.733 +access (avg_nanosec_per_kmer) = 357.9 +iterator (avg_nanosec_per_kmer) = 2.90867 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 880.859 +negative lookup (avg_nanosec_per_kmer) 855.406 +access (avg_nanosec_per_kmer) = 360.505 +iterator (avg_nanosec_per_kmer) = 2.94814 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1540.57 +negative lookup (avg_nanosec_per_kmer) 1155.27 +access (avg_nanosec_per_kmer) = 759.041 +iterator (avg_nanosec_per_kmer) = 2.93186 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1544.19 +negative lookup (avg_nanosec_per_kmer) 1149.79 +access (avg_nanosec_per_kmer) = 751.691 +iterator (avg_nanosec_per_kmer) = 2.93734 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1541.79 +negative lookup (avg_nanosec_per_kmer) 1157.11 +access (avg_nanosec_per_kmer) = 754.57 +iterator (avg_nanosec_per_kmer) = 3.03046 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1313.99 +negative lookup (avg_nanosec_per_kmer) 978.959 +access (avg_nanosec_per_kmer) = 648.605 +iterator (avg_nanosec_per_kmer) = 3.12937 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1322.75 +negative lookup (avg_nanosec_per_kmer) 974.624 +access (avg_nanosec_per_kmer) = 647.357 +iterator (avg_nanosec_per_kmer) = 3.04266 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1310.68 +negative lookup (avg_nanosec_per_kmer) 981.353 +access (avg_nanosec_per_kmer) = 638.633 +iterator (avg_nanosec_per_kmer) = 3.03058 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1828.78 +negative lookup (avg_nanosec_per_kmer) 860.88 +access (avg_nanosec_per_kmer) = 458.103 +iterator (avg_nanosec_per_kmer) = 3.02388 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1820.78 +negative lookup (avg_nanosec_per_kmer) 865.647 +access (avg_nanosec_per_kmer) = 457.872 +iterator (avg_nanosec_per_kmer) = 3.07692 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1815.06 +negative lookup (avg_nanosec_per_kmer) 862.647 +access (avg_nanosec_per_kmer) = 459.945 +iterator (avg_nanosec_per_kmer) = 3.01714 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1550.44 +negative lookup (avg_nanosec_per_kmer) 855.394 +access (avg_nanosec_per_kmer) = 403.946 +iterator (avg_nanosec_per_kmer) = 2.96217 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1537.68 +negative lookup (avg_nanosec_per_kmer) 853.39 +access (avg_nanosec_per_kmer) = 408.069 +iterator (avg_nanosec_per_kmer) = 2.96376 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1543.09 +negative lookup (avg_nanosec_per_kmer) 843.749 +access (avg_nanosec_per_kmer) = 406.676 +iterator (avg_nanosec_per_kmer) = 2.99849 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 598.822 +negative lookup (avg_nanosec_per_kmer) 693.449 +access (avg_nanosec_per_kmer) = 284.325 +iterator (avg_nanosec_per_kmer) = 2.92687 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 618.441 +negative lookup (avg_nanosec_per_kmer) 687.976 +access (avg_nanosec_per_kmer) = 281.169 +iterator (avg_nanosec_per_kmer) = 2.93057 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 611.72 +negative lookup (avg_nanosec_per_kmer) 703.158 +access (avg_nanosec_per_kmer) = 282.142 +iterator (avg_nanosec_per_kmer) = 2.92033 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1078.33 +negative lookup (avg_nanosec_per_kmer) 1058.11 +access (avg_nanosec_per_kmer) = 590.485 +iterator (avg_nanosec_per_kmer) = 2.92041 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1081.96 +negative lookup (avg_nanosec_per_kmer) 1039.84 +access (avg_nanosec_per_kmer) = 580.86 +iterator (avg_nanosec_per_kmer) = 2.91685 +./sshash bench -i /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash +positive lookup (avg_nanosec_per_kmer) = 1089.78 +negative lookup (avg_nanosec_per_kmer) 1042.54 +access (avg_nanosec_per_kmer) = 583.65 +iterator (avg_nanosec_per_kmer) = 2.93082 From 99900cb8351b9e17779eafcbc1326895481e8640 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 11 Nov 2025 15:49:23 +0100 Subject: [PATCH 096/112] updated results; better streaming query script --- benchmarks/download-datasets.sh | 22 +- benchmarks/print.py | 122 + .../results-10-11-25/k31/canon-build.json | 9 + .../results-10-11-25/k31/canon-build.log | 2974 +++++++++++++++++ .../results-10-11-25/k31/canon-build.time.log | 207 ++ .../results-10-11-25/k31/regular-build.json | 9 + .../results-10-11-25/k31/regular-build.log | 2710 +++++++++++++++ .../k31/regular-build.time.log | 207 ++ .../results-10-11-25/k63/canon-build.json | 9 + .../results-10-11-25/k63/canon-build.log | 2046 ++++++++++++ .../results-10-11-25/k63/canon-build.time.log | 207 ++ .../results-10-11-25/k63/regular-build.json | 9 + .../results-10-11-25/k63/regular-build.log | 1975 +++++++++++ .../k63/regular-build.time.log | 207 ++ script/bench.py | 3 +- script/build.py | 9 +- script/streaming-query-high-hit.py | 99 + script/streaming-query-high-hit.sh | 25 - tools/query.cpp | 22 +- 19 files changed, 10822 insertions(+), 49 deletions(-) create mode 100644 benchmarks/print.py create mode 100644 benchmarks/results-10-11-25/k31/canon-build.json create mode 100644 benchmarks/results-10-11-25/k31/canon-build.log create mode 100644 benchmarks/results-10-11-25/k31/canon-build.time.log create mode 100644 benchmarks/results-10-11-25/k31/regular-build.json create mode 100644 benchmarks/results-10-11-25/k31/regular-build.log create mode 100644 benchmarks/results-10-11-25/k31/regular-build.time.log create mode 100644 benchmarks/results-10-11-25/k63/canon-build.json create mode 100644 benchmarks/results-10-11-25/k63/canon-build.log create mode 100644 benchmarks/results-10-11-25/k63/canon-build.time.log create mode 100644 benchmarks/results-10-11-25/k63/regular-build.json create mode 100644 benchmarks/results-10-11-25/k63/regular-build.log create mode 100644 benchmarks/results-10-11-25/k63/regular-build.time.log create mode 100644 script/streaming-query-high-hit.py delete mode 100644 script/streaming-query-high-hit.sh diff --git a/benchmarks/download-datasets.sh b/benchmarks/download-datasets.sh index a3dd9a9..274ed3f 100644 --- a/benchmarks/download-datasets.sh +++ b/benchmarks/download-datasets.sh @@ -10,26 +10,26 @@ wget https://zenodo.org/records/7239205/files/human.k63.unitigs.fa.ust.fa.gz # queries -# cod -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR128/049/SRR12858649/SRR12858649.fastq.gz +# axolotl +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR216/001/ERR2163351/ERR2163351.fastq.gz + +# ncbi-virus: it's actually low hit... +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR321/ERR321482/ERR321482_1.fastq.gz + +# for jgi-fungi: it's actually low hit... +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR106/023/SRR10664323/SRR10664323_1.fastq.gz # kestrel wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR114/043/SRR11449743/SRR11449743_1.fastq.gz +# cod +wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR128/049/SRR12858649/SRR12858649.fastq.gz + # human, hprc wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR583/004/SRR5833294/SRR5833294.fastq.gz -# axolotl -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR216/001/ERR2163351/ERR2163351.fastq.gz - # EC wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR590/005/SRR5901135/SRR5901135_1.fastq.gz # SE wget wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR801/SRR801268/SRR801268_1.fastq.gz - -# ncbi-virus: it's actually low hit... -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR321/ERR321482/ERR321482_1.fastq.gz - -# for jgi-fungi: it's actually low hit... -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR106/023/SRR10664323/SRR10664323_1.fastq.gz diff --git a/benchmarks/print.py b/benchmarks/print.py new file mode 100644 index 0000000..8e56c20 --- /dev/null +++ b/benchmarks/print.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 + +import sys +import json +import os +from statistics import mean, StatisticsError + +def format_time(microseconds): + seconds = microseconds / 1_000_000 + minutes = int(seconds // 60) + seconds = int(seconds % 60) + return f"{minutes}:{seconds:02d}" + +def parse_build_file(path, canonical_flag): + """Parse build JSONL file.""" + results = [] + with open(path) as f: + for line in f: + line = line.strip() + if not line: + continue + try: + d = json.loads(line) + except json.JSONDecodeError: + print(f"Skipping invalid JSON line in {path}", file=sys.stderr) + continue + + num_kmers = int(d["num_kmers"]) + index_bytes = int(d["index_size_in_bytes"]) + build_time_us = int(d["total_build_time_in_microsec"]) + + bits_per_kmer = (index_bytes * 8) / num_kmers + gb = index_bytes / 1e9 + build_time_fmt = format_time(build_time_us) + + fname = os.path.basename(d["input_filename"]) + collection = fname.split(".")[0].capitalize() + k = d["k"] + + results.append({ + "k": k, + "Collection": collection, + "m": d["m"], + "canonical": "yes" if canonical_flag else "no", + "bits_per_kmer": f"{bits_per_kmer:.2f}", + "total_GB": f"{gb:.2f}", + "build_time": build_time_fmt + }) + return results + +def parse_bench_file(path, canonical_flag): + """Parse benchmark JSONL file and average per collection.""" + lookup_data = {} + with open(path) as f: + for line in f: + line = line.strip() + if not line: + continue + try: + d = json.loads(line) + except json.JSONDecodeError: + print(f"Skipping invalid JSON line in {path}", file=sys.stderr) + continue + + fname = os.path.basename(d["index_filename"]) + collection = fname.split(".")[0].capitalize() + m = d["m"] + k = d["k"] + canonical = "yes" if canonical_flag else "no" + + key = (collection, m, canonical) + entry = lookup_data.setdefault(key, { + "k": k, + "pos": [], "neg": [], "access": [], "iter": [] + }) + entry["pos"].append(float(d["positive lookup (avg_nanosec_per_kmer)"])) + entry["neg"].append(float(d["negative lookup (avg_nanosec_per_kmer)"])) + entry["access"].append(float(d["access (avg_nanosec_per_kmer)"])) + entry["iter"].append(float(d["iterator (avg_nanosec_per_kmer)"])) + + # average the results + for k, v in lookup_data.items(): + try: + lookup_data[k] = { + "k": v["k"], + "pos": f"{mean(v['pos'])/1000:.2f}", + "neg": f"{mean(v['neg'])/1000:.2f}", + "access": f"{mean(v['access'])/1000:.2f}", + "iter": f"{mean(v['iter']):.2f}", + } + except StatisticsError: + lookup_data[k] = {"k": v["k"], "pos": "NA", "neg": "NA", "access": "NA", "iter": "NA"} + return lookup_data + +def main(): + if len(sys.argv) != 5: + print("Usage: index_stats_csv.py regular-build.json canon-build.json regular-bench.json canon-bench.json", file=sys.stderr) + sys.exit(1) + + reg_build_path, canon_build_path, reg_bench_path, canon_bench_path = sys.argv[1:] + + reg_build = parse_build_file(reg_build_path, False) + canon_build = parse_build_file(canon_build_path, True) + reg_bench = parse_bench_file(reg_bench_path, False) + canon_bench = parse_bench_file(canon_bench_path, True) + + # merge everything + all_builds = reg_build + canon_build + lookup_all = {**reg_bench, **canon_bench} + + # CSV header + print("k,Collection,m,canonical,bits_per_kmer,total_GB,build_time,positive_lookup_ns,negative_lookup_ns,access_ns,iteration_ns") + + for r in sorted(all_builds, key=lambda x: (int(x["k"]), x["Collection"], x["canonical"])): + key = (r["Collection"], r["m"], r["canonical"]) + lookup = lookup_all.get(key, {"pos": "NA", "neg": "NA", "access": "NA", "iter": "NA", "k": r["k"]}) + + print(f"{r['k']},{r['Collection']},{r['m']},{r['canonical']},{r['bits_per_kmer']},{r['total_GB']},{r['build_time']},{lookup['pos']},{lookup['neg']},{lookup['access']},{lookup['iter']}") + +if __name__ == "__main__": + main() + diff --git a/benchmarks/results-10-11-25/k31/canon-build.json b/benchmarks/results-10-11-25/k31/canon-build.json new file mode 100644 index 0000000..80ecb73 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-build.json @@ -0,0 +1,9 @@ +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz", "k": "31", "m": "20", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1677776", "step 2 (compute minimizer tuples)": "742988", "step 3 (merging minimizer tuples)": "5069909", "step 4 (build mphf)": "3674066", "step 5 (replacing minimizer values with MPHF hashes)": "3524940", "step 6 (merging minimizers tuples)": "7408673", "step 7.1 (build sparse index)": "1242493", "step 7.2 (build skew index)": "3339054", "step 7 (build sparse and skew index)": "4806763", "total_build_time_in_microsec": "26905115", "index_size_in_bytes": "566181081", "num_kmers": "502465200"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz", "k": "31", "m": "20", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "3213367", "step 2 (compute minimizer tuples)": "1310902", "step 3 (merging minimizer tuples)": "11197918", "step 4 (build mphf)": "8514381", "step 5 (replacing minimizer values with MPHF hashes)": "7990571", "step 6 (merging minimizers tuples)": "31178206", "step 7.1 (build sparse index)": "1981005", "step 7.2 (build skew index)": "1058644", "step 7 (build sparse and skew index)": "3496165", "total_build_time_in_microsec": "66901510", "index_size_in_bytes": "1246156075", "num_kmers": "1150399205"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "7741285", "step 2 (compute minimizer tuples)": "3132330", "step 3 (merging minimizer tuples)": "57806636", "step 4 (build mphf)": "18672185", "step 5 (replacing minimizer values with MPHF hashes)": "18575641", "step 6 (merging minimizers tuples)": "67851902", "step 7.1 (build sparse index)": "6579041", "step 7.2 (build skew index)": "8938319", "step 7 (build sparse and skew index)": "16725239", "total_build_time_in_microsec": "190505218", "index_size_in_bytes": "3135788878", "num_kmers": "2505678680"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "74469166", "step 2 (compute minimizer tuples)": "132929365", "step 3 (merging minimizer tuples)": "311498555", "step 4 (build mphf)": "271387025", "step 5 (replacing minimizer values with MPHF hashes)": "283505437", "step 6 (merging minimizers tuples)": "409148589", "step 7.1 (build sparse index)": "72560865", "step 7.2 (build skew index)": "56665151", "step 7 (build sparse and skew index)": "138006592", "total_build_time_in_microsec": "1620944729", "index_size_in_bytes": "26027317465", "num_kmers": "17987935180"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "16860289", "step 2 (compute minimizer tuples)": "9072178", "step 3 (merging minimizer tuples)": "60514444", "step 4 (build mphf)": "23944043", "step 5 (replacing minimizer values with MPHF hashes)": "26552714", "step 6 (merging minimizers tuples)": "114259532", "step 7.1 (build sparse index)": "15751012", "step 7.2 (build skew index)": "16348994", "step 7 (build sparse and skew index)": "34070557", "total_build_time_in_microsec": "285273757", "index_size_in_bytes": "5544019788", "num_kmers": "3718120949"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "5744102", "step 2 (compute minimizer tuples)": "1562408", "step 3 (merging minimizer tuples)": "13432774", "step 4 (build mphf)": "7287468", "step 5 (replacing minimizer values with MPHF hashes)": "8407509", "step 6 (merging minimizers tuples)": "32332023", "step 7.1 (build sparse index)": "4999557", "step 7.2 (build skew index)": "6457378", "step 7 (build sparse and skew index)": "12097558", "total_build_time_in_microsec": "80863842", "index_size_in_bytes": "1600485113", "num_kmers": "1111018845"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "4578309", "step 2 (compute minimizer tuples)": "1359941", "step 3 (merging minimizer tuples)": "10683665", "step 4 (build mphf)": "5988675", "step 5 (replacing minimizer values with MPHF hashes)": "6756195", "step 6 (merging minimizers tuples)": "29021973", "step 7.1 (build sparse index)": "4071384", "step 7.2 (build skew index)": "3781315", "step 7 (build sparse and skew index)": "8383331", "total_build_time_in_microsec": "66772089", "index_size_in_bytes": "1287008500", "num_kmers": "894310084"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz", "k": "31", "m": "19", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1113573", "step 2 (compute minimizer tuples)": "620769", "step 3 (merging minimizer tuples)": "3511262", "step 4 (build mphf)": "2761131", "step 5 (replacing minimizer values with MPHF hashes)": "2495039", "step 6 (merging minimizers tuples)": "5206076", "step 7.1 (build sparse index)": "960968", "step 7.2 (build skew index)": "39044", "step 7 (build sparse and skew index)": "1164370", "total_build_time_in_microsec": "16872220", "index_size_in_bytes": "398891769", "num_kmers": "376205185"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "38018674", "step 2 (compute minimizer tuples)": "40881264", "step 3 (merging minimizer tuples)": "208951298", "step 4 (build mphf)": "214322784", "step 5 (replacing minimizer values with MPHF hashes)": "186685394", "step 6 (merging minimizers tuples)": "273627254", "step 7.1 (build sparse index)": "38396190", "step 7.2 (build skew index)": "5832073", "step 7 (build sparse and skew index)": "49839265", "total_build_time_in_microsec": "1012325933", "index_size_in_bytes": "16357630621", "num_kmers": "12319840464"} diff --git a/benchmarks/results-10-11-25/k31/canon-build.log b/benchmarks/results-10-11-25/k31/canon-build.log new file mode 100644 index 0000000..49e3fc3 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-build.log @@ -0,0 +1,2974 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash --canonical +2025-11-10 23:51:57: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max string length = 31415 +num bits per_absolute_offset = 30 +num bits per_relative_offset = 15 +num bits per_string_id = 21 +=== step 1 (encode strings): 1.67778 [sec] (3.33909 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.742988 [sec] (1.47869 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.bin' +=== step 3 (merging minimizer tuples): 5.06991 [sec] (10.0901 [ns/kmer]) +num_minimizers = 86163506 +num_minimizer_positions = 94463730 +num_super_kmers = 98209779 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 3.67407 [sec] (7.31208 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815117438038839.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 3.52494 [sec] (7.01529 [ns/kmer]) +=== step 6 (merging minimizers tuples): 7.40867 [sec] (14.7446 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 2988605/86163506 (3.46853%) +num_buckets_in_skew_index 5810/86163506 (0.00674299%) +max_bucket_size 68577 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 10013861/94463730 (10.6007%) +num_minimizer_positions_of_buckets_in_skew_index 1280778/94463730 (1.35584%) +=== step 7.1 (build sparse index): 1.24249 [sec] (2.47279 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 1643143 + partition = 1: num kmers in buckets of size > 128 and <= 256: 1178275 + partition = 2: num kmers in buckets of size > 256 and <= 512: 956038 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 605533 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 425543 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 382297 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 254872 + partition = 7: num kmers in buckets of size > 8192 and <= 68577: 624986 +num kmers in skew index = 6070687 (1.20818%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1643143 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1643143)... + built mphs[0] for 1643143 kmers; bits/key = 2.56038 + built positions[0] for 1643143 kmers; bits/key = 7.0002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1178275 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1178275)... + built mphs[1] for 1178275 kmers; bits/key = 2.41806 + built positions[1] for 1178275 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 956038 + building MPHF with 64 threads and 1 partitions (avg. partition size = 956038)... + built mphs[2] for 956038 kmers; bits/key = 2.56129 + built positions[2] for 956038 kmers; bits/key = 9.00035 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 605533 + building MPHF with 64 threads and 1 partitions (avg. partition size = 605533)... + built mphs[3] for 605533 kmers; bits/key = 2.41961 + built positions[3] for 605533 kmers; bits/key = 10.0006 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 425543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 425543)... + built mphs[4] for 425543 kmers; bits/key = 2.42126 + built positions[4] for 425543 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 382297 + building MPHF with 64 threads and 1 partitions (avg. partition size = 382297)... + built mphs[5] for 382297 kmers; bits/key = 2.42153 + built positions[5] for 382297 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 254872 + building MPHF with 64 threads and 1 partitions (avg. partition size = 254872)... + built mphs[6] for 254872 kmers; bits/key = 2.56712 + built positions[6] for 254872 kmers; bits/key = 13.0013 + lower = 8192; upper = 68577; num_bits_per_pos = 17; num_kmers_in_partition = 624986 + building MPHF with 64 threads and 1 partitions (avg. partition size = 624986)... + built mphs[7] for 624986 kmers; bits/key = 2.41943 + built positions[7] for 624986 kmers; bits/key = 17.0005 +=== step 7.2 (build skew index): 3.33905 [sec] (6.64534 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 96.5247% +buckets with 2 minimizer positions = 2.16597% +buckets with 3 minimizer positions = 0.599947% +buckets with 4 minimizer positions = 0.247865% +buckets with 5 minimizer positions = 0.129293% +buckets with 6 minimizer positions = 0.0768388% +buckets with 7 minimizer positions = 0.0512653% +buckets with 8 minimizer positions = 0.0353688% +buckets with 9 minimizer positions = 0.0260667% +buckets with 10 minimizer positions = 0.0199121% +buckets with 11 minimizer positions = 0.0157805% +buckets with 12 minimizer positions = 0.0127513% +buckets with 13 minimizer positions = 0.0102503% +buckets with 14 minimizer positions = 0.00880535% +buckets with 15 minimizer positions = 0.0074347% +buckets with 16 minimizer positions = 0.00615574% +max_bucket_size = 68577 +=== step 7 (build sparse and skew index): 4.80676 [sec] (9.56636 [ns/kmer]) +=== total time: 26.9051 [sec] (53.5462 [ns/kmer]) +total index size: 566181081 [B] -- 566.181 [MB] +SPACE BREAKDOWN: + mphf: 0.487029 [bits/kmer] (2.84013 [bits/key]) -- 5.40276% + strings_offsets: 0.144419 [bits/kmer] -- 1.60208% + control_codewords: 5.31593 [bits/kmer] -- 58.9712% + mid_load_buckets: 0.597885 [bits/kmer] -- 6.63251% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.73347e-05% + strings: 2.24566 [bits/kmer] -- 24.9118% + skew_index: 0.223525 [bits/kmer] -- 2.47963% + weights: 2.92956e-06 [bits/kmer] -- 3.24984e-05% + -------------- + total: 9.01445 [bits/kmer] +2025-11-10 23:52:24: saving data structure to disk... +2025-11-10 23:52:27: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash --canonical +2025-11-10 23:52:27: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max string length = 111973 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 17 +num bits per_string_id = 20 +=== step 1 (encode strings): 3.21337 [sec] (2.79326 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 1.3109 [sec] (1.13952 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +=== step 3 (merging minimizer tuples): 11.1979 [sec] (9.73394 [ns/kmer]) +num_minimizers = 209937048 +num_minimizer_positions = 213990360 +num_super_kmers = 222970482 +building minimizers MPHF with 64 threads and 70 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 8.51438 [sec] (7.40124 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815147476111131.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 7.99057 [sec] (6.94591 [ns/kmer]) +=== step 6 (merging minimizers tuples): 31.1782 [sec] (27.1021 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 2035626/209937048 (0.969636%) +num_buckets_in_skew_index 2517/209937048 (0.00119893%) +max_bucket_size 5316 +log2_max_bucket_size 13 +num_partitions in skew index 7 +num_minimizer_positions_of_buckets_larger_than_1 5736623/213990360 (2.68079%) +num_minimizer_positions_of_buckets_in_skew_index 354832/213990360 (0.165817%) +=== step 7.1 (build sparse index): 1.981 [sec] (1.72202 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 846431 + partition = 1: num kmers in buckets of size > 128 and <= 256: 463901 + partition = 2: num kmers in buckets of size > 256 and <= 512: 298968 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 116879 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 120430 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 42891 + partition = 6: num kmers in buckets of size > 4096 and <= 5316: 9813 +num kmers in skew index = 1899313 (0.1651%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 846431 + building MPHF with 64 threads and 1 partitions (avg. partition size = 846431)... + built mphs[0] for 846431 kmers; bits/key = 2.41876 + built positions[0] for 846431 kmers; bits/key = 7.00042 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 463901 + building MPHF with 64 threads and 1 partitions (avg. partition size = 463901)... + built mphs[1] for 463901 kmers; bits/key = 2.42059 + built positions[1] for 463901 kmers; bits/key = 8.00074 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 298968 + building MPHF with 64 threads and 1 partitions (avg. partition size = 298968)... + built mphs[2] for 298968 kmers; bits/key = 2.42332 + built positions[2] for 298968 kmers; bits/key = 9.0012 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 116879 + building MPHF with 64 threads and 1 partitions (avg. partition size = 116879)... + built mphs[3] for 116879 kmers; bits/key = 2.57716 + built positions[3] for 116879 kmers; bits/key = 10.0031 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 120430 + building MPHF with 64 threads and 1 partitions (avg. partition size = 120430)... + built mphs[4] for 120430 kmers; bits/key = 2.43408 + built positions[4] for 120430 kmers; bits/key = 11.0027 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 42891 + building MPHF with 64 threads and 1 partitions (avg. partition size = 42891)... + built mphs[5] for 42891 kmers; bits/key = 2.46579 + built positions[5] for 42891 kmers; bits/key = 12.0089 + lower = 4096; upper = 5316; num_bits_per_pos = 13; num_kmers_in_partition = 9813 + building MPHF with 64 threads and 1 partitions (avg. partition size = 9813)... + built mphs[6] for 9813 kmers; bits/key = 2.48487 + built positions[6] for 9813 kmers; bits/key = 13.0374 +=== step 7.2 (build skew index): 1.05864 [sec] (0.920241 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 99.0292% +buckets with 2 minimizer positions = 0.755504% +buckets with 3 minimizer positions = 0.0986639% +buckets with 4 minimizer positions = 0.0387669% +buckets with 5 minimizer positions = 0.0208944% +buckets with 6 minimizer positions = 0.0129548% +buckets with 7 minimizer positions = 0.00864497% +buckets with 8 minimizer positions = 0.00604515% +buckets with 9 minimizer positions = 0.00458137% +buckets with 10 minimizer positions = 0.00347628% +buckets with 11 minimizer positions = 0.00277321% +buckets with 12 minimizer positions = 0.00222448% +buckets with 13 minimizer positions = 0.00183484% +buckets with 14 minimizer positions = 0.00150569% +buckets with 15 minimizer positions = 0.00123418% +buckets with 16 minimizer positions = 0.00103317% +max_bucket_size = 5316 +=== step 7 (build sparse and skew index): 3.49616 [sec] (3.03909 [ns/kmer]) +=== total time: 66.9015 [sec] (58.155 [ns/kmer]) +total index size: 1246156075 [B] -- 1246.16 [MB] +SPACE BREAKDOWN: + mphf: 0.514173 [bits/kmer] (2.81753 [bits/key]) -- 5.93329% + strings_offsets: 0.100021 [bits/kmer] -- 1.15419% + control_codewords: 5.8397 [bits/kmer] -- 67.3871% + mid_load_buckets: 0.154586 [bits/kmer] -- 1.78384% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.15061e-05% + strings: 2.0304 [bits/kmer] -- 23.4298% + skew_index: 0.0270208 [bits/kmer] -- 0.311806% + weights: 1.27956e-06 [bits/kmer] -- 1.47654e-05% + -------------- + total: 8.6659 [bits/kmer] +2025-11-10 23:53:34: saving data structure to disk... +2025-11-10 23:53:40: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash --canonical +2025-11-10 23:53:40: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max string length = 35848 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 16 +num bits per_string_id = 24 +=== step 1 (encode strings): 7.74129 [sec] (3.0895 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.101.bin'... +=== step 2 (compute minimizer tuples): 3.13233 [sec] (1.25009 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +=== step 3 (merging minimizer tuples): 57.8066 [sec] (23.0703 [ns/kmer]) +num_minimizers = 462224926 +num_minimizer_positions = 511201278 +num_super_kmers = 531186741 +building minimizers MPHF with 64 threads and 155 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 18.6722 [sec] (7.45195 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 18.5756 [sec] (7.41342 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815220322184433.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +=== step 6 (merging minimizers tuples): 67.8519 [sec] (27.0793 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 14266506/462224926 (3.08649%) +num_buckets_in_skew_index 60557/462224926 (0.0131012%) +max_bucket_size 22085 +log2_max_bucket_size 15 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 53165974/511201278 (10.4002%) +num_minimizer_positions_of_buckets_in_skew_index 10137441/511201278 (1.98306%) +=== step 7.1 (build sparse index): 6.57904 [sec] (2.62565 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 14957205 + partition = 1: num kmers in buckets of size > 128 and <= 256: 10906495 + partition = 2: num kmers in buckets of size > 256 and <= 512: 7473094 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 4774535 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 2638087 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1593261 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 729770 + partition = 7: num kmers in buckets of size > 8192 and <= 22085: 506148 +num kmers in skew index = 43578595 (1.73919%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 14957205 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[0] for 14957205 kmers; bits/key = 2.56583 + built positions[0] for 14957205 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10906495 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[1] for 10906495 kmers; bits/key = 2.61744 + built positions[1] for 10906495 kmers; bits/key = 8.00003 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 7473094 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 7473094 kmers; bits/key = 2.65359 + built positions[2] for 7473094 kmers; bits/key = 9.00004 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4774535 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4774535 kmers; bits/key = 2.75085 + built positions[3] for 4774535 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2638087 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2638087)... + built mphs[4] for 2638087 kmers; bits/key = 2.55989 + built positions[4] for 2638087 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1593261 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1593261)... + built mphs[5] for 1593261 kmers; bits/key = 2.56041 + built positions[5] for 1593261 kmers; bits/key = 12.0002 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 729770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 729770)... + built mphs[6] for 729770 kmers; bits/key = 2.56195 + built positions[6] for 729770 kmers; bits/key = 13.0005 + lower = 8192; upper = 22085; num_bits_per_pos = 15; num_kmers_in_partition = 506148 + building MPHF with 64 threads and 1 partitions (avg. partition size = 506148)... + built mphs[7] for 506148 kmers; bits/key = 2.42048 + built positions[7] for 506148 kmers; bits/key = 15.0007 +=== step 7.2 (build skew index): 8.93832 [sec] (3.56722 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 96.9004% +buckets with 2 minimizer positions = 1.89323% +buckets with 3 minimizer positions = 0.481205% +buckets with 4 minimizer positions = 0.215066% +buckets with 5 minimizer positions = 0.121924% +buckets with 6 minimizer positions = 0.0781816% +buckets with 7 minimizer positions = 0.0541282% +buckets with 8 minimizer positions = 0.0394014% +buckets with 9 minimizer positions = 0.0296871% +buckets with 10 minimizer positions = 0.0233579% +buckets with 11 minimizer positions = 0.0188211% +buckets with 12 minimizer positions = 0.0152856% +buckets with 13 minimizer positions = 0.0127754% +buckets with 14 minimizer positions = 0.0106204% +buckets with 15 minimizer positions = 0.00907826% +buckets with 16 minimizer positions = 0.0079457% +max_bucket_size = 22085 +=== step 7 (build sparse and skew index): 16.7252 [sec] (6.67493 [ns/kmer]) +=== total time: 190.505 [sec] (76.0294 [ns/kmer]) +total index size: 3135788878 [B] -- 3135.79 [MB] +SPACE BREAKDOWN: + mphf: 0.523236 [bits/kmer] (2.83641 [bits/key]) -- 5.2262% + strings_offsets: 0.153147 [bits/kmer] -- 1.52966% + control_codewords: 6.08754 [bits/kmer] -- 60.8038% + mid_load_buckets: 0.678982 [bits/kmer] -- 6.78183% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.54649e-06% + strings: 2.24545 [bits/kmer] -- 22.4281% + skew_index: 0.323422 [bits/kmer] -- 3.23041% + weights: 5.87466e-07 [bits/kmer] -- 5.86774e-06% + -------------- + total: 10.0118 [bits/kmer] +2025-11-10 23:56:50: saving data structure to disk... +2025-11-10 23:57:04: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash --canonical +2025-11-10 23:57:04: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz'... +read 1000000 sequences, 129490969 bases, 99490969 kmers +read 2000000 sequences, 259406781 bases, 199406781 kmers +read 3000000 sequences, 390247383 bases, 300247383 kmers +read 4000000 sequences, 521879077 bases, 401879077 kmers +read 5000000 sequences, 654383925 bases, 504383925 kmers +read 6000000 sequences, 787748040 bases, 607748040 kmers +read 7000000 sequences, 921978207 bases, 711978207 kmers +read 8000000 sequences, 1056572544 bases, 816572544 kmers +read 9000000 sequences, 1192074067 bases, 922074067 kmers +read 10000000 sequences, 1328585611 bases, 1028585611 kmers +read 11000000 sequences, 1466068193 bases, 1136068193 kmers +read 12000000 sequences, 1604189526 bases, 1244189526 kmers +read 13000000 sequences, 1743096378 bases, 1353096378 kmers +read 14000000 sequences, 1882900221 bases, 1462900221 kmers +read 15000000 sequences, 2023699884 bases, 1573699884 kmers +read 16000000 sequences, 2165862057 bases, 1685862057 kmers +read 17000000 sequences, 2309661964 bases, 1799661964 kmers +read 18000000 sequences, 2454684974 bases, 1914684974 kmers +read 19000000 sequences, 2601025569 bases, 2031025569 kmers +read 20000000 sequences, 2749275100 bases, 2149275100 kmers +read 21000000 sequences, 2898804831 bases, 2268804831 kmers +read 22000000 sequences, 3049858713 bases, 2389858713 kmers +read 23000000 sequences, 3203100307 bases, 2513100307 kmers +read 24000000 sequences, 3357729055 bases, 2637729055 kmers +read 25000000 sequences, 3514381494 bases, 2764381494 kmers +read 26000000 sequences, 3673423010 bases, 2893423010 kmers +read 27000000 sequences, 3833876723 bases, 3023876723 kmers +read 28000000 sequences, 3997541031 bases, 3157541031 kmers +read 29000000 sequences, 4163233674 bases, 3293233674 kmers +read 30000000 sequences, 4331783042 bases, 3431783042 kmers +read 31000000 sequences, 4504035303 bases, 3574035303 kmers +read 32000000 sequences, 4679090399 bases, 3719090399 kmers +read 33000000 sequences, 4858436877 bases, 3868436877 kmers +read 34000000 sequences, 5041637740 bases, 4021637740 kmers +read 35000000 sequences, 5229976324 bases, 4179976324 kmers +read 36000000 sequences, 5423490866 bases, 4343490866 kmers +read 37000000 sequences, 5622911177 bases, 4512911177 kmers +read 38000000 sequences, 5828307256 bases, 4688307256 kmers +read 39000000 sequences, 6041904282 bases, 4871904282 kmers +read 40000000 sequences, 6264018359 bases, 5064018359 kmers +read 41000000 sequences, 6497175042 bases, 5267175042 kmers +read 42000000 sequences, 6743365189 bases, 5483365189 kmers +read 43000000 sequences, 7005667896 bases, 5715667896 kmers +read 44000000 sequences, 7289398126 bases, 5969398126 kmers +read 45000000 sequences, 7600998045 bases, 6250998045 kmers +read 46000000 sequences, 7846412811 bases, 6466412811 kmers +read 47000000 sequences, 7950267050 bases, 6540267050 kmers +read 48000000 sequences, 8054449490 bases, 6614449490 kmers +read 49000000 sequences, 8158503893 bases, 6688503893 kmers +read 50000000 sequences, 8262623298 bases, 6762623298 kmers +read 51000000 sequences, 8366491419 bases, 6836491419 kmers +read 52000000 sequences, 8470360694 bases, 6910360694 kmers +read 53000000 sequences, 8574554064 bases, 6984554064 kmers +read 54000000 sequences, 8678752038 bases, 7058752038 kmers +read 55000000 sequences, 8783318704 bases, 7133318704 kmers +read 56000000 sequences, 8887348929 bases, 7207348929 kmers +read 57000000 sequences, 8991244574 bases, 7281244574 kmers +read 58000000 sequences, 9095727588 bases, 7355727588 kmers +read 59000000 sequences, 9200181084 bases, 7430181084 kmers +read 60000000 sequences, 9304538500 bases, 7504538500 kmers +read 61000000 sequences, 9409280029 bases, 7579280029 kmers +read 62000000 sequences, 9513939845 bases, 7653939845 kmers +read 63000000 sequences, 9618472370 bases, 7728472370 kmers +read 64000000 sequences, 9723234224 bases, 7803234224 kmers +read 65000000 sequences, 9827751954 bases, 7877751954 kmers +read 66000000 sequences, 9932020550 bases, 7952020550 kmers +read 67000000 sequences, 10036741400 bases, 8026741400 kmers +read 68000000 sequences, 10141739679 bases, 8101739679 kmers +read 69000000 sequences, 10246720968 bases, 8176720968 kmers +read 70000000 sequences, 10351924281 bases, 8251924281 kmers +read 71000000 sequences, 10456872741 bases, 8326872741 kmers +read 72000000 sequences, 10562347711 bases, 8402347711 kmers +read 73000000 sequences, 10667420487 bases, 8477420487 kmers +read 74000000 sequences, 10772671579 bases, 8552671579 kmers +read 75000000 sequences, 10877868233 bases, 8627868233 kmers +read 76000000 sequences, 10983492844 bases, 8703492844 kmers +read 77000000 sequences, 11089073361 bases, 8779073361 kmers +read 78000000 sequences, 11194470848 bases, 8854470848 kmers +read 79000000 sequences, 11300332559 bases, 8930332559 kmers +read 80000000 sequences, 11406269822 bases, 9006269822 kmers +read 81000000 sequences, 11512162907 bases, 9082162907 kmers +read 82000000 sequences, 11618219813 bases, 9158219813 kmers +read 83000000 sequences, 11724078742 bases, 9234078742 kmers +read 84000000 sequences, 11830014073 bases, 9310014073 kmers +read 85000000 sequences, 11935890790 bases, 9385890790 kmers +read 86000000 sequences, 12042232134 bases, 9462232134 kmers +read 87000000 sequences, 12148382832 bases, 9538382832 kmers +read 88000000 sequences, 12254822411 bases, 9614822411 kmers +read 89000000 sequences, 12361563673 bases, 9691563673 kmers +read 90000000 sequences, 12468297930 bases, 9768297930 kmers +read 91000000 sequences, 12574912907 bases, 9844912907 kmers +read 92000000 sequences, 12681494065 bases, 9921494065 kmers +read 93000000 sequences, 12788194017 bases, 9998194017 kmers +read 94000000 sequences, 12894915381 bases, 10074915381 kmers +read 95000000 sequences, 13001521631 bases, 10151521631 kmers +read 96000000 sequences, 13109064835 bases, 10229064835 kmers +read 97000000 sequences, 13215873113 bases, 10305873113 kmers +read 98000000 sequences, 13323125980 bases, 10383125980 kmers +read 99000000 sequences, 13430215641 bases, 10460215641 kmers +read 100000000 sequences, 13537778344 bases, 10537778344 kmers +read 101000000 sequences, 13645148965 bases, 10615148965 kmers +read 102000000 sequences, 13752520277 bases, 10692520277 kmers +read 103000000 sequences, 13860127249 bases, 10770127249 kmers +read 104000000 sequences, 13968075956 bases, 10848075956 kmers +read 105000000 sequences, 14075861146 bases, 10925861146 kmers +read 106000000 sequences, 14184298738 bases, 11004298738 kmers +read 107000000 sequences, 14292530270 bases, 11082530270 kmers +read 108000000 sequences, 14400943968 bases, 11160943968 kmers +read 109000000 sequences, 14509339935 bases, 11239339935 kmers +read 110000000 sequences, 14617599335 bases, 11317599335 kmers +read 111000000 sequences, 14725842174 bases, 11395842174 kmers +read 112000000 sequences, 14834254989 bases, 11474254989 kmers +read 113000000 sequences, 14942804338 bases, 11552804338 kmers +read 114000000 sequences, 15051637733 bases, 11631637733 kmers +read 115000000 sequences, 15160739429 bases, 11710739429 kmers +read 116000000 sequences, 15269978487 bases, 11789978487 kmers +read 117000000 sequences, 15378990148 bases, 11868990148 kmers +read 118000000 sequences, 15488236558 bases, 11948236558 kmers +read 119000000 sequences, 15598141514 bases, 12028141514 kmers +read 120000000 sequences, 15707567895 bases, 12107567895 kmers +read 121000000 sequences, 15817378418 bases, 12187378418 kmers +read 122000000 sequences, 15927205756 bases, 12267205756 kmers +read 123000000 sequences, 16037448540 bases, 12347448540 kmers +read 124000000 sequences, 16147936166 bases, 12427936166 kmers +read 125000000 sequences, 16258467588 bases, 12508467588 kmers +read 126000000 sequences, 16368795492 bases, 12588795492 kmers +read 127000000 sequences, 16479785214 bases, 12669785214 kmers +read 128000000 sequences, 16590282249 bases, 12750282249 kmers +read 129000000 sequences, 16701057677 bases, 12831057677 kmers +read 130000000 sequences, 16812553081 bases, 12912553081 kmers +read 131000000 sequences, 16923449047 bases, 12993449047 kmers +read 132000000 sequences, 17034230526 bases, 13074230526 kmers +read 133000000 sequences, 17145713815 bases, 13155713815 kmers +read 134000000 sequences, 17257389525 bases, 13237389525 kmers +read 135000000 sequences, 17369130838 bases, 13319130838 kmers +read 136000000 sequences, 17481314596 bases, 13401314596 kmers +read 137000000 sequences, 17593629072 bases, 13483629072 kmers +read 138000000 sequences, 17706229726 bases, 13566229726 kmers +read 139000000 sequences, 17818270886 bases, 13648270886 kmers +read 140000000 sequences, 17931420451 bases, 13731420451 kmers +read 141000000 sequences, 18044353871 bases, 13814353871 kmers +read 142000000 sequences, 18157903240 bases, 13897903240 kmers +read 143000000 sequences, 18271415292 bases, 13981415292 kmers +read 144000000 sequences, 18384555504 bases, 14064555504 kmers +read 145000000 sequences, 18498314118 bases, 14148314118 kmers +read 146000000 sequences, 18612140169 bases, 14232140169 kmers +read 147000000 sequences, 18726166960 bases, 14316166960 kmers +read 148000000 sequences, 18840350948 bases, 14400350948 kmers +read 149000000 sequences, 18954724883 bases, 14484724883 kmers +read 150000000 sequences, 19069173447 bases, 14569173447 kmers +read 151000000 sequences, 19183793062 bases, 14653793062 kmers +read 152000000 sequences, 19298944468 bases, 14738944468 kmers +read 153000000 sequences, 19414656615 bases, 14824656615 kmers +read 154000000 sequences, 19530428728 bases, 14910428728 kmers +read 155000000 sequences, 19646614327 bases, 14996614327 kmers +read 156000000 sequences, 19762624488 bases, 15082624488 kmers +read 157000000 sequences, 19879115632 bases, 15169115632 kmers +read 158000000 sequences, 19995793294 bases, 15255793294 kmers +read 159000000 sequences, 20112771576 bases, 15342771576 kmers +read 160000000 sequences, 20230295571 bases, 15430295571 kmers +read 161000000 sequences, 20347943202 bases, 15517943202 kmers +read 162000000 sequences, 20465629376 bases, 15605629376 kmers +read 163000000 sequences, 20583555678 bases, 15693555678 kmers +read 164000000 sequences, 20701871322 bases, 15781871322 kmers +read 165000000 sequences, 20820410777 bases, 15870410777 kmers +read 166000000 sequences, 20939977253 bases, 15959977253 kmers +read 167000000 sequences, 21059538950 bases, 16049538950 kmers +read 168000000 sequences, 21179653875 bases, 16139653875 kmers +read 169000000 sequences, 21300125826 bases, 16230125826 kmers +read 170000000 sequences, 21421275644 bases, 16321275644 kmers +read 171000000 sequences, 21542230532 bases, 16412230532 kmers +read 172000000 sequences, 21663705881 bases, 16503705881 kmers +read 173000000 sequences, 21785083912 bases, 16595083912 kmers +read 174000000 sequences, 21907256668 bases, 16687256668 kmers +read 175000000 sequences, 22029743385 bases, 16779743385 kmers +read 176000000 sequences, 22152051369 bases, 16872051369 kmers +read 177000000 sequences, 22275733581 bases, 16965733581 kmers +read 178000000 sequences, 22399701749 bases, 17059701749 kmers +read 179000000 sequences, 22524206009 bases, 17154206009 kmers +read 180000000 sequences, 22648755725 bases, 17248755725 kmers +read 181000000 sequences, 22773928274 bases, 17343928274 kmers +read 182000000 sequences, 22899987762 bases, 17439987762 kmers +read 183000000 sequences, 23025485159 bases, 17535485159 kmers +read 184000000 sequences, 23152188885 bases, 17632188885 kmers +read 185000000 sequences, 23279392102 bases, 17729392102 kmers +read 186000000 sequences, 23406527093 bases, 17826527093 kmers +read 187000000 sequences, 23534989577 bases, 17924989577 kmers +read 187636048 sequences, 23617016620 bases, 17987935180 kmers +num_kmers 17987935180 +cost: 2.0 + 0.625873 [bits/kmer] +max string length = 38851 +num bits per_absolute_offset = 35 +num bits per_relative_offset = 16 +num bits per_string_id = 28 +=== step 1 (encode strings): 74.4692 [sec] (4.13995 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.206.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.207.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.208.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.209.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.210.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.211.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.212.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.213.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.214.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.215.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.216.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.217.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.218.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.219.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.220.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.221.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.222.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.223.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.224.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.225.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.226.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.227.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.228.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.229.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.230.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.231.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.232.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.233.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.234.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.235.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.236.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.237.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.238.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.239.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.240.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.241.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.242.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.243.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.244.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.245.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.246.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.247.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.248.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.249.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.250.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.251.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.252.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.253.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.254.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.255.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.256.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.257.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.258.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.259.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.260.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.261.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.262.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.263.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.264.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.265.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.266.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.267.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.268.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.269.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.270.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.271.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.272.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.273.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.274.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.275.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.276.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.277.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.278.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.279.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.280.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.281.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.282.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.283.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.284.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.285.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.286.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.287.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.288.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.289.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.290.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.291.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.292.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.293.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.294.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.295.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.296.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.297.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.298.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.299.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.300.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.301.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.302.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.303.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.304.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.305.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.306.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.307.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.308.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.309.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.310.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.311.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.312.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.313.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.314.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.315.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.316.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.317.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.318.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.319.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.320.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.321.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.322.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.323.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.324.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.325.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.326.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.327.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.328.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.329.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.330.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.331.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.332.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.333.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.334.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.335.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.336.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.337.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.338.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.339.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.340.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.341.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.342.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.343.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.344.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.345.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.346.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.347.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.348.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.349.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.350.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.351.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.352.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.353.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.354.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.355.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.356.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.357.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.358.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.359.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.360.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.361.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.362.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.363.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.364.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.365.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.366.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.367.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.368.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.369.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.370.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.371.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.372.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.373.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.374.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.375.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.376.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.377.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.378.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.379.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.380.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.381.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.382.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.383.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.384.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.385.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.386.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.387.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.388.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.389.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.390.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.391.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.392.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.393.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.394.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.395.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.396.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.397.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.398.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.399.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.400.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.401.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.402.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.403.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.404.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.405.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.406.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.407.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.408.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.409.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.410.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.411.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.412.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.413.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.414.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.415.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.416.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.417.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.418.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.419.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.420.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.421.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.422.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.423.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.424.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.425.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.426.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.427.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.428.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.429.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.430.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.431.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.432.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.433.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.434.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.435.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.436.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.437.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.438.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.439.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.440.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.441.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.442.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.443.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.444.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.445.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.446.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.447.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.448.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.449.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.450.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.451.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.452.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.453.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.454.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.455.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.456.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.457.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.458.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.459.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.460.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.461.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.462.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.463.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.464.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.465.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.466.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.467.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.468.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.469.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.470.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.471.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.472.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.473.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.474.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.475.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.476.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.477.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.478.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.479.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.480.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.481.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.482.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.483.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.484.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.485.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.486.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.487.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.488.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.489.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.490.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.491.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.492.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.493.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.494.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.495.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.496.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.497.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.498.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.499.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.500.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.501.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.502.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.503.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.504.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.505.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.506.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.507.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.508.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.509.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.510.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.511.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.512.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.513.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.514.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.515.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.516.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.517.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.518.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.519.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.520.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.521.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.522.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.523.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.524.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.525.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.526.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.527.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.528.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.529.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.530.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.531.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.532.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.533.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.534.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.535.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.536.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.537.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.538.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.539.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.540.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.541.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.542.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.543.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.544.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.545.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.546.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.547.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.548.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.549.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.550.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.551.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.552.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.553.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.554.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.555.bin'... +=== step 2 (compute minimizer tuples): 132.929 [sec] (7.38992 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +processed 2700000000 minimizer tuples +processed 2800000000 minimizer tuples +processed 2900000000 minimizer tuples +processed 3000000000 minimizer tuples +processed 3100000000 minimizer tuples +processed 3200000000 minimizer tuples +processed 3300000000 minimizer tuples +processed 3400000000 minimizer tuples +processed 3500000000 minimizer tuples +processed 3600000000 minimizer tuples +processed 3700000000 minimizer tuples +processed 3800000000 minimizer tuples +processed 3900000000 minimizer tuples +=== step 3 (merging minimizer tuples): 311.499 [sec] (17.3171 [ns/kmer]) +num_minimizers = 3007078089 +num_minimizer_positions = 3771612342 +num_super_kmers = 3913697473 +building minimizers MPHF with 64 threads and 1003 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 271.387 [sec] (15.0872 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.8.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 283.505 [sec] (15.7609 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762815424875733578.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +processed 2700000000 minimizer tuples +processed 2800000000 minimizer tuples +processed 2900000000 minimizer tuples +processed 3000000000 minimizer tuples +processed 3100000000 minimizer tuples +processed 3200000000 minimizer tuples +processed 3300000000 minimizer tuples +processed 3400000000 minimizer tuples +processed 3500000000 minimizer tuples +processed 3600000000 minimizer tuples +processed 3700000000 minimizer tuples +processed 3800000000 minimizer tuples +processed 3900000000 minimizer tuples +=== step 6 (merging minimizers tuples): 409.149 [sec] (22.7457 [ns/kmer]) +num_bits_per_offset = 35 +num_buckets_larger_than_1_not_in_skew_index 259767459/3007078089 (8.63853%) +num_buckets_in_skew_index 621186/3007078089 (0.0206575%) +max_bucket_size 96569 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 942584227/3771612342 (24.9915%) +num_minimizer_positions_of_buckets_in_skew_index 82338671/3771612342 (2.18312%) +=== step 7.1 (build sparse index): 72.5609 [sec] (4.03386 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 170796088 + partition = 1: num kmers in buckets of size > 128 and <= 256: 101178141 + partition = 2: num kmers in buckets of size > 256 and <= 512: 52619176 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 22739211 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 8521738 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 2988490 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 1453237 + partition = 7: num kmers in buckets of size > 8192 and <= 96569: 1063107 +num kmers in skew index = 361359188 (2.0089%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 170796088 + building MPHF with 64 threads and 57 partitions (avg. partition size = 3000000)... + built mphs[0] for 170796088 kmers; bits/key = 2.55471 + built positions[0] for 170796088 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 101178141 + building MPHF with 64 threads and 34 partitions (avg. partition size = 3000000)... + built mphs[1] for 101178141 kmers; bits/key = 2.55592 + built positions[1] for 101178141 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 52619176 + building MPHF with 64 threads and 18 partitions (avg. partition size = 3000000)... + built mphs[2] for 52619176 kmers; bits/key = 2.52635 + built positions[2] for 52619176 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 22739211 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[3] for 22739211 kmers; bits/key = 2.52777 + built positions[3] for 22739211 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8521738 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[4] for 8521738 kmers; bits/key = 2.52914 + built positions[4] for 8521738 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2988490 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2988490)... + built mphs[5] for 2988490 kmers; bits/key = 2.55981 + built positions[5] for 2988490 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1453237 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1453237)... + built mphs[6] for 1453237 kmers; bits/key = 2.56054 + built positions[6] for 1453237 kmers; bits/key = 13.0002 + lower = 8192; upper = 96569; num_bits_per_pos = 17; num_kmers_in_partition = 1063107 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1063107)... + built mphs[7] for 1063107 kmers; bits/key = 2.56108 + built positions[7] for 1063107 kmers; bits/key = 17.0003 +=== step 7.2 (build skew index): 56.6652 [sec] (3.15018 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 91.3408% +buckets with 2 minimizer positions = 5.0388% +buckets with 3 minimizer positions = 1.50349% +buckets with 4 minimizer positions = 0.686099% +buckets with 5 minimizer positions = 0.383447% +buckets with 6 minimizer positions = 0.239348% +buckets with 7 minimizer positions = 0.160991% +buckets with 8 minimizer positions = 0.114476% +buckets with 9 minimizer positions = 0.0847425% +buckets with 10 minimizer positions = 0.0647212% +buckets with 11 minimizer positions = 0.0507236% +buckets with 12 minimizer positions = 0.0406309% +buckets with 13 minimizer positions = 0.0330582% +buckets with 14 minimizer positions = 0.0273473% +buckets with 15 minimizer positions = 0.0229519% +buckets with 16 minimizer positions = 0.0194797% +max_bucket_size = 96569 +=== step 7 (build sparse and skew index): 138.007 [sec] (7.67218 [ns/kmer]) +=== total time: 1620.94 [sec] (90.1129 [ns/kmer]) +total index size: 26027317465 [B] -- 26027.3 [MB] +SPACE BREAKDOWN: + mphf: 0.472648 [bits/kmer] (2.82732 [bits/key]) -- 4.0832% + strings_offsets: 0.253608 [bits/kmer] -- 2.19091% + control_codewords: 6.01819 [bits/kmer] -- 51.991% + mid_load_buckets: 1.83403 [bits/kmer] -- 15.8441% + begin_buckets_of_size: 1.19191e-07 [bits/kmer] -- 1.02969e-06% + strings: 2.62587 [bits/kmer] -- 22.6848% + skew_index: 0.371103 [bits/kmer] -- 3.20595% + weights: 8.18326e-08 [bits/kmer] -- 7.0695e-07% + -------------- + total: 11.5755 [bits/kmer] +2025-11-11 00:24:05: saving data structure to disk... +2025-11-11 00:26:06: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash --canonical +2025-11-11 00:26:07: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max string length = 17920 +num bits per_absolute_offset = 33 +num bits per_relative_offset = 15 +num bits per_string_id = 26 +=== step 1 (encode strings): 16.8603 [sec] (4.53463 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.133.bin'... +=== step 2 (compute minimizer tuples): 9.07218 [sec] (2.43999 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +=== step 3 (merging minimizer tuples): 60.5144 [sec] (16.2755 [ns/kmer]) +num_minimizers = 619508590 +num_minimizer_positions = 790834640 +num_super_kmers = 819080133 +building minimizers MPHF with 64 threads and 207 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 23.944 [sec] (6.43982 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 26.5527 [sec] (7.14143 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817167661601220.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +=== step 6 (merging minimizers tuples): 114.26 [sec] (30.7305 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 81104016/619508590 (13.0917%) +num_buckets_in_skew_index 149851/619508590 (0.0241887%) +max_bucket_size 71241 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 225181159/790834640 (28.4739%) +num_minimizer_positions_of_buckets_in_skew_index 27398758/790834640 (3.46454%) +=== step 7.1 (build sparse index): 15.751 [sec] (4.23628 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 35558914 + partition = 1: num kmers in buckets of size > 128 and <= 256: 26726484 + partition = 2: num kmers in buckets of size > 256 and <= 512: 19151665 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 12830346 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 8265693 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 5225188 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 3257832 + partition = 7: num kmers in buckets of size > 8192 and <= 71241: 4228970 +num kmers in skew index = 115245092 (3.09955%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 35558914 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[0] for 35558914 kmers; bits/key = 2.57422 + built positions[0] for 35558914 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26726484 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26726484 kmers; bits/key = 2.5656 + built positions[1] for 26726484 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19151665 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19151665 kmers; bits/key = 2.60993 + built positions[2] for 19151665 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 12830346 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[3] for 12830346 kmers; bits/key = 2.65495 + built positions[3] for 12830346 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8265693 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[4] for 8265693 kmers; bits/key = 2.59459 + built positions[4] for 8265693 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 5225188 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 5225188 kmers; bits/key = 2.63154 + built positions[5] for 5225188 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 3257832 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 3257832 kmers; bits/key = 3.31153 + built positions[6] for 3257832 kmers; bits/key = 13.0001 + lower = 8192; upper = 71241; num_bits_per_pos = 17; num_kmers_in_partition = 4228970 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 4228970 kmers; bits/key = 2.84935 + built positions[7] for 4228970 kmers; bits/key = 17.0001 +=== step 7.2 (build skew index): 16.349 [sec] (4.39711 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 86.8841% +buckets with 2 minimizer positions = 10.1608% +buckets with 3 minimizer positions = 1.5937% +buckets with 4 minimizer positions = 0.465965% +buckets with 5 minimizer positions = 0.227622% +buckets with 6 minimizer positions = 0.138122% +buckets with 7 minimizer positions = 0.0932371% +buckets with 8 minimizer positions = 0.0672932% +buckets with 9 minimizer positions = 0.0507686% +buckets with 10 minimizer positions = 0.0394317% +buckets with 11 minimizer positions = 0.0314958% +buckets with 12 minimizer positions = 0.025655% +buckets with 13 minimizer positions = 0.0213997% +buckets with 14 minimizer positions = 0.017952% +buckets with 15 minimizer positions = 0.0152708% +buckets with 16 minimizer positions = 0.0132381% +max_bucket_size = 71241 +=== step 7 (build sparse and skew index): 34.0706 [sec] (9.16338 [ns/kmer]) +=== total time: 285.274 [sec] (76.7252 [ns/kmer]) +total index size: 5544019788 [B] -- 5544.02 [MB] +SPACE BREAKDOWN: + mphf: 0.472233 [bits/kmer] (2.83421 [bits/key]) -- 3.95881% + strings_offsets: 0.300083 [bits/kmer] -- 2.51565% + control_codewords: 5.66504 [bits/kmer] -- 47.491% + mid_load_buckets: 1.99858 [bits/kmer] -- 16.7545% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.83404e-06% + strings: 2.8909 [bits/kmer] -- 24.2349% + skew_index: 0.601813 [bits/kmer] -- 5.04511% + weights: 3.95899e-07 [bits/kmer] -- 3.31889e-06% + -------------- + total: 11.9286 [bits/kmer] +2025-11-11 00:30:52: saving data structure to disk... +2025-11-11 00:31:18: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash --canonical +2025-11-11 00:31:18: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max string length = 176455 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 18 +num bits per_string_id = 25 +=== step 1 (encode strings): 5.7441 [sec] (5.17012 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.65.bin'... +=== step 2 (compute minimizer tuples): 1.56241 [sec] (1.40628 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +=== step 3 (merging minimizer tuples): 13.4328 [sec] (12.0905 [ns/kmer]) +num_minimizers = 174641353 +num_minimizer_positions = 240693690 +num_super_kmers = 249228267 +building minimizers MPHF with 64 threads and 59 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 7.28747 [sec] (6.55927 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817478694665857.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 8.40751 [sec] (7.56739 [ns/kmer]) +=== step 6 (merging minimizers tuples): 32.332 [sec] (29.1012 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 20680302/174641353 (11.8416%) +num_buckets_in_skew_index 18464/174641353 (0.0105725%) +max_bucket_size 37043 +log2_max_bucket_size 16 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 82592303/240693690 (34.3143%) +num_minimizer_positions_of_buckets_in_skew_index 4158800/240693690 (1.72784%) +=== step 7.1 (build sparse index): 4.99956 [sec] (4.49997 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 4817539 + partition = 1: num kmers in buckets of size > 128 and <= 256: 2376719 + partition = 2: num kmers in buckets of size > 256 and <= 512: 1827153 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1520019 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1265567 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 951364 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 1017584 + partition = 7: num kmers in buckets of size > 8192 and <= 37043: 1228646 +num kmers in skew index = 15004591 (1.35053%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4817539 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4817539 kmers; bits/key = 2.73 + built positions[0] for 4817539 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2376719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2376719)... + built mphs[1] for 2376719 kmers; bits/key = 2.55999 + built positions[1] for 2376719 kmers; bits/key = 8.00014 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1827153 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1827153)... + built mphs[2] for 1827153 kmers; bits/key = 2.56021 + built positions[2] for 1827153 kmers; bits/key = 9.0002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1520019 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1520019)... + built mphs[3] for 1520019 kmers; bits/key = 2.56043 + built positions[3] for 1520019 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1265567 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1265567)... + built mphs[4] for 1265567 kmers; bits/key = 2.56074 + built positions[4] for 1265567 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 951364 + building MPHF with 64 threads and 1 partitions (avg. partition size = 951364)... + built mphs[5] for 951364 kmers; bits/key = 2.56127 + built positions[5] for 951364 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1017584 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1017584)... + built mphs[6] for 1017584 kmers; bits/key = 2.41831 + built positions[6] for 1017584 kmers; bits/key = 13.0003 + lower = 8192; upper = 37043; num_bits_per_pos = 16; num_kmers_in_partition = 1228646 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1228646)... + built mphs[7] for 1228646 kmers; bits/key = 2.56083 + built positions[7] for 1228646 kmers; bits/key = 16.0003 +=== step 7.2 (build skew index): 6.45738 [sec] (5.81212 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 88.1478% +buckets with 2 minimizer positions = 6.79213% +buckets with 3 minimizer positions = 1.92226% +buckets with 4 minimizer positions = 0.856078% +buckets with 5 minimizer positions = 0.493468% +buckets with 6 minimizer positions = 0.325915% +buckets with 7 minimizer positions = 0.234531% +buckets with 8 minimizer positions = 0.178296% +buckets with 9 minimizer positions = 0.141164% +buckets with 10 minimizer positions = 0.115104% +buckets with 11 minimizer positions = 0.0959486% +buckets with 12 minimizer positions = 0.0807615% +buckets with 13 minimizer positions = 0.0695379% +buckets with 14 minimizer positions = 0.060729% +buckets with 15 minimizer positions = 0.0531947% +buckets with 16 minimizer positions = 0.0472706% +max_bucket_size = 37043 +=== step 7 (build sparse and skew index): 12.0976 [sec] (10.8887 [ns/kmer]) +=== total time: 80.8638 [sec] (72.7835 [ns/kmer]) +total index size: 1600485113 [B] -- 1600.49 [MB] +SPACE BREAKDOWN: + mphf: 0.447872 [bits/kmer] (2.84923 [bits/key]) -- 3.88627% + strings_offsets: 0.337884 [bits/kmer] -- 2.93189% + control_codewords: 5.03009 [bits/kmer] -- 43.6471% + mid_load_buckets: 2.30452 [bits/kmer] -- 19.9968% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.67449e-05% + strings: 3.1245 [bits/kmer] -- 27.1119% + skew_index: 0.279583 [bits/kmer] -- 2.426% + weights: 1.32491e-06 [bits/kmer] -- 1.14965e-05% + -------------- + total: 11.5244 [bits/kmer] +2025-11-11 00:32:39: saving data structure to disk... +2025-11-11 00:32:46: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash --canonical +2025-11-11 00:32:47: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max string length = 117016 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 17 +num bits per_string_id = 24 +=== step 1 (encode strings): 4.57831 [sec] (5.11938 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.64.bin'... +=== step 2 (compute minimizer tuples): 1.35994 [sec] (1.52066 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +=== step 3 (merging minimizer tuples): 10.6837 [sec] (11.9463 [ns/kmer]) +num_minimizers = 143418843 +num_minimizer_positions = 193511241 +num_super_kmers = 200364919 +building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 5.98867 [sec] (6.69642 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817567105836865.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 6.75619 [sec] (7.55464 [ns/kmer]) +=== step 6 (merging minimizers tuples): 29.022 [sec] (32.4518 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 18123968/143418843 (12.6371%) +num_buckets_in_skew_index 15172/143418843 (0.0105788%) +max_bucket_size 30655 +log2_max_bucket_size 15 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 65664193/193511241 (33.933%) +num_minimizer_positions_of_buckets_in_skew_index 2567345/193511241 (1.32672%) +=== step 7.1 (build sparse index): 4.07138 [sec] (4.55254 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 4240400 + partition = 1: num kmers in buckets of size > 128 and <= 256: 1914946 + partition = 2: num kmers in buckets of size > 256 and <= 512: 1106165 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 771672 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 562721 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 475654 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 388509 + partition = 7: num kmers in buckets of size > 8192 and <= 30655: 459571 +num kmers in skew index = 9919638 (1.10919%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4240400 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4240400 kmers; bits/key = 2.84282 + built positions[0] for 4240400 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1914946 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1914946)... + built mphs[1] for 1914946 kmers; bits/key = 2.56017 + built positions[1] for 1914946 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1106165 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1106165)... + built mphs[2] for 1106165 kmers; bits/key = 2.56093 + built positions[2] for 1106165 kmers; bits/key = 9.00032 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 771672 + building MPHF with 64 threads and 1 partitions (avg. partition size = 771672)... + built mphs[3] for 771672 kmers; bits/key = 2.41893 + built positions[3] for 771672 kmers; bits/key = 10.0004 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 562721 + building MPHF with 64 threads and 1 partitions (avg. partition size = 562721)... + built mphs[4] for 562721 kmers; bits/key = 2.56295 + built positions[4] for 562721 kmers; bits/key = 11.0006 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 475654 + building MPHF with 64 threads and 1 partitions (avg. partition size = 475654)... + built mphs[5] for 475654 kmers; bits/key = 2.56365 + built positions[5] for 475654 kmers; bits/key = 12.0008 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 388509 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388509)... + built mphs[6] for 388509 kmers; bits/key = 2.42185 + built positions[6] for 388509 kmers; bits/key = 13.0008 + lower = 8192; upper = 30655; num_bits_per_pos = 15; num_kmers_in_partition = 459571 + building MPHF with 64 threads and 1 partitions (avg. partition size = 459571)... + built mphs[7] for 459571 kmers; bits/key = 2.4208 + built positions[7] for 459571 kmers; bits/key = 15.0007 +=== step 7.2 (build skew index): 3.78132 [sec] (4.22819 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 87.3523% +buckets with 2 minimizer positions = 7.4877% +buckets with 3 minimizer positions = 2.14684% +buckets with 4 minimizer positions = 0.927917% +buckets with 5 minimizer positions = 0.508829% +buckets with 6 minimizer positions = 0.320607% +buckets with 7 minimizer positions = 0.221914% +buckets with 8 minimizer positions = 0.16449% +buckets with 9 minimizer positions = 0.128547% +buckets with 10 minimizer positions = 0.104586% +buckets with 11 minimizer positions = 0.0865967% +buckets with 12 minimizer positions = 0.0732902% +buckets with 13 minimizer positions = 0.062991% +buckets with 14 minimizer positions = 0.0543541% +buckets with 15 minimizer positions = 0.0475495% +buckets with 16 minimizer positions = 0.0409653% +max_bucket_size = 30655 +=== step 7 (build sparse and skew index): 8.38333 [sec] (9.37408 [ns/kmer]) +=== total time: 66.7721 [sec] (74.6632 [ns/kmer]) +total index size: 1287008500 [B] -- 1287.01 [MB] +SPACE BREAKDOWN: + mphf: 0.453288 [bits/kmer] (2.82655 [bits/key]) -- 3.93723% + strings_offsets: 0.333373 [bits/kmer] -- 2.89565% + control_codewords: 5.13178 [bits/kmer] -- 44.5743% + mid_load_buckets: 2.27616 [bits/kmer] -- 19.7706% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.08235e-05% + strings: 3.10303 [bits/kmer] -- 26.9527% + skew_index: 0.215227 [bits/kmer] -- 1.86944% + weights: 1.64596e-06 [bits/kmer] -- 1.42967e-05% + -------------- + total: 11.5129 [bits/kmer] +2025-11-11 00:33:53: saving data structure to disk... +2025-11-11 00:33:59: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash --canonical +2025-11-11 00:34:00: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz'... +read 1000000 sequences, 289026795 bases, 259026795 kmers +read 1645464 sequences, 425569105 bases, 376205185 kmers +num_kmers 376205185 +cost: 2.0 + 0.262431 [bits/kmer] +max string length = 234900 +num bits per_absolute_offset = 29 +num bits per_relative_offset = 18 +num bits per_string_id = 21 +=== step 1 (encode strings): 1.11357 [sec] (2.96002 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.620769 [sec] (1.65008 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.bin' +=== step 3 (merging minimizer tuples): 3.51126 [sec] (9.33337 [ns/kmer]) +num_minimizers = 61900353 +num_minimizer_positions = 66937395 +num_super_kmers = 69800288 +building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.76113 [sec] (7.33943 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817640087399618.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 2.49504 [sec] (6.63212 [ns/kmer]) +=== step 6 (merging minimizers tuples): 5.20608 [sec] (13.8384 [ns/kmer]) +num_bits_per_offset = 29 +num_buckets_larger_than_1_not_in_skew_index 3624138/61900353 (5.85479%) +num_buckets_in_skew_index 39/61900353 (6.30045e-05%) +max_bucket_size 536 +log2_max_bucket_size 10 +num_partitions in skew index 4 +num_minimizer_positions_of_buckets_larger_than_1 8656439/66937395 (12.9321%) +num_minimizer_positions_of_buckets_in_skew_index 4780/66937395 (0.007141%) +=== step 7.1 (build sparse index): 0.960968 [sec] (2.55437 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 13913 + partition = 1: num kmers in buckets of size > 128 and <= 256: 2852 + partition = 2: num kmers in buckets of size > 256 and <= 512: 3765 + partition = 3: num kmers in buckets of size > 512 and <= 536: 1800 +num kmers in skew index = 22330 (0.00593559%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 13913 + building MPHF with 64 threads and 1 partitions (avg. partition size = 13913)... + built mphs[0] for 13913 kmers; bits/key = 2.42421 + built positions[0] for 13913 kmers; bits/key = 7.02422 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2852 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2852)... + built mphs[1] for 2852 kmers; bits/key = 3.01823 + built positions[1] for 2852 kmers; bits/key = 8.12342 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 3765 + building MPHF with 64 threads and 1 partitions (avg. partition size = 3765)... + built mphs[2] for 3765 kmers; bits/key = 2.85578 + built positions[2] for 3765 kmers; bits/key = 9.09429 + lower = 512; upper = 536; num_bits_per_pos = 10; num_kmers_in_partition = 1800 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1800)... + built mphs[3] for 1800 kmers; bits/key = 3.48444 + built positions[3] for 1800 kmers; bits/key = 10.2044 +=== step 7.2 (build skew index): 0.039044 [sec] (0.103784 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 94.1451% +buckets with 2 minimizer positions = 4.50452% +buckets with 3 minimizer positions = 0.894247% +buckets with 4 minimizer positions = 0.259036% +buckets with 5 minimizer positions = 0.0977103% +buckets with 6 minimizer positions = 0.0440321% +buckets with 7 minimizer positions = 0.0222034% +buckets with 8 minimizer positions = 0.0119789% +buckets with 9 minimizer positions = 0.00695473% +buckets with 10 minimizer positions = 0.00425684% +buckets with 11 minimizer positions = 0.00288528% +buckets with 12 minimizer positions = 0.00173505% +buckets with 13 minimizer positions = 0.00116639% +buckets with 14 minimizer positions = 0.000827136% +buckets with 15 minimizer positions = 0.000639738% +buckets with 16 minimizer positions = 0.000463648% +max_bucket_size = 536 +=== step 7 (build sparse and skew index): 1.16437 [sec] (3.09504 [ns/kmer]) +=== total time: 16.8722 [sec] (44.8485 [ns/kmer]) +total index size: 398891769 [B] -- 398.892 [MB] +SPACE BREAKDOWN: + mphf: 0.472086 [bits/kmer] (2.86915 [bits/key]) -- 5.56546% + strings_offsets: 0.14346 [bits/kmer] -- 1.69126% + control_codewords: 4.93617 [bits/kmer] -- 58.1928% + mid_load_buckets: 0.667288 [bits/kmer] -- 7.8667% + begin_buckets_of_size: 5.69902e-06 [bits/kmer] -- 6.71861e-05% + strings: 2.26243 [bits/kmer] -- 26.672% + skew_index: 0.000988652 [bits/kmer] -- 0.0116553% + weights: 3.91276e-06 [bits/kmer] -- 4.61278e-05% + -------------- + total: 8.48243 [bits/kmer] +2025-11-11 00:34:16: saving data structure to disk... +2025-11-11 00:34:18: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash --canonical +2025-11-11 00:34:18: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz'... +read 1000000 sequences, 686017631 bases, 656017631 kmers +read 2000000 sequences, 1516930736 bases, 1456930736 kmers +read 3000000 sequences, 1671624364 bases, 1581624364 kmers +read 4000000 sequences, 1825353707 bases, 1705353707 kmers +read 5000000 sequences, 1981022079 bases, 1831022079 kmers +read 6000000 sequences, 2135517340 bases, 1955517340 kmers +read 7000000 sequences, 2290855053 bases, 2080855053 kmers +read 8000000 sequences, 2446475973 bases, 2206475973 kmers +read 9000000 sequences, 2602386528 bases, 2332386528 kmers +read 10000000 sequences, 2759608735 bases, 2459608735 kmers +read 11000000 sequences, 2916635557 bases, 2586635557 kmers +read 12000000 sequences, 3075074548 bases, 2715074548 kmers +read 13000000 sequences, 3231174451 bases, 2841174451 kmers +read 14000000 sequences, 3387702724 bases, 2967702724 kmers +read 15000000 sequences, 3546041675 bases, 3096041675 kmers +read 16000000 sequences, 3705485347 bases, 3225485347 kmers +read 17000000 sequences, 3864338567 bases, 3354338567 kmers +read 18000000 sequences, 4024214257 bases, 3484214257 kmers +read 19000000 sequences, 4185860468 bases, 3615860468 kmers +read 20000000 sequences, 4346092632 bases, 3746092632 kmers +read 21000000 sequences, 4506820088 bases, 3876820088 kmers +read 22000000 sequences, 4669576501 bases, 4009576501 kmers +read 23000000 sequences, 4833065439 bases, 4143065439 kmers +read 24000000 sequences, 4995788985 bases, 4275788985 kmers +read 25000000 sequences, 5161157096 bases, 4411157096 kmers +read 26000000 sequences, 5326624598 bases, 4546624598 kmers +read 27000000 sequences, 5491635755 bases, 4681635755 kmers +read 28000000 sequences, 5657793355 bases, 4817793355 kmers +read 29000000 sequences, 5825695255 bases, 4955695255 kmers +read 30000000 sequences, 5993510862 bases, 5093510862 kmers +read 31000000 sequences, 6162441208 bases, 5232441208 kmers +read 32000000 sequences, 6331692362 bases, 5371692362 kmers +read 33000000 sequences, 6503271864 bases, 5513271864 kmers +read 34000000 sequences, 6675760229 bases, 5655760229 kmers +read 35000000 sequences, 6848330384 bases, 5798330384 kmers +read 36000000 sequences, 7023123965 bases, 5943123965 kmers +read 37000000 sequences, 7198253074 bases, 6088253074 kmers +read 38000000 sequences, 7375809245 bases, 6235809245 kmers +read 39000000 sequences, 7554546146 bases, 6384546146 kmers +read 40000000 sequences, 7733588270 bases, 6533588270 kmers +read 41000000 sequences, 7913812723 bases, 6683812723 kmers +read 42000000 sequences, 8096249793 bases, 6836249793 kmers +read 43000000 sequences, 8280221420 bases, 6990221420 kmers +read 44000000 sequences, 8465351199 bases, 7145351199 kmers +read 45000000 sequences, 8653130199 bases, 7303130199 kmers +read 46000000 sequences, 8842916979 bases, 7462916979 kmers +read 47000000 sequences, 9034171590 bases, 7624171590 kmers +read 48000000 sequences, 9229077420 bases, 7789077420 kmers +read 49000000 sequences, 9427173385 bases, 7957173385 kmers +read 50000000 sequences, 9626599822 bases, 8126599822 kmers +read 51000000 sequences, 9828281066 bases, 8298281066 kmers +read 52000000 sequences, 10034632099 bases, 8474632099 kmers +read 53000000 sequences, 10244441062 bases, 8654441062 kmers +read 54000000 sequences, 10461638729 bases, 8841638729 kmers +read 55000000 sequences, 10681775593 bases, 9031775593 kmers +read 56000000 sequences, 10909062511 bases, 9229062511 kmers +read 57000000 sequences, 11141765143 bases, 9431765143 kmers +read 58000000 sequences, 11382466536 bases, 9642466536 kmers +read 59000000 sequences, 11631643814 bases, 9861643814 kmers +read 60000000 sequences, 11893103257 bases, 10093103257 kmers +read 61000000 sequences, 12168237378 bases, 10338237378 kmers +read 62000000 sequences, 12459768025 bases, 10599768025 kmers +read 63000000 sequences, 12773380141 bases, 10883380141 kmers +read 64000000 sequences, 13118311195 bases, 11198311195 kmers +read 65000000 sequences, 13506575783 bases, 11556575783 kmers +read 66000000 sequences, 13957265370 bases, 11977265370 kmers +read 66677672 sequences, 14320170624 bases, 12319840464 kmers +num_kmers 12319840464 +cost: 2.0 + 0.324733 [bits/kmer] +max string length = 199388 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 18 +num bits per_string_id = 26 +=== step 1 (encode strings): 38.0187 [sec] (3.08597 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.206.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.207.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.208.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.209.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.210.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.211.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.212.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.213.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.214.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.215.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.216.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.217.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.218.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.219.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.220.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.221.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.222.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.223.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.224.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.225.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.226.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.227.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.228.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.229.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.230.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.231.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.232.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.233.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.234.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.235.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.236.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.237.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.238.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.239.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.240.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.241.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.242.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.243.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.244.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.245.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.246.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.247.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.248.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.249.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.250.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.251.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.252.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.253.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.254.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.255.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.256.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.257.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.258.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.259.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.260.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.261.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.262.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.263.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.264.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.265.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.266.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.267.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.268.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.269.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.270.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.271.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.272.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.273.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.274.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.275.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.276.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.277.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.278.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.279.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.280.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.281.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.282.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.283.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.284.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.285.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.286.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.287.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.288.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.289.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.290.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.291.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.292.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.293.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.294.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.295.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.296.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.297.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.298.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.299.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.300.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.301.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.302.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.303.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.304.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.305.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.306.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.307.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.308.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.309.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.310.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.311.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.312.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.313.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.314.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.315.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.316.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.317.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.318.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.319.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.320.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.321.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.322.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.323.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.324.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.325.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.326.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.327.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.328.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.329.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.330.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.331.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.332.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.333.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.334.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.335.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.336.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.337.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.338.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.339.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.340.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.341.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.342.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.343.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.344.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.345.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.346.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.347.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.348.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.349.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.350.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.351.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.352.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.353.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.354.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.355.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.356.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.357.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.358.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.359.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.360.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.361.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.362.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.363.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.364.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.365.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.366.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.367.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.368.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.369.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.370.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.371.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.372.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.373.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.374.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.375.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.376.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.377.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.378.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.379.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.380.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.381.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.382.bin'... +=== step 2 (compute minimizer tuples): 40.8813 [sec] (3.31833 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +=== step 3 (merging minimizer tuples): 208.951 [sec] (16.9606 [ns/kmer]) +num_minimizers = 2310123641 +num_minimizer_positions = 2534773036 +num_super_kmers = 2635842181 +building minimizers MPHF with 64 threads and 771 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 214.323 [sec] (17.3966 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.5.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 186.685 [sec] (15.1532 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762817658872962917.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +=== step 6 (merging minimizers tuples): 273.627 [sec] (22.2103 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 139340525/2310123641 (6.03173%) +num_buckets_in_skew_index 26397/2310123641 (0.00114267%) +max_bucket_size 39709 +log2_max_bucket_size 16 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 359624077/2534773036 (14.1876%) +num_minimizer_positions_of_buckets_in_skew_index 4392240/2534773036 (0.173279%) +=== step 7.1 (build sparse index): 38.3962 [sec] (3.11661 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 8192991 + partition = 1: num kmers in buckets of size > 128 and <= 256: 4344352 + partition = 2: num kmers in buckets of size > 256 and <= 512: 3071572 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1936665 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1598600 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1118432 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 506671 + partition = 7: num kmers in buckets of size > 8192 and <= 39709: 918303 +num kmers in skew index = 21687586 (0.176038%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 8192991 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[0] for 8192991 kmers; bits/key = 2.61394 + built positions[0] for 8192991 kmers; bits/key = 7.00004 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 4344352 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 4344352 kmers; bits/key = 2.78474 + built positions[1] for 4344352 kmers; bits/key = 8.00007 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 3071572 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 3071572 kmers; bits/key = 3.20805 + built positions[2] for 3071572 kmers; bits/key = 9.00011 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1936665 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1936665)... + built mphs[3] for 1936665 kmers; bits/key = 2.56017 + built positions[3] for 1936665 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1598600 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1598600)... + built mphs[4] for 1598600 kmers; bits/key = 2.56041 + built positions[4] for 1598600 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1118432 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1118432)... + built mphs[5] for 1118432 kmers; bits/key = 2.56094 + built positions[5] for 1118432 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 506671 + building MPHF with 64 threads and 1 partitions (avg. partition size = 506671)... + built mphs[6] for 506671 kmers; bits/key = 2.42028 + built positions[6] for 506671 kmers; bits/key = 13.0007 + lower = 8192; upper = 39709; num_bits_per_pos = 16; num_kmers_in_partition = 918303 + building MPHF with 64 threads and 1 partitions (avg. partition size = 918303)... + built mphs[7] for 918303 kmers; bits/key = 2.56139 + built positions[7] for 918303 kmers; bits/key = 16.0004 +=== step 7.2 (build skew index): 5.83207 [sec] (0.473389 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 93.9671% +buckets with 2 minimizer positions = 4.43011% +buckets with 3 minimizer positions = 0.958706% +buckets with 4 minimizer positions = 0.312903% +buckets with 5 minimizer positions = 0.13175% +buckets with 6 minimizer positions = 0.0653104% +buckets with 7 minimizer positions = 0.0366997% +buckets with 8 minimizer positions = 0.0229438% +buckets with 9 minimizer positions = 0.01544% +buckets with 10 minimizer positions = 0.0109679% +buckets with 11 minimizer positions = 0.00812428% +buckets with 12 minimizer positions = 0.00620521% +buckets with 13 minimizer positions = 0.00487394% +buckets with 14 minimizer positions = 0.00390131% +buckets with 15 minimizer positions = 0.00317338% +buckets with 16 minimizer positions = 0.00260103% +max_bucket_size = 39709 +=== step 7 (build sparse and skew index): 49.8393 [sec] (4.04545 [ns/kmer]) +=== total time: 1012.33 [sec] (82.1704 [ns/kmer]) +total index size: 16357630621 [B] -- 16357.6 [MB] +SPACE BREAKDOWN: + mphf: 0.5305 [bits/kmer] (2.82915 [bits/key]) -- 4.99436% + strings_offsets: 0.178888 [bits/kmer] -- 1.68413% + control_codewords: 6.56294 [bits/kmer] -- 61.7864% + mid_load_buckets: 0.992482 [bits/kmer] -- 9.34367% + begin_buckets_of_size: 1.74028e-07 [bits/kmer] -- 1.63838e-06% + strings: 2.32473 [bits/kmer] -- 21.8861% + skew_index: 0.0324357 [bits/kmer] -- 0.305364% + weights: 1.19482e-07 [bits/kmer] -- 1.12486e-06% + -------------- + total: 10.622 [bits/kmer] +2025-11-11 00:51:11: saving data structure to disk... +2025-11-11 00:52:28: DONE diff --git a/benchmarks/results-10-11-25/k31/canon-build.time.log b/benchmarks/results-10-11-25/k31/canon-build.time.log new file mode 100644 index 0000000..c05ec83 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-build.time.log @@ -0,0 +1,207 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash --canonical" + User time (seconds): 55.86 + System time (seconds): 13.46 + Percent of CPU this job got: 230% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:30.03 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 4893484 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 3272542 + Voluntary context switches: 30178 + Involuntary context switches: 8313 + Swaps: 0 + File system inputs: 121616 + File system outputs: 14514904 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash --canonical" + User time (seconds): 138.73 + System time (seconds): 28.72 + Percent of CPU this job got: 229% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:12.84 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9627436 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 7323840 + Voluntary context switches: 38810 + Involuntary context switches: 8515 + Swaps: 0 + File system inputs: 667928 + File system outputs: 33377312 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash --canonical" + User time (seconds): 402.01 + System time (seconds): 77.72 + Percent of CPU this job got: 234% + Elapsed (wall clock) time (h:mm:ss or m:ss): 3:24.55 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 20293184 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 16812014 + Voluntary context switches: 105629 + Involuntary context switches: 14100 + Swaps: 0 + File system inputs: 1725608 + File system outputs: 97182920 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.canon.sshash --canonical" + User time (seconds): 3096.75 + System time (seconds): 465.92 + Percent of CPU this job got: 204% + Elapsed (wall clock) time (h:mm:ss or m:ss): 29:02.78 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 117399064 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 83853618 + Voluntary context switches: 949118 + Involuntary context switches: 85961 + Swaps: 0 + File system inputs: 16123848 + File system outputs: 707620200 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash --canonical" + User time (seconds): 594.65 + System time (seconds): 102.64 + Percent of CPU this job got: 224% + Elapsed (wall clock) time (h:mm:ss or m:ss): 5:11.03 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 26835704 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 23863157 + Voluntary context switches: 140738 + Involuntary context switches: 17267 + Swaps: 0 + File system inputs: 328 + File system outputs: 147931672 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.canon.sshash --canonical" + User time (seconds): 153.25 + System time (seconds): 33.92 + Percent of CPU this job got: 211% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:28.40 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 11295764 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 8234867 + Voluntary context switches: 31507 + Involuntary context switches: 9385 + Swaps: 0 + File system inputs: 96 + File system outputs: 35597416 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash --canonical" + User time (seconds): 118.00 + System time (seconds): 26.39 + Percent of CPU this job got: 197% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:12.97 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9106788 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6678995 + Voluntary context switches: 33139 + Involuntary context switches: 8840 + Swaps: 0 + File system inputs: 80 + File system outputs: 28721576 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash --canonical" + User time (seconds): 34.94 + System time (seconds): 9.59 + Percent of CPU this job got: 237% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:18.78 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3577468 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2329236 + Voluntary context switches: 29575 + Involuntary context switches: 7356 + Swaps: 0 + File system inputs: 56 + File system outputs: 10334360 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.canon.sshash --canonical" + User time (seconds): 1985.87 + System time (seconds): 329.22 + Percent of CPU this job got: 212% + Elapsed (wall clock) time (h:mm:ss or m:ss): 18:10.53 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 72774192 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 58475937 + Voluntary context switches: 742078 + Involuntary context switches: 54485 + Swaps: 0 + File system inputs: 744 + File system outputs: 484368272 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-10-11-25/k31/regular-build.json b/benchmarks/results-10-11-25/k31/regular-build.json new file mode 100644 index 0000000..d017d36 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-build.json @@ -0,0 +1,9 @@ +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz", "k": "31", "m": "20", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1454001", "step 2 (compute minimizer tuples)": "509596", "step 3 (merging minimizer tuples)": "3936428", "step 4 (build mphf)": "2993043", "step 5 (replacing minimizer values with MPHF hashes)": "2732530", "step 6 (merging minimizers tuples)": "10827581", "step 7.1 (build sparse index)": "920075", "step 7.2 (build skew index)": "2573416", "step 7 (build sparse and skew index)": "3661230", "total_build_time_in_microsec": "26114409", "index_size_in_bytes": "495332377", "num_kmers": "502465200"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz", "k": "31", "m": "20", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "2671135", "step 2 (compute minimizer tuples)": "979126", "step 3 (merging minimizer tuples)": "8609168", "step 4 (build mphf)": "6674200", "step 5 (replacing minimizer values with MPHF hashes)": "6142475", "step 6 (merging minimizers tuples)": "15774504", "step 7.1 (build sparse index)": "1474226", "step 7.2 (build skew index)": "662961", "step 7 (build sparse and skew index)": "2486478", "total_build_time_in_microsec": "43337086", "index_size_in_bytes": "1077792939", "num_kmers": "1150399205"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "7204653", "step 2 (compute minimizer tuples)": "2309928", "step 3 (merging minimizer tuples)": "21796889", "step 4 (build mphf)": "15201595", "step 5 (replacing minimizer values with MPHF hashes)": "14821673", "step 6 (merging minimizers tuples)": "47620820", "step 7.1 (build sparse index)": "4960098", "step 7.2 (build skew index)": "7003843", "step 7 (build sparse and skew index)": "12842196", "total_build_time_in_microsec": "121797754", "index_size_in_bytes": "2716053224", "num_kmers": "2505678680"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "74035635", "step 2 (compute minimizer tuples)": "85579820", "step 3 (merging minimizer tuples)": "1099537910", "step 4 (build mphf)": "206294431", "step 5 (replacing minimizer values with MPHF hashes)": "109116591", "step 6 (merging minimizers tuples)": "415629995", "step 7.1 (build sparse index)": "54969610", "step 7.2 (build skew index)": "33949847", "step 7 (build sparse and skew index)": "96180453", "total_build_time_in_microsec": "2086374835", "index_size_in_bytes": "22620878165", "num_kmers": "17987935180"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "17585651", "step 2 (compute minimizer tuples)": "6549516", "step 3 (merging minimizer tuples)": "57673000", "step 4 (build mphf)": "21101231", "step 5 (replacing minimizer values with MPHF hashes)": "22471693", "step 6 (merging minimizers tuples)": "95446722", "step 7.1 (build sparse index)": "11220269", "step 7.2 (build skew index)": "15014989", "step 7 (build sparse and skew index)": "27857986", "total_build_time_in_microsec": "248685799", "index_size_in_bytes": "4810783166", "num_kmers": "3718120949"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "6086742", "step 2 (compute minimizer tuples)": "1230828", "step 3 (merging minimizer tuples)": "10647280", "step 4 (build mphf)": "6366655", "step 5 (replacing minimizer values with MPHF hashes)": "6977114", "step 6 (merging minimizers tuples)": "29607621", "step 7.1 (build sparse index)": "3929955", "step 7.2 (build skew index)": "6081166", "step 7 (build sparse and skew index)": "10543780", "total_build_time_in_microsec": "71460020", "index_size_in_bytes": "1416509371", "num_kmers": "1111018845"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "5393718", "step 2 (compute minimizer tuples)": "1021948", "step 3 (merging minimizer tuples)": "8541526", "step 4 (build mphf)": "5257783", "step 5 (replacing minimizer values with MPHF hashes)": "5627145", "step 6 (merging minimizers tuples)": "12275385", "step 7.1 (build sparse index)": "3117678", "step 7.2 (build skew index)": "3545548", "step 7 (build sparse and skew index)": "7088806", "total_build_time_in_microsec": "45206311", "index_size_in_bytes": "1137030140", "num_kmers": "894310084"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz", "k": "31", "m": "19", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1176293", "step 2 (compute minimizer tuples)": "487854", "step 3 (merging minimizer tuples)": "2746448", "step 4 (build mphf)": "2352642", "step 5 (replacing minimizer values with MPHF hashes)": "2009973", "step 6 (merging minimizers tuples)": "3772587", "step 7.1 (build sparse index)": "646190", "step 7.2 (build skew index)": "27902", "step 7 (build sparse and skew index)": "806121", "total_build_time_in_microsec": "13351918", "index_size_in_bytes": "346391727", "num_kmers": "376205185"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz", "k": "31", "m": "21", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "40467955", "step 2 (compute minimizer tuples)": "13547658", "step 3 (merging minimizer tuples)": "157576640", "step 4 (build mphf)": "172891710", "step 5 (replacing minimizer values with MPHF hashes)": "150310190", "step 6 (merging minimizers tuples)": "239906881", "step 7.1 (build sparse index)": "26834532", "step 7.2 (build skew index)": "4793222", "step 7 (build sparse and skew index)": "36123229", "total_build_time_in_microsec": "810824263", "index_size_in_bytes": "14122834359", "num_kmers": "12319840464"} diff --git a/benchmarks/results-10-11-25/k31/regular-build.log b/benchmarks/results-10-11-25/k31/regular-build.log new file mode 100644 index 0000000..9cae9e4 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-build.log @@ -0,0 +1,2710 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash +2025-11-10 22:50:18: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +read 1000000 sequences, 260758668 bases, 230758668 kmers +read 2000000 sequences, 549832064 bases, 489832064 kmers +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +cost: 2.0 + 0.245658 [bits/kmer] +max string length = 31415 +num bits per_absolute_offset = 30 +num bits per_relative_offset = 15 +num bits per_string_id = 21 +=== step 1 (encode strings): 1.454 [sec] (2.89373 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.509596 [sec] (1.01419 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.bin' +=== step 3 (merging minimizer tuples): 3.93643 [sec] (7.83423 [ns/kmer]) +num_minimizers = 72381146 +num_minimizer_positions = 78455681 +num_super_kmers = 78455681 +building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.99304 [sec] (5.95672 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811418032067371.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 2.73253 [sec] (5.43825 [ns/kmer]) +=== step 6 (merging minimizers tuples): 10.8276 [sec] (21.5489 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) +num_buckets_in_skew_index 4215/72381146 (0.00582334%) +max_bucket_size 70346 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) +num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) +=== step 7.1 (build sparse index): 0.920075 [sec] (1.83112 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 1260546 + partition = 1: num kmers in buckets of size > 128 and <= 256: 994175 + partition = 2: num kmers in buckets of size > 256 and <= 512: 665719 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 408608 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 423234 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 271419 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 288814 + partition = 7: num kmers in buckets of size > 8192 and <= 70346: 428378 +num kmers in skew index = 4740893 (0.943527%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... + built mphs[0] for 1260546 kmers; bits/key = 2.56076 + built positions[0] for 1260546 kmers; bits/key = 7.00029 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 + building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... + built mphs[1] for 994175 kmers; bits/key = 2.41831 + built positions[1] for 994175 kmers; bits/key = 8.00033 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 + building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... + built mphs[2] for 665719 kmers; bits/key = 2.41938 + built positions[2] for 665719 kmers; bits/key = 9.00051 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 + building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... + built mphs[3] for 408608 kmers; bits/key = 2.42149 + built positions[3] for 408608 kmers; bits/key = 10.0008 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 + building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... + built mphs[4] for 423234 kmers; bits/key = 2.56407 + built positions[4] for 423234 kmers; bits/key = 11.0009 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 + building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... + built mphs[5] for 271419 kmers; bits/key = 2.42412 + built positions[5] for 271419 kmers; bits/key = 12.0014 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 + building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... + built mphs[6] for 288814 kmers; bits/key = 2.42387 + built positions[6] for 288814 kmers; bits/key = 13.0013 + lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 + building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... + built mphs[7] for 428378 kmers; bits/key = 2.56398 + built positions[7] for 428378 kmers; bits/key = 17.0008 +=== step 7.2 (build skew index): 2.57342 [sec] (5.12158 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 96.8721% +buckets with 2 minimizer positions = 2.00417% +buckets with 3 minimizer positions = 0.51765% +buckets with 4 minimizer positions = 0.211311% +buckets with 5 minimizer positions = 0.109826% +buckets with 6 minimizer positions = 0.0661802% +buckets with 7 minimizer positions = 0.0437061% +buckets with 8 minimizer positions = 0.0308464% +buckets with 9 minimizer positions = 0.0235614% +buckets with 10 minimizer positions = 0.0177228% +buckets with 11 minimizer positions = 0.0139967% +buckets with 12 minimizer positions = 0.0112902% +buckets with 13 minimizer positions = 0.00931044% +buckets with 14 minimizer positions = 0.00771748% +buckets with 15 minimizer positions = 0.00632347% +buckets with 16 minimizer positions = 0.00528591% +max_bucket_size = 70346 +=== step 7 (build sparse and skew index): 3.66123 [sec] (7.28653 [ns/kmer]) +=== total time: 26.1144 [sec] (51.9726 [ns/kmer]) +total index size: 495332377 [B] -- 495.332 [MB] +SPACE BREAKDOWN: + mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 5.30379% + strings_offsets: 0.144419 [bits/kmer] -- 1.83123% + control_codewords: 4.46561 [bits/kmer] -- 56.624% + mid_load_buckets: 0.439286 [bits/kmer] -- 5.57015% + begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 5.41051e-05% + strings: 2.24566 [bits/kmer] -- 28.4749% + skew_index: 0.173169 [bits/kmer] -- 2.19578% + weights: 2.92956e-06 [bits/kmer] -- 3.71468e-05% + -------------- + total: 7.88643 [bits/kmer] +2025-11-10 22:50:44: saving data structure to disk... +2025-11-10 22:50:46: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash +2025-11-10 22:50:46: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +cost: 2.0 + 0.0303995 [bits/kmer] +max string length = 111973 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 17 +num bits per_string_id = 20 +=== step 1 (encode strings): 2.67114 [sec] (2.32192 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.979126 [sec] (0.851118 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 8.60917 [sec] (7.48364 [ns/kmer]) +num_minimizers = 173258591 +num_minimizer_positions = 175959772 +num_super_kmers = 175959772 +building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 6.6742 [sec] (5.80164 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811446407881372.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 6.14248 [sec] (5.33943 [ns/kmer]) +=== step 6 (merging minimizers tuples): 15.7745 [sec] (13.7122 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) +num_buckets_in_skew_index 1541/173258591 (0.000889422%) +max_bucket_size 3747 +log2_max_bucket_size 12 +num_partitions in skew index 6 +num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) +num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) +=== step 7.1 (build sparse index): 1.47423 [sec] (1.28149 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 559507 + partition = 1: num kmers in buckets of size > 128 and <= 256: 317132 + partition = 2: num kmers in buckets of size > 256 and <= 512: 144139 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 106543 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 21308 + partition = 5: num kmers in buckets of size > 2048 and <= 3747: 36738 +num kmers in skew index = 1185367 (0.10304%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 + building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... + built mphs[0] for 559507 kmers; bits/key = 2.41999 + built positions[0] for 559507 kmers; bits/key = 7.00068 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 + building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... + built mphs[1] for 317132 kmers; bits/key = 2.42276 + built positions[1] for 317132 kmers; bits/key = 8.00111 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 + building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... + built mphs[2] for 144139 kmers; bits/key = 2.43099 + built positions[2] for 144139 kmers; bits/key = 9.00242 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 + building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... + built mphs[3] for 106543 kmers; bits/key = 2.43597 + built positions[3] for 106543 kmers; bits/key = 10.0034 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 + building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... + built mphs[4] for 21308 kmers; bits/key = 2.51323 + built positions[4] for 21308 kmers; bits/key = 11.0171 + lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 + building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... + built mphs[5] for 36738 kmers; bits/key = 2.4746 + built positions[5] for 36738 kmers; bits/key = 12.0098 +=== step 7.2 (build skew index): 0.662961 [sec] (0.576288 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 99.2421% +buckets with 2 minimizer positions = 0.571193% +buckets with 3 minimizer positions = 0.0840564% +buckets with 4 minimizer positions = 0.0345576% +buckets with 5 minimizer positions = 0.0184735% +buckets with 6 minimizer positions = 0.011514% +buckets with 7 minimizer positions = 0.00772718% +buckets with 8 minimizer positions = 0.00537809% +buckets with 9 minimizer positions = 0.00392246% +buckets with 10 minimizer positions = 0.00304862% +buckets with 11 minimizer positions = 0.00236583% +buckets with 12 minimizer positions = 0.0019139% +buckets with 13 minimizer positions = 0.00156356% +buckets with 14 minimizer positions = 0.00127613% +buckets with 15 minimizer positions = 0.00105276% +buckets with 16 minimizer positions = 0.000939636% +max_bucket_size = 3747 +=== step 7 (build sparse and skew index): 2.48648 [sec] (2.1614 [ns/kmer]) +=== total time: 43.3371 [sec] (37.6713 [ns/kmer]) +total index size: 1077792939 [B] -- 1077.79 [MB] +SPACE BREAKDOWN: + mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.68775% + strings_offsets: 0.100021 [bits/kmer] -- 1.33449% + control_codewords: 4.81944 [bits/kmer] -- 64.3013% + mid_load_buckets: 0.102577 [bits/kmer] -- 1.36859% + begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.48656e-05% + strings: 2.0304 [bits/kmer] -- 27.0897% + skew_index: 0.0163494 [bits/kmer] -- 0.218135% + weights: 1.27956e-06 [bits/kmer] -- 1.70719e-05% + -------------- + total: 7.49509 [bits/kmer] +2025-11-10 22:51:29: saving data structure to disk... +2025-11-10 22:51:34: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash +2025-11-10 22:51:34: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +read 1000000 sequences, 245137036 bases, 215137036 kmers +read 2000000 sequences, 492922311 bases, 432922311 kmers +read 3000000 sequences, 743136741 bases, 653136741 kmers +read 4000000 sequences, 997901947 bases, 877901947 kmers +read 5000000 sequences, 1259012338 bases, 1109012338 kmers +read 6000000 sequences, 1534166192 bases, 1354166192 kmers +read 7000000 sequences, 1835088477 bases, 1625088477 kmers +read 8000000 sequences, 2224822737 bases, 1984822737 kmers +read 9000000 sequences, 2506972380 bases, 2236972380 kmers +read 10000000 sequences, 2751909556 bases, 2451909556 kmers +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +cost: 2.0 + 0.245454 [bits/kmer] +max string length = 35848 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 16 +num bits per_string_id = 24 +=== step 1 (encode strings): 7.20465 [sec] (2.87533 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.72.bin'... +=== step 2 (compute minimizer tuples): 2.30993 [sec] (0.921877 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +=== step 3 (merging minimizer tuples): 21.7969 [sec] (8.699 [ns/kmer]) +num_minimizers = 386687326 +num_minimizer_positions = 423023926 +num_super_kmers = 423023926 +building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 15.2016 [sec] (6.06686 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811494198577529.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 14.8217 [sec] (5.91523 [ns/kmer]) +=== step 6 (merging minimizers tuples): 47.6208 [sec] (19.0052 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) +num_buckets_in_skew_index 42372/386687326 (0.0109577%) +max_bucket_size 22972 +log2_max_bucket_size 15 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) +num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) +=== step 7.1 (build sparse index): 4.9601 [sec] (1.97954 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 11807213 + partition = 1: num kmers in buckets of size > 128 and <= 256: 8389556 + partition = 2: num kmers in buckets of size > 256 and <= 512: 5343660 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 3076413 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1855446 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1008178 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 375770 + partition = 7: num kmers in buckets of size > 8192 and <= 22972: 207510 +num kmers in skew index = 32063746 (1.27964%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[0] for 11807213 kmers; bits/key = 2.55841 + built positions[0] for 11807213 kmers; bits/key = 7.00003 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[1] for 8389556 kmers; bits/key = 2.61352 + built positions[1] for 8389556 kmers; bits/key = 8.00004 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 5343660 kmers; bits/key = 2.66261 + built positions[2] for 5343660 kmers; bits/key = 9.00007 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3076413 kmers; bits/key = 3.34298 + built positions[3] for 3076413 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... + built mphs[4] for 1855446 kmers; bits/key = 2.56022 + built positions[4] for 1855446 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... + built mphs[5] for 1008178 kmers; bits/key = 2.41829 + built positions[5] for 1008178 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 + building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... + built mphs[6] for 375770 kmers; bits/key = 2.42182 + built positions[6] for 375770 kmers; bits/key = 13.001 + lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 + building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... + built mphs[7] for 207510 kmers; bits/key = 2.42618 + built positions[7] for 207510 kmers; bits/key = 15.0018 +=== step 7.2 (build skew index): 7.00384 [sec] (2.79519 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 97.1918% +buckets with 2 minimizer positions = 1.69205% +buckets with 3 minimizer positions = 0.442612% +buckets with 4 minimizer positions = 0.201662% +buckets with 5 minimizer positions = 0.114623% +buckets with 6 minimizer positions = 0.0734475% +buckets with 7 minimizer positions = 0.0506719% +buckets with 8 minimizer positions = 0.0368406% +buckets with 9 minimizer positions = 0.0280203% +buckets with 10 minimizer positions = 0.0218197% +buckets with 11 minimizer positions = 0.0175108% +buckets with 12 minimizer positions = 0.0142045% +buckets with 13 minimizer positions = 0.0116337% +buckets with 14 minimizer positions = 0.00980818% +buckets with 15 minimizer positions = 0.00832637% +buckets with 16 minimizer positions = 0.00717712% +max_bucket_size = 22972 +=== step 7 (build sparse and skew index): 12.8422 [sec] (5.12524 [ns/kmer]) +=== total time: 121.798 [sec] (48.6087 [ns/kmer]) +total index size: 2716053224 [B] -- 2716.05 [MB] +SPACE BREAKDOWN: + mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 5.03015% + strings_offsets: 0.153147 [bits/kmer] -- 1.76606% + control_codewords: 5.0927 [bits/kmer] -- 58.7281% + mid_load_buckets: 0.516242 [bits/kmer] -- 5.95319% + begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 9.86726e-06% + strings: 2.24545 [bits/kmer] -- 25.8941% + skew_index: 0.227926 [bits/kmer] -- 2.6284% + weights: 5.87466e-07 [bits/kmer] -- 6.77454e-06% + -------------- + total: 8.67167 [bits/kmer] +2025-11-10 22:53:35: saving data structure to disk... +2025-11-10 22:53:48: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash +2025-11-10 22:53:48: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz'... +read 1000000 sequences, 129490969 bases, 99490969 kmers +read 2000000 sequences, 259406781 bases, 199406781 kmers +read 3000000 sequences, 390247383 bases, 300247383 kmers +read 4000000 sequences, 521879077 bases, 401879077 kmers +read 5000000 sequences, 654383925 bases, 504383925 kmers +read 6000000 sequences, 787748040 bases, 607748040 kmers +read 7000000 sequences, 921978207 bases, 711978207 kmers +read 8000000 sequences, 1056572544 bases, 816572544 kmers +read 9000000 sequences, 1192074067 bases, 922074067 kmers +read 10000000 sequences, 1328585611 bases, 1028585611 kmers +read 11000000 sequences, 1466068193 bases, 1136068193 kmers +read 12000000 sequences, 1604189526 bases, 1244189526 kmers +read 13000000 sequences, 1743096378 bases, 1353096378 kmers +read 14000000 sequences, 1882900221 bases, 1462900221 kmers +read 15000000 sequences, 2023699884 bases, 1573699884 kmers +read 16000000 sequences, 2165862057 bases, 1685862057 kmers +read 17000000 sequences, 2309661964 bases, 1799661964 kmers +read 18000000 sequences, 2454684974 bases, 1914684974 kmers +read 19000000 sequences, 2601025569 bases, 2031025569 kmers +read 20000000 sequences, 2749275100 bases, 2149275100 kmers +read 21000000 sequences, 2898804831 bases, 2268804831 kmers +read 22000000 sequences, 3049858713 bases, 2389858713 kmers +read 23000000 sequences, 3203100307 bases, 2513100307 kmers +read 24000000 sequences, 3357729055 bases, 2637729055 kmers +read 25000000 sequences, 3514381494 bases, 2764381494 kmers +read 26000000 sequences, 3673423010 bases, 2893423010 kmers +read 27000000 sequences, 3833876723 bases, 3023876723 kmers +read 28000000 sequences, 3997541031 bases, 3157541031 kmers +read 29000000 sequences, 4163233674 bases, 3293233674 kmers +read 30000000 sequences, 4331783042 bases, 3431783042 kmers +read 31000000 sequences, 4504035303 bases, 3574035303 kmers +read 32000000 sequences, 4679090399 bases, 3719090399 kmers +read 33000000 sequences, 4858436877 bases, 3868436877 kmers +read 34000000 sequences, 5041637740 bases, 4021637740 kmers +read 35000000 sequences, 5229976324 bases, 4179976324 kmers +read 36000000 sequences, 5423490866 bases, 4343490866 kmers +read 37000000 sequences, 5622911177 bases, 4512911177 kmers +read 38000000 sequences, 5828307256 bases, 4688307256 kmers +read 39000000 sequences, 6041904282 bases, 4871904282 kmers +read 40000000 sequences, 6264018359 bases, 5064018359 kmers +read 41000000 sequences, 6497175042 bases, 5267175042 kmers +read 42000000 sequences, 6743365189 bases, 5483365189 kmers +read 43000000 sequences, 7005667896 bases, 5715667896 kmers +read 44000000 sequences, 7289398126 bases, 5969398126 kmers +read 45000000 sequences, 7600998045 bases, 6250998045 kmers +read 46000000 sequences, 7846412811 bases, 6466412811 kmers +read 47000000 sequences, 7950267050 bases, 6540267050 kmers +read 48000000 sequences, 8054449490 bases, 6614449490 kmers +read 49000000 sequences, 8158503893 bases, 6688503893 kmers +read 50000000 sequences, 8262623298 bases, 6762623298 kmers +read 51000000 sequences, 8366491419 bases, 6836491419 kmers +read 52000000 sequences, 8470360694 bases, 6910360694 kmers +read 53000000 sequences, 8574554064 bases, 6984554064 kmers +read 54000000 sequences, 8678752038 bases, 7058752038 kmers +read 55000000 sequences, 8783318704 bases, 7133318704 kmers +read 56000000 sequences, 8887348929 bases, 7207348929 kmers +read 57000000 sequences, 8991244574 bases, 7281244574 kmers +read 58000000 sequences, 9095727588 bases, 7355727588 kmers +read 59000000 sequences, 9200181084 bases, 7430181084 kmers +read 60000000 sequences, 9304538500 bases, 7504538500 kmers +read 61000000 sequences, 9409280029 bases, 7579280029 kmers +read 62000000 sequences, 9513939845 bases, 7653939845 kmers +read 63000000 sequences, 9618472370 bases, 7728472370 kmers +read 64000000 sequences, 9723234224 bases, 7803234224 kmers +read 65000000 sequences, 9827751954 bases, 7877751954 kmers +read 66000000 sequences, 9932020550 bases, 7952020550 kmers +read 67000000 sequences, 10036741400 bases, 8026741400 kmers +read 68000000 sequences, 10141739679 bases, 8101739679 kmers +read 69000000 sequences, 10246720968 bases, 8176720968 kmers +read 70000000 sequences, 10351924281 bases, 8251924281 kmers +read 71000000 sequences, 10456872741 bases, 8326872741 kmers +read 72000000 sequences, 10562347711 bases, 8402347711 kmers +read 73000000 sequences, 10667420487 bases, 8477420487 kmers +read 74000000 sequences, 10772671579 bases, 8552671579 kmers +read 75000000 sequences, 10877868233 bases, 8627868233 kmers +read 76000000 sequences, 10983492844 bases, 8703492844 kmers +read 77000000 sequences, 11089073361 bases, 8779073361 kmers +read 78000000 sequences, 11194470848 bases, 8854470848 kmers +read 79000000 sequences, 11300332559 bases, 8930332559 kmers +read 80000000 sequences, 11406269822 bases, 9006269822 kmers +read 81000000 sequences, 11512162907 bases, 9082162907 kmers +read 82000000 sequences, 11618219813 bases, 9158219813 kmers +read 83000000 sequences, 11724078742 bases, 9234078742 kmers +read 84000000 sequences, 11830014073 bases, 9310014073 kmers +read 85000000 sequences, 11935890790 bases, 9385890790 kmers +read 86000000 sequences, 12042232134 bases, 9462232134 kmers +read 87000000 sequences, 12148382832 bases, 9538382832 kmers +read 88000000 sequences, 12254822411 bases, 9614822411 kmers +read 89000000 sequences, 12361563673 bases, 9691563673 kmers +read 90000000 sequences, 12468297930 bases, 9768297930 kmers +read 91000000 sequences, 12574912907 bases, 9844912907 kmers +read 92000000 sequences, 12681494065 bases, 9921494065 kmers +read 93000000 sequences, 12788194017 bases, 9998194017 kmers +read 94000000 sequences, 12894915381 bases, 10074915381 kmers +read 95000000 sequences, 13001521631 bases, 10151521631 kmers +read 96000000 sequences, 13109064835 bases, 10229064835 kmers +read 97000000 sequences, 13215873113 bases, 10305873113 kmers +read 98000000 sequences, 13323125980 bases, 10383125980 kmers +read 99000000 sequences, 13430215641 bases, 10460215641 kmers +read 100000000 sequences, 13537778344 bases, 10537778344 kmers +read 101000000 sequences, 13645148965 bases, 10615148965 kmers +read 102000000 sequences, 13752520277 bases, 10692520277 kmers +read 103000000 sequences, 13860127249 bases, 10770127249 kmers +read 104000000 sequences, 13968075956 bases, 10848075956 kmers +read 105000000 sequences, 14075861146 bases, 10925861146 kmers +read 106000000 sequences, 14184298738 bases, 11004298738 kmers +read 107000000 sequences, 14292530270 bases, 11082530270 kmers +read 108000000 sequences, 14400943968 bases, 11160943968 kmers +read 109000000 sequences, 14509339935 bases, 11239339935 kmers +read 110000000 sequences, 14617599335 bases, 11317599335 kmers +read 111000000 sequences, 14725842174 bases, 11395842174 kmers +read 112000000 sequences, 14834254989 bases, 11474254989 kmers +read 113000000 sequences, 14942804338 bases, 11552804338 kmers +read 114000000 sequences, 15051637733 bases, 11631637733 kmers +read 115000000 sequences, 15160739429 bases, 11710739429 kmers +read 116000000 sequences, 15269978487 bases, 11789978487 kmers +read 117000000 sequences, 15378990148 bases, 11868990148 kmers +read 118000000 sequences, 15488236558 bases, 11948236558 kmers +read 119000000 sequences, 15598141514 bases, 12028141514 kmers +read 120000000 sequences, 15707567895 bases, 12107567895 kmers +read 121000000 sequences, 15817378418 bases, 12187378418 kmers +read 122000000 sequences, 15927205756 bases, 12267205756 kmers +read 123000000 sequences, 16037448540 bases, 12347448540 kmers +read 124000000 sequences, 16147936166 bases, 12427936166 kmers +read 125000000 sequences, 16258467588 bases, 12508467588 kmers +read 126000000 sequences, 16368795492 bases, 12588795492 kmers +read 127000000 sequences, 16479785214 bases, 12669785214 kmers +read 128000000 sequences, 16590282249 bases, 12750282249 kmers +read 129000000 sequences, 16701057677 bases, 12831057677 kmers +read 130000000 sequences, 16812553081 bases, 12912553081 kmers +read 131000000 sequences, 16923449047 bases, 12993449047 kmers +read 132000000 sequences, 17034230526 bases, 13074230526 kmers +read 133000000 sequences, 17145713815 bases, 13155713815 kmers +read 134000000 sequences, 17257389525 bases, 13237389525 kmers +read 135000000 sequences, 17369130838 bases, 13319130838 kmers +read 136000000 sequences, 17481314596 bases, 13401314596 kmers +read 137000000 sequences, 17593629072 bases, 13483629072 kmers +read 138000000 sequences, 17706229726 bases, 13566229726 kmers +read 139000000 sequences, 17818270886 bases, 13648270886 kmers +read 140000000 sequences, 17931420451 bases, 13731420451 kmers +read 141000000 sequences, 18044353871 bases, 13814353871 kmers +read 142000000 sequences, 18157903240 bases, 13897903240 kmers +read 143000000 sequences, 18271415292 bases, 13981415292 kmers +read 144000000 sequences, 18384555504 bases, 14064555504 kmers +read 145000000 sequences, 18498314118 bases, 14148314118 kmers +read 146000000 sequences, 18612140169 bases, 14232140169 kmers +read 147000000 sequences, 18726166960 bases, 14316166960 kmers +read 148000000 sequences, 18840350948 bases, 14400350948 kmers +read 149000000 sequences, 18954724883 bases, 14484724883 kmers +read 150000000 sequences, 19069173447 bases, 14569173447 kmers +read 151000000 sequences, 19183793062 bases, 14653793062 kmers +read 152000000 sequences, 19298944468 bases, 14738944468 kmers +read 153000000 sequences, 19414656615 bases, 14824656615 kmers +read 154000000 sequences, 19530428728 bases, 14910428728 kmers +read 155000000 sequences, 19646614327 bases, 14996614327 kmers +read 156000000 sequences, 19762624488 bases, 15082624488 kmers +read 157000000 sequences, 19879115632 bases, 15169115632 kmers +read 158000000 sequences, 19995793294 bases, 15255793294 kmers +read 159000000 sequences, 20112771576 bases, 15342771576 kmers +read 160000000 sequences, 20230295571 bases, 15430295571 kmers +read 161000000 sequences, 20347943202 bases, 15517943202 kmers +read 162000000 sequences, 20465629376 bases, 15605629376 kmers +read 163000000 sequences, 20583555678 bases, 15693555678 kmers +read 164000000 sequences, 20701871322 bases, 15781871322 kmers +read 165000000 sequences, 20820410777 bases, 15870410777 kmers +read 166000000 sequences, 20939977253 bases, 15959977253 kmers +read 167000000 sequences, 21059538950 bases, 16049538950 kmers +read 168000000 sequences, 21179653875 bases, 16139653875 kmers +read 169000000 sequences, 21300125826 bases, 16230125826 kmers +read 170000000 sequences, 21421275644 bases, 16321275644 kmers +read 171000000 sequences, 21542230532 bases, 16412230532 kmers +read 172000000 sequences, 21663705881 bases, 16503705881 kmers +read 173000000 sequences, 21785083912 bases, 16595083912 kmers +read 174000000 sequences, 21907256668 bases, 16687256668 kmers +read 175000000 sequences, 22029743385 bases, 16779743385 kmers +read 176000000 sequences, 22152051369 bases, 16872051369 kmers +read 177000000 sequences, 22275733581 bases, 16965733581 kmers +read 178000000 sequences, 22399701749 bases, 17059701749 kmers +read 179000000 sequences, 22524206009 bases, 17154206009 kmers +read 180000000 sequences, 22648755725 bases, 17248755725 kmers +read 181000000 sequences, 22773928274 bases, 17343928274 kmers +read 182000000 sequences, 22899987762 bases, 17439987762 kmers +read 183000000 sequences, 23025485159 bases, 17535485159 kmers +read 184000000 sequences, 23152188885 bases, 17632188885 kmers +read 185000000 sequences, 23279392102 bases, 17729392102 kmers +read 186000000 sequences, 23406527093 bases, 17826527093 kmers +read 187000000 sequences, 23534989577 bases, 17924989577 kmers +read 187636048 sequences, 23617016620 bases, 17987935180 kmers +num_kmers 17987935180 +cost: 2.0 + 0.625873 [bits/kmer] +max string length = 38851 +num bits per_absolute_offset = 35 +num bits per_relative_offset = 16 +num bits per_string_id = 28 +=== step 1 (encode strings): 74.0356 [sec] (4.11585 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.206.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.207.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.208.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.209.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.210.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.211.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.212.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.213.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.214.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.215.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.216.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.217.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.218.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.219.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.220.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.221.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.222.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.223.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.224.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.225.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.226.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.227.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.228.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.229.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.230.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.231.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.232.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.233.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.234.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.235.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.236.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.237.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.238.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.239.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.240.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.241.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.242.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.243.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.244.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.245.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.246.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.247.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.248.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.249.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.250.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.251.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.252.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.253.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.254.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.255.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.256.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.257.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.258.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.259.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.260.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.261.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.262.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.263.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.264.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.265.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.266.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.267.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.268.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.269.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.270.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.271.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.272.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.273.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.274.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.275.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.276.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.277.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.278.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.279.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.280.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.281.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.282.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.283.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.284.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.285.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.286.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.287.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.288.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.289.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.290.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.291.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.292.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.293.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.294.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.295.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.296.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.297.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.298.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.299.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.300.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.301.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.302.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.303.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.304.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.305.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.306.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.307.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.308.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.309.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.310.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.311.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.312.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.313.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.314.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.315.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.316.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.317.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.318.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.319.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.320.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.321.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.322.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.323.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.324.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.325.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.326.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.327.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.328.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.329.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.330.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.331.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.332.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.333.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.334.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.335.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.336.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.337.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.338.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.339.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.340.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.341.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.342.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.343.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.344.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.345.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.346.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.347.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.348.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.349.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.350.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.351.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.352.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.353.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.354.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.355.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.356.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.357.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.358.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.359.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.360.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.361.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.362.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.363.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.364.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.365.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.366.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.367.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.368.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.369.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.370.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.371.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.372.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.373.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.374.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.375.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.376.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.377.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.378.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.379.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.380.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.381.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.382.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.383.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.384.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.385.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.386.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.387.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.388.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.389.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.390.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.391.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.392.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.393.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.394.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.395.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.396.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.397.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.398.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.399.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.400.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.401.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.402.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.403.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.404.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.405.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.406.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.407.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.408.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.409.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.410.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.411.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.412.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.413.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.414.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.415.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.416.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.417.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.418.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.419.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.420.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.421.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.422.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.423.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.424.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.425.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.426.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.427.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.428.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.429.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.430.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.431.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.432.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.433.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.434.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.435.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.436.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.437.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.438.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.439.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.440.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.441.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.442.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.443.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.444.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.445.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.446.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.447.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.448.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.449.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.450.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.451.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.452.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.453.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.454.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.455.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.456.bin'... +=== step 2 (compute minimizer tuples): 85.5798 [sec] (4.75762 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +processed 2700000000 minimizer tuples +processed 2800000000 minimizer tuples +processed 2900000000 minimizer tuples +processed 3000000000 minimizer tuples +processed 3100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 1099.54 [sec] (61.1264 [ns/kmer]) +num_minimizers = 2586967125 +num_minimizer_positions = 3137471712 +num_super_kmers = 3137471712 +building minimizers MPHF with 64 threads and 863 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 206.294 [sec] (11.4685 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.6.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 109.117 [sec] (6.0661 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762811628522837389.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +processed 2100000000 minimizer tuples +processed 2200000000 minimizer tuples +processed 2300000000 minimizer tuples +processed 2400000000 minimizer tuples +processed 2500000000 minimizer tuples +processed 2600000000 minimizer tuples +processed 2700000000 minimizer tuples +processed 2800000000 minimizer tuples +processed 2900000000 minimizer tuples +processed 3000000000 minimizer tuples +processed 3100000000 minimizer tuples +=== step 6 (merging minimizers tuples): 415.63 [sec] (23.106 [ns/kmer]) +num_bits_per_offset = 35 +num_buckets_larger_than_1_not_in_skew_index 201722347/2586967125 (7.79764%) +num_buckets_in_skew_index 377105/2586967125 (0.0145771%) +max_bucket_size 63221 +log2_max_bucket_size 16 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 705347646/3137471712 (22.4814%) +num_minimizer_positions_of_buckets_in_skew_index 47256393/3137471712 (1.50619%) +=== step 7.1 (build sparse index): 54.9696 [sec] (3.05592 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 118809610 + partition = 1: num kmers in buckets of size > 128 and <= 256: 63637532 + partition = 2: num kmers in buckets of size > 256 and <= 512: 28814382 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 11075511 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 4175522 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1800377 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 653242 + partition = 7: num kmers in buckets of size > 8192 and <= 63221: 493725 +num kmers in skew index = 229459901 (1.27563%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 118809610 + building MPHF with 64 threads and 40 partitions (avg. partition size = 3000000)... + built mphs[0] for 118809610 kmers; bits/key = 2.56673 + built positions[0] for 118809610 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 63637532 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[1] for 63637532 kmers; bits/key = 2.51805 + built positions[1] for 63637532 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 28814382 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[2] for 28814382 kmers; bits/key = 2.5289 + built positions[2] for 28814382 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 11075511 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[3] for 11075511 kmers; bits/key = 2.58384 + built positions[3] for 11075511 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4175522 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4175522 kmers; bits/key = 2.88051 + built positions[4] for 4175522 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1800377 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1800377)... + built mphs[5] for 1800377 kmers; bits/key = 2.56025 + built positions[5] for 1800377 kmers; bits/key = 12.0002 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 653242 + building MPHF with 64 threads and 1 partitions (avg. partition size = 653242)... + built mphs[6] for 653242 kmers; bits/key = 2.41942 + built positions[6] for 653242 kmers; bits/key = 13.0005 + lower = 8192; upper = 63221; num_bits_per_pos = 16; num_kmers_in_partition = 493725 + building MPHF with 64 threads and 1 partitions (avg. partition size = 493725)... + built mphs[7] for 493725 kmers; bits/key = 2.42055 + built positions[7] for 493725 kmers; bits/key = 16.0007 +=== step 7.2 (build skew index): 33.9498 [sec] (1.88737 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 92.1878% +buckets with 2 minimizer positions = 4.65692% +buckets with 3 minimizer positions = 1.35588% +buckets with 4 minimizer positions = 0.60708% +buckets with 5 minimizer positions = 0.331836% +buckets with 6 minimizer positions = 0.203718% +buckets with 7 minimizer positions = 0.135291% +buckets with 8 minimizer positions = 0.095017% +buckets with 9 minimizer positions = 0.0696812% +buckets with 10 minimizer positions = 0.0528772% +buckets with 11 minimizer positions = 0.0411865% +buckets with 12 minimizer positions = 0.0328397% +buckets with 13 minimizer positions = 0.0267158% +buckets with 14 minimizer positions = 0.0219975% +buckets with 15 minimizer positions = 0.018403% +buckets with 16 minimizer positions = 0.0155512% +max_bucket_size = 63221 +=== step 7 (build sparse and skew index): 96.1805 [sec] (5.34694 [ns/kmer]) +=== total time: 2086.37 [sec] (115.987 [ns/kmer]) +total index size: 22620878165 [B] -- 22620.9 [MB] +SPACE BREAKDOWN: + mphf: 0.406843 [bits/kmer] (2.8289 [bits/key]) -- 4.04398% + strings_offsets: 0.253608 [bits/kmer] -- 2.52084% + control_codewords: 5.1774 [bits/kmer] -- 51.4629% + mid_load_buckets: 1.37243 [bits/kmer] -- 13.6418% + begin_buckets_of_size: 1.19191e-07 [bits/kmer] -- 1.18475e-06% + strings: 2.62587 [bits/kmer] -- 26.1009% + skew_index: 0.224309 [bits/kmer] -- 2.2296% + weights: 8.18326e-08 [bits/kmer] -- 8.13408e-07% + -------------- + total: 10.0605 [bits/kmer] +2025-11-10 23:28:34: saving data structure to disk... +2025-11-10 23:30:22: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash +2025-11-10 23:30:23: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +read 1000000 sequences, 159860354 bases, 129860354 kmers +read 2000000 sequences, 345519042 bases, 285519042 kmers +read 3000000 sequences, 569210425 bases, 479210425 kmers +read 4000000 sequences, 848332212 bases, 728332212 kmers +read 5000000 sequences, 1226889961 bases, 1076889961 kmers +read 6000000 sequences, 1800462808 bases, 1620462808 kmers +read 7000000 sequences, 1906975392 bases, 1696975392 kmers +read 8000000 sequences, 1964117272 bases, 1724117272 kmers +read 9000000 sequences, 2021346703 bases, 1751346703 kmers +read 10000000 sequences, 2078777105 bases, 1778777105 kmers +read 11000000 sequences, 2136245853 bases, 1806245853 kmers +read 12000000 sequences, 2193864516 bases, 1833864516 kmers +read 13000000 sequences, 2251713140 bases, 1861713140 kmers +read 14000000 sequences, 2309685311 bases, 1889685311 kmers +read 15000000 sequences, 2367830861 bases, 1917830861 kmers +read 16000000 sequences, 2426185107 bases, 1946185107 kmers +read 17000000 sequences, 2484756357 bases, 1974756357 kmers +read 18000000 sequences, 2543560790 bases, 2003560790 kmers +read 19000000 sequences, 2602544828 bases, 2032544828 kmers +read 20000000 sequences, 2661829332 bases, 2061829332 kmers +read 21000000 sequences, 2721408473 bases, 2091408473 kmers +read 22000000 sequences, 2781228842 bases, 2121228842 kmers +read 23000000 sequences, 2841415119 bases, 2151415119 kmers +read 24000000 sequences, 2901936379 bases, 2181936379 kmers +read 25000000 sequences, 2962750749 bases, 2212750749 kmers +read 26000000 sequences, 3023914429 bases, 2243914429 kmers +read 27000000 sequences, 3085556058 bases, 2275556058 kmers +read 28000000 sequences, 3147523815 bases, 2307523815 kmers +read 29000000 sequences, 3209891758 bases, 2339891758 kmers +read 30000000 sequences, 3272761181 bases, 2372761181 kmers +read 31000000 sequences, 3336150965 bases, 2406150965 kmers +read 32000000 sequences, 3400254734 bases, 2440254734 kmers +read 33000000 sequences, 3464886783 bases, 2474886783 kmers +read 34000000 sequences, 3530247184 bases, 2510247184 kmers +read 35000000 sequences, 3596273843 bases, 2546273843 kmers +read 36000000 sequences, 3663044813 bases, 2583044813 kmers +read 37000000 sequences, 3730743513 bases, 2620743513 kmers +read 38000000 sequences, 3799297920 bases, 2659297920 kmers +read 39000000 sequences, 3869022100 bases, 2699022100 kmers +read 40000000 sequences, 3939899906 bases, 2739899906 kmers +read 41000000 sequences, 4011944353 bases, 2781944353 kmers +read 42000000 sequences, 4085447760 bases, 2825447760 kmers +read 43000000 sequences, 4160667187 bases, 2870667187 kmers +read 44000000 sequences, 4237696486 bases, 2917696486 kmers +read 45000000 sequences, 4316730755 bases, 2966730755 kmers +read 46000000 sequences, 4398064724 bases, 3018064724 kmers +read 47000000 sequences, 4482251464 bases, 3072251464 kmers +read 48000000 sequences, 4569570617 bases, 3129570617 kmers +read 49000000 sequences, 4660631625 bases, 3190631625 kmers +read 50000000 sequences, 4756246344 bases, 3256246344 kmers +read 51000000 sequences, 4856753463 bases, 3326753463 kmers +read 52000000 sequences, 4964398717 bases, 3404398717 kmers +read 53000000 sequences, 5079791551 bases, 3489791551 kmers +read 54000000 sequences, 5205070836 bases, 3585070836 kmers +read 55000000 sequences, 5343495625 bases, 3693495625 kmers +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +cost: 2.0 + 0.890898 [bits/kmer] +max string length = 17920 +num bits per_absolute_offset = 33 +num bits per_relative_offset = 15 +num bits per_string_id = 26 +=== step 1 (encode strings): 17.5857 [sec] (4.72971 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.113.bin'... +=== step 2 (compute minimizer tuples): 6.54952 [sec] (1.76151 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +=== step 3 (merging minimizer tuples): 57.673 [sec] (15.5113 [ns/kmer]) +num_minimizers = 544808214 +num_minimizer_positions = 661139039 +num_super_kmers = 661139039 +building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 21.1012 [sec] (5.67524 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 22.4717 [sec] (6.04383 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762813823746747470.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +=== step 6 (merging minimizers tuples): 95.4467 [sec] (25.6707 [ns/kmer]) +num_bits_per_offset = 33 +num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) +num_buckets_in_skew_index 108291/544808214 (0.0198769%) +max_bucket_size 81171 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) +num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) +=== step 7.1 (build sparse index): 11.2203 [sec] (3.01773 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 28872109 + partition = 1: num kmers in buckets of size > 128 and <= 256: 21161002 + partition = 2: num kmers in buckets of size > 256 and <= 512: 14619521 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 8967010 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 5825185 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 3889571 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 2412718 + partition = 7: num kmers in buckets of size > 8192 and <= 81171: 2510316 +num kmers in skew index = 88257432 (2.37371%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[0] for 28872109 kmers; bits/key = 2.53953 + built positions[0] for 28872109 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21161002 kmers; bits/key = 2.665 + built positions[1] for 21161002 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 14619521 kmers; bits/key = 2.58618 + built positions[2] for 14619521 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 8967010 kmers; bits/key = 2.51981 + built positions[3] for 8967010 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 5825185 kmers; bits/key = 2.55049 + built positions[4] for 5825185 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3889571 kmers; bits/key = 2.9515 + built positions[5] for 3889571 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... + built mphs[6] for 2412718 kmers; bits/key = 2.41709 + built positions[6] for 2412718 kmers; bits/key = 13.0002 + lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... + built mphs[7] for 2510316 kmers; bits/key = 2.55991 + built positions[7] for 2510316 kmers; bits/key = 17.0001 +=== step 7.2 (build skew index): 15.015 [sec] (4.03833 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 90.4966% +buckets with 2 minimizer positions = 7.33042% +buckets with 3 minimizer positions = 1.04104% +buckets with 4 minimizer positions = 0.358078% +buckets with 5 minimizer positions = 0.190444% +buckets with 6 minimizer positions = 0.119606% +buckets with 7 minimizer positions = 0.0815559% +buckets with 8 minimizer positions = 0.059031% +buckets with 9 minimizer positions = 0.0448457% +buckets with 10 minimizer positions = 0.0349758% +buckets with 11 minimizer positions = 0.0279273% +buckets with 12 minimizer positions = 0.022929% +buckets with 13 minimizer positions = 0.0189582% +buckets with 14 minimizer positions = 0.0159649% +buckets with 15 minimizer positions = 0.0135407% +buckets with 16 minimizer positions = 0.0117506% +max_bucket_size = 81171 +=== step 7 (build sparse and skew index): 27.858 [sec] (7.49249 [ns/kmer]) +=== total time: 248.686 [sec] (66.8848 [ns/kmer]) +total index size: 4810783166 [B] -- 4810.78 [MB] +SPACE BREAKDOWN: + mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 4.01359% + strings_offsets: 0.300083 [bits/kmer] -- 2.89907% + control_codewords: 4.98195 [bits/kmer] -- 48.1301% + mid_load_buckets: 1.32295 [bits/kmer] -- 12.7809% + begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.57082e-06% + strings: 2.8909 [bits/kmer] -- 27.9287% + skew_index: 0.439676 [bits/kmer] -- 4.24766% + weights: 3.95899e-07 [bits/kmer] -- 3.82474e-06% + -------------- + total: 10.351 [bits/kmer] +2025-11-10 23:34:32: saving data structure to disk... +2025-11-10 23:34:55: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash +2025-11-10 23:34:56: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... +read 1000000 sequences, 153195620 bases, 123195620 kmers +read 2000000 sequences, 238301856 bases, 178301856 kmers +read 3000000 sequences, 306827724 bases, 216827724 kmers +read 4000000 sequences, 376235441 bases, 256235441 kmers +read 5000000 sequences, 445233170 bases, 295233170 kmers +read 6000000 sequences, 515368260 bases, 335368260 kmers +read 7000000 sequences, 586116050 bases, 376116050 kmers +read 8000000 sequences, 657174193 bases, 417174193 kmers +read 9000000 sequences, 729536721 bases, 459536721 kmers +read 10000000 sequences, 802902838 bases, 502902838 kmers +read 11000000 sequences, 876372447 bases, 546372447 kmers +read 12000000 sequences, 951284053 bases, 591284053 kmers +read 13000000 sequences, 1027636701 bases, 637636701 kmers +read 14000000 sequences, 1105722693 bases, 685722693 kmers +read 15000000 sequences, 1185796892 bases, 735796892 kmers +read 16000000 sequences, 1267846293 bases, 787846293 kmers +read 17000000 sequences, 1352901026 bases, 842901026 kmers +read 18000000 sequences, 1442015880 bases, 902015880 kmers +read 19000000 sequences, 1536308350 bases, 966308350 kmers +read 20000000 sequences, 1639158516 bases, 1039158516 kmers +read 20822360 sequences, 1735689645 bases, 1111018845 kmers +num_kmers 1111018845 +cost: 2.0 + 1.1245 [bits/kmer] +max string length = 176455 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 18 +num bits per_string_id = 25 +=== step 1 (encode strings): 6.08674 [sec] (5.47852 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.64.bin'... +=== step 2 (compute minimizer tuples): 1.23083 [sec] (1.10784 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +=== step 3 (merging minimizer tuples): 10.6473 [sec] (9.58335 [ns/kmer]) +num_minimizers = 153003346 +num_minimizer_positions = 201447538 +num_super_kmers = 201447538 +building minimizers MPHF with 64 threads and 52 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 6.36665 [sec] (5.73047 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814096124463938.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 6.97711 [sec] (6.27992 [ns/kmer]) +=== step 6 (merging minimizers tuples): 29.6076 [sec] (26.6491 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 16447921/153003346 (10.75%) +num_buckets_in_skew_index 10727/153003346 (0.00701096%) +max_bucket_size 71743 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 61815481/201447538 (30.6856%) +num_minimizer_positions_of_buckets_in_skew_index 3087359/201447538 (1.53259%) +=== step 7.1 (build sparse index): 3.92996 [sec] (3.53725 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 2530324 + partition = 1: num kmers in buckets of size > 128 and <= 256: 1770374 + partition = 2: num kmers in buckets of size > 256 and <= 512: 1563484 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1214204 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1091924 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1055593 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 789627 + partition = 7: num kmers in buckets of size > 8192 and <= 71743: 1030596 +num kmers in skew index = 11046126 (0.994234%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2530324 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2530324)... + built mphs[0] for 2530324 kmers; bits/key = 2.5599 + built positions[0] for 2530324 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1770374 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1770374)... + built mphs[1] for 1770374 kmers; bits/key = 2.56029 + built positions[1] for 1770374 kmers; bits/key = 8.00019 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1563484 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1563484)... + built mphs[2] for 1563484 kmers; bits/key = 2.56038 + built positions[2] for 1563484 kmers; bits/key = 9.00021 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1214204 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1214204)... + built mphs[3] for 1214204 kmers; bits/key = 2.56081 + built positions[3] for 1214204 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1091924 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1091924)... + built mphs[4] for 1091924 kmers; bits/key = 2.4182 + built positions[4] for 1091924 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1055593 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1055593)... + built mphs[5] for 1055593 kmers; bits/key = 2.56108 + built positions[5] for 1055593 kmers; bits/key = 12.0003 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 789627 + building MPHF with 64 threads and 1 partitions (avg. partition size = 789627)... + built mphs[6] for 789627 kmers; bits/key = 2.41888 + built positions[6] for 789627 kmers; bits/key = 13.0004 + lower = 8192; upper = 71743; num_bits_per_pos = 17; num_kmers_in_partition = 1030596 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1030596)... + built mphs[7] for 1030596 kmers; bits/key = 2.4183 + built positions[7] for 1030596 kmers; bits/key = 17.0004 +=== step 7.2 (build skew index): 6.08117 [sec] (5.4735 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 89.2429% +buckets with 2 minimizer positions = 6.05035% +buckets with 3 minimizer positions = 1.71539% +buckets with 4 minimizer positions = 0.818195% +buckets with 5 minimizer positions = 0.497438% +buckets with 6 minimizer positions = 0.343779% +buckets with 7 minimizer positions = 0.255749% +buckets with 8 minimizer positions = 0.199702% +buckets with 9 minimizer positions = 0.159387% +buckets with 10 minimizer positions = 0.13028% +buckets with 11 minimizer positions = 0.107217% +buckets with 12 minimizer positions = 0.0878229% +buckets with 13 minimizer positions = 0.0717429% +buckets with 14 minimizer positions = 0.0589601% +buckets with 15 minimizer positions = 0.0471898% +buckets with 16 minimizer positions = 0.0377861% +max_bucket_size = 71743 +=== step 7 (build sparse and skew index): 10.5438 [sec] (9.49019 [ns/kmer]) +=== total time: 71.46 [sec] (64.3194 [ns/kmer]) +total index size: 1416509371 [B] -- 1416.51 [MB] +SPACE BREAKDOWN: + mphf: 0.394931 [bits/kmer] (2.86775 [bits/key]) -- 3.87198% + strings_offsets: 0.337884 [bits/kmer] -- 3.31268% + control_codewords: 4.40686 [bits/kmer] -- 43.2057% + mid_load_buckets: 1.7248 [bits/kmer] -- 16.9102% + begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.89197e-05% + strings: 3.1245 [bits/kmer] -- 30.6332% + skew_index: 0.210737 [bits/kmer] -- 2.0661% + weights: 1.32491e-06 [bits/kmer] -- 1.29897e-05% + -------------- + total: 10.1997 [bits/kmer] +2025-11-10 23:36:07: saving data structure to disk... +2025-11-10 23:36:13: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash +2025-11-10 23:36:13: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +read 1000000 sequences, 89525906 bases, 59525906 kmers +read 2000000 sequences, 188052064 bases, 128052064 kmers +read 3000000 sequences, 302142183 bases, 212142183 kmers +read 4000000 sequences, 461236524 bases, 341236524 kmers +read 5000000 sequences, 530371783 bases, 380371783 kmers +read 6000000 sequences, 600036489 bases, 420036489 kmers +read 7000000 sequences, 670072473 bases, 460072473 kmers +read 8000000 sequences, 740830673 bases, 500830673 kmers +read 9000000 sequences, 812530455 bases, 542530455 kmers +read 10000000 sequences, 884692153 bases, 584692153 kmers +read 11000000 sequences, 958222271 bases, 628222271 kmers +read 12000000 sequences, 1032736062 bases, 672736062 kmers +read 13000000 sequences, 1108501169 bases, 718501169 kmers +read 14000000 sequences, 1186158510 bases, 766158510 kmers +read 15000000 sequences, 1266102895 bases, 816102895 kmers +read 16000000 sequences, 1349263765 bases, 869263765 kmers +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +cost: 2.0 + 1.10303 [bits/kmer] +max string length = 117016 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 17 +num bits per_string_id = 24 +=== step 1 (encode strings): 5.39372 [sec] (6.03115 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.64.bin'... +=== step 2 (compute minimizer tuples): 1.02195 [sec] (1.14272 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 8.54153 [sec] (9.55097 [ns/kmer]) +num_minimizers = 126246665 +num_minimizer_positions = 162006751 +num_super_kmers = 162006751 +building minimizers MPHF with 64 threads and 43 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 5.25778 [sec] (5.87915 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814173844318210.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 5.62714 [sec] (6.29216 [ns/kmer]) +=== step 6 (merging minimizers tuples): 12.2754 [sec] (13.7261 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 14059268/126246665 (11.1363%) +num_buckets_in_skew_index 8266/126246665 (0.0065475%) +max_bucket_size 36894 +log2_max_bucket_size 16 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 48164669/162006751 (29.73%) +num_minimizer_positions_of_buckets_in_skew_index 1662951/162006751 (1.02647%) +=== step 7.1 (build sparse index): 3.11768 [sec] (3.48613 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 2254325 + partition = 1: num kmers in buckets of size > 128 and <= 256: 1183762 + partition = 2: num kmers in buckets of size > 256 and <= 512: 885561 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 591648 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 450833 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 373731 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 338406 + partition = 7: num kmers in buckets of size > 8192 and <= 36894: 388502 +num kmers in skew index = 6466768 (0.723101%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2254325 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2254325)... + built mphs[0] for 2254325 kmers; bits/key = 2.56001 + built positions[0] for 2254325 kmers; bits/key = 7.00015 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1183762 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1183762)... + built mphs[1] for 1183762 kmers; bits/key = 2.56081 + built positions[1] for 1183762 kmers; bits/key = 8.00031 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 885561 + building MPHF with 64 threads and 1 partitions (avg. partition size = 885561)... + built mphs[2] for 885561 kmers; bits/key = 2.56147 + built positions[2] for 885561 kmers; bits/key = 9.00043 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 591648 + building MPHF with 64 threads and 1 partitions (avg. partition size = 591648)... + built mphs[3] for 591648 kmers; bits/key = 2.56263 + built positions[3] for 591648 kmers; bits/key = 10.0005 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 450833 + building MPHF with 64 threads and 1 partitions (avg. partition size = 450833)... + built mphs[4] for 450833 kmers; bits/key = 2.42098 + built positions[4] for 450833 kmers; bits/key = 11.0007 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 373731 + building MPHF with 64 threads and 1 partitions (avg. partition size = 373731)... + built mphs[5] for 373731 kmers; bits/key = 2.56484 + built positions[5] for 373731 kmers; bits/key = 12.0009 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 338406 + building MPHF with 64 threads and 1 partitions (avg. partition size = 338406)... + built mphs[6] for 338406 kmers; bits/key = 2.4226 + built positions[6] for 338406 kmers; bits/key = 13.001 + lower = 8192; upper = 36894; num_bits_per_pos = 16; num_kmers_in_partition = 388502 + building MPHF with 64 threads and 1 partitions (avg. partition size = 388502)... + built mphs[7] for 388502 kmers; bits/key = 2.56472 + built positions[7] for 388502 kmers; bits/key = 16.0009 +=== step 7.2 (build skew index): 3.54555 [sec] (3.96456 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 88.8571% +buckets with 2 minimizer positions = 6.64024% +buckets with 3 minimizer positions = 1.83049% +buckets with 4 minimizer positions = 0.817717% +buckets with 5 minimizer positions = 0.475524% +buckets with 6 minimizer positions = 0.319677% +buckets with 7 minimizer positions = 0.233881% +buckets with 8 minimizer positions = 0.178737% +buckets with 9 minimizer positions = 0.138965% +buckets with 10 minimizer positions = 0.107245% +buckets with 11 minimizer positions = 0.0823246% +buckets with 12 minimizer positions = 0.0632579% +buckets with 13 minimizer positions = 0.0483173% +buckets with 14 minimizer positions = 0.0365673% +buckets with 15 minimizer positions = 0.027916% +buckets with 16 minimizer positions = 0.0218604% +max_bucket_size = 36894 +=== step 7 (build sparse and skew index): 7.08881 [sec] (7.92656 [ns/kmer]) +=== total time: 45.2063 [sec] (50.5488 [ns/kmer]) +total index size: 1137030140 [B] -- 1137.03 [MB] +SPACE BREAKDOWN: + mphf: 0.405702 [bits/kmer] (2.87392 [bits/key]) -- 3.98871% + strings_offsets: 0.333373 [bits/kmer] -- 3.2776% + control_codewords: 4.51733 [bits/kmer] -- 44.4128% + mid_load_buckets: 1.66956 [bits/kmer] -- 16.4145% + begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.35702e-05% + strings: 3.10303 [bits/kmer] -- 30.5079% + skew_index: 0.142237 [bits/kmer] -- 1.39842% + weights: 1.64596e-06 [bits/kmer] -- 1.61825e-05% + -------------- + total: 10.1712 [bits/kmer] +2025-11-10 23:36:59: saving data structure to disk... +2025-11-10 23:37:04: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash +2025-11-10 23:37:04: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz'... +read 1000000 sequences, 289026795 bases, 259026795 kmers +read 1645464 sequences, 425569105 bases, 376205185 kmers +num_kmers 376205185 +cost: 2.0 + 0.262431 [bits/kmer] +max string length = 234900 +num bits per_absolute_offset = 29 +num bits per_relative_offset = 18 +num bits per_string_id = 21 +=== step 1 (encode strings): 1.17629 [sec] (3.12673 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.487854 [sec] (1.29678 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.bin' +=== step 3 (merging minimizer tuples): 2.74645 [sec] (7.3004 [ns/kmer]) +num_minimizers = 52162715 +num_minimizer_positions = 55045821 +num_super_kmers = 55045821 +building minimizers MPHF with 64 threads and 18 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.35264 [sec] (6.25361 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814224403175312.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 2.00997 [sec] (5.34276 [ns/kmer]) +=== step 6 (merging minimizers tuples): 3.77259 [sec] (10.028 [ns/kmer]) +num_bits_per_offset = 29 +num_buckets_larger_than_1_not_in_skew_index 2257124/52162715 (4.32708%) +num_buckets_in_skew_index 22/52162715 (4.21757e-05%) +max_bucket_size 322 +log2_max_bucket_size 9 +num_partitions in skew index 3 +num_minimizer_positions_of_buckets_larger_than_1 5137481/55045821 (9.3331%) +num_minimizer_positions_of_buckets_in_skew_index 2771/55045821 (0.00503399%) +=== step 7.1 (build sparse index): 0.64619 [sec] (1.71765 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 7461 + partition = 1: num kmers in buckets of size > 128 and <= 256: 2349 + partition = 2: num kmers in buckets of size > 256 and <= 322: 2299 +num kmers in skew index = 12109 (0.00321872%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 7461 + building MPHF with 64 threads and 1 partitions (avg. partition size = 7461)... + built mphs[0] for 7461 kmers; bits/key = 2.69991 + built positions[0] for 7461 kmers; bits/key = 7.05107 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2349 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2349)... + built mphs[1] for 2349 kmers; bits/key = 3.16731 + built positions[1] for 2349 kmers; bits/key = 8.14645 + lower = 256; upper = 322; num_bits_per_pos = 9; num_kmers_in_partition = 2299 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2299)... + built mphs[2] for 2299 kmers; bits/key = 3.18051 + built positions[2] for 2299 kmers; bits/key = 9.15876 +=== step 7.2 (build skew index): 0.027902 [sec] (0.074167 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 95.6729% +buckets with 2 minimizer positions = 3.54418% +buckets with 3 minimizer positions = 0.560318% +buckets with 4 minimizer positions = 0.1372% +buckets with 5 minimizer positions = 0.0464911% +buckets with 6 minimizer positions = 0.0185669% +buckets with 7 minimizer positions = 0.00842556% +buckets with 8 minimizer positions = 0.00444379% +buckets with 9 minimizer positions = 0.00242894% +buckets with 10 minimizer positions = 0.00141289% +buckets with 11 minimizer positions = 0.000904861% +buckets with 12 minimizer positions = 0.000592377% +buckets with 13 minimizer positions = 0.000416006% +buckets with 14 minimizer positions = 0.000352742% +buckets with 15 minimizer positions = 0.000222381% +buckets with 16 minimizer positions = 0.000207044% +max_bucket_size = 322 +=== step 7 (build sparse and skew index): 0.806121 [sec] (2.14277 [ns/kmer]) +=== total time: 13.3519 [sec] (35.4911 [ns/kmer]) +total index size: 346391727 [B] -- 346.392 [MB] +SPACE BREAKDOWN: + mphf: 0.403884 [bits/kmer] (2.91287 [bits/key]) -- 5.48307% + strings_offsets: 0.14346 [bits/kmer] -- 1.9476% + control_codewords: 4.15965 [bits/kmer] -- 56.4708% + mid_load_buckets: 0.396027 [bits/kmer] -- 5.3764% + begin_buckets_of_size: 5.69902e-06 [bits/kmer] -- 7.73691e-05% + strings: 2.26243 [bits/kmer] -- 30.7144% + skew_index: 0.000554293 [bits/kmer] -- 0.00752501% + weights: 3.91276e-06 [bits/kmer] -- 5.31191e-05% + -------------- + total: 7.36602 [bits/kmer] +2025-11-10 23:37:17: saving data structure to disk... +2025-11-10 23:37:19: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash +2025-11-10 23:37:19: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz'... +read 1000000 sequences, 686017631 bases, 656017631 kmers +read 2000000 sequences, 1516930736 bases, 1456930736 kmers +read 3000000 sequences, 1671624364 bases, 1581624364 kmers +read 4000000 sequences, 1825353707 bases, 1705353707 kmers +read 5000000 sequences, 1981022079 bases, 1831022079 kmers +read 6000000 sequences, 2135517340 bases, 1955517340 kmers +read 7000000 sequences, 2290855053 bases, 2080855053 kmers +read 8000000 sequences, 2446475973 bases, 2206475973 kmers +read 9000000 sequences, 2602386528 bases, 2332386528 kmers +read 10000000 sequences, 2759608735 bases, 2459608735 kmers +read 11000000 sequences, 2916635557 bases, 2586635557 kmers +read 12000000 sequences, 3075074548 bases, 2715074548 kmers +read 13000000 sequences, 3231174451 bases, 2841174451 kmers +read 14000000 sequences, 3387702724 bases, 2967702724 kmers +read 15000000 sequences, 3546041675 bases, 3096041675 kmers +read 16000000 sequences, 3705485347 bases, 3225485347 kmers +read 17000000 sequences, 3864338567 bases, 3354338567 kmers +read 18000000 sequences, 4024214257 bases, 3484214257 kmers +read 19000000 sequences, 4185860468 bases, 3615860468 kmers +read 20000000 sequences, 4346092632 bases, 3746092632 kmers +read 21000000 sequences, 4506820088 bases, 3876820088 kmers +read 22000000 sequences, 4669576501 bases, 4009576501 kmers +read 23000000 sequences, 4833065439 bases, 4143065439 kmers +read 24000000 sequences, 4995788985 bases, 4275788985 kmers +read 25000000 sequences, 5161157096 bases, 4411157096 kmers +read 26000000 sequences, 5326624598 bases, 4546624598 kmers +read 27000000 sequences, 5491635755 bases, 4681635755 kmers +read 28000000 sequences, 5657793355 bases, 4817793355 kmers +read 29000000 sequences, 5825695255 bases, 4955695255 kmers +read 30000000 sequences, 5993510862 bases, 5093510862 kmers +read 31000000 sequences, 6162441208 bases, 5232441208 kmers +read 32000000 sequences, 6331692362 bases, 5371692362 kmers +read 33000000 sequences, 6503271864 bases, 5513271864 kmers +read 34000000 sequences, 6675760229 bases, 5655760229 kmers +read 35000000 sequences, 6848330384 bases, 5798330384 kmers +read 36000000 sequences, 7023123965 bases, 5943123965 kmers +read 37000000 sequences, 7198253074 bases, 6088253074 kmers +read 38000000 sequences, 7375809245 bases, 6235809245 kmers +read 39000000 sequences, 7554546146 bases, 6384546146 kmers +read 40000000 sequences, 7733588270 bases, 6533588270 kmers +read 41000000 sequences, 7913812723 bases, 6683812723 kmers +read 42000000 sequences, 8096249793 bases, 6836249793 kmers +read 43000000 sequences, 8280221420 bases, 6990221420 kmers +read 44000000 sequences, 8465351199 bases, 7145351199 kmers +read 45000000 sequences, 8653130199 bases, 7303130199 kmers +read 46000000 sequences, 8842916979 bases, 7462916979 kmers +read 47000000 sequences, 9034171590 bases, 7624171590 kmers +read 48000000 sequences, 9229077420 bases, 7789077420 kmers +read 49000000 sequences, 9427173385 bases, 7957173385 kmers +read 50000000 sequences, 9626599822 bases, 8126599822 kmers +read 51000000 sequences, 9828281066 bases, 8298281066 kmers +read 52000000 sequences, 10034632099 bases, 8474632099 kmers +read 53000000 sequences, 10244441062 bases, 8654441062 kmers +read 54000000 sequences, 10461638729 bases, 8841638729 kmers +read 55000000 sequences, 10681775593 bases, 9031775593 kmers +read 56000000 sequences, 10909062511 bases, 9229062511 kmers +read 57000000 sequences, 11141765143 bases, 9431765143 kmers +read 58000000 sequences, 11382466536 bases, 9642466536 kmers +read 59000000 sequences, 11631643814 bases, 9861643814 kmers +read 60000000 sequences, 11893103257 bases, 10093103257 kmers +read 61000000 sequences, 12168237378 bases, 10338237378 kmers +read 62000000 sequences, 12459768025 bases, 10599768025 kmers +read 63000000 sequences, 12773380141 bases, 10883380141 kmers +read 64000000 sequences, 13118311195 bases, 11198311195 kmers +read 65000000 sequences, 13506575783 bases, 11556575783 kmers +read 66000000 sequences, 13957265370 bases, 11977265370 kmers +read 66677672 sequences, 14320170624 bases, 12319840464 kmers +num_kmers 12319840464 +cost: 2.0 + 0.324733 [bits/kmer] +max string length = 199388 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 18 +num bits per_string_id = 26 +=== step 1 (encode strings): 40.468 [sec] (3.28478 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.206.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.207.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.208.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.209.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.210.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.211.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.212.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.213.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.214.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.215.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.216.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.217.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.218.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.219.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.220.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.221.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.222.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.223.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.224.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.225.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.226.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.227.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.228.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.229.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.230.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.231.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.232.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.233.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.234.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.235.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.236.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.237.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.238.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.239.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.240.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.241.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.242.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.243.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.244.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.245.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.246.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.247.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.248.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.249.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.250.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.251.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.252.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.253.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.254.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.255.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.256.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.257.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.258.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.259.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.260.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.261.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.262.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.263.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.264.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.265.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.266.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.267.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.268.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.269.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.270.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.271.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.272.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.273.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.274.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.275.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.276.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.277.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.278.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.279.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.280.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.281.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.282.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.283.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.284.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.285.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.286.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.287.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.288.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.289.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.290.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.291.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.292.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.293.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.294.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.295.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.296.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.297.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.298.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.299.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.300.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.301.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.302.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.303.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.304.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.305.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.306.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.307.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.308.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.309.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.310.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.311.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.312.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.313.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.314.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.315.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.316.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.317.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.318.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.319.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.320.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.321.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.322.bin'... +=== step 2 (compute minimizer tuples): 13.5477 [sec] (1.09966 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +=== step 3 (merging minimizer tuples): 157.577 [sec] (12.7905 [ns/kmer]) +num_minimizers = 1961525096 +num_minimizer_positions = 2099034004 +num_super_kmers = 2099034004 +building minimizers MPHF with 64 threads and 654 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 172.892 [sec] (14.0336 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.4.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 150.31 [sec] (12.2007 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762814239345305644.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +processed 1600000000 minimizer tuples +processed 1700000000 minimizer tuples +processed 1800000000 minimizer tuples +processed 1900000000 minimizer tuples +processed 2000000000 minimizer tuples +=== step 6 (merging minimizers tuples): 239.907 [sec] (19.4732 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 91088139/1961525096 (4.64374%) +num_buckets_in_skew_index 15359/1961525096 (0.000783013%) +max_bucket_size 29356 +log2_max_bucket_size 15 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 225830591/2099034004 (10.7588%) +num_minimizer_positions_of_buckets_in_skew_index 2781815/2099034004 (0.132528%) +=== step 7.1 (build sparse index): 26.8345 [sec] (2.17816 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 4802542 + partition = 1: num kmers in buckets of size > 128 and <= 256: 3332028 + partition = 2: num kmers in buckets of size > 256 and <= 512: 2066925 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1692798 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1087998 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 606642 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 618629 + partition = 7: num kmers in buckets of size > 8192 and <= 29356: 453529 +num kmers in skew index = 14661091 (0.119004%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4802542 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4802542 kmers; bits/key = 2.73723 + built positions[0] for 4802542 kmers; bits/key = 7.00008 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3332028 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3332028 kmers; bits/key = 3.24707 + built positions[1] for 3332028 kmers; bits/key = 8.00011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2066925 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2066925)... + built mphs[2] for 2066925 kmers; bits/key = 2.56012 + built positions[2] for 2066925 kmers; bits/key = 9.00018 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1692798 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1692798)... + built mphs[3] for 1692798 kmers; bits/key = 2.56031 + built positions[3] for 1692798 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1087998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1087998)... + built mphs[4] for 1087998 kmers; bits/key = 2.41823 + built positions[4] for 1087998 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 606642 + building MPHF with 64 threads and 1 partitions (avg. partition size = 606642)... + built mphs[5] for 606642 kmers; bits/key = 2.41969 + built positions[5] for 606642 kmers; bits/key = 12.0006 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 618629 + building MPHF with 64 threads and 1 partitions (avg. partition size = 618629)... + built mphs[6] for 618629 kmers; bits/key = 2.56252 + built positions[6] for 618629 kmers; bits/key = 13.0006 + lower = 8192; upper = 29356; num_bits_per_pos = 15; num_kmers_in_partition = 453529 + building MPHF with 64 threads and 1 partitions (avg. partition size = 453529)... + built mphs[7] for 453529 kmers; bits/key = 2.42087 + built positions[7] for 453529 kmers; bits/key = 15.0007 +=== step 7.2 (build skew index): 4.79322 [sec] (0.389065 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 95.3555% +buckets with 2 minimizer positions = 3.59761% +buckets with 3 minimizer positions = 0.65191% +buckets with 4 minimizer positions = 0.191677% +buckets with 5 minimizer positions = 0.0777054% +buckets with 6 minimizer positions = 0.0393496% +buckets with 7 minimizer positions = 0.0230028% +buckets with 8 minimizer positions = 0.0148099% +buckets with 9 minimizer positions = 0.0102043% +buckets with 10 minimizer positions = 0.00731242% +buckets with 11 minimizer positions = 0.00546238% +buckets with 12 minimizer positions = 0.00416008% +buckets with 13 minimizer positions = 0.00324798% +buckets with 14 minimizer positions = 0.0025861% +buckets with 15 minimizer positions = 0.0020871% +buckets with 16 minimizer positions = 0.00169791% +max_bucket_size = 29356 +=== step 7 (build sparse and skew index): 36.1232 [sec] (2.93212 [ns/kmer]) +=== total time: 810.824 [sec] (65.8145 [ns/kmer]) +total index size: 14122834359 [B] -- 14122.8 [MB] +SPACE BREAKDOWN: + mphf: 0.449842 [bits/kmer] (2.82534 [bits/key]) -- 4.90516% + strings_offsets: 0.178888 [bits/kmer] -- 1.95063% + control_codewords: 5.57259 [bits/kmer] -- 60.7645% + mid_load_buckets: 0.623242 [bits/kmer] -- 6.79595% + begin_buckets_of_size: 1.74028e-07 [bits/kmer] -- 1.89764e-06% + strings: 2.32473 [bits/kmer] -- 25.3493% + skew_index: 0.0214982 [bits/kmer] -- 0.234421% + weights: 1.19482e-07 [bits/kmer] -- 1.30285e-06% + -------------- + total: 9.17079 [bits/kmer] +2025-11-10 23:50:50: saving data structure to disk... +2025-11-10 23:51:56: DONE diff --git a/benchmarks/results-10-11-25/k31/regular-build.time.log b/benchmarks/results-10-11-25/k31/regular-build.time.log new file mode 100644 index 0000000..c483c29 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-build.time.log @@ -0,0 +1,207 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash" + User time (seconds): 42.15 + System time (seconds): 10.57 + Percent of CPU this job got: 185% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:28.37 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 4078416 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2660433 + Voluntary context switches: 29457 + Involuntary context switches: 7941 + Swaps: 0 + File system inputs: 0 + File system outputs: 11811032 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash" + User time (seconds): 111.91 + System time (seconds): 26.47 + Percent of CPU this job got: 289% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:47.78 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9624656 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6078020 + Voluntary context switches: 33158 + Involuntary context switches: 9143 + Swaps: 0 + File system inputs: 128 + File system outputs: 26795048 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash" + User time (seconds): 309.05 + System time (seconds): 56.64 + Percent of CPU this job got: 272% + Elapsed (wall clock) time (h:mm:ss or m:ss): 2:14.32 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 18086172 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 13788606 + Voluntary context switches: 69187 + Involuntary context switches: 10303 + Swaps: 0 + File system inputs: 176 + File system outputs: 63600976 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k31.sshash" + User time (seconds): 2303.16 + System time (seconds): 492.15 + Percent of CPU this job got: 127% + Elapsed (wall clock) time (h:mm:ss or m:ss): 36:35.21 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 94469984 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 107232 + Minor (reclaiming a frame) page faults: 70110189 + Voluntary context switches: 1092211 + Involuntary context switches: 73349 + Swaps: 0 + File system inputs: 45823408 + File system outputs: 576910912 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash" + User time (seconds): 472.79 + System time (seconds): 89.24 + Percent of CPU this job got: 206% + Elapsed (wall clock) time (h:mm:ss or m:ss): 4:32.37 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 23454808 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 1 + Minor (reclaiming a frame) page faults: 20354525 + Voluntary context switches: 138546 + Involuntary context switches: 15103 + Swaps: 0 + File system inputs: 3671248 + File system outputs: 121645608 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k31.sshash" + User time (seconds): 121.63 + System time (seconds): 28.91 + Percent of CPU this job got: 193% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:17.71 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9668960 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6817679 + Voluntary context switches: 31022 + Involuntary context switches: 9096 + Swaps: 0 + File system inputs: 1247824 + File system outputs: 29435176 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash" + User time (seconds): 92.24 + System time (seconds): 22.31 + Percent of CPU this job got: 226% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:50.55 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 7828188 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 5524160 + Voluntary context switches: 31543 + Involuntary context switches: 9210 + Swaps: 0 + File system inputs: 996952 + File system outputs: 23782336 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash" + User time (seconds): 26.33 + System time (seconds): 7.84 + Percent of CPU this job got: 228% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:14.93 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 2983092 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1880126 + Voluntary context switches: 29352 + Involuntary context switches: 7007 + Swaps: 0 + File system inputs: 265464 + File system outputs: 8333480 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k31.sshash" + User time (seconds): 1593.27 + System time (seconds): 266.26 + Percent of CPU this job got: 211% + Elapsed (wall clock) time (h:mm:ss or m:ss): 14:38.08 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 59072844 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 46119150 + Voluntary context switches: 651688 + Involuntary context switches: 45324 + Swaps: 0 + File system inputs: 9165920 + File system outputs: 392165928 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-10-11-25/k63/canon-build.json b/benchmarks/results-10-11-25/k63/canon-build.json new file mode 100644 index 0000000..c6ec00c --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-build.json @@ -0,0 +1,9 @@ +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz", "k": "63", "m": "24", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1455730", "step 2 (compute minimizer tuples)": "423547", "step 3 (merging minimizer tuples)": "1932696", "step 4 (build mphf)": "1615217", "step 5 (replacing minimizer values with MPHF hashes)": "1332988", "step 6 (merging minimizers tuples)": "2395700", "step 7.1 (build sparse index)": "500158", "step 7.2 (build skew index)": "5663735", "step 7 (build sparse and skew index)": "6253775", "total_build_time_in_microsec": "15409653", "index_size_in_bytes": "345440542", "num_kmers": "556585658"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz", "k": "63", "m": "24", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "2621728", "step 2 (compute minimizer tuples)": "666365", "step 3 (merging minimizer tuples)": "3742543", "step 4 (build mphf)": "2931134", "step 5 (replacing minimizer values with MPHF hashes)": "2642471", "step 6 (merging minimizers tuples)": "5286761", "step 7.1 (build sparse index)": "611732", "step 7.2 (build skew index)": "1058241", "step 7 (build sparse and skew index)": "1821152", "total_build_time_in_microsec": "19712154", "index_size_in_bytes": "610013389", "num_kmers": "1155250667"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "6797908", "step 2 (compute minimizer tuples)": "1491658", "step 3 (merging minimizer tuples)": "9284711", "step 4 (build mphf)": "5937076", "step 5 (replacing minimizer values with MPHF hashes)": "6276611", "step 6 (merging minimizers tuples)": "16108392", "step 7.1 (build sparse index)": "2174004", "step 7.2 (build skew index)": "20595029", "step 7 (build sparse and skew index)": "23168795", "total_build_time_in_microsec": "69065151", "index_size_in_bytes": "1839839296", "num_kmers": "2771316093"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "66380276", "step 2 (compute minimizer tuples)": "14288435", "step 3 (merging minimizer tuples)": "106961304", "step 4 (build mphf)": "83357684", "step 5 (replacing minimizer values with MPHF hashes)": "67389059", "step 6 (merging minimizers tuples)": "211314683", "step 7.1 (build sparse index)": "28935678", "step 7.2 (build skew index)": "309270405", "step 7 (build sparse and skew index)": "342019891", "total_build_time_in_microsec": "891711332", "index_size_in_bytes": "17433076635", "num_kmers": "22766770240"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "26910723", "step 2 (compute minimizer tuples)": "10917373", "step 3 (merging minimizer tuples)": "34527726", "step 4 (build mphf)": "12784700", "step 5 (replacing minimizer values with MPHF hashes)": "16993522", "step 6 (merging minimizers tuples)": "66065635", "step 7.1 (build sparse index)": "13120534", "step 7.2 (build skew index)": "70705352", "step 7 (build sparse and skew index)": "85345523", "total_build_time_in_microsec": "253545202", "index_size_in_bytes": "6028576020", "num_kmers": "5926785469"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "9911460", "step 2 (compute minimizer tuples)": "1423819", "step 3 (merging minimizer tuples)": "9860370", "step 4 (build mphf)": "3902561", "step 5 (replacing minimizer values with MPHF hashes)": "5718533", "step 6 (merging minimizers tuples)": "13647523", "step 7.1 (build sparse index)": "4042275", "step 7.2 (build skew index)": "40097912", "step 7 (build sparse and skew index)": "44663017", "total_build_time_in_microsec": "89127283", "index_size_in_bytes": "2131440134", "num_kmers": "2027656011"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "7224275", "step 2 (compute minimizer tuples)": "1070910", "step 3 (merging minimizer tuples)": "7387421", "step 4 (build mphf)": "3137436", "step 5 (replacing minimizer values with MPHF hashes)": "4263331", "step 6 (merging minimizers tuples)": "9988831", "step 7.1 (build sparse index)": "3092792", "step 7.2 (build skew index)": "21449308", "step 7 (build sparse and skew index)": "24928109", "total_build_time_in_microsec": "58000313", "index_size_in_bytes": "1481048960", "num_kmers": "1524904156"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz", "k": "63", "m": "23", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1117396", "step 2 (compute minimizer tuples)": "476091", "step 3 (merging minimizer tuples)": "1404115", "step 4 (build mphf)": "1250212", "step 5 (replacing minimizer values with MPHF hashes)": "1002353", "step 6 (merging minimizers tuples)": "1833045", "step 7.1 (build sparse index)": "430283", "step 7.2 (build skew index)": "52647", "step 7 (build sparse and skew index)": "554804", "total_build_time_in_microsec": "7638016", "index_size_in_bytes": "229841550", "num_kmers": "412515880"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "true", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "35644705", "step 2 (compute minimizer tuples)": "12432565", "step 3 (merging minimizer tuples)": "61124540", "step 4 (build mphf)": "56661382", "step 5 (replacing minimizer values with MPHF hashes)": "29935639", "step 6 (merging minimizers tuples)": "124814038", "step 7.1 (build sparse index)": "14713057", "step 7.2 (build skew index)": "12205092", "step 7 (build sparse and skew index)": "28991155", "total_build_time_in_microsec": "349604024", "index_size_in_bytes": "8386935913", "num_kmers": "13663610341"} diff --git a/benchmarks/results-10-11-25/k63/canon-build.log b/benchmarks/results-10-11-25/k63/canon-build.log new file mode 100644 index 0000000..f113ec8 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-build.log @@ -0,0 +1,2046 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash --canonical +2025-11-11 01:17:27: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max string length = 46783 +num bits per_absolute_offset = 30 +num bits per_relative_offset = 16 +num bits per_string_id = 20 +=== step 1 (encode strings): 1.45573 [sec] (2.61546 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.423547 [sec] (0.760974 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.bin' +=== step 3 (merging minimizer tuples): 1.9327 [sec] (3.47241 [ns/kmer]) +num_minimizers = 29275778 +num_minimizer_positions = 34590805 +num_super_kmers = 36307176 +building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 1.61522 [sec] (2.90201 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820247195652893.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 1.33299 [sec] (2.39494 [ns/kmer]) +=== step 6 (merging minimizers tuples): 2.3957 [sec] (4.30428 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 1189512/29275778 (4.06313%) +num_buckets_in_skew_index 5032/29275778 (0.0171883%) +max_bucket_size 815743 +log2_max_bucket_size 20 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 4643594/34590805 (13.4244%) +num_minimizer_positions_of_buckets_in_skew_index 1865977/34590805 (5.39443%) +=== step 7.1 (build sparse index): 0.500158 [sec] (0.898618 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 4850737 + partition = 1: num kmers in buckets of size > 128 and <= 256: 3133092 + partition = 2: num kmers in buckets of size > 256 and <= 512: 1886121 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1113398 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 945186 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1019479 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 681501 + partition = 7: num kmers in buckets of size > 8192 and <= 815743: 5508330 +num kmers in skew index = 19137844 (3.43844%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4850737 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 4850737 kmers; bits/key = 2.71418 + built positions[0] for 4850737 kmers; bits/key = 7.00007 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3133092 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[1] for 3133092 kmers; bits/key = 3.15324 + built positions[1] for 3133092 kmers; bits/key = 8.00011 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1886121 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1886121)... + built mphs[2] for 1886121 kmers; bits/key = 2.5602 + built positions[2] for 1886121 kmers; bits/key = 9.00018 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1113398 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1113398)... + built mphs[3] for 1113398 kmers; bits/key = 2.56094 + built positions[3] for 1113398 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 945186 + building MPHF with 64 threads and 1 partitions (avg. partition size = 945186)... + built mphs[4] for 945186 kmers; bits/key = 2.56129 + built positions[4] for 945186 kmers; bits/key = 11.0003 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1019479 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1019479)... + built mphs[5] for 1019479 kmers; bits/key = 2.56115 + built positions[5] for 1019479 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 681501 + building MPHF with 64 threads and 1 partitions (avg. partition size = 681501)... + built mphs[6] for 681501 kmers; bits/key = 2.41941 + built positions[6] for 681501 kmers; bits/key = 13.0005 + lower = 8192; upper = 815743; num_bits_per_pos = 20; num_kmers_in_partition = 5508330 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 5508330 kmers; bits/key = 2.59546 + built positions[7] for 5508330 kmers; bits/key = 20.0001 +=== step 7.2 (build skew index): 5.66373 [sec] (10.1759 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 95.9197% +buckets with 2 minimizer positions = 2.25505% +buckets with 3 minimizer positions = 0.743143% +buckets with 4 minimizer positions = 0.33953% +buckets with 5 minimizer positions = 0.188914% +buckets with 6 minimizer positions = 0.116602% +buckets with 7 minimizer positions = 0.0799535% +buckets with 8 minimizer positions = 0.0565963% +buckets with 9 minimizer positions = 0.0427691% +buckets with 10 minimizer positions = 0.0324774% +buckets with 11 minimizer positions = 0.0259498% +buckets with 12 minimizer positions = 0.0206382% +buckets with 13 minimizer positions = 0.017038% +buckets with 14 minimizer positions = 0.0148143% +buckets with 15 minimizer positions = 0.0124232% +buckets with 16 minimizer positions = 0.0107973% +max_bucket_size = 815743 +=== step 7 (build sparse and skew index): 6.25378 [sec] (11.236 [ns/kmer]) +=== total time: 15.4097 [sec] (27.686 [ns/kmer]) +total index size: 345440542 [B] -- 345.441 [MB] +SPACE BREAKDOWN: + mphf: 0.151285 [bits/kmer] (2.87621 [bits/key]) -- 3.04695% + strings_offsets: 0.115799 [bits/kmer] -- 2.33224% + control_codewords: 1.63057 [bits/kmer] -- 32.8403% + mid_load_buckets: 0.250291 [bits/kmer] -- 5.04096% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.75821e-05% + strings: 2.21266 [bits/kmer] -- 44.564% + skew_index: 0.604527 [bits/kmer] -- 12.1754% + weights: 2.6447e-06 [bits/kmer] -- 5.32653e-05% + -------------- + total: 4.96514 [bits/kmer] +2025-11-11 01:17:42: saving data structure to disk... +2025-11-11 01:17:44: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash --canonical +2025-11-11 01:17:44: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max string length = 261876 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 18 +num bits per_string_id = 18 +=== step 1 (encode strings): 2.62173 [sec] (2.2694 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.666365 [sec] (0.576814 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.bin' +=== step 3 (merging minimizer tuples): 3.74254 [sec] (3.23959 [ns/kmer]) +num_minimizers = 68497878 +num_minimizer_positions = 69282395 +num_super_kmers = 73080845 +building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.93113 [sec] (2.53723 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820264346018005.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 2.64247 [sec] (2.28736 [ns/kmer]) +=== step 6 (merging minimizers tuples): 5.28676 [sec] (4.57629 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 296941/68497878 (0.433504%) +num_buckets_in_skew_index 787/68497878 (0.00114894%) +max_bucket_size 1509 +log2_max_bucket_size 11 +num_partitions in skew index 5 +num_minimizer_positions_of_buckets_larger_than_1 973386/69282395 (1.40495%) +num_minimizer_positions_of_buckets_in_skew_index 108859/69282395 (0.157124%) +=== step 7.1 (build sparse index): 0.611732 [sec] (0.529523 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 854803 + partition = 1: num kmers in buckets of size > 128 and <= 256: 508726 + partition = 2: num kmers in buckets of size > 256 and <= 512: 353088 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 143157 + partition = 4: num kmers in buckets of size > 1024 and <= 1509: 45334 +num kmers in skew index = 1905108 (0.164909%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 854803 + building MPHF with 64 threads and 1 partitions (avg. partition size = 854803)... + built mphs[0] for 854803 kmers; bits/key = 2.5616 + built positions[0] for 854803 kmers; bits/key = 7.00044 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 508726 + building MPHF with 64 threads and 1 partitions (avg. partition size = 508726)... + built mphs[1] for 508726 kmers; bits/key = 2.42032 + built positions[1] for 508726 kmers; bits/key = 8.00066 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 353088 + building MPHF with 64 threads and 1 partitions (avg. partition size = 353088)... + built mphs[2] for 353088 kmers; bits/key = 2.56521 + built positions[2] for 353088 kmers; bits/key = 9.00091 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 143157 + building MPHF with 64 threads and 1 partitions (avg. partition size = 143157)... + built mphs[3] for 143157 kmers; bits/key = 2.4309 + built positions[3] for 143157 kmers; bits/key = 10.0026 + lower = 1024; upper = 1509; num_bits_per_pos = 11; num_kmers_in_partition = 45334 + building MPHF with 64 threads and 1 partitions (avg. partition size = 45334)... + built mphs[4] for 45334 kmers; bits/key = 2.46173 + built positions[4] for 45334 kmers; bits/key = 11.0074 +=== step 7.2 (build skew index): 1.05824 [sec] (0.916027 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 99.5653% +buckets with 2 minimizer positions = 0.296122% +buckets with 3 minimizer positions = 0.0602092% +buckets with 4 minimizer positions = 0.0251672% +buckets with 5 minimizer positions = 0.0136895% +buckets with 6 minimizer positions = 0.00842362% +buckets with 7 minimizer positions = 0.00572864% +buckets with 8 minimizer positions = 0.00416071% +buckets with 9 minimizer positions = 0.00301323% +buckets with 10 minimizer positions = 0.00248183% +buckets with 11 minimizer positions = 0.00184093% +buckets with 12 minimizer positions = 0.00158691% +buckets with 13 minimizer positions = 0.00117084% +buckets with 14 minimizer positions = 0.00105697% +buckets with 15 minimizer positions = 0.000887619% +buckets with 16 minimizer positions = 0.000756228% +max_bucket_size = 1509 +=== step 7 (build sparse and skew index): 1.82115 [sec] (1.57641 [ns/kmer]) +=== total time: 19.7122 [sec] (17.0631 [ns/kmer]) +total index size: 610013389 [B] -- 610.013 [MB] +SPACE BREAKDOWN: + mphf: 0.16806 [bits/kmer] (2.83441 [bits/key]) -- 3.97842% + strings_offsets: 0.0958242 [bits/kmer] -- 2.26841% + control_codewords: 1.89737 [bits/kmer] -- 44.9157% + mid_load_buckets: 0.0261201 [bits/kmer] -- 0.618333% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.39335e-05% + strings: 2.01672 [bits/kmer] -- 47.7411% + skew_index: 0.0201901 [bits/kmer] -- 0.477952% + weights: 1.27418e-06 [bits/kmer] -- 3.01633e-05% + -------------- + total: 4.22428 [bits/kmer] +2025-11-11 01:18:04: saving data structure to disk... +2025-11-11 01:18:06: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash --canonical +2025-11-11 01:18:06: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max string length = 124282 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 17 +num bits per_string_id = 22 +=== step 1 (encode strings): 6.79791 [sec] (2.45295 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 1.49166 [sec] (0.538249 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 9.28471 [sec] (3.35029 [ns/kmer]) +num_minimizers = 149769567 +num_minimizer_positions = 173272792 +num_super_kmers = 182565576 +building minimizers MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 5.93708 [sec] (2.14233 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820286868261128.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 6.27661 [sec] (2.26485 [ns/kmer]) +=== step 6 (merging minimizers tuples): 16.1084 [sec] (5.81254 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 4082749/149769567 (2.72602%) +num_buckets_in_skew_index 35781/149769567 (0.0238907%) +max_bucket_size 284250 +log2_max_bucket_size 19 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 16495406/173272792 (9.51991%) +num_minimizer_positions_of_buckets_in_skew_index 11126349/173272792 (6.42129%) +=== step 7.1 (build sparse index): 2.174 [sec] (0.784466 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 26742724 + partition = 1: num kmers in buckets of size > 128 and <= 256: 24475836 + partition = 2: num kmers in buckets of size > 256 and <= 512: 21113117 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 19260150 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 17989259 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 15443443 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 12315344 + partition = 7: num kmers in buckets of size > 8192 and <= 284250: 28690575 +num kmers in skew index = 166030448 (5.99103%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26742724 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 26742724 kmers; bits/key = 2.56429 + built positions[0] for 26742724 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 24475836 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 24475836 kmers; bits/key = 2.62316 + built positions[1] for 24475836 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 21113117 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[2] for 21113117 kmers; bits/key = 2.6904 + built positions[2] for 21113117 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 19260150 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 19260150 kmers; bits/key = 2.59757 + built positions[3] for 19260150 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17989259 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17989259 kmers; bits/key = 2.53715 + built positions[4] for 17989259 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 15443443 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[5] for 15443443 kmers; bits/key = 2.69254 + built positions[5] for 15443443 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 12315344 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[6] for 12315344 kmers; bits/key = 2.67895 + built positions[6] for 12315344 kmers; bits/key = 13 + lower = 8192; upper = 284250; num_bits_per_pos = 19; num_kmers_in_partition = 28690575 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[7] for 28690575 kmers; bits/key = 2.55295 + built positions[7] for 28690575 kmers; bits/key = 19 +=== step 7.2 (build skew index): 20.595 [sec] (7.4315 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 97.2501% +buckets with 2 minimizer positions = 1.59767% +buckets with 3 minimizer positions = 0.444706% +buckets with 4 minimizer positions = 0.198987% +buckets with 5 minimizer positions = 0.113029% +buckets with 6 minimizer positions = 0.07244% +buckets with 7 minimizer positions = 0.0504562% +buckets with 8 minimizer positions = 0.0370322% +buckets with 9 minimizer positions = 0.0281472% +buckets with 10 minimizer positions = 0.0224598% +buckets with 11 minimizer positions = 0.0182414% +buckets with 12 minimizer positions = 0.0149463% +buckets with 13 minimizer positions = 0.0124745% +buckets with 14 minimizer positions = 0.0107405% +buckets with 15 minimizer positions = 0.00923686% +buckets with 16 minimizer positions = 0.00803234% +max_bucket_size = 284250 +=== step 7 (build sparse and skew index): 23.1688 [sec] (8.36021 [ns/kmer]) +=== total time: 69.0652 [sec] (24.9214 [ns/kmer]) +total index size: 1839839296 [B] -- 1839.84 [MB] +SPACE BREAKDOWN: + mphf: 0.152644 [bits/kmer] (2.82451 [bits/key]) -- 2.87406% + strings_offsets: 0.11255 [bits/kmer] -- 2.11915% + control_codewords: 1.78341 [bits/kmer] -- 33.579% + mid_load_buckets: 0.19047 [bits/kmer] -- 3.58627% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.45665e-05% + strings: 2.11826 [bits/kmer] -- 39.8836% + skew_index: 0.95376 [bits/kmer] -- 17.9579% + weights: 5.31156e-07 [bits/kmer] -- 1.00009e-05% + -------------- + total: 5.31109 [bits/kmer] +2025-11-11 01:19:15: saving data structure to disk... +2025-11-11 01:19:24: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash --canonical +2025-11-11 01:19:24: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz'... +read 1000000 sequences, 367776209 bases, 305776209 kmers +read 2000000 sequences, 737985819 bases, 613985819 kmers +read 3000000 sequences, 1110904173 bases, 924904173 kmers +read 4000000 sequences, 1483811415 bases, 1235811415 kmers +read 5000000 sequences, 1859655851 bases, 1549655851 kmers +read 6000000 sequences, 2238082976 bases, 1866082976 kmers +read 7000000 sequences, 2618741364 bases, 2184741364 kmers +read 8000000 sequences, 3003367751 bases, 2507367751 kmers +read 9000000 sequences, 3393382254 bases, 2835382254 kmers +read 10000000 sequences, 3787981427 bases, 3167981427 kmers +read 11000000 sequences, 4184097126 bases, 3502097126 kmers +read 12000000 sequences, 4584570246 bases, 3840570246 kmers +read 13000000 sequences, 4992446542 bases, 4186446542 kmers +read 14000000 sequences, 5404831631 bases, 4536831631 kmers +read 15000000 sequences, 5823371753 bases, 4893371753 kmers +read 16000000 sequences, 6248734465 bases, 5256734465 kmers +read 17000000 sequences, 6682521466 bases, 5628521466 kmers +read 18000000 sequences, 7124787217 bases, 6008787217 kmers +read 19000000 sequences, 7580114109 bases, 6402114109 kmers +read 20000000 sequences, 8047294111 bases, 6807294111 kmers +read 21000000 sequences, 8529676866 bases, 7227676866 kmers +read 22000000 sequences, 9033767795 bases, 7669767795 kmers +read 23000000 sequences, 9560185658 bases, 8134185658 kmers +read 24000000 sequences, 10119240080 bases, 8631240080 kmers +read 25000000 sequences, 10718751300 bases, 9168751300 kmers +read 26000000 sequences, 11378640529 bases, 9766640529 kmers +read 27000000 sequences, 12134212218 bases, 10460212218 kmers +read 28000000 sequences, 13067071790 bases, 11331071790 kmers +read 29000000 sequences, 13626049624 bases, 11828049624 kmers +read 30000000 sequences, 13960720037 bases, 12100720037 kmers +read 31000000 sequences, 14294970673 bases, 12372970673 kmers +read 32000000 sequences, 14628836645 bases, 12644836645 kmers +read 33000000 sequences, 14963175436 bases, 12917175436 kmers +read 34000000 sequences, 15298218879 bases, 13190218879 kmers +read 35000000 sequences, 15633699282 bases, 13463699282 kmers +read 36000000 sequences, 15967703945 bases, 13735703945 kmers +read 37000000 sequences, 16302024026 bases, 14008024026 kmers +read 38000000 sequences, 16635791931 bases, 14279791931 kmers +read 39000000 sequences, 16971526422 bases, 14553526422 kmers +read 40000000 sequences, 17307281294 bases, 14827281294 kmers +read 41000000 sequences, 17645308371 bases, 15103308371 kmers +read 42000000 sequences, 17983412927 bases, 15379412927 kmers +read 43000000 sequences, 18320303922 bases, 15654303922 kmers +read 44000000 sequences, 18658298765 bases, 15930298765 kmers +read 45000000 sequences, 18996960738 bases, 16206960738 kmers +read 46000000 sequences, 19337650486 bases, 16485650486 kmers +read 47000000 sequences, 19678229737 bases, 16764229737 kmers +read 48000000 sequences, 20021474847 bases, 17045474847 kmers +read 49000000 sequences, 20364403409 bases, 17326403409 kmers +read 50000000 sequences, 20708621449 bases, 17608621449 kmers +read 51000000 sequences, 21051850139 bases, 17889850139 kmers +read 52000000 sequences, 21397390032 bases, 18173390032 kmers +read 53000000 sequences, 21743414843 bases, 18457414843 kmers +read 54000000 sequences, 22090330124 bases, 18742330124 kmers +read 55000000 sequences, 22439410639 bases, 19029410639 kmers +read 56000000 sequences, 22787640700 bases, 19315640700 kmers +read 57000000 sequences, 23137101573 bases, 19603101573 kmers +read 58000000 sequences, 23487411623 bases, 19891411623 kmers +read 59000000 sequences, 23839869821 bases, 20181869821 kmers +read 60000000 sequences, 24191291613 bases, 20471291613 kmers +read 61000000 sequences, 24545366070 bases, 20763366070 kmers +read 62000000 sequences, 24900738859 bases, 21056738859 kmers +read 63000000 sequences, 25257104822 bases, 21351104822 kmers +read 64000000 sequences, 25617509594 bases, 21649509594 kmers +read 65000000 sequences, 25977036607 bases, 21947036607 kmers +read 66000000 sequences, 26338121105 bases, 22246121105 kmers +read 67000000 sequences, 26701662537 bases, 22547662537 kmers +read 67725914 sequences, 26965776908 bases, 22766770240 kmers +num_kmers 22766770240 +cost: 2.0 + 0.368872 [bits/kmer] +max string length = 77847 +num bits per_absolute_offset = 35 +num bits per_relative_offset = 17 +num bits per_string_id = 27 +=== step 1 (encode strings): 66.3803 [sec] (2.91567 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.206.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.207.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.208.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.209.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.210.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.211.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.212.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.213.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.214.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.215.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.216.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.217.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.218.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.219.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.220.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.221.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.222.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.223.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.224.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.225.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.226.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.227.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.228.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.229.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.230.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.231.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.232.bin'... +=== step 2 (compute minimizer tuples): 14.2884 [sec] (0.6276 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +=== step 3 (merging minimizer tuples): 106.961 [sec] (4.69813 [ns/kmer]) +num_minimizers = 1050811069 +num_minimizer_positions = 1468555314 +num_super_kmers = 1544327439 +building minimizers MPHF with 64 threads and 351 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 83.3577 [sec] (3.66138 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.3.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 67.3891 [sec] (2.95997 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762820364727096833.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +processed 1300000000 minimizer tuples +processed 1400000000 minimizer tuples +processed 1500000000 minimizer tuples +=== step 6 (merging minimizers tuples): 211.315 [sec] (9.28172 [ns/kmer]) +num_bits_per_offset = 35 +num_buckets_larger_than_1_not_in_skew_index 88763229/1050811069 (8.44712%) +num_buckets_in_skew_index 646454/1050811069 (0.0615195%) +max_bucket_size 180205 +log2_max_bucket_size 18 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 369499242/1468555314 (25.1607%) +num_minimizer_positions_of_buckets_in_skew_index 137654686/1468555314 (9.37348%) +=== step 7.1 (build sparse index): 28.9357 [sec] (1.27096 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 482180906 + partition = 1: num kmers in buckets of size > 128 and <= 256: 408452161 + partition = 2: num kmers in buckets of size > 256 and <= 512: 342999108 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 281650651 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 203247810 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 129300467 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 61963038 + partition = 7: num kmers in buckets of size > 8192 and <= 180205: 61253732 +num kmers in skew index = 1971047873 (8.65756%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 482180906 + building MPHF with 64 threads and 161 partitions (avg. partition size = 3000000)... + built mphs[0] for 482180906 kmers; bits/key = 2.55443 + built positions[0] for 482180906 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 408452161 + building MPHF with 64 threads and 137 partitions (avg. partition size = 3000000)... + built mphs[1] for 408452161 kmers; bits/key = 2.55416 + built positions[1] for 408452161 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 342999108 + building MPHF with 64 threads and 115 partitions (avg. partition size = 3000000)... + built mphs[2] for 342999108 kmers; bits/key = 2.55469 + built positions[2] for 342999108 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 281650651 + building MPHF with 64 threads and 94 partitions (avg. partition size = 3000000)... + built mphs[3] for 281650651 kmers; bits/key = 2.55625 + built positions[3] for 281650651 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 203247810 + building MPHF with 64 threads and 68 partitions (avg. partition size = 3000000)... + built mphs[4] for 203247810 kmers; bits/key = 2.55497 + built positions[4] for 203247810 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 129300467 + building MPHF with 64 threads and 44 partitions (avg. partition size = 3000000)... + built mphs[5] for 129300467 kmers; bits/key = 2.56136 + built positions[5] for 129300467 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 61963038 + building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... + built mphs[6] for 61963038 kmers; bits/key = 2.56789 + built positions[6] for 61963038 kmers; bits/key = 13 + lower = 8192; upper = 180205; num_bits_per_pos = 18; num_kmers_in_partition = 61253732 + building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... + built mphs[7] for 61253732 kmers; bits/key = 2.52984 + built positions[7] for 61253732 kmers; bits/key = 18 +=== step 7.2 (build skew index): 309.27 [sec] (13.5843 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 91.4914% +buckets with 2 minimizer positions = 4.74025% +buckets with 3 minimizer positions = 1.38774% +buckets with 4 minimizer positions = 0.653773% +buckets with 5 minimizer positions = 0.38509% +buckets with 6 minimizer positions = 0.252845% +buckets with 7 minimizer positions = 0.177906% +buckets with 8 minimizer positions = 0.131797% +buckets with 9 minimizer positions = 0.101004% +buckets with 10 minimizer positions = 0.0796625% +buckets with 11 minimizer positions = 0.0644186% +buckets with 12 minimizer positions = 0.0530856% +buckets with 13 minimizer positions = 0.0443078% +buckets with 14 minimizer positions = 0.0373937% +buckets with 15 minimizer positions = 0.0321165% +buckets with 16 minimizer positions = 0.0277512% +max_bucket_size = 180205 +=== step 7 (build sparse and skew index): 342.02 [sec] (15.0228 [ns/kmer]) +=== total time: 891.711 [sec] (39.1672 [ns/kmer]) +total index size: 17433076635 [B] -- 17433.1 [MB] +SPACE BREAKDOWN: + mphf: 0.130611 [bits/kmer] (2.8298 [bits/key]) -- 2.13215% + strings_offsets: 0.162621 [bits/kmer] -- 2.65469% + control_codewords: 1.6616 [bits/kmer] -- 27.1246% + mid_load_buckets: 0.568042 [bits/kmer] -- 9.27294% + begin_buckets_of_size: 9.41723e-08 [bits/kmer] -- 1.53731e-06% + strings: 2.36887 [bits/kmer] -- 38.6704% + skew_index: 1.23405 [bits/kmer] -- 20.1452% + weights: 6.46556e-08 [bits/kmer] -- 1.05546e-06% + -------------- + total: 6.1258 [bits/kmer] +2025-11-11 01:34:16: saving data structure to disk... +2025-11-11 01:35:40: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash --canonical +2025-11-11 01:35:41: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max string length = 27681 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 15 +num bits per_string_id = 26 +=== step 1 (encode strings): 26.9107 [sec] (4.54053 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.90.bin'... +=== step 2 (compute minimizer tuples): 10.9174 [sec] (1.84204 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +=== step 3 (merging minimizer tuples): 34.5277 [sec] (5.82571 [ns/kmer]) +num_minimizers = 295344565 +num_minimizer_positions = 485764487 +num_super_kmers = 507036670 +building minimizers MPHF with 64 threads and 99 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 12.7847 [sec] (2.15711 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 16.9935 [sec] (2.86724 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821341953482565.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +=== step 6 (merging minimizers tuples): 66.0656 [sec] (11.147 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 76095635/295344565 (25.765%) +num_buckets_in_skew_index 164193/295344565 (0.0555937%) +max_bucket_size 265182 +log2_max_bucket_size 19 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 218504008/485764487 (44.9815%) +num_minimizer_positions_of_buckets_in_skew_index 48175742/485764487 (9.91751%) +=== step 7.1 (build sparse index): 13.1205 [sec] (2.21377 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 91237805 + partition = 1: num kmers in buckets of size > 128 and <= 256: 81089595 + partition = 2: num kmers in buckets of size > 256 and <= 512: 71244043 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 64999827 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 55340829 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 44026748 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 33883659 + partition = 7: num kmers in buckets of size > 8192 and <= 265182: 85368523 +num kmers in skew index = 527191029 (8.89506%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 91237805 + building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... + built mphs[0] for 91237805 kmers; bits/key = 2.54472 + built positions[0] for 91237805 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 81089595 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[1] for 81089595 kmers; bits/key = 2.56263 + built positions[1] for 81089595 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 71244043 + building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... + built mphs[2] for 71244043 kmers; bits/key = 2.56439 + built positions[2] for 71244043 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 64999827 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[3] for 64999827 kmers; bits/key = 2.54652 + built positions[3] for 64999827 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 55340829 + building MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... + built mphs[4] for 55340829 kmers; bits/key = 2.53877 + built positions[4] for 55340829 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 44026748 + building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... + built mphs[5] for 44026748 kmers; bits/key = 2.53894 + built positions[5] for 44026748 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 33883659 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[6] for 33883659 kmers; bits/key = 2.5671 + built positions[6] for 33883659 kmers; bits/key = 13 + lower = 8192; upper = 265182; num_bits_per_pos = 19; num_kmers_in_partition = 85368523 + building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... + built mphs[7] for 85368523 kmers; bits/key = 2.56049 + built positions[7] for 85368523 kmers; bits/key = 19 +=== step 7.2 (build skew index): 70.7054 [sec] (11.9298 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 74.1794% +buckets with 2 minimizer positions = 17.5493% +buckets with 3 minimizer positions = 4.9171% +buckets with 4 minimizer positions = 1.47166% +buckets with 5 minimizer positions = 0.573611% +buckets with 6 minimizer positions = 0.301038% +buckets with 7 minimizer positions = 0.190827% +buckets with 8 minimizer positions = 0.133018% +buckets with 9 minimizer positions = 0.0984907% +buckets with 10 minimizer positions = 0.0753777% +buckets with 11 minimizer positions = 0.0590937% +buckets with 12 minimizer positions = 0.0475793% +buckets with 13 minimizer positions = 0.0389636% +buckets with 14 minimizer positions = 0.0324661% +buckets with 15 minimizer positions = 0.0273305% +buckets with 16 minimizer positions = 0.0232809% +max_bucket_size = 265182 +=== step 7 (build sparse and skew index): 85.3455 [sec] (14.4 [ns/kmer]) +=== total time: 253.545 [sec] (42.7795 [ns/kmer]) +total index size: 6028576020 [B] -- 6028.58 [MB] +SPACE BREAKDOWN: + mphf: 0.141443 [bits/kmer] (2.83839 [bits/key]) -- 1.73819% + strings_offsets: 0.273643 [bits/kmer] -- 3.36278% + control_codewords: 1.74413 [bits/kmer] -- 21.4335% + mid_load_buckets: 1.25348 [bits/kmer] -- 15.404% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.44549e-06% + strings: 3.2463 [bits/kmer] -- 39.8936% + skew_index: 1.4784 [bits/kmer] -- 18.168% + weights: 2.48364e-07 [bits/kmer] -- 3.05213e-06% + -------------- + total: 8.1374 [bits/kmer] +2025-11-11 01:39:55: saving data structure to disk... +2025-11-11 01:40:22: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash --canonical +2025-11-11 01:40:22: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max string length = 643923 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 20 +num bits per_string_id = 25 +=== step 1 (encode strings): 9.91146 [sec] (4.88814 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 1.42382 [sec] (0.702199 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 9.86037 [sec] (4.86294 [ns/kmer]) +num_minimizers = 86631941 +num_minimizer_positions = 169264838 +num_super_kmers = 176725324 +building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 3.90256 [sec] (1.92467 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821622787195254.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 5.71853 [sec] (2.82027 [ns/kmer]) +=== step 6 (merging minimizers tuples): 13.6475 [sec] (6.73069 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 14311872/86631941 (16.5203%) +num_buckets_in_skew_index 167883/86631941 (0.193789%) +max_bucket_size 475227 +log2_max_bucket_size 19 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 74713236/169264838 (44.1398%) +num_minimizer_positions_of_buckets_in_skew_index 22399416/169264838 (13.2334%) +=== step 7.1 (build sparse index): 4.04228 [sec] (1.99357 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 164308993 + partition = 1: num kmers in buckets of size > 128 and <= 256: 48058096 + partition = 2: num kmers in buckets of size > 256 and <= 512: 13657562 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 6137831 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 4414714 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 4433156 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 4082117 + partition = 7: num kmers in buckets of size > 8192 and <= 475227: 35954358 +num kmers in skew index = 281046827 (13.8607%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 164308993 + building MPHF with 64 threads and 55 partitions (avg. partition size = 3000000)... + built mphs[0] for 164308993 kmers; bits/key = 2.56349 + built positions[0] for 164308993 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 48058096 + building MPHF with 64 threads and 17 partitions (avg. partition size = 3000000)... + built mphs[1] for 48058096 kmers; bits/key = 2.53932 + built positions[1] for 48058096 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13657562 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13657562 kmers; bits/key = 2.61351 + built positions[2] for 13657562 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6137831 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6137831 kmers; bits/key = 2.93085 + built positions[3] for 6137831 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4414714 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4414714 kmers; bits/key = 2.84407 + built positions[4] for 4414714 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 4433156 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 4433156 kmers; bits/key = 2.73731 + built positions[5] for 4433156 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 4082117 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 4082117 kmers; bits/key = 2.9369 + built positions[6] for 4082117 kmers; bits/key = 13.0001 + lower = 8192; upper = 475227; num_bits_per_pos = 19; num_kmers_in_partition = 35954358 + building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... + built mphs[7] for 35954358 kmers; bits/key = 2.55049 + built positions[7] for 35954358 kmers; bits/key = 19 +=== step 7.2 (build skew index): 40.0979 [sec] (19.7755 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 83.2859% +buckets with 2 minimizer positions = 8.38918% +buckets with 3 minimizer positions = 2.77772% +buckets with 4 minimizer positions = 1.31798% +buckets with 5 minimizer positions = 0.776307% +buckets with 6 minimizer positions = 0.518707% +buckets with 7 minimizer positions = 0.374551% +buckets with 8 minimizer positions = 0.285226% +buckets with 9 minimizer positions = 0.226981% +buckets with 10 minimizer positions = 0.183834% +buckets with 11 minimizer positions = 0.15397% +buckets with 12 minimizer positions = 0.131367% +buckets with 13 minimizer positions = 0.113066% +buckets with 14 minimizer positions = 0.0987326% +buckets with 15 minimizer positions = 0.0868144% +buckets with 16 minimizer positions = 0.0771828% +max_bucket_size = 475227 +=== step 7 (build sparse and skew index): 44.663 [sec] (22.0269 [ns/kmer]) +=== total time: 89.1273 [sec] (43.9558 [ns/kmer]) +total index size: 2131440134 [B] -- 2131.44 [MB] +SPACE BREAKDOWN: + mphf: 0.120785 [bits/kmer] (2.82702 [bits/key]) -- 1.43629% + strings_offsets: 0.291878 [bits/kmer] -- 3.47083% + control_codewords: 1.40993 [bits/kmer] -- 16.766% + mid_load_buckets: 1.17911 [bits/kmer] -- 14.0212% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.25737e-05% + strings: 3.43556 [bits/kmer] -- 40.8534% + skew_index: 1.97221 [bits/kmer] -- 23.4523% + weights: 7.25961e-07 [bits/kmer] -- 8.63266e-06% + -------------- + total: 8.40947 [bits/kmer] +2025-11-11 01:41:51: saving data structure to disk... +2025-11-11 01:42:01: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash --canonical +2025-11-11 01:42:01: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max string length = 499189 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 19 +num bits per_string_id = 24 +=== step 1 (encode strings): 7.22427 [sec] (4.73753 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 1.07091 [sec] (0.70228 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 7.38742 [sec] (4.84451 [ns/kmer]) +num_minimizers = 69577229 +num_minimizer_positions = 126350163 +num_super_kmers = 131966527 +building minimizers MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 3.13744 [sec] (2.05746 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821721801375994.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 4.26333 [sec] (2.7958 [ns/kmer]) +=== step 6 (merging minimizers tuples): 9.98883 [sec] (6.55046 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 12190335/69577229 (17.5206%) +num_buckets_in_skew_index 86973/69577229 (0.125002%) +max_bucket_size 245177 +log2_max_bucket_size 18 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 57511599/126350163 (45.5176%) +num_minimizer_positions_of_buckets_in_skew_index 11538643/126350163 (9.13227%) +=== step 7.1 (build sparse index): 3.09279 [sec] (2.02819 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 77399356 + partition = 1: num kmers in buckets of size > 128 and <= 256: 26776297 + partition = 2: num kmers in buckets of size > 256 and <= 512: 13974034 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 6504754 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 3263868 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 2527517 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 2420664 + partition = 7: num kmers in buckets of size > 8192 and <= 245177: 10756294 +num kmers in skew index = 143622784 (9.41848%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 77399356 + building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... + built mphs[0] for 77399356 kmers; bits/key = 2.54863 + built positions[0] for 77399356 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26776297 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[1] for 26776297 kmers; bits/key = 2.54559 + built positions[1] for 26776297 kmers; bits/key = 8.00001 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13974034 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[2] for 13974034 kmers; bits/key = 2.56375 + built positions[2] for 13974034 kmers; bits/key = 9.00003 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6504754 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[3] for 6504754 kmers; bits/key = 2.78902 + built positions[3] for 6504754 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 3263868 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 3263868 kmers; bits/key = 3.30619 + built positions[4] for 3263868 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2527517 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2527517)... + built mphs[5] for 2527517 kmers; bits/key = 2.55992 + built positions[5] for 2527517 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2420664 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2420664)... + built mphs[6] for 2420664 kmers; bits/key = 2.55997 + built positions[6] for 2420664 kmers; bits/key = 13.0001 + lower = 8192; upper = 245177; num_bits_per_pos = 18; num_kmers_in_partition = 10756294 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[7] for 10756294 kmers; bits/key = 2.64819 + built positions[7] for 10756294 kmers; bits/key = 18 +=== step 7.2 (build skew index): 21.4493 [sec] (14.066 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 82.3544% +buckets with 2 minimizer positions = 9.17598% +buckets with 3 minimizer positions = 3.08546% +buckets with 4 minimizer positions = 1.44294% +buckets with 5 minimizer positions = 0.830594% +buckets with 6 minimizer positions = 0.537643% +buckets with 7 minimizer positions = 0.377841% +buckets with 8 minimizer positions = 0.278926% +buckets with 9 minimizer positions = 0.215933% +buckets with 10 minimizer positions = 0.171191% +buckets with 11 minimizer positions = 0.139152% +buckets with 12 minimizer positions = 0.116435% +buckets with 13 minimizer positions = 0.0976368% +buckets with 14 minimizer positions = 0.0839542% +buckets with 15 minimizer positions = 0.0727882% +buckets with 16 minimizer positions = 0.064557% +max_bucket_size = 245177 +=== step 7 (build sparse and skew index): 24.9281 [sec] (16.3473 [ns/kmer]) +=== total time: 58.0003 [sec] (38.0354 [ns/kmer]) +total index size: 1481048960 [B] -- 1481.05 [MB] +SPACE BREAKDOWN: + mphf: 0.132337 [bits/kmer] (2.9004 [bits/key]) -- 1.7032% + strings_offsets: 0.274587 [bits/kmer] -- 3.53397% + control_codewords: 1.5057 [bits/kmer] -- 19.3786% + mid_load_buckets: 1.20688 [bits/kmer] -- 15.5327% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.80953e-05% + strings: 3.35283 [bits/kmer] -- 43.1513% + skew_index: 1.2976 [bits/kmer] -- 16.7002% + weights: 9.65307e-07 [bits/kmer] -- 1.24236e-05% + -------------- + total: 7.76993 [bits/kmer] +2025-11-11 01:42:59: saving data structure to disk... +2025-11-11 01:43:06: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash --canonical +2025-11-11 01:43:06: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz'... +read 800231 sequences, 462130202 bases, 412515880 kmers +num_kmers 412515880 +cost: 2.0 + 0.240545 [bits/kmer] +max string length = 490374 +num bits per_absolute_offset = 29 +num bits per_relative_offset = 19 +num bits per_string_id = 20 +=== step 1 (encode strings): 1.1174 [sec] (2.70873 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.476091 [sec] (1.15412 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.bin' +=== step 3 (merging minimizer tuples): 1.40412 [sec] (3.40378 [ns/kmer]) +num_minimizers = 21966429 +num_minimizer_positions = 25033260 +num_super_kmers = 26367160 +building minimizers MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 1.25021 [sec] (3.0307 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821786607159693.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 1.00235 [sec] (2.42985 [ns/kmer]) +=== step 6 (merging minimizers tuples): 1.83305 [sec] (4.44357 [ns/kmer]) +num_bits_per_offset = 29 +num_buckets_larger_than_1_not_in_skew_index 1786727/21966429 (8.1339%) +num_buckets_in_skew_index 26/21966429 (0.000118362%) +max_bucket_size 442 +log2_max_bucket_size 9 +num_partitions in skew index 3 +num_minimizer_positions_of_buckets_larger_than_1 4850053/25033260 (19.3744%) +num_minimizer_positions_of_buckets_in_skew_index 3531/25033260 (0.0141052%) +=== step 7.1 (build sparse index): 0.430283 [sec] (1.04307 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 26291 + partition = 1: num kmers in buckets of size > 128 and <= 256: 10791 + partition = 2: num kmers in buckets of size > 256 and <= 442: 19798 +num kmers in skew index = 56880 (0.0137886%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26291 + building MPHF with 64 threads and 1 partitions (avg. partition size = 26291)... + built mphs[0] for 26291 kmers; bits/key = 2.35214 + built positions[0] for 26291 kmers; bits/key = 7.0132 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10791 + building MPHF with 64 threads and 1 partitions (avg. partition size = 10791)... + built mphs[1] for 10791 kmers; bits/key = 2.61255 + built positions[1] for 10791 kmers; bits/key = 8.0304 + lower = 256; upper = 442; num_bits_per_pos = 9; num_kmers_in_partition = 19798 + building MPHF with 64 threads and 1 partitions (avg. partition size = 19798)... + built mphs[2] for 19798 kmers; bits/key = 2.5247 + built positions[2] for 19798 kmers; bits/key = 9.01909 +=== step 7.2 (build skew index): 0.052647 [sec] (0.127624 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 91.866% +buckets with 2 minimizer positions = 5.49617% +buckets with 3 minimizer positions = 1.46125% +buckets with 4 minimizer positions = 0.538881% +buckets with 5 minimizer positions = 0.252859% +buckets with 6 minimizer positions = 0.135052% +buckets with 7 minimizer positions = 0.0790661% +buckets with 8 minimizer positions = 0.0489884% +buckets with 9 minimizer positions = 0.031712% +buckets with 10 minimizer positions = 0.0217832% +buckets with 11 minimizer positions = 0.0157968% +buckets with 12 minimizer positions = 0.0113628% +buckets with 13 minimizer positions = 0.00857672% +buckets with 14 minimizer positions = 0.00628231% +buckets with 15 minimizer positions = 0.00510779% +buckets with 16 minimizer positions = 0.00396969% +max_bucket_size = 442 +=== step 7 (build sparse and skew index): 0.554804 [sec] (1.34493 [ns/kmer]) +=== total time: 7.63802 [sec] (18.5157 [ns/kmer]) +total index size: 229841550 [B] -- 229.842 [MB] +SPACE BREAKDOWN: + mphf: 0.157467 [bits/kmer] (2.95713 [bits/key]) -- 3.53273% + strings_offsets: 0.119202 [bits/kmer] -- 2.67427% + control_codewords: 1.5975 [bits/kmer] -- 35.8395% + mid_load_buckets: 0.340961 [bits/kmer] -- 7.64939% + begin_buckets_of_size: 5.19738e-06 [bits/kmer] -- 0.000116602% + strings: 2.24055 [bits/kmer] -- 50.2662% + skew_index: 0.00167864 [bits/kmer] -- 0.0376599% + weights: 3.56835e-06 [bits/kmer] -- 8.00552e-05% + -------------- + total: 4.45736 [bits/kmer] +2025-11-11 01:43:14: saving data structure to disk... +2025-11-11 01:43:15: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash --canonical +2025-11-11 01:43:15: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz'... +read 1000000 sequences, 508802169 bases, 446802169 kmers +read 2000000 sequences, 1018081275 bases, 894081275 kmers +read 3000000 sequences, 1530401896 bases, 1344401896 kmers +read 4000000 sequences, 2055069016 bases, 1807069016 kmers +read 5000000 sequences, 2593224248 bases, 2283224248 kmers +read 6000000 sequences, 3139549385 bases, 2767549385 kmers +read 7000000 sequences, 3701263851 bases, 3267263851 kmers +read 8000000 sequences, 4283309251 bases, 3787309251 kmers +read 9000000 sequences, 4887570899 bases, 4329570899 kmers +read 10000000 sequences, 5529157849 bases, 4909157849 kmers +read 11000000 sequences, 6209792203 bases, 5527792203 kmers +read 12000000 sequences, 6962139753 bases, 6218139753 kmers +read 13000000 sequences, 7835035276 bases, 7029035276 kmers +read 14000000 sequences, 8978632454 bases, 8110632454 kmers +read 15000000 sequences, 11212240633 bases, 10282240633 kmers +read 16000000 sequences, 11682448788 bases, 10690448788 kmers +read 17000000 sequences, 12155568466 bases, 11101568466 kmers +read 18000000 sequences, 12632855540 bases, 11516855540 kmers +read 19000000 sequences, 13118014015 bases, 11940014015 kmers +read 20000000 sequences, 13600052606 bases, 12360052606 kmers +read 21000000 sequences, 14089576602 bases, 12787576602 kmers +read 22000000 sequences, 14580292633 bases, 13216292633 kmers +read 23000000 sequences, 15076414826 bases, 13650414826 kmers +read 23030730 sequences, 15091515601 bases, 13663610341 kmers +num_kmers 13663610341 +cost: 2.0 + 0.209008 [bits/kmer] +max string length = 980757 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 20 +num bits per_string_id = 25 +=== step 1 (encode strings): 35.6447 [sec] (2.60873 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.155.bin'... +=== step 2 (compute minimizer tuples): 12.4326 [sec] (0.909903 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +=== step 3 (merging minimizer tuples): 61.1245 [sec] (4.47353 [ns/kmer]) +num_minimizers = 756254336 +num_minimizer_positions = 865984712 +num_super_kmers = 912355628 +building minimizers MPHF with 64 threads and 253 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 56.6614 [sec] (4.14688 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 29.9356 [sec] (2.1909 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762821795536487276.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +=== step 6 (merging minimizers tuples): 124.814 [sec] (9.13478 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 57738877/756254336 (7.63485%) +num_buckets_in_skew_index 33571/756254336 (0.00443912%) +max_bucket_size 102709 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 162929131/865984712 (18.8143%) +num_minimizer_positions_of_buckets_in_skew_index 4573693/865984712 (0.528149%) +=== step 7.1 (build sparse index): 14.7131 [sec] (1.07681 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 31990844 + partition = 1: num kmers in buckets of size > 128 and <= 256: 17895678 + partition = 2: num kmers in buckets of size > 256 and <= 512: 8738611 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 3891800 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1940263 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 1017382 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 1038043 + partition = 7: num kmers in buckets of size > 8192 and <= 102709: 1724288 +num kmers in skew index = 68236909 (0.499406%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 31990844 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[0] for 31990844 kmers; bits/key = 2.53354 + built positions[0] for 31990844 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 17895678 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 17895678 kmers; bits/key = 2.5722 + built positions[1] for 17895678 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8738611 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 8738611 kmers; bits/key = 2.62382 + built positions[2] for 8738611 kmers; bits/key = 9.00004 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3891800 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3891800 kmers; bits/key = 2.95004 + built positions[3] for 3891800 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1940263 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1940263)... + built mphs[4] for 1940263 kmers; bits/key = 2.56017 + built positions[4] for 1940263 kmers; bits/key = 11.0002 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1017382 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1017382)... + built mphs[5] for 1017382 kmers; bits/key = 2.56121 + built positions[5] for 1017382 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1038043 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1038043)... + built mphs[6] for 1038043 kmers; bits/key = 2.56105 + built positions[6] for 1038043 kmers; bits/key = 13.0003 + lower = 8192; upper = 102709; num_bits_per_pos = 17; num_kmers_in_partition = 1724288 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1724288)... + built mphs[7] for 1724288 kmers; bits/key = 2.56031 + built positions[7] for 1724288 kmers; bits/key = 17.0002 +=== step 7.2 (build skew index): 12.2051 [sec] (0.893255 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 92.3607% +buckets with 2 minimizer positions = 5.15375% +buckets with 3 minimizer positions = 1.32523% +buckets with 4 minimizer positions = 0.506715% +buckets with 5 minimizer positions = 0.246927% +buckets with 6 minimizer positions = 0.133097% +buckets with 7 minimizer positions = 0.0770936% +buckets with 8 minimizer positions = 0.0472016% +buckets with 9 minimizer positions = 0.0306497% +buckets with 10 minimizer positions = 0.02095% +buckets with 11 minimizer positions = 0.0151124% +buckets with 12 minimizer positions = 0.0112313% +buckets with 13 minimizer positions = 0.00871651% +buckets with 14 minimizer positions = 0.00703467% +buckets with 15 minimizer positions = 0.00577491% +buckets with 16 minimizer positions = 0.00485895% +max_bucket_size = 102709 +=== step 7 (build sparse and skew index): 28.9912 [sec] (2.12178 [ns/kmer]) +=== total time: 349.604 [sec] (25.5865 [ns/kmer]) +total index size: 8386935913 [B] -- 8386.94 [MB] +SPACE BREAKDOWN: + mphf: 0.156651 [bits/kmer] (2.83029 [bits/key]) -- 3.19011% + strings_offsets: 0.136923 [bits/kmer] -- 2.78836% + control_codewords: 1.93718 [bits/kmer] -- 39.4496% + mid_load_buckets: 0.405427 [bits/kmer] -- 8.25628% + begin_buckets_of_size: 1.56913e-07 [bits/kmer] -- 3.19545e-06% + strings: 2.20901 [bits/kmer] -- 44.9852% + skew_index: 0.0653321 [bits/kmer] -- 1.33045% + weights: 1.07731e-07 [bits/kmer] -- 2.19389e-06% + -------------- + total: 4.91052 [bits/kmer] +2025-11-11 01:49:05: saving data structure to disk... +2025-11-11 01:49:41: DONE diff --git a/benchmarks/results-10-11-25/k63/canon-build.time.log b/benchmarks/results-10-11-25/k63/canon-build.time.log new file mode 100644 index 0000000..c29e6cb --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-build.time.log @@ -0,0 +1,207 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash --canonical" + User time (seconds): 29.79 + System time (seconds): 6.14 + Percent of CPU this job got: 209% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:17.14 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1825648 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1509711 + Voluntary context switches: 30933 + Involuntary context switches: 7278 + Swaps: 0 + File system inputs: 40 + File system outputs: 5542200 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash --canonical" + User time (seconds): 51.21 + System time (seconds): 9.99 + Percent of CPU this job got: 271% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:22.51 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3949252 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2478129 + Voluntary context switches: 28610 + Involuntary context switches: 7175 + Swaps: 0 + File system inputs: 16 + File system outputs: 11324232 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash --canonical" + User time (seconds): 219.20 + System time (seconds): 28.68 + Percent of CPU this job got: 318% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:17.85 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9329796 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 8203903 + Voluntary context switches: 33276 + Involuntary context switches: 9537 + Swaps: 0 + File system inputs: 96 + File system outputs: 28147704 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.canon.sshash --canonical" + User time (seconds): 2743.71 + System time (seconds): 426.47 + Percent of CPU this job got: 324% + Elapsed (wall clock) time (h:mm:ss or m:ss): 16:17.22 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 65191296 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 59691404 + Voluntary context switches: 693079 + Involuntary context switches: 39249 + Swaps: 0 + File system inputs: 1816 + File system outputs: 288401280 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash --canonical" + User time (seconds): 711.43 + System time (seconds): 83.04 + Percent of CPU this job got: 282% + Elapsed (wall clock) time (h:mm:ss or m:ss): 4:40.83 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 21211816 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 21682332 + Voluntary context switches: 105268 + Involuntary context switches: 14569 + Swaps: 0 + File system inputs: 680 + File system outputs: 93530032 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.canon.sshash --canonical" + User time (seconds): 293.44 + System time (seconds): 42.07 + Percent of CPU this job got: 338% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:39.01 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 17326080 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 11325424 + Voluntary context switches: 31588 + Involuntary context switches: 9801 + Swaps: 0 + File system inputs: 168 + File system outputs: 25868144 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash --canonical" + User time (seconds): 165.11 + System time (seconds): 21.03 + Percent of CPU this job got: 287% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:04.80 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9888600 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6330149 + Voluntary context switches: 28543 + Involuntary context switches: 8381 + Swaps: 0 + File system inputs: 120 + File system outputs: 19280272 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash --canonical" + User time (seconds): 15.98 + System time (seconds): 4.27 + Percent of CPU this job got: 227% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:08.92 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1359956 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 898110 + Voluntary context switches: 29814 + Involuntary context switches: 6043 + Swaps: 0 + File system inputs: 32 + File system outputs: 4013544 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.canon.sshash --canonical" + User time (seconds): 820.66 + System time (seconds): 120.42 + Percent of CPU this job got: 243% + Elapsed (wall clock) time (h:mm:ss or m:ss): 6:26.56 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 30151716 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 25651988 + Voluntary context switches: 310229 + Involuntary context switches: 19290 + Swaps: 0 + File system inputs: 584 + File system outputs: 171442344 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-10-11-25/k63/regular-build.json b/benchmarks/results-10-11-25/k63/regular-build.json new file mode 100644 index 0000000..53b0261 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-build.json @@ -0,0 +1,9 @@ +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz", "k": "63", "m": "24", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1550501", "step 2 (compute minimizer tuples)": "341181", "step 3 (merging minimizer tuples)": "1481165", "step 4 (build mphf)": "1324126", "step 5 (replacing minimizer values with MPHF hashes)": "1072533", "step 6 (merging minimizers tuples)": "1907390", "step 7.1 (build sparse index)": "374789", "step 7.2 (build skew index)": "4746187", "step 7 (build sparse and skew index)": "5188720", "total_build_time_in_microsec": "12865616", "index_size_in_bytes": "308878216", "num_kmers": "556585658"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz", "k": "63", "m": "24", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "2834930", "step 2 (compute minimizer tuples)": "499707", "step 3 (merging minimizer tuples)": "2823341", "step 4 (build mphf)": "2465617", "step 5 (replacing minimizer values with MPHF hashes)": "2044225", "step 6 (merging minimizers tuples)": "4062124", "step 7.1 (build sparse index)": "453285", "step 7.2 (build skew index)": "710322", "step 7 (build sparse and skew index)": "1277284", "total_build_time_in_microsec": "16007228", "index_size_in_bytes": "551471063", "num_kmers": "1155250667"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "7287587", "step 2 (compute minimizer tuples)": "1032319", "step 3 (merging minimizer tuples)": "7045959", "step 4 (build mphf)": "4760749", "step 5 (replacing minimizer values with MPHF hashes)": "4838910", "step 6 (merging minimizers tuples)": "10719832", "step 7.1 (build sparse index)": "1615531", "step 7.2 (build skew index)": "17332459", "step 7 (build sparse and skew index)": "19253047", "total_build_time_in_microsec": "54938403", "index_size_in_bytes": "1647878160", "num_kmers": "2771316093"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "70905506", "step 2 (compute minimizer tuples)": "8815426", "step 3 (merging minimizer tuples)": "82707396", "step 4 (build mphf)": "32525569", "step 5 (replacing minimizer values with MPHF hashes)": "37310602", "step 6 (merging minimizers tuples)": "169296218", "step 7.1 (build sparse index)": "21324927", "step 7.2 (build skew index)": "242979594", "step 7 (build sparse and skew index)": "267119303", "total_build_time_in_microsec": "668680020", "index_size_in_bytes": "15531396563", "num_kmers": "22766770240"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "27817896", "step 2 (compute minimizer tuples)": "6626512", "step 3 (merging minimizer tuples)": "22501102", "step 4 (build mphf)": "11049447", "step 5 (replacing minimizer values with MPHF hashes)": "13554157", "step 6 (merging minimizers tuples)": "49497804", "step 7.1 (build sparse index)": "9032404", "step 7.2 (build skew index)": "59270230", "step 7 (build sparse and skew index)": "69359825", "total_build_time_in_microsec": "200406743", "index_size_in_bytes": "5431161974", "num_kmers": "5926785469"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "10327733", "step 2 (compute minimizer tuples)": "979513", "step 3 (merging minimizer tuples)": "7740073", "step 4 (build mphf)": "3334139", "step 5 (replacing minimizer values with MPHF hashes)": "4471903", "step 6 (merging minimizers tuples)": "10551280", "step 7.1 (build sparse index)": "3218494", "step 7.2 (build skew index)": "19651337", "step 7 (build sparse and skew index)": "23244662", "total_build_time_in_microsec": "60649303", "index_size_in_bytes": "1824281560", "num_kmers": "2027656011"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz", "k": "63", "m": "31", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "7858559", "step 2 (compute minimizer tuples)": "764585", "step 3 (merging minimizer tuples)": "5748183", "step 4 (build mphf)": "2753717", "step 5 (replacing minimizer values with MPHF hashes)": "3392272", "step 6 (merging minimizers tuples)": "7612061", "step 7.1 (build sparse index)": "2395701", "step 7.2 (build skew index)": "13405634", "step 7 (build sparse and skew index)": "16076369", "total_build_time_in_microsec": "44205746", "index_size_in_bytes": "1294767218", "num_kmers": "1524904156"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz", "k": "63", "m": "23", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "1176209", "step 2 (compute minimizer tuples)": "321286", "step 3 (merging minimizer tuples)": "1068420", "step 4 (build mphf)": "1067419", "step 5 (replacing minimizer values with MPHF hashes)": "755179", "step 6 (merging minimizers tuples)": "1127851", "step 7.1 (build sparse index)": "273848", "step 7.2 (build skew index)": "39049", "step 7 (build sparse and skew index)": "363897", "total_build_time_in_microsec": "5880261", "index_size_in_bytes": "209086404", "num_kmers": "412515880"} +{"input_filename": "/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz", "k": "63", "m": "25", "canonical": "false", "seed": "1", "num_threads": "64", "step 1 (encode strings)": "38001608", "step 2 (compute minimizer tuples)": "7701882", "step 3 (merging minimizer tuples)": "77158661", "step 4 (build mphf)": "23107746", "step 5 (replacing minimizer values with MPHF hashes)": "23805657", "step 6 (merging minimizers tuples)": "73107007", "step 7.1 (build sparse index)": "9974866", "step 7.2 (build skew index)": "8571477", "step 7 (build sparse and skew index)": "20088686", "total_build_time_in_microsec": "262971247", "index_size_in_bytes": "7528610111", "num_kmers": "13663610341"} diff --git a/benchmarks/results-10-11-25/k63/regular-build.log b/benchmarks/results-10-11-25/k63/regular-build.log new file mode 100644 index 0000000..bb53aa5 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-build.log @@ -0,0 +1,1975 @@ +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash +2025-11-11 00:52:41: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +cost: 2.0 + 0.212662 [bits/kmer] +max string length = 46783 +num bits per_absolute_offset = 30 +num bits per_relative_offset = 16 +num bits per_string_id = 20 +=== step 1 (encode strings): 1.5505 [sec] (2.78574 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.341181 [sec] (0.612989 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.bin' +=== step 3 (merging minimizer tuples): 1.48117 [sec] (2.66116 [ns/kmer]) +num_minimizers = 24306363 +num_minimizer_positions = 28148872 +num_super_kmers = 28148872 +building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 1.32413 [sec] (2.37902 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818761289542632.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 1.07253 [sec] (1.92699 [ns/kmer]) +=== step 6 (merging minimizers tuples): 1.90739 [sec] (3.42695 [ns/kmer]) +num_bits_per_offset = 30 +num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) +num_buckets_in_skew_index 3271/24306363 (0.0134574%) +max_bucket_size 414759 +log2_max_bucket_size 19 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) +num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) +=== step 7.1 (build sparse index): 0.374789 [sec] (0.673372 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 3558021 + partition = 1: num kmers in buckets of size > 128 and <= 256: 2129998 + partition = 2: num kmers in buckets of size > 256 and <= 512: 1247229 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 1130328 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 1022110 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 790746 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 666283 + partition = 7: num kmers in buckets of size > 8192 and <= 414759: 3762004 +num kmers in skew index = 14306719 (2.57044%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[0] for 3558021 kmers; bits/key = 3.06724 + built positions[0] for 3558021 kmers; bits/key = 7.0001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... + built mphs[1] for 2129998 kmers; bits/key = 2.56007 + built positions[1] for 2129998 kmers; bits/key = 8.00016 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... + built mphs[2] for 1247229 kmers; bits/key = 2.56071 + built positions[2] for 1247229 kmers; bits/key = 9.00028 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... + built mphs[3] for 1130328 kmers; bits/key = 2.56088 + built positions[3] for 1130328 kmers; bits/key = 10.0003 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... + built mphs[4] for 1022110 kmers; bits/key = 2.41826 + built positions[4] for 1022110 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 + building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... + built mphs[5] for 790746 kmers; bits/key = 2.4189 + built positions[5] for 790746 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 + building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... + built mphs[6] for 666283 kmers; bits/key = 2.5622 + built positions[6] for 666283 kmers; bits/key = 13.0005 + lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[7] for 3762004 kmers; bits/key = 2.9235 + built positions[7] for 3762004 kmers; bits/key = 19.0001 +=== step 7.2 (build skew index): 4.74619 [sec] (8.52733 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 96.0459% +buckets with 2 minimizer positions = 2.25565% +buckets with 3 minimizer positions = 0.699874% +buckets with 4 minimizer positions = 0.315284% +buckets with 5 minimizer positions = 0.173597% +buckets with 6 minimizer positions = 0.108305% +buckets with 7 minimizer positions = 0.0716932% +buckets with 8 minimizer positions = 0.0520522% +buckets with 9 minimizer positions = 0.0388458% +buckets with 10 minimizer positions = 0.0301485% +buckets with 11 minimizer positions = 0.0240019% +buckets with 12 minimizer positions = 0.0204144% +buckets with 13 minimizer positions = 0.0165265% +buckets with 14 minimizer positions = 0.013984% +buckets with 15 minimizer positions = 0.0120051% +buckets with 16 minimizer positions = 0.00972996% +max_bucket_size = 414759 +=== step 7 (build sparse and skew index): 5.18872 [sec] (9.32241 [ns/kmer]) +=== total time: 12.8656 [sec] (23.1152 [ns/kmer]) +total index size: 308878216 [B] -- 308.878 [MB] +SPACE BREAKDOWN: + mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.93534% + strings_offsets: 0.115799 [bits/kmer] -- 2.60831% + control_codewords: 1.35379 [bits/kmer] -- 30.4933% + mid_load_buckets: 0.196907 [bits/kmer] -- 4.43522% + begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.67656e-05% + strings: 2.21266 [bits/kmer] -- 49.8391% + skew_index: 0.430136 [bits/kmer] -- 9.68858% + weights: 2.6447e-06 [bits/kmer] -- 5.95704e-05% + -------------- + total: 4.43961 [bits/kmer] +2025-11-11 00:52:54: saving data structure to disk... +2025-11-11 00:52:55: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash +2025-11-11 00:52:55: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +cost: 2.0 + 0.0167212 [bits/kmer] +max string length = 261876 +num bits per_absolute_offset = 31 +num bits per_relative_offset = 18 +num bits per_string_id = 18 +=== step 1 (encode strings): 2.83493 [sec] (2.45395 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.499707 [sec] (0.432553 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.bin' +=== step 3 (merging minimizer tuples): 2.82334 [sec] (2.44392 [ns/kmer]) +num_minimizers = 55464592 +num_minimizer_positions = 56006004 +num_super_kmers = 56006004 +building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.46562 [sec] (2.13427 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818775616846859.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 2.04422 [sec] (1.76951 [ns/kmer]) +=== step 6 (merging minimizers tuples): 4.06212 [sec] (3.51623 [ns/kmer]) +num_bits_per_offset = 31 +num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) +num_buckets_in_skew_index 490/55464592 (0.000883447%) +max_bucket_size 794 +log2_max_bucket_size 10 +num_partitions in skew index 4 +num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) +num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) +=== step 7.1 (build sparse index): 0.453285 [sec] (0.392369 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 604884 + partition = 1: num kmers in buckets of size > 128 and <= 256: 417805 + partition = 2: num kmers in buckets of size > 256 and <= 512: 221219 + partition = 3: num kmers in buckets of size > 512 and <= 794: 50229 +num kmers in skew index = 1294137 (0.112022%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 + building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... + built mphs[0] for 604884 kmers; bits/key = 2.41964 + built positions[0] for 604884 kmers; bits/key = 7.00061 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 + building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... + built mphs[1] for 417805 kmers; bits/key = 2.42142 + built positions[1] for 417805 kmers; bits/key = 8.00082 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 + building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... + built mphs[2] for 221219 kmers; bits/key = 2.42569 + built positions[2] for 221219 kmers; bits/key = 9.00147 + lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 + building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... + built mphs[3] for 50229 kmers; bits/key = 2.45946 + built positions[3] for 50229 kmers; bits/key = 10.0073 +=== step 7.2 (build skew index): 0.710322 [sec] (0.614864 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 99.6239% +buckets with 2 minimizer positions = 0.253291% +buckets with 3 minimizer positions = 0.0530717% +buckets with 4 minimizer positions = 0.0227569% +buckets with 5 minimizer positions = 0.012325% +buckets with 6 minimizer positions = 0.00748405% +buckets with 7 minimizer positions = 0.00509695% +buckets with 8 minimizer positions = 0.00359148% +buckets with 9 minimizer positions = 0.00270803% +buckets with 10 minimizer positions = 0.0021383% +buckets with 11 minimizer positions = 0.00159201% +buckets with 12 minimizer positions = 0.00125666% +buckets with 13 minimizer positions = 0.00109619% +buckets with 14 minimizer positions = 0.000941141% +buckets with 15 minimizer positions = 0.000795102% +buckets with 16 minimizer positions = 0.000685122% +max_bucket_size = 794 +=== step 7 (build sparse and skew index): 1.27728 [sec] (1.10563 [ns/kmer]) +=== total time: 16.0072 [sec] (13.8561 [ns/kmer]) +total index size: 551471063 [B] -- 551.471 [MB] +SPACE BREAKDOWN: + mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.62483% + strings_offsets: 0.0958242 [bits/kmer] -- 2.50922% + control_codewords: 1.53635 [bits/kmer] -- 40.2303% + mid_load_buckets: 0.0184383 [bits/kmer] -- 0.482819% + begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.85973e-05% + strings: 2.01672 [bits/kmer] -- 52.8092% + skew_index: 0.0131204 [bits/kmer] -- 0.343567% + weights: 1.27418e-06 [bits/kmer] -- 3.33653e-05% + -------------- + total: 3.81888 [bits/kmer] +2025-11-11 00:53:11: saving data structure to disk... +2025-11-11 00:53:13: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash +2025-11-11 00:53:14: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +read 1000000 sequences, 1159508892 bases, 1097508892 kmers +read 2000000 sequences, 2171598594 bases, 2047598594 kmers +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +cost: 2.0 + 0.118255 [bits/kmer] +max string length = 124282 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 17 +num bits per_string_id = 22 +=== step 1 (encode strings): 7.28759 [sec] (2.62965 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 1.03232 [sec] (0.372501 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 7.04596 [sec] (2.54246 [ns/kmer]) +num_minimizers = 122838669 +num_minimizer_positions = 140756047 +num_super_kmers = 140756047 +building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 4.76075 [sec] (1.71787 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818794035679118.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 4.83891 [sec] (1.74607 [ns/kmer]) +=== step 6 (merging minimizers tuples): 10.7198 [sec] (3.86814 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) +num_buckets_in_skew_index 28203/122838669 (0.0229594%) +max_bucket_size 147936 +log2_max_bucket_size 18 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) +num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) +=== step 7.1 (build sparse index): 1.61553 [sec] (0.582947 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 25196923 + partition = 1: num kmers in buckets of size > 128 and <= 256: 21919654 + partition = 2: num kmers in buckets of size > 256 and <= 512: 19634878 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 18051454 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 17018125 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 14085569 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 9296403 + partition = 7: num kmers in buckets of size > 8192 and <= 147936: 20255122 +num kmers in skew index = 145458128 (5.2487%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 + building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... + built mphs[0] for 25196923 kmers; bits/key = 2.56001 + built positions[0] for 25196923 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 + building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... + built mphs[1] for 21919654 kmers; bits/key = 2.60671 + built positions[1] for 21919654 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[2] for 19634878 kmers; bits/key = 2.55594 + built positions[2] for 19634878 kmers; bits/key = 9.00002 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[3] for 18051454 kmers; bits/key = 2.60116 + built positions[3] for 18051454 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[4] for 17018125 kmers; bits/key = 2.58264 + built positions[4] for 17018125 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 + building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... + built mphs[5] for 14085569 kmers; bits/key = 2.54674 + built positions[5] for 14085569 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[6] for 9296403 kmers; bits/key = 2.72206 + built positions[6] for 9296403 kmers; bits/key = 13 + lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[7] for 20255122 kmers; bits/key = 2.57505 + built positions[7] for 20255122 kmers; bits/key = 18 +=== step 7.2 (build skew index): 17.3325 [sec] (6.25423 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 97.4557% +buckets with 2 minimizer positions = 1.46862% +buckets with 3 minimizer positions = 0.405135% +buckets with 4 minimizer positions = 0.185188% +buckets with 5 minimizer positions = 0.10523% +buckets with 6 minimizer positions = 0.0680771% +buckets with 7 minimizer positions = 0.0480598% +buckets with 8 minimizer positions = 0.0352926% +buckets with 9 minimizer positions = 0.0271502% +buckets with 10 minimizer positions = 0.0217871% +buckets with 11 minimizer positions = 0.0176866% +buckets with 12 minimizer positions = 0.014607% +buckets with 13 minimizer positions = 0.0121411% +buckets with 14 minimizer positions = 0.0105985% +buckets with 15 minimizer positions = 0.00909811% +buckets with 16 minimizer positions = 0.00794457% +max_bucket_size = 147936 +=== step 7 (build sparse and skew index): 19.253 [sec] (6.94726 [ns/kmer]) +=== total time: 54.9384 [sec] (19.8239 [ns/kmer]) +total index size: 1647878160 [B] -- 1647.88 [MB] +SPACE BREAKDOWN: + mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.63218% + strings_offsets: 0.11255 [bits/kmer] -- 2.36601% + control_codewords: 1.46273 [bits/kmer] -- 30.7492% + mid_load_buckets: 0.146928 [bits/kmer] -- 3.08869% + begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.62633e-05% + strings: 2.11826 [bits/kmer] -- 44.5296% + skew_index: 0.791283 [bits/kmer] -- 16.6342% + weights: 5.31156e-07 [bits/kmer] -- 1.11659e-05% + -------------- + total: 4.75695 [bits/kmer] +2025-11-11 00:54:08: saving data structure to disk... +2025-11-11 00:54:15: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash +2025-11-11 00:54:16: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz'... +read 1000000 sequences, 367776209 bases, 305776209 kmers +read 2000000 sequences, 737985819 bases, 613985819 kmers +read 3000000 sequences, 1110904173 bases, 924904173 kmers +read 4000000 sequences, 1483811415 bases, 1235811415 kmers +read 5000000 sequences, 1859655851 bases, 1549655851 kmers +read 6000000 sequences, 2238082976 bases, 1866082976 kmers +read 7000000 sequences, 2618741364 bases, 2184741364 kmers +read 8000000 sequences, 3003367751 bases, 2507367751 kmers +read 9000000 sequences, 3393382254 bases, 2835382254 kmers +read 10000000 sequences, 3787981427 bases, 3167981427 kmers +read 11000000 sequences, 4184097126 bases, 3502097126 kmers +read 12000000 sequences, 4584570246 bases, 3840570246 kmers +read 13000000 sequences, 4992446542 bases, 4186446542 kmers +read 14000000 sequences, 5404831631 bases, 4536831631 kmers +read 15000000 sequences, 5823371753 bases, 4893371753 kmers +read 16000000 sequences, 6248734465 bases, 5256734465 kmers +read 17000000 sequences, 6682521466 bases, 5628521466 kmers +read 18000000 sequences, 7124787217 bases, 6008787217 kmers +read 19000000 sequences, 7580114109 bases, 6402114109 kmers +read 20000000 sequences, 8047294111 bases, 6807294111 kmers +read 21000000 sequences, 8529676866 bases, 7227676866 kmers +read 22000000 sequences, 9033767795 bases, 7669767795 kmers +read 23000000 sequences, 9560185658 bases, 8134185658 kmers +read 24000000 sequences, 10119240080 bases, 8631240080 kmers +read 25000000 sequences, 10718751300 bases, 9168751300 kmers +read 26000000 sequences, 11378640529 bases, 9766640529 kmers +read 27000000 sequences, 12134212218 bases, 10460212218 kmers +read 28000000 sequences, 13067071790 bases, 11331071790 kmers +read 29000000 sequences, 13626049624 bases, 11828049624 kmers +read 30000000 sequences, 13960720037 bases, 12100720037 kmers +read 31000000 sequences, 14294970673 bases, 12372970673 kmers +read 32000000 sequences, 14628836645 bases, 12644836645 kmers +read 33000000 sequences, 14963175436 bases, 12917175436 kmers +read 34000000 sequences, 15298218879 bases, 13190218879 kmers +read 35000000 sequences, 15633699282 bases, 13463699282 kmers +read 36000000 sequences, 15967703945 bases, 13735703945 kmers +read 37000000 sequences, 16302024026 bases, 14008024026 kmers +read 38000000 sequences, 16635791931 bases, 14279791931 kmers +read 39000000 sequences, 16971526422 bases, 14553526422 kmers +read 40000000 sequences, 17307281294 bases, 14827281294 kmers +read 41000000 sequences, 17645308371 bases, 15103308371 kmers +read 42000000 sequences, 17983412927 bases, 15379412927 kmers +read 43000000 sequences, 18320303922 bases, 15654303922 kmers +read 44000000 sequences, 18658298765 bases, 15930298765 kmers +read 45000000 sequences, 18996960738 bases, 16206960738 kmers +read 46000000 sequences, 19337650486 bases, 16485650486 kmers +read 47000000 sequences, 19678229737 bases, 16764229737 kmers +read 48000000 sequences, 20021474847 bases, 17045474847 kmers +read 49000000 sequences, 20364403409 bases, 17326403409 kmers +read 50000000 sequences, 20708621449 bases, 17608621449 kmers +read 51000000 sequences, 21051850139 bases, 17889850139 kmers +read 52000000 sequences, 21397390032 bases, 18173390032 kmers +read 53000000 sequences, 21743414843 bases, 18457414843 kmers +read 54000000 sequences, 22090330124 bases, 18742330124 kmers +read 55000000 sequences, 22439410639 bases, 19029410639 kmers +read 56000000 sequences, 22787640700 bases, 19315640700 kmers +read 57000000 sequences, 23137101573 bases, 19603101573 kmers +read 58000000 sequences, 23487411623 bases, 19891411623 kmers +read 59000000 sequences, 23839869821 bases, 20181869821 kmers +read 60000000 sequences, 24191291613 bases, 20471291613 kmers +read 61000000 sequences, 24545366070 bases, 20763366070 kmers +read 62000000 sequences, 24900738859 bases, 21056738859 kmers +read 63000000 sequences, 25257104822 bases, 21351104822 kmers +read 64000000 sequences, 25617509594 bases, 21649509594 kmers +read 65000000 sequences, 25977036607 bases, 21947036607 kmers +read 66000000 sequences, 26338121105 bases, 22246121105 kmers +read 67000000 sequences, 26701662537 bases, 22547662537 kmers +read 67725914 sequences, 26965776908 bases, 22766770240 kmers +num_kmers 22766770240 +cost: 2.0 + 0.368872 [bits/kmer] +max string length = 77847 +num bits per_absolute_offset = 35 +num bits per_relative_offset = 17 +num bits per_string_id = 27 +=== step 1 (encode strings): 70.9055 [sec] (3.11443 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.142.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.143.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.144.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.145.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.146.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.147.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.148.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.149.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.150.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.151.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.152.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.153.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.154.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.155.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.156.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.157.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.158.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.159.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.160.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.161.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.162.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.163.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.164.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.165.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.166.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.167.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.168.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.169.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.170.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.171.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.172.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.173.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.174.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.175.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.176.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.177.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.178.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.179.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.180.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.181.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.182.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.183.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.184.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.185.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.186.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.187.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.188.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.189.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.190.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.191.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.192.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.193.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.194.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.195.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.196.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.197.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.198.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.199.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.200.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.201.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.202.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.203.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.204.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.205.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.206.bin'... +=== step 2 (compute minimizer tuples): 8.81543 [sec] (0.387206 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +=== step 3 (merging minimizer tuples): 82.7074 [sec] (3.63281 [ns/kmer]) +num_minimizers = 885645159 +num_minimizer_positions = 1200568435 +num_super_kmers = 1200568435 +building minimizers MPHF with 64 threads and 296 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 32.5256 [sec] (1.42864 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.2.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 37.3106 [sec] (1.63882 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762818856201662731.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +processed 800000000 minimizer tuples +processed 900000000 minimizer tuples +processed 1000000000 minimizer tuples +processed 1100000000 minimizer tuples +processed 1200000000 minimizer tuples +=== step 6 (merging minimizers tuples): 169.296 [sec] (7.43611 [ns/kmer]) +num_bits_per_offset = 35 +num_buckets_larger_than_1_not_in_skew_index 69198834/885645159 (7.81338%) +num_buckets_in_skew_index 487719/885645159 (0.0550693%) +max_bucket_size 94315 +log2_max_bucket_size 17 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 286596361/1200568435 (23.8717%) +num_minimizer_positions_of_buckets_in_skew_index 98013468/1200568435 (8.16392%) +=== step 7.1 (build sparse index): 21.3249 [sec] (0.936669 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 425537767 + partition = 1: num kmers in buckets of size > 128 and <= 256: 362066886 + partition = 2: num kmers in buckets of size > 256 and <= 512: 301939123 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 228603652 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 148530360 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 81213417 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 38708611 + partition = 7: num kmers in buckets of size > 8192 and <= 94315: 36554519 +num kmers in skew index = 1623154335 (7.12949%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 425537767 + building MPHF with 64 threads and 142 partitions (avg. partition size = 3000000)... + built mphs[0] for 425537767 kmers; bits/key = 2.55898 + built positions[0] for 425537767 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 362066886 + building MPHF with 64 threads and 121 partitions (avg. partition size = 3000000)... + built mphs[1] for 362066886 kmers; bits/key = 2.55692 + built positions[1] for 362066886 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 301939123 + building MPHF with 64 threads and 101 partitions (avg. partition size = 3000000)... + built mphs[2] for 301939123 kmers; bits/key = 2.55728 + built positions[2] for 301939123 kmers; bits/key = 9 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 228603652 + building MPHF with 64 threads and 77 partitions (avg. partition size = 3000000)... + built mphs[3] for 228603652 kmers; bits/key = 2.56716 + built positions[3] for 228603652 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 148530360 + building MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... + built mphs[4] for 148530360 kmers; bits/key = 2.56647 + built positions[4] for 148530360 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 81213417 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[5] for 81213417 kmers; bits/key = 2.53824 + built positions[5] for 81213417 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 38708611 + building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... + built mphs[6] for 38708611 kmers; bits/key = 2.54261 + built positions[6] for 38708611 kmers; bits/key = 13 + lower = 8192; upper = 94315; num_bits_per_pos = 17; num_kmers_in_partition = 36554519 + building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... + built mphs[7] for 36554519 kmers; bits/key = 2.55068 + built positions[7] for 36554519 kmers; bits/key = 17 +=== step 7.2 (build skew index): 242.98 [sec] (10.6726 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 92.1315% +buckets with 2 minimizer positions = 4.3466% +buckets with 3 minimizer positions = 1.2957% +buckets with 4 minimizer positions = 0.623479% +buckets with 5 minimizer positions = 0.366055% +buckets with 6 minimizer positions = 0.23929% +buckets with 7 minimizer positions = 0.167326% +buckets with 8 minimizer positions = 0.12317% +buckets with 9 minimizer positions = 0.0938571% +buckets with 10 minimizer positions = 0.0737212% +buckets with 11 minimizer positions = 0.0591028% +buckets with 12 minimizer positions = 0.0484583% +buckets with 13 minimizer positions = 0.0404011% +buckets with 14 minimizer positions = 0.0339243% +buckets with 15 minimizer positions = 0.0291173% +buckets with 16 minimizer positions = 0.0249361% +max_bucket_size = 94315 +=== step 7 (build sparse and skew index): 267.119 [sec] (11.7329 [ns/kmer]) +=== total time: 668.68 [sec] (29.3709 [ns/kmer]) +total index size: 15531396563 [B] -- 15531.4 [MB] +SPACE BREAKDOWN: + mphf: 0.110167 [bits/kmer] (2.832 [bits/key]) -- 2.01861% + strings_offsets: 0.162621 [bits/kmer] -- 2.97973% + control_codewords: 1.40043 [bits/kmer] -- 25.6603% + mid_load_buckets: 0.440593 [bits/kmer] -- 8.07306% + begin_buckets_of_size: 9.41723e-08 [bits/kmer] -- 1.72554e-06% + strings: 2.36887 [bits/kmer] -- 43.4053% + skew_index: 0.974887 [bits/kmer] -- 17.863% + weights: 6.46556e-08 [bits/kmer] -- 1.1847e-06% + -------------- + total: 5.45757 [bits/kmer] +2025-11-11 01:05:24: saving data structure to disk... +2025-11-11 01:06:37: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash +2025-11-11 01:06:38: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +read 1000000 sequences, 123618042 bases, 61618042 kmers +read 2000000 sequences, 248006699 bases, 124006699 kmers +read 3000000 sequences, 373165849 bases, 187165849 kmers +read 4000000 sequences, 499216806 bases, 251216806 kmers +read 5000000 sequences, 626504126 bases, 316504126 kmers +read 6000000 sequences, 754844978 bases, 382844978 kmers +read 7000000 sequences, 884611558 bases, 450611558 kmers +read 8000000 sequences, 1015719906 bases, 519719906 kmers +read 9000000 sequences, 1148384128 bases, 590384128 kmers +read 10000000 sequences, 1283305186 bases, 663305186 kmers +read 11000000 sequences, 1420392618 bases, 738392618 kmers +read 12000000 sequences, 1559905103 bases, 815905103 kmers +read 13000000 sequences, 1702344045 bases, 896344045 kmers +read 14000000 sequences, 1848153905 bases, 980153905 kmers +read 15000000 sequences, 1998487611 bases, 1068487611 kmers +read 16000000 sequences, 2153589528 bases, 1161589528 kmers +read 17000000 sequences, 2314472162 bases, 1260472162 kmers +read 18000000 sequences, 2483331066 bases, 1367331066 kmers +read 19000000 sequences, 2661730312 bases, 1483730312 kmers +read 20000000 sequences, 2852409810 bases, 1612409810 kmers +read 21000000 sequences, 3060194564 bases, 1758194564 kmers +read 22000000 sequences, 3290140238 bases, 1926140238 kmers +read 23000000 sequences, 3552570970 bases, 2126570970 kmers +read 24000000 sequences, 3863888905 bases, 2375888905 kmers +read 25000000 sequences, 4253358029 bases, 2703358029 kmers +read 26000000 sequences, 4780487647 bases, 3168487647 kmers +read 27000000 sequences, 5604484526 bases, 3930484526 kmers +read 28000000 sequences, 5925952935 bases, 4189952935 kmers +read 29000000 sequences, 6039783917 bases, 4241783917 kmers +read 30000000 sequences, 6153634902 bases, 4293634902 kmers +read 31000000 sequences, 6267684053 bases, 4345684053 kmers +read 32000000 sequences, 6381788267 bases, 4397788267 kmers +read 33000000 sequences, 6496092541 bases, 4450092541 kmers +read 34000000 sequences, 6610456809 bases, 4502456809 kmers +read 35000000 sequences, 6725025608 bases, 4555025608 kmers +read 36000000 sequences, 6839697388 bases, 4607697388 kmers +read 37000000 sequences, 6954566139 bases, 4660566139 kmers +read 38000000 sequences, 7069620814 bases, 4713620814 kmers +read 39000000 sequences, 7184856392 bases, 4766856392 kmers +read 40000000 sequences, 7300352498 bases, 4820352498 kmers +read 41000000 sequences, 7415987203 bases, 4873987203 kmers +read 42000000 sequences, 7531875755 bases, 4927875755 kmers +read 43000000 sequences, 7647987237 bases, 4981987237 kmers +read 44000000 sequences, 7764325565 bases, 5036325565 kmers +read 45000000 sequences, 7880919196 bases, 5090919196 kmers +read 46000000 sequences, 7997748943 bases, 5145748943 kmers +read 47000000 sequences, 8114852221 bases, 5200852221 kmers +read 48000000 sequences, 8232292777 bases, 5256292777 kmers +read 49000000 sequences, 8349993383 bases, 5311993383 kmers +read 50000000 sequences, 8468086161 bases, 5368086161 kmers +read 51000000 sequences, 8586456588 bases, 5424456588 kmers +read 52000000 sequences, 8705279881 bases, 5481279881 kmers +read 53000000 sequences, 8824571697 bases, 5538571697 kmers +read 54000000 sequences, 8944259928 bases, 5596259928 kmers +read 55000000 sequences, 9064361649 bases, 5654361649 kmers +read 56000000 sequences, 9185024212 bases, 5713024212 kmers +read 57000000 sequences, 9306137968 bases, 5772137968 kmers +read 58000000 sequences, 9427875971 bases, 5831875971 kmers +read 59000000 sequences, 9550182119 bases, 5892182119 kmers +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +cost: 2.0 + 1.2463 [bits/kmer] +max string length = 27681 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 15 +num bits per_string_id = 26 +=== step 1 (encode strings): 27.8179 [sec] (4.69359 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.82.bin'... +=== step 2 (compute minimizer tuples): 6.62651 [sec] (1.11806 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +=== step 3 (merging minimizer tuples): 22.5011 [sec] (3.79651 [ns/kmer]) +num_minimizers = 274429863 +num_minimizer_positions = 406062800 +num_super_kmers = 406062800 +building minimizers MPHF with 64 threads and 92 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 11.0494 [sec] (1.86432 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819598072253670.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 13.5542 [sec] (2.28693 [ns/kmer]) +=== step 6 (merging minimizers tuples): 49.4978 [sec] (8.35154 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 51299487/274429863 (18.6931%) +num_buckets_in_skew_index 131946/274429863 (0.04808%) +max_bucket_size 176220 +log2_max_bucket_size 18 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 146053805/406062800 (35.9683%) +num_minimizer_positions_of_buckets_in_skew_index 37010565/406062800 (9.11449%) +=== step 7.1 (build sparse index): 9.0324 [sec] (1.524 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 83316513 + partition = 1: num kmers in buckets of size > 128 and <= 256: 74231522 + partition = 2: num kmers in buckets of size > 256 and <= 512: 67271777 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 57125353 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 46013184 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 37921473 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 28349062 + partition = 7: num kmers in buckets of size > 8192 and <= 176220: 62824185 +num kmers in skew index = 457053069 (7.71165%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 83316513 + building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... + built mphs[0] for 83316513 kmers; bits/key = 2.55669 + built positions[0] for 83316513 kmers; bits/key = 7 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 74231522 + building MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... + built mphs[1] for 74231522 kmers; bits/key = 2.57033 + built positions[1] for 74231522 kmers; bits/key = 8 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 67271777 + building MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... + built mphs[2] for 67271777 kmers; bits/key = 2.54468 + built positions[2] for 67271777 kmers; bits/key = 9.00001 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 57125353 + building MPHF with 64 threads and 20 partitions (avg. partition size = 3000000)... + built mphs[3] for 57125353 kmers; bits/key = 2.53252 + built positions[3] for 57125353 kmers; bits/key = 10 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46013184 + building MPHF with 64 threads and 16 partitions (avg. partition size = 3000000)... + built mphs[4] for 46013184 kmers; bits/key = 2.53117 + built positions[4] for 46013184 kmers; bits/key = 11 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 37921473 + building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... + built mphs[5] for 37921473 kmers; bits/key = 2.56414 + built positions[5] for 37921473 kmers; bits/key = 12 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 28349062 + building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... + built mphs[6] for 28349062 kmers; bits/key = 2.56358 + built positions[6] for 28349062 kmers; bits/key = 13 + lower = 8192; upper = 176220; num_bits_per_pos = 18; num_kmers_in_partition = 62824185 + building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... + built mphs[7] for 62824185 kmers; bits/key = 2.55204 + built positions[7] for 62824185 kmers; bits/key = 18 +=== step 7.2 (build skew index): 59.2702 [sec] (10.0004 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 81.2588% +buckets with 2 minimizer positions = 13.7158% +buckets with 3 minimizer positions = 2.82467% +buckets with 4 minimizer positions = 0.819903% +buckets with 5 minimizer positions = 0.371916% +buckets with 6 minimizer positions = 0.218785% +buckets with 7 minimizer positions = 0.143859% +buckets with 8 minimizer positions = 0.101665% +buckets with 9 minimizer positions = 0.0751737% +buckets with 10 minimizer positions = 0.0573965% +buckets with 11 minimizer positions = 0.0451926% +buckets with 12 minimizer positions = 0.0368258% +buckets with 13 minimizer positions = 0.0299698% +buckets with 14 minimizer positions = 0.025193% +buckets with 15 minimizer positions = 0.0214499% +buckets with 16 minimizer positions = 0.0183803% +max_bucket_size = 176220 +=== step 7 (build sparse and skew index): 69.3598 [sec] (11.7028 [ns/kmer]) +=== total time: 200.407 [sec] (33.8137 [ns/kmer]) +total index size: 5431161974 [B] -- 5431.16 [MB] +SPACE BREAKDOWN: + mphf: 0.131165 [bits/kmer] (2.83273 [bits/key]) -- 1.78918% + strings_offsets: 0.273643 [bits/kmer] -- 3.73268% + control_codewords: 1.62062 [bits/kmer] -- 22.1063% + mid_load_buckets: 0.837862 [bits/kmer] -- 11.429% + begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.93449e-06% + strings: 3.2463 [bits/kmer] -- 44.2818% + skew_index: 1.22142 [bits/kmer] -- 16.661% + weights: 2.48364e-07 [bits/kmer] -- 3.38786e-06% + -------------- + total: 7.33101 [bits/kmer] +2025-11-11 01:09:58: saving data structure to disk... +2025-11-11 01:10:23: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash +2025-11-11 01:10:24: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... +read 1000000 sequences, 146366718 bases, 84366718 kmers +read 2000000 sequences, 296791327 bases, 172791327 kmers +read 3000000 sequences, 452465563 bases, 266465563 kmers +read 4000000 sequences, 614198433 bases, 366198433 kmers +read 5000000 sequences, 783034539 bases, 473034539 kmers +read 6000000 sequences, 966455345 bases, 594455345 kmers +read 7000000 sequences, 1177950483 bases, 743950483 kmers +read 8000000 sequences, 1408450282 bases, 912450282 kmers +read 9000000 sequences, 1536152549 bases, 978152549 kmers +read 10000000 sequences, 1664904910 bases, 1044904910 kmers +read 11000000 sequences, 1794061925 bases, 1112061925 kmers +read 12000000 sequences, 1923575230 bases, 1179575230 kmers +read 13000000 sequences, 2053070210 bases, 1247070210 kmers +read 14000000 sequences, 2183943636 bases, 1315943636 kmers +read 15000000 sequences, 2316373175 bases, 1386373175 kmers +read 16000000 sequences, 2449041041 bases, 1457041041 kmers +read 17000000 sequences, 2582562981 bases, 1528562981 kmers +read 18000000 sequences, 2717390529 bases, 1601390529 kmers +read 19000000 sequences, 2853100531 bases, 1675100531 kmers +read 20000000 sequences, 2990606476 bases, 1750606476 kmers +read 21000000 sequences, 3129300415 bases, 1827300415 kmers +read 22000000 sequences, 3269949888 bases, 1905949888 kmers +read 23000000 sequences, 3412658016 bases, 1986658016 kmers +read 23474327 sequences, 3483064285 bases, 2027656011 kmers +num_kmers 2027656011 +cost: 2.0 + 1.43556 [bits/kmer] +max string length = 643923 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 20 +num bits per_string_id = 25 +=== step 1 (encode strings): 10.3277 [sec] (5.09343 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.979513 [sec] (0.483077 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 7.74007 [sec] (3.81725 [ns/kmer]) +num_minimizers = 76630489 +num_minimizer_positions = 141268659 +num_super_kmers = 141268659 +building minimizers MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 3.33414 [sec] (1.64433 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819824382133876.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 4.4719 [sec] (2.20545 [ns/kmer]) +=== step 6 (merging minimizers tuples): 10.5513 [sec] (5.20368 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 12031601/76630489 (15.7008%) +num_buckets_in_skew_index 62262/76630489 (0.0812496%) +max_bucket_size 281880 +log2_max_bucket_size 19 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 66085279/141268659 (46.7799%) +num_minimizer_positions_of_buckets_in_skew_index 10646754/141268659 (7.53653%) +=== step 7.1 (build sparse index): 3.21849 [sec] (1.5873 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 65292887 + partition = 1: num kmers in buckets of size > 128 and <= 256: 16768176 + partition = 2: num kmers in buckets of size > 256 and <= 512: 6866326 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 4652668 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 4307414 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 3858894 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 5911410 + partition = 7: num kmers in buckets of size > 8192 and <= 281880: 31685511 +num kmers in skew index = 139343286 (6.87214%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 65292887 + building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... + built mphs[0] for 65292887 kmers; bits/key = 2.55008 + built positions[0] for 65292887 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16768176 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16768176 kmers; bits/key = 2.56383 + built positions[1] for 16768176 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 6866326 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 6866326 kmers; bits/key = 2.72645 + built positions[2] for 6866326 kmers; bits/key = 9.00006 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4652668 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 4652668 kmers; bits/key = 2.812 + built positions[3] for 4652668 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4307414 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[4] for 4307414 kmers; bits/key = 2.80506 + built positions[4] for 4307414 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3858894 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[5] for 3858894 kmers; bits/key = 3.08272 + built positions[5] for 3858894 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5911410 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[6] for 5911410 kmers; bits/key = 2.51936 + built positions[6] for 5911410 kmers; bits/key = 13.0001 + lower = 8192; upper = 281880; num_bits_per_pos = 19; num_kmers_in_partition = 31685511 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[7] for 31685511 kmers; bits/key = 2.52689 + built positions[7] for 31685511 kmers; bits/key = 19 +=== step 7.2 (build skew index): 19.6513 [sec] (9.69165 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 84.2179% +buckets with 2 minimizer positions = 7.76108% +buckets with 3 minimizer positions = 2.50949% +buckets with 4 minimizer positions = 1.23307% +buckets with 5 minimizer positions = 0.750442% +buckets with 6 minimizer positions = 0.516927% +buckets with 7 minimizer positions = 0.38172% +buckets with 8 minimizer positions = 0.296813% +buckets with 9 minimizer positions = 0.239214% +buckets with 10 minimizer positions = 0.197673% +buckets with 11 minimizer positions = 0.166211% +buckets with 12 minimizer positions = 0.142668% +buckets with 13 minimizer positions = 0.124415% +buckets with 14 minimizer positions = 0.108818% +buckets with 15 minimizer positions = 0.0962646% +buckets with 16 minimizer positions = 0.0863325% +max_bucket_size = 281880 +=== step 7 (build sparse and skew index): 23.2447 [sec] (11.4638 [ns/kmer]) +=== total time: 60.6493 [sec] (29.911 [ns/kmer]) +total index size: 1824281560 [B] -- 1824.28 [MB] +SPACE BREAKDOWN: + mphf: 0.108372 [bits/kmer] (2.86754 [bits/key]) -- 1.50567% + strings_offsets: 0.291878 [bits/kmer] -- 4.05522% + control_codewords: 1.24716 [bits/kmer] -- 17.3274% + mid_load_buckets: 1.04294 [bits/kmer] -- 14.4902% + begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.46907e-05% + strings: 3.43556 [bits/kmer] -- 47.732% + skew_index: 1.07169 [bits/kmer] -- 14.8895% + weights: 7.25961e-07 [bits/kmer] -- 1.00862e-05% + -------------- + total: 7.1976 [bits/kmer] +2025-11-11 01:11:25: saving data structure to disk... +2025-11-11 01:11:33: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash +2025-11-11 01:11:33: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +read 1000000 sequences, 195596653 bases, 133596653 kmers +read 2000000 sequences, 328155468 bases, 204155468 kmers +read 3000000 sequences, 461539333 bases, 275539333 kmers +read 4000000 sequences, 595230806 bases, 347230806 kmers +read 5000000 sequences, 730213776 bases, 420213776 kmers +read 6000000 sequences, 866286185 bases, 494286185 kmers +read 7000000 sequences, 1002901529 bases, 568901529 kmers +read 8000000 sequences, 1142394085 bases, 646394085 kmers +read 9000000 sequences, 1282878983 bases, 724878983 kmers +read 10000000 sequences, 1425636398 bases, 805636398 kmers +read 11000000 sequences, 1571133044 bases, 889133044 kmers +read 12000000 sequences, 1720028668 bases, 976028668 kmers +read 13000000 sequences, 1874571339 bases, 1068571339 kmers +read 14000000 sequences, 2036208720 bases, 1168208720 kmers +read 15000000 sequences, 2208992707 bases, 1278992707 kmers +read 16000000 sequences, 2403498478 bases, 1411498478 kmers +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +cost: 2.0 + 1.35283 [bits/kmer] +max string length = 499189 +num bits per_absolute_offset = 32 +num bits per_relative_offset = 19 +num bits per_string_id = 24 +=== step 1 (encode strings): 7.85856 [sec] (5.15348 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.764585 [sec] (0.501399 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.bin' +processed 100000000 minimizer tuples +=== step 3 (merging minimizer tuples): 5.74818 [sec] (3.76954 [ns/kmer]) +num_minimizers = 61951224 +num_minimizer_positions = 105337248 +num_super_kmers = 105337248 +building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 2.75372 [sec] (1.80583 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819893593617488.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 3.39227 [sec] (2.22458 [ns/kmer]) +=== step 6 (merging minimizers tuples): 7.61206 [sec] (4.99183 [ns/kmer]) +num_bits_per_offset = 32 +num_buckets_larger_than_1_not_in_skew_index 9999764/61951224 (16.1414%) +num_buckets_in_skew_index 36489/61951224 (0.0588996%) +max_bucket_size 144478 +log2_max_bucket_size 18 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 47622255/105337248 (45.2093%) +num_minimizer_positions_of_buckets_in_skew_index 5800022/105337248 (5.50615%) +=== step 7.1 (build sparse index): 2.3957 [sec] (1.57105 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 32078766 + partition = 1: num kmers in buckets of size > 128 and <= 256: 16092632 + partition = 2: num kmers in buckets of size > 256 and <= 512: 8174536 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 3454318 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 2781070 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 2981930 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 2815305 + partition = 7: num kmers in buckets of size > 8192 and <= 144478: 7418130 +num kmers in skew index = 75796687 (4.97059%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 32078766 + building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... + built mphs[0] for 32078766 kmers; bits/key = 2.51437 + built positions[0] for 32078766 kmers; bits/key = 7.00001 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16092632 + building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... + built mphs[1] for 16092632 kmers; bits/key = 2.65398 + built positions[1] for 16092632 kmers; bits/key = 8.00002 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8174536 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[2] for 8174536 kmers; bits/key = 2.61889 + built positions[2] for 8174536 kmers; bits/key = 9.00005 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3454318 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[3] for 3454318 kmers; bits/key = 3.14686 + built positions[3] for 3454318 kmers; bits/key = 10.0001 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2781070 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2781070)... + built mphs[4] for 2781070 kmers; bits/key = 2.55987 + built positions[4] for 2781070 kmers; bits/key = 11.0001 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2981930 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2981930)... + built mphs[5] for 2981930 kmers; bits/key = 2.55978 + built positions[5] for 2981930 kmers; bits/key = 12.0001 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2815305 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2815305)... + built mphs[6] for 2815305 kmers; bits/key = 2.55984 + built positions[6] for 2815305 kmers; bits/key = 13.0001 + lower = 8192; upper = 144478; num_bits_per_pos = 18; num_kmers_in_partition = 7418130 + building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... + built mphs[7] for 7418130 kmers; bits/key = 2.72795 + built positions[7] for 7418130 kmers; bits/key = 18.0001 +=== step 7.2 (build skew index): 13.4056 [sec] (8.79113 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 83.7998% +buckets with 2 minimizer positions = 8.4968% +buckets with 3 minimizer positions = 2.71676% +buckets with 4 minimizer positions = 1.2809% +buckets with 5 minimizer positions = 0.745569% +buckets with 6 minimizer positions = 0.487324% +buckets with 7 minimizer positions = 0.345178% +buckets with 8 minimizer positions = 0.259136% +buckets with 9 minimizer positions = 0.202319% +buckets with 10 minimizer positions = 0.163595% +buckets with 11 minimizer positions = 0.136582% +buckets with 12 minimizer positions = 0.116401% +buckets with 13 minimizer positions = 0.100962% +buckets with 14 minimizer positions = 0.0888166% +buckets with 15 minimizer positions = 0.0782793% +buckets with 16 minimizer positions = 0.0706992% +max_bucket_size = 144478 +=== step 7 (build sparse and skew index): 16.0764 [sec] (10.5425 [ns/kmer]) +=== total time: 44.2057 [sec] (28.9892 [ns/kmer]) +total index size: 1294767218 [B] -- 1294.77 [MB] +SPACE BREAKDOWN: + mphf: 0.116088 [bits/kmer] (2.85745 [bits/key]) -- 1.70902% + strings_offsets: 0.274587 [bits/kmer] -- 4.04242% + control_codewords: 1.34067 [bits/kmer] -- 19.737% + mid_load_buckets: 0.99935 [bits/kmer] -- 14.7122% + begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 2.06987e-05% + strings: 3.35283 [bits/kmer] -- 49.3596% + skew_index: 0.709128 [bits/kmer] -- 10.4396% + weights: 9.65307e-07 [bits/kmer] -- 1.4211e-05% + -------------- + total: 6.79265 [bits/kmer] +2025-11-11 01:12:17: saving data structure to disk... +2025-11-11 01:12:23: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash +2025-11-11 01:12:23: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz'... +read 800231 sequences, 462130202 bases, 412515880 kmers +num_kmers 412515880 +cost: 2.0 + 0.240545 [bits/kmer] +max string length = 490374 +num bits per_absolute_offset = 29 +num bits per_relative_offset = 19 +num bits per_string_id = 20 +=== step 1 (encode strings): 1.17621 [sec] (2.85131 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.63.bin'... +=== step 2 (compute minimizer tuples): 0.321286 [sec] (0.778845 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.bin' +=== step 3 (merging minimizer tuples): 1.06842 [sec] (2.59001 [ns/kmer]) +num_minimizers = 18448739 +num_minimizer_positions = 20311554 +num_super_kmers = 20311554 +building minimizers MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 1.06742 [sec] (2.58758 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819943605340003.minimizers.0.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 0.755179 [sec] (1.83067 [ns/kmer]) +=== step 6 (merging minimizers tuples): 1.12785 [sec] (2.73408 [ns/kmer]) +num_bits_per_offset = 29 +num_buckets_larger_than_1_not_in_skew_index 1211725/18448739 (6.56806%) +num_buckets_in_skew_index 16/18448739 (8.67268e-05%) +max_bucket_size 489 +log2_max_bucket_size 9 +num_partitions in skew index 3 +num_minimizer_positions_of_buckets_larger_than_1 3072206/20311554 (15.1254%) +num_minimizer_positions_of_buckets_in_skew_index 2350/20311554 (0.0115698%) +=== step 7.1 (build sparse index): 0.273848 [sec] (0.663848 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 15469 + partition = 1: num kmers in buckets of size > 128 and <= 256: 14628 + partition = 2: num kmers in buckets of size > 256 and <= 489: 2787 +num kmers in skew index = 32884 (0.00797157%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 15469 + building MPHF with 64 threads and 1 partitions (avg. partition size = 15469)... + built mphs[0] for 15469 kmers; bits/key = 2.55168 + built positions[0] for 15469 kmers; bits/key = 7.02101 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14628 + building MPHF with 64 threads and 1 partitions (avg. partition size = 14628)... + built mphs[1] for 14628 kmers; bits/key = 2.56166 + built positions[1] for 14628 kmers; bits/key = 8.02406 + lower = 256; upper = 489; num_bits_per_pos = 9; num_kmers_in_partition = 2787 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2787)... + built mphs[2] for 2787 kmers; bits/key = 3.06566 + built positions[2] for 2787 kmers; bits/key = 9.11661 +=== step 7.2 (build skew index): 0.039049 [sec] (0.0946606 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 93.4318% +buckets with 2 minimizer positions = 4.75528% +buckets with 3 minimizer positions = 1.08358% +buckets with 4 minimizer positions = 0.365494% +buckets with 5 minimizer positions = 0.158802% +buckets with 6 minimizer positions = 0.080412% +buckets with 7 minimizer positions = 0.0434393% +buckets with 8 minimizer positions = 0.0264408% +buckets with 9 minimizer positions = 0.0161962% +buckets with 10 minimizer positions = 0.0109113% +buckets with 11 minimizer positions = 0.00805475% +buckets with 12 minimizer positions = 0.00528491% +buckets with 13 minimizer positions = 0.00364795% +buckets with 14 minimizer positions = 0.00271563% +buckets with 15 minimizer positions = 0.00196219% +buckets with 16 minimizer positions = 0.00142015% +max_bucket_size = 489 +=== step 7 (build sparse and skew index): 0.363897 [sec] (0.882141 [ns/kmer]) +=== total time: 5.88026 [sec] (14.2546 [ns/kmer]) +total index size: 209086404 [B] -- 209.086 [MB] +SPACE BREAKDOWN: + mphf: 0.136459 [bits/kmer] (3.05124 [bits/key]) -- 3.36533% + strings_offsets: 0.119202 [bits/kmer] -- 2.93974% + control_codewords: 1.34168 [bits/kmer] -- 33.0881% + mid_load_buckets: 0.215978 [bits/kmer] -- 5.32641% + begin_buckets_of_size: 5.19738e-06 [bits/kmer] -- 0.000128177% + strings: 2.24055 [bits/kmer] -- 55.2559% + skew_index: 0.000982963 [bits/kmer] -- 0.0242417% + weights: 3.56835e-06 [bits/kmer] -- 8.80019e-05% + -------------- + total: 4.05485 [bits/kmer] +2025-11-11 01:12:29: saving data structure to disk... +2025-11-11 01:12:30: DONE +./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash +2025-11-11 01:12:30: building data structure... +reading file '/mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz'... +read 1000000 sequences, 508802169 bases, 446802169 kmers +read 2000000 sequences, 1018081275 bases, 894081275 kmers +read 3000000 sequences, 1530401896 bases, 1344401896 kmers +read 4000000 sequences, 2055069016 bases, 1807069016 kmers +read 5000000 sequences, 2593224248 bases, 2283224248 kmers +read 6000000 sequences, 3139549385 bases, 2767549385 kmers +read 7000000 sequences, 3701263851 bases, 3267263851 kmers +read 8000000 sequences, 4283309251 bases, 3787309251 kmers +read 9000000 sequences, 4887570899 bases, 4329570899 kmers +read 10000000 sequences, 5529157849 bases, 4909157849 kmers +read 11000000 sequences, 6209792203 bases, 5527792203 kmers +read 12000000 sequences, 6962139753 bases, 6218139753 kmers +read 13000000 sequences, 7835035276 bases, 7029035276 kmers +read 14000000 sequences, 8978632454 bases, 8110632454 kmers +read 15000000 sequences, 11212240633 bases, 10282240633 kmers +read 16000000 sequences, 11682448788 bases, 10690448788 kmers +read 17000000 sequences, 12155568466 bases, 11101568466 kmers +read 18000000 sequences, 12632855540 bases, 11516855540 kmers +read 19000000 sequences, 13118014015 bases, 11940014015 kmers +read 20000000 sequences, 13600052606 bases, 12360052606 kmers +read 21000000 sequences, 14089576602 bases, 12787576602 kmers +read 22000000 sequences, 14580292633 bases, 13216292633 kmers +read 23000000 sequences, 15076414826 bases, 13650414826 kmers +read 23030730 sequences, 15091515601 bases, 13663610341 kmers +num_kmers 13663610341 +cost: 2.0 + 0.209008 [bits/kmer] +max string length = 980757 +num bits per_absolute_offset = 34 +num bits per_relative_offset = 20 +num bits per_string_id = 25 +=== step 1 (encode strings): 38.0016 [sec] (2.78123 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.1.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.2.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.3.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.4.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.5.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.6.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.7.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.8.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.9.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.10.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.11.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.12.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.13.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.14.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.15.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.16.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.17.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.18.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.19.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.20.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.21.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.22.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.23.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.24.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.25.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.26.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.27.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.28.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.29.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.30.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.31.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.32.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.33.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.34.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.35.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.36.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.37.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.38.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.39.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.40.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.41.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.42.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.43.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.44.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.45.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.46.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.47.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.48.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.49.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.50.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.51.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.52.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.53.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.54.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.55.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.56.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.57.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.58.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.59.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.60.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.61.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.62.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.63.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.64.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.65.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.66.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.67.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.68.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.69.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.70.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.71.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.72.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.73.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.74.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.75.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.76.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.77.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.78.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.79.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.80.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.81.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.82.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.83.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.84.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.85.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.86.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.87.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.88.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.89.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.90.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.91.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.92.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.93.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.94.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.95.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.96.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.97.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.98.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.99.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.100.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.101.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.102.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.103.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.104.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.105.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.106.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.107.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.108.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.109.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.110.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.111.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.112.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.113.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.114.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.115.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.116.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.117.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.118.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.119.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.120.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.121.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.122.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.123.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.124.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.125.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.126.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.127.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.128.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.129.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.130.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.131.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.132.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.133.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.134.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.135.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.136.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.137.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.138.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.139.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.140.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.141.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.142.bin'... +=== step 2 (compute minimizer tuples): 7.70188 [sec] (0.563678 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +=== step 3 (merging minimizer tuples): 77.1587 [sec] (5.64702 [ns/kmer]) +num_minimizers = 635376539 +num_minimizer_positions = 704332572 +num_super_kmers = 704332572 +building minimizers MPHF with 64 threads and 212 partitions (avg. partition size = 3000000)... +=== step 4 (build mphf): 23.1077 [sec] (1.69119 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.0.bin'... +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.1.bin'... +=== step 5 (replacing minimizer values with MPHF hashes): 23.8057 [sec] (1.74227 [ns/kmer]) +saving to file '/mnt/hd2/pibiri/DNA/tmp_dir/sshash.tmp.run_1762819950410494738.minimizers.bin' +processed 100000000 minimizer tuples +processed 200000000 minimizer tuples +processed 300000000 minimizer tuples +processed 400000000 minimizer tuples +processed 500000000 minimizer tuples +processed 600000000 minimizer tuples +processed 700000000 minimizer tuples +=== step 6 (merging minimizers tuples): 73.107 [sec] (5.35049 [ns/kmer]) +num_bits_per_offset = 34 +num_buckets_larger_than_1_not_in_skew_index 39285317/635376539 (6.183%) +num_buckets_in_skew_index 18897/635376539 (0.00297414%) +max_bucket_size 54496 +log2_max_bucket_size 16 +num_partitions in skew index 8 +num_minimizer_positions_of_buckets_larger_than_1 105735487/704332572 (15.0122%) +num_minimizer_positions_of_buckets_in_skew_index 2524760/704332572 (0.358461%) +=== step 7.1 (build sparse index): 9.97487 [sec] (0.730032 [ns/kmer]) + partition = 0: num kmers in buckets of size > 64 and <= 128: 20969688 + partition = 1: num kmers in buckets of size > 128 and <= 256: 10737757 + partition = 2: num kmers in buckets of size > 256 and <= 512: 4741531 + partition = 3: num kmers in buckets of size > 512 and <= 1024: 2486138 + partition = 4: num kmers in buckets of size > 1024 and <= 2048: 989727 + partition = 5: num kmers in buckets of size > 2048 and <= 4096: 943348 + partition = 6: num kmers in buckets of size > 4096 and <= 8192: 642370 + partition = 7: num kmers in buckets of size > 8192 and <= 54496: 1294795 +num kmers in skew index = 42805354 (0.31328%) + lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 20969688 + building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... + built mphs[0] for 20969688 kmers; bits/key = 2.54235 + built positions[0] for 20969688 kmers; bits/key = 7.00002 + lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10737757 + building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... + built mphs[1] for 10737757 kmers; bits/key = 2.65204 + built positions[1] for 10737757 kmers; bits/key = 8.00003 + lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 4741531 + building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... + built mphs[2] for 4741531 kmers; bits/key = 2.76709 + built positions[2] for 4741531 kmers; bits/key = 9.00007 + lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 2486138 + building MPHF with 64 threads and 1 partitions (avg. partition size = 2486138)... + built mphs[3] for 2486138 kmers; bits/key = 2.55994 + built positions[3] for 2486138 kmers; bits/key = 10.0002 + lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 989727 + building MPHF with 64 threads and 1 partitions (avg. partition size = 989727)... + built mphs[4] for 989727 kmers; bits/key = 2.41843 + built positions[4] for 989727 kmers; bits/key = 11.0004 + lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 943348 + building MPHF with 64 threads and 1 partitions (avg. partition size = 943348)... + built mphs[5] for 943348 kmers; bits/key = 2.41845 + built positions[5] for 943348 kmers; bits/key = 12.0004 + lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 642370 + building MPHF with 64 threads and 1 partitions (avg. partition size = 642370)... + built mphs[6] for 642370 kmers; bits/key = 2.41959 + built positions[6] for 642370 kmers; bits/key = 13.0006 + lower = 8192; upper = 54496; num_bits_per_pos = 16; num_kmers_in_partition = 1294795 + building MPHF with 64 threads and 1 partitions (avg. partition size = 1294795)... + built mphs[7] for 1294795 kmers; bits/key = 2.56074 + built positions[7] for 1294795 kmers; bits/key = 16.0003 +=== step 7.2 (build skew index): 8.57148 [sec] (0.627322 [ns/kmer]) +=== bucket statistics (less) === +buckets with 1 minimizer positions = 93.814% +buckets with 2 minimizer positions = 4.42799% +buckets with 3 minimizer positions = 1.00785% +buckets with 4 minimizer positions = 0.351026% +buckets with 5 minimizer positions = 0.151711% +buckets with 6 minimizer positions = 0.0750917% +buckets with 7 minimizer positions = 0.042181% +buckets with 8 minimizer positions = 0.0264498% +buckets with 9 minimizer positions = 0.0181631% +buckets with 10 minimizer positions = 0.0132882% +buckets with 11 minimizer positions = 0.0102552% +buckets with 12 minimizer positions = 0.00803933% +buckets with 13 minimizer positions = 0.00649237% +buckets with 14 minimizer positions = 0.00533274% +buckets with 15 minimizer positions = 0.0044295% +buckets with 16 minimizer positions = 0.00378972% +max_bucket_size = 54496 +=== step 7 (build sparse and skew index): 20.0887 [sec] (1.47023 [ns/kmer]) +=== total time: 262.971 [sec] (19.2461 [ns/kmer]) +total index size: 7528610111 [B] -- 7528.61 [MB] +SPACE BREAKDOWN: + mphf: 0.13127 [bits/kmer] (2.82294 [bits/key]) -- 2.97802% + strings_offsets: 0.136923 [bits/kmer] -- 3.10626% + control_codewords: 1.62755 [bits/kmer] -- 36.9228% + mid_load_buckets: 0.263108 [bits/kmer] -- 5.96891% + begin_buckets_of_size: 1.56913e-07 [bits/kmer] -- 3.55975e-06% + strings: 2.20901 [bits/kmer] -- 50.1139% + skew_index: 0.0401185 [bits/kmer] -- 0.910134% + weights: 1.07731e-07 [bits/kmer] -- 2.44401e-06% + -------------- + total: 4.40798 [bits/kmer] +2025-11-11 01:16:53: saving data structure to disk... +2025-11-11 01:17:26: DONE diff --git a/benchmarks/results-10-11-25/k63/regular-build.time.log b/benchmarks/results-10-11-25/k63/regular-build.time.log new file mode 100644 index 0000000..faa2e9b --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-build.time.log @@ -0,0 +1,207 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash" + User time (seconds): 21.00 + System time (seconds): 5.04 + Percent of CPU this job got: 181% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:14.32 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1528612 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1167209 + Voluntary context switches: 30843 + Involuntary context switches: 7048 + Swaps: 0 + File system inputs: 349880 + File system outputs: 4440696 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash" + User time (seconds): 35.71 + System time (seconds): 8.30 + Percent of CPU this job got: 239% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:18.41 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3226812 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2000154 + Voluntary context switches: 28545 + Involuntary context switches: 7499 + Swaps: 0 + File system inputs: 658008 + File system outputs: 8951128 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash" + User time (seconds): 166.38 + System time (seconds): 21.76 + Percent of CPU this job got: 302% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:02.16 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 7586552 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6180152 + Voluntary context switches: 30022 + Involuntary context switches: 8614 + Swaps: 0 + File system inputs: 1667336 + File system outputs: 22410192 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/axolotl.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/axolotl.k63.sshash" + User time (seconds): 2164.86 + System time (seconds): 227.97 + Percent of CPU this job got: 322% + Elapsed (wall clock) time (h:mm:ss or m:ss): 12:21.86 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 55227232 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 49182837 + Voluntary context switches: 419242 + Involuntary context switches: 33889 + Swaps: 0 + File system inputs: 16364008 + File system outputs: 230502424 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash" + User time (seconds): 569.37 + System time (seconds): 63.67 + Percent of CPU this job got: 279% + Elapsed (wall clock) time (h:mm:ss or m:ss): 3:46.30 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 17447736 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 18463727 + Voluntary context switches: 57407 + Involuntary context switches: 13706 + Swaps: 0 + File system inputs: 5974376 + File system outputs: 63147912 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ec.k63.sshash" + User time (seconds): 160.99 + System time (seconds): 21.39 + Percent of CPU this job got: 263% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:09.20 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 9279992 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6507955 + Voluntary context switches: 30742 + Involuntary context switches: 8708 + Swaps: 0 + File system inputs: 2288816 + File system outputs: 21177984 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash" + User time (seconds): 97.80 + System time (seconds): 15.16 + Percent of CPU this job got: 225% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:50.00 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 5782684 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 4499938 + Voluntary context switches: 29589 + Involuntary context switches: 8741 + Swaps: 0 + File system inputs: 1680088 + File system outputs: 15833744 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash" + User time (seconds): 11.40 + System time (seconds): 3.48 + Percent of CPU this job got: 218% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.80 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1134996 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 719329 + Voluntary context switches: 29642 + Involuntary context switches: 6076 + Swaps: 0 + File system inputs: 274408 + File system outputs: 3211544 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/jgi_fungi.batch-0.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-indexes/jgi_fungi.batch-0.k63.sshash" + User time (seconds): 610.72 + System time (seconds): 99.38 + Percent of CPU this job got: 239% + Elapsed (wall clock) time (h:mm:ss or m:ss): 4:56.78 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 26375148 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 21111660 + Voluntary context switches: 98691 + Involuntary context switches: 17851 + Swaps: 0 + File system inputs: 8976432 + File system outputs: 136229984 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/script/bench.py b/script/bench.py index 78237ef..2b334e3 100644 --- a/script/bench.py +++ b/script/bench.py @@ -20,8 +20,7 @@ results_dir = Path(f"results-{log_label}") datasets = [ - "cod", "kestrel", "human", "axolotl", "hprc", - "ec", "se", "ncbi-virus", "jgi_fungi.batch-0" + "cod", "kestrel", "human", "ncbi-virus", "se", "hprc" ] # ------------------------------ diff --git a/script/build.py b/script/build.py index 3c10486..5e78cae 100644 --- a/script/build.py +++ b/script/build.py @@ -19,18 +19,15 @@ g = 16 datasets = [ - "cod", "kestrel", "human", "axolotl", "hprc", - "ec", "se", "ncbi-virus", "jgi_fungi.batch-0" + "cod", "kestrel", "human", "ncbi-virus", "se", "hprc" ] m_values_k31 = { - "cod": 20, "kestrel": 20, "human": 21, "axolotl": 21, - "hprc": 21, "ec": 21, "se": 21, "ncbi-virus": 19, "jgi_fungi.batch-0": 21 + "cod": 20, "kestrel": 20, "human": 21, "ncbi-virus": 19, "se": 21, "hprc": 21 } m_values_k63 = { - "cod": 24, "kestrel": 24, "human": 25, "axolotl": 25, - "hprc": 31, "ec": 31, "se": 31, "ncbi-virus": 23, "jgi_fungi.batch-0": 25 + "cod": 24, "kestrel": 24, "human": 25, "ncbi-virus": 23, "se": 31, "hprc": 31 } # --- Utilities --- diff --git a/script/streaming-query-high-hit.py b/script/streaming-query-high-hit.py new file mode 100644 index 0000000..5e44150 --- /dev/null +++ b/script/streaming-query-high-hit.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +import os +import subprocess +import sys +from pathlib import Path + +# ------------------------------ +# Argument parsing +# ------------------------------ +if len(sys.argv) < 4: + print("Usage: python3 bench.py ") + sys.exit(1) + +log_label = sys.argv[1] +index_dir = Path(sys.argv[2]).resolve() +query_dir = Path(sys.argv[3]).resolve() + +# ------------------------------ +# Global configuration +# ------------------------------ +results_dir = Path(f"results-{log_label}") + +datasets = [ + "cod", "kestrel", "human", "ncbi-virus", "se", "hprc" +] + +queries = {"cod":"SRR12858649", "kestrel":"SRR11449743_1", "human":"SRR5833294", "ncbi-virus":"ncbi-queries", "se":"SRR801268_1", "hprc":"SRR5833294"} + +# ------------------------------ +# Utility functions +# ------------------------------ +def run_cmd(cmd, cwd=None): + """Run a shell command and print it.""" + print(f"[RUN] {' '.join(cmd)}") + subprocess.run(cmd, cwd=cwd, check=True) + + +def build_project(max_k63: bool): + """Run cmake + make with max_k63 = True/False.""" + flag = "On" if max_k63 else "Off" + print(f"\n=== Building SSHASH (MAX_KMER_LENGTH_63={flag}) ===\n") + run_cmd([ + "cmake", "..", + "-DCMAKE_BUILD_TYPE=Release", + "-DCMAKE_CXX_COMPILER=/usr/bin/g++", + "-DSSHASH_USE_ARCH_NATIVE=On", + "-DSSHASH_USE_SANITIZERS=Off", + f"-DSSHASH_USE_MAX_KMER_LENGTH_63={flag}" + ]) + run_cmd(["make", "-j"]) + + +def run_bench(k, canonical, runs = 1): + """Run SSHASH benchmark for all datasets.""" + mode = "canon" if canonical else "regular" + out_dir = results_dir / f"k{k}" + out_dir.mkdir(parents=True, exist_ok=True) + log_file = out_dir / f"{mode}-streaming-queries-high-hit.log" + json_file = out_dir / f"{mode}-streaming-queries-high-hit.json" + + for dataset in datasets: + suffix = f".k{k}.canon.sshash" if canonical else f".k{k}.sshash" + index_path = index_dir / f"{dataset}{suffix}" + + print(f"\n>>> Benchmarking {dataset} (k={k}, mode={mode})\n") + for i in range(runs): + print(f" ==> run {i+1}/{runs}") + cmd = ["./sshash", "query", "-i", str(index_path), "-q", str(query_dir) + "/" + queries[dataset] + ".fastq.gz"] + # Append stdout to .log, stderr to .json + with open(log_file, "a") as log, open(json_file, "a") as js: + subprocess.run(cmd, stdout=log, stderr=js, check=True) + +# ------------------------------ +# Prepare directories +# ------------------------------ +results_dir.mkdir(parents=True, exist_ok=True) +(index_dir).mkdir(parents=True, exist_ok=True) + +(results_dir / "k31").mkdir(exist_ok=True) +(results_dir / "k63").mkdir(exist_ok=True) + +# ------------------------------ +# Run benchmarks +# ------------------------------ + +# --- Build for k=31 --- +build_project(max_k63=False) +run_bench(31, False) +run_bench(31, True) + +# --- Build for k=63 --- +build_project(max_k63=True) +run_bench(63, False) +run_bench(63, True) + +# --- Restore to default --- +build_project(max_k63=False) + +print("\n All SSHash benchmark runs completed successfully. \n") diff --git a/script/streaming-query-high-hit.sh b/script/streaming-query-high-hit.sh deleted file mode 100644 index 07eb4fd..0000000 --- a/script/streaming-query-high-hit.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -echo "output log file =" $1 - -### regular indexes - -./sshash query -i cod.k31.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.regular.high-hit.streaming_query_log -# ./sshash query -i cod.k63.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.regular.high-hit.streaming_query_log - -./sshash query -i kestrel.k31.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.regular.high-hit.streaming_query_log -# ./sshash query -i kestrel.k63.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.regular.high-hit.streaming_query_log - -./sshash query -i human.k31.sshash -q ~/sshash_queries/SRR5833294.fastq.gz >> $1.regular.high-hit.streaming_query_log -# ./sshash query -i human.k63.sshash -q ~/sshash_queries/SRR5833294.fastq.gz >> $1.regular.high-hit.streaming_query_log - -### canonical indexes - -./sshash query -i cod.k31.canon.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.canon.high-hit.streaming_query_log -# ./sshash query -i cod.k63.canon.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.canon.high-hit.streaming_query_log - -./sshash query -i kestrel.k31.canon.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.canon.high-hit.streaming_query_log -# ./sshash query -i kestrel.k63.canon.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.canon.high-hit.streaming_query_log - -./sshash query -i human.k31.canon.sshash -q ~/sshash_queries/SRR5833294.fastq.gz >> $1.canon.high-hit.streaming_query_log -# ./sshash query -i human.k63.canon.sshash -q ~/sshash_queries/SRR5833294.fastq.gz >> $1.canon.high-hit.streaming_query_log diff --git a/tools/query.cpp b/tools/query.cpp index 1fa46ba..67eec13 100644 --- a/tools/query.cpp +++ b/tools/query.cpp @@ -26,12 +26,23 @@ int query(int argc, char** argv) { load_dictionary(dict, index_filename, verbose); essentials::logger("performing queries from file '" + query_filename + "'..."); - essentials::timer t; + essentials::timer t; t.start(); auto report = dict.streaming_query_from_file(query_filename, multiline); t.stop(); essentials::logger("DONE"); + essentials::json_lines query_stats; + query_stats.add("index_filename", index_filename.c_str()); + query_stats.add("query_filename", query_filename.c_str()); + query_stats.add("num_kmers", report.num_kmers); + query_stats.add("num_positive_kmers", report.num_positive_kmers); + query_stats.add("num_negative_kmers", report.num_negative_kmers); + query_stats.add("num_invalid_kmers", report.num_invalid_kmers); + query_stats.add("num_searches", report.num_searches); + query_stats.add("num_extensions", report.num_extensions); + query_stats.add("elapsed_millisec", uint64(t.elapsed())); + std::cout << "==== query report:\n"; std::cout << "num_kmers = " << report.num_kmers << std::endl; std::cout << "num_positive_kmers = " << report.num_positive_kmers << " (" @@ -46,10 +57,11 @@ int query(int argc, char** argv) { std::cout << "num_extensions = " << report.num_extensions << "/" << report.num_positive_kmers << " (" << (report.num_extensions * 100.0) / report.num_positive_kmers << "%)" << std::endl; - std::cout << "elapsed = " << t.elapsed() / 1000 << " millisec / "; - std::cout << t.elapsed() / 1'000'000 << " sec / "; - std::cout << t.elapsed() / 1'000'000 / 60 << " min / "; - std::cout << (t.elapsed() * 1000) / report.num_kmers << " ns/kmer" << std::endl; + std::cout << "elapsed = " << t.elapsed() / 1000 << " sec / "; + std::cout << t.elapsed() / 1000 / 60 << " min / "; + std::cout << (t.elapsed() * 1e6) / report.num_kmers << " ns/kmer" << std::endl; + + query_stats.print(); return 0; } \ No newline at end of file From c4218d1b3a183a8c021978db364020d1e77860c4 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Tue, 11 Nov 2025 20:48:31 +0100 Subject: [PATCH 097/112] different query file for SE --- script/streaming-query-high-hit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/streaming-query-high-hit.py b/script/streaming-query-high-hit.py index 5e44150..27c774e 100644 --- a/script/streaming-query-high-hit.py +++ b/script/streaming-query-high-hit.py @@ -24,7 +24,7 @@ "cod", "kestrel", "human", "ncbi-virus", "se", "hprc" ] -queries = {"cod":"SRR12858649", "kestrel":"SRR11449743_1", "human":"SRR5833294", "ncbi-virus":"ncbi-queries", "se":"SRR801268_1", "hprc":"SRR5833294"} +queries = {"cod":"SRR12858649", "kestrel":"SRR11449743_1", "human":"SRR5833294", "ncbi-virus":"ncbi-queries", "se":"SRR27871075_1", "hprc":"SRR5833294"} # ------------------------------ # Utility functions From 0502751cb5ac4c057ba65969b89ce4db501fa5c9 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 12 Nov 2025 14:13:01 +0100 Subject: [PATCH 098/112] results updated --- benchmarks/README.md | 4 +- .../k31/canon-streaming-queries-high-hit.json | 6 ++ .../k31/canon-streaming-queries-high-hit.log | 66 +++++++++++++++++++ .../regular-streaming-queries-high-hit.json | 6 ++ .../regular-streaming-queries-high-hit.log | 66 +++++++++++++++++++ .../k63/canon-streaming-queries-high-hit.json | 6 ++ .../k63/canon-streaming-queries-high-hit.log | 66 +++++++++++++++++++ .../regular-streaming-queries-high-hit.json | 6 ++ .../regular-streaming-queries-high-hit.log | 66 +++++++++++++++++++ 9 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.json create mode 100644 benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.log create mode 100644 benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.json create mode 100644 benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.log create mode 100644 benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.json create mode 100644 benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.log create mode 100644 benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.json create mode 100644 benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.log diff --git a/benchmarks/README.md b/benchmarks/README.md index a921284..61831a8 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -1,8 +1,10 @@ -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7239205.svg)](https://doi.org/10.5281/zenodo.7239205) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17582116.svg)](https://doi.org/10.5281/zenodo.17582116) Benchmarks ---------- +UPDATE + For these benchmarks we used the whole genomes of the following organisms: - Gadus Morhua ("Cod") diff --git a/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.json b/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.json new file mode 100644 index 0000000..5ba1b3d --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.json @@ -0,0 +1,6 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz", "num_kmers": "163287360", "num_positive_kmers": "132860997", "num_negative_kmers": "30426363", "num_invalid_kmers": "0", "num_searches": "6576340", "num_extensions": "126284657", "elapsed_millisec": "4862"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz", "num_kmers": "695737535", "num_positive_kmers": "525542891", "num_negative_kmers": "170183654", "num_invalid_kmers": "10990", "num_searches": "12437476", "num_extensions": "513105415", "elapsed_millisec": "34000"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "1569974986", "num_positive_kmers": "1437949378", "num_negative_kmers": "130996597", "num_invalid_kmers": "1029011", "num_searches": "100222623", "num_extensions": "1337726755", "elapsed_millisec": "134221"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz", "num_kmers": "14092875", "num_positive_kmers": "13983775", "num_negative_kmers": "108161", "num_invalid_kmers": "939", "num_searches": "590894", "num_extensions": "13392881", "elapsed_millisec": "405"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz", "num_kmers": "789838196", "num_positive_kmers": "764882549", "num_negative_kmers": "24935381", "num_invalid_kmers": "20266", "num_searches": "218875709", "num_extensions": "546006840", "elapsed_millisec": "182160"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "1569974986", "num_positive_kmers": "1485223278", "num_negative_kmers": "83722697", "num_invalid_kmers": "1029011", "num_searches": "135823240", "num_extensions": "1349400038", "elapsed_millisec": "170163"} diff --git a/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.log b/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.log new file mode 100644 index 0000000..a6cde44 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/canon-streaming-queries-high-hit.log @@ -0,0 +1,66 @@ +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz +2025-11-11 21:00:50: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-11 21:00:54: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 6576340/132860997 (4.94979%) +num_extensions = 126284657/132860997 (95.0502%) +elapsed = 4.862 sec / 0.0810333 min / 29.7757 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz +2025-11-11 21:00:55: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-11 21:01:29: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 12437476/525542891 (2.3666%) +num_extensions = 513105415/525542891 (97.6334%) +elapsed = 34 sec / 0.566667 min / 48.869 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:01:30: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:03:45: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437949378 (91.5906%) +num_negative_kmers = 130996597 (8.34387%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 100222623/1437949378 (6.96983%) +num_extensions = 1337726755/1437949378 (93.0302%) +elapsed = 134.221 sec / 2.23702 min / 85.4924 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz +2025-11-11 21:03:45: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-11 21:03:45: DONE +==== query report: +num_kmers = 14092875 +num_positive_kmers = 13983775 (99.2258%) +num_negative_kmers = 108161 (0.767487%) +num_invalid_kmers = 939 (0.00666294%) +num_searches = 590894/13983775 (4.22557%) +num_extensions = 13392881/13983775 (95.7744%) +elapsed = 0.405 sec / 0.00675 min / 28.7379 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz +2025-11-11 21:03:46: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-11 21:06:48: DONE +==== query report: +num_kmers = 789838196 +num_positive_kmers = 764882549 (96.8404%) +num_negative_kmers = 24935381 (3.15702%) +num_invalid_kmers = 20266 (0.00256584%) +num_searches = 218875709/764882549 (28.6156%) +num_extensions = 546006840/764882549 (71.3844%) +elapsed = 182.16 sec / 3.036 min / 230.63 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:06:50: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:09:40: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1485223278 (94.6017%) +num_negative_kmers = 83722697 (5.33274%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 135823240/1485223278 (9.14497%) +num_extensions = 1349400038/1485223278 (90.855%) +elapsed = 170.163 sec / 2.83605 min / 108.386 ns/kmer diff --git a/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.json b/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.json new file mode 100644 index 0000000..d2d7949 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.json @@ -0,0 +1,6 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz", "num_kmers": "163287360", "num_positive_kmers": "132860997", "num_negative_kmers": "30426363", "num_invalid_kmers": "0", "num_searches": "6576340", "num_extensions": "126284657", "elapsed_millisec": "5660"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz", "num_kmers": "695737535", "num_positive_kmers": "525542891", "num_negative_kmers": "170183654", "num_invalid_kmers": "10990", "num_searches": "12437476", "num_extensions": "513105415", "elapsed_millisec": "44876"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "1569974986", "num_positive_kmers": "1437949378", "num_negative_kmers": "130996597", "num_invalid_kmers": "1029011", "num_searches": "100222623", "num_extensions": "1337726755", "elapsed_millisec": "177288"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz", "num_kmers": "14092875", "num_positive_kmers": "13983775", "num_negative_kmers": "108161", "num_invalid_kmers": "939", "num_searches": "590894", "num_extensions": "13392881", "elapsed_millisec": "441"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz", "num_kmers": "789838196", "num_positive_kmers": "764882549", "num_negative_kmers": "24935381", "num_invalid_kmers": "20266", "num_searches": "218875709", "num_extensions": "546006840", "elapsed_millisec": "202642"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "1569974986", "num_positive_kmers": "1485223278", "num_negative_kmers": "83722697", "num_invalid_kmers": "1029011", "num_searches": "135823240", "num_extensions": "1349400038", "elapsed_millisec": "231629"} diff --git a/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.log b/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.log new file mode 100644 index 0000000..00ceb86 --- /dev/null +++ b/benchmarks/results-10-11-25/k31/regular-streaming-queries-high-hit.log @@ -0,0 +1,66 @@ +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz +2025-11-11 20:49:42: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-11 20:49:48: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_negative_kmers = 30426363 (18.6336%) +num_invalid_kmers = 0 (0%) +num_searches = 6576340/132860997 (4.94979%) +num_extensions = 126284657/132860997 (95.0502%) +elapsed = 5.66 sec / 0.0943333 min / 34.6628 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz +2025-11-11 20:49:48: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-11 20:50:33: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_negative_kmers = 170183654 (24.4609%) +num_invalid_kmers = 10990 (0.00157962%) +num_searches = 12437476/525542891 (2.3666%) +num_extensions = 513105415/525542891 (97.6334%) +elapsed = 44.876 sec / 0.747933 min / 64.5013 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 20:50:34: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 20:53:32: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437949378 (91.5906%) +num_negative_kmers = 130996597 (8.34387%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 100222623/1437949378 (6.96983%) +num_extensions = 1337726755/1437949378 (93.0302%) +elapsed = 177.288 sec / 2.9548 min / 112.924 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz +2025-11-11 20:53:32: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-11 20:53:32: DONE +==== query report: +num_kmers = 14092875 +num_positive_kmers = 13983775 (99.2258%) +num_negative_kmers = 108161 (0.767487%) +num_invalid_kmers = 939 (0.00666294%) +num_searches = 590894/13983775 (4.22557%) +num_extensions = 13392881/13983775 (95.7744%) +elapsed = 0.441 sec / 0.00735 min / 31.2924 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz +2025-11-11 20:53:33: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-11 20:56:55: DONE +==== query report: +num_kmers = 789838196 +num_positive_kmers = 764882549 (96.8404%) +num_negative_kmers = 24935381 (3.15702%) +num_invalid_kmers = 20266 (0.00256584%) +num_searches = 218875709/764882549 (28.6156%) +num_extensions = 546006840/764882549 (71.3844%) +elapsed = 202.642 sec / 3.37737 min / 256.561 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k31.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 20:56:57: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:00:49: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1485223278 (94.6017%) +num_negative_kmers = 83722697 (5.33274%) +num_invalid_kmers = 1029011 (0.0655431%) +num_searches = 135823240/1485223278 (9.14497%) +num_extensions = 1349400038/1485223278 (90.855%) +elapsed = 231.629 sec / 3.86048 min / 147.537 ns/kmer diff --git a/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.json b/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.json new file mode 100644 index 0000000..272aaaa --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.json @@ -0,0 +1,6 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz", "num_kmers": "97972416", "num_positive_kmers": "67275966", "num_negative_kmers": "30696450", "num_invalid_kmers": "0", "num_searches": "34801398", "num_extensions": "32474568", "elapsed_millisec": "6369"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz", "num_kmers": "461383839", "num_positive_kmers": "293470517", "num_negative_kmers": "167902332", "num_invalid_kmers": "10990", "num_searches": "149919071", "num_extensions": "143551446", "elapsed_millisec": "31852"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "477818474", "num_positive_kmers": "406529529", "num_negative_kmers": "70615167", "num_invalid_kmers": "673778", "num_searches": "219935013", "num_extensions": "186594516", "elapsed_millisec": "70259"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz", "num_kmers": "10330949", "num_positive_kmers": "10230224", "num_negative_kmers": "99451", "num_invalid_kmers": "1274", "num_searches": "5430984", "num_extensions": "4799240", "elapsed_millisec": "797"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz", "num_kmers": "541466405", "num_positive_kmers": "507202856", "num_negative_kmers": "34238416", "num_invalid_kmers": "25133", "num_searches": "319174875", "num_extensions": "188027981", "elapsed_millisec": "312834"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "477818474", "num_positive_kmers": "434532302", "num_negative_kmers": "42612394", "num_invalid_kmers": "673778", "num_searches": "238897243", "num_extensions": "195635059", "elapsed_millisec": "89038"} diff --git a/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.log b/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.log new file mode 100644 index 0000000..e019f29 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/canon-streaming-queries-high-hit.log @@ -0,0 +1,66 @@ +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz +2025-11-11 21:19:51: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-11 21:19:57: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34801398/67275966 (51.7293%) +num_extensions = 32474568/67275966 (48.2707%) +elapsed = 6.369 sec / 0.10615 min / 65.0081 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz +2025-11-11 21:19:58: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-11 21:20:29: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149919071/293470517 (51.0849%) +num_extensions = 143551446/293470517 (48.9151%) +elapsed = 31.852 sec / 0.530867 min / 69.0358 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:20:30: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:21:40: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406529529 (85.0803%) +num_negative_kmers = 70615167 (14.7787%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 219935013/406529529 (54.1006%) +num_extensions = 186594516/406529529 (45.8994%) +elapsed = 70.259 sec / 1.17098 min / 147.041 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz +2025-11-11 21:21:41: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-11 21:21:41: DONE +==== query report: +num_kmers = 10330949 +num_positive_kmers = 10230224 (99.025%) +num_negative_kmers = 99451 (0.962651%) +num_invalid_kmers = 1274 (0.0123319%) +num_searches = 5430984/10230224 (53.0876%) +num_extensions = 4799240/10230224 (46.9124%) +elapsed = 0.797 sec / 0.0132833 min / 77.1468 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz +2025-11-11 21:21:42: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-11 21:26:55: DONE +==== query report: +num_kmers = 541466405 +num_positive_kmers = 507202856 (93.6721%) +num_negative_kmers = 34238416 (6.32328%) +num_invalid_kmers = 25133 (0.00464165%) +num_searches = 319174875/507202856 (62.9284%) +num_extensions = 188027981/507202856 (37.0716%) +elapsed = 312.834 sec / 5.2139 min / 577.753 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.canon.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:26:57: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:28:26: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 434532302 (90.9409%) +num_negative_kmers = 42612394 (8.91811%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 238897243/434532302 (54.978%) +num_extensions = 195635059/434532302 (45.022%) +elapsed = 89.038 sec / 1.48397 min / 186.343 ns/kmer diff --git a/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.json b/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.json new file mode 100644 index 0000000..e173a34 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.json @@ -0,0 +1,6 @@ +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz", "num_kmers": "97972416", "num_positive_kmers": "67275966", "num_negative_kmers": "30696450", "num_invalid_kmers": "0", "num_searches": "34801398", "num_extensions": "32474568", "elapsed_millisec": "7710"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz", "num_kmers": "461383839", "num_positive_kmers": "293470517", "num_negative_kmers": "167902332", "num_invalid_kmers": "10990", "num_searches": "149919071", "num_extensions": "143551446", "elapsed_millisec": "39619"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "477818474", "num_positive_kmers": "406529529", "num_negative_kmers": "70615167", "num_invalid_kmers": "673778", "num_searches": "219935013", "num_extensions": "186594516", "elapsed_millisec": "89746"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz", "num_kmers": "10330949", "num_positive_kmers": "10230224", "num_negative_kmers": "99451", "num_invalid_kmers": "1274", "num_searches": "5430984", "num_extensions": "4799240", "elapsed_millisec": "961"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz", "num_kmers": "541466405", "num_positive_kmers": "507202856", "num_negative_kmers": "34238416", "num_invalid_kmers": "25133", "num_searches": "319174875", "num_extensions": "188027981", "elapsed_millisec": "342924"} +{"index_filename": "/mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash", "query_filename": "/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz", "num_kmers": "477818474", "num_positive_kmers": "434532302", "num_negative_kmers": "42612394", "num_invalid_kmers": "673778", "num_searches": "238897243", "num_extensions": "195635059", "elapsed_millisec": "113149"} diff --git a/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.log b/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.log new file mode 100644 index 0000000..2ce58c3 --- /dev/null +++ b/benchmarks/results-10-11-25/k63/regular-streaming-queries-high-hit.log @@ -0,0 +1,66 @@ +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/cod.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz +2025-11-11 21:09:53: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-11 21:10:00: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_negative_kmers = 30696450 (31.3317%) +num_invalid_kmers = 0 (0%) +num_searches = 34801398/67275966 (51.7293%) +num_extensions = 32474568/67275966 (48.2707%) +elapsed = 7.71 sec / 0.1285 min / 78.6956 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/kestrel.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz +2025-11-11 21:10:01: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-11 21:10:40: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_negative_kmers = 167902332 (36.391%) +num_invalid_kmers = 10990 (0.00238196%) +num_searches = 149919071/293470517 (51.0849%) +num_extensions = 143551446/293470517 (48.9151%) +elapsed = 39.619 sec / 0.660317 min / 85.8699 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/human.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:10:41: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:12:11: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406529529 (85.0803%) +num_negative_kmers = 70615167 (14.7787%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 219935013/406529529 (54.1006%) +num_extensions = 186594516/406529529 (45.8994%) +elapsed = 89.746 sec / 1.49577 min / 187.824 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/ncbi-virus.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz +2025-11-11 21:12:11: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-11 21:12:12: DONE +==== query report: +num_kmers = 10330949 +num_positive_kmers = 10230224 (99.025%) +num_negative_kmers = 99451 (0.962651%) +num_invalid_kmers = 1274 (0.0123319%) +num_searches = 5430984/10230224 (53.0876%) +num_extensions = 4799240/10230224 (46.9124%) +elapsed = 0.961 sec / 0.0160167 min / 93.0215 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/se.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz +2025-11-11 21:12:12: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-11 21:17:55: DONE +==== query report: +num_kmers = 541466405 +num_positive_kmers = 507202856 (93.6721%) +num_negative_kmers = 34238416 (6.32328%) +num_invalid_kmers = 25133 (0.00464165%) +num_searches = 319174875/507202856 (62.9284%) +num_extensions = 188027981/507202856 (37.0716%) +elapsed = 342.924 sec / 5.7154 min / 633.325 ns/kmer +./sshash query -i /mnt/hd2/pibiri/DNA/sshash-indexes/hprc.k63.sshash -q /mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz +2025-11-11 21:17:57: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-11 21:19:51: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 434532302 (90.9409%) +num_negative_kmers = 42612394 (8.91811%) +num_invalid_kmers = 673778 (0.141011%) +num_searches = 238897243/434532302 (54.978%) +num_extensions = 195635059/434532302 (45.022%) +elapsed = 113.149 sec / 1.88582 min / 236.803 ns/kmer From 71a6a932947d876858e5c22fedd4f31656ddfcbc Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 12 Nov 2025 20:53:31 +0100 Subject: [PATCH 099/112] benchmarks subfolder refactored --- benchmarks/README.md | 75 +- benchmarks/download-datasets.sh | 35 - benchmarks/print.py | 69 +- benchmarks/results-10-11-25/results.png | Bin 0 -> 597336 bytes .../k31/14-09-25.canon.bench_log | 9 - .../k31/14-09-25.canon.build_log | 536 ---- ...4-09-25.canon.high-hit.streaming_query_log | 30 - ...14-09-25.canon.low-hit.streaming_query_log | 30 - .../k31/14-09-25.regular.bench_log | 9 - .../k31/14-09-25.regular.build_log | 516 ---- ...09-25.regular.high-hit.streaming_query_log | 30 - ...-09-25.regular.low-hit.streaming_query_log | 30 - .../k63/14-09-25.canon.bench_log | 9 - .../k63/14-09-25.canon.build_log | 389 --- ...4-09-25.canon.high-hit.streaming_query_log | 30 - ...14-09-25.canon.low-hit.streaming_query_log | 30 - .../k63/14-09-25.regular.bench_log | 9 - .../k63/14-09-25.regular.build_log | 378 --- ...09-25.regular.high-hit.streaming_query_log | 30 - ...-09-25.regular.low-hit.streaming_query_log | 30 - benchmarks/results-14-09-25/results.png | Bin 325036 -> 0 bytes .../results-21-10-25/k31/canon-bench.log | 60 - .../results-21-10-25/k31/canon-build.log | 1512 ----------- .../results-21-10-25/k31/regular-bench.log | 60 - .../results-21-10-25/k31/regular-build.log | 1473 ----------- .../results-21-10-25/k63/canon-bench.log | 60 - .../results-21-10-25/k63/canon-build.log | 1358 ---------- .../results-21-10-25/k63/regular-bench.log | 60 - .../results-21-10-25/k63/regular-build.log | 1339 ---------- .../k31/22-08-25.canon.bench_log | 18 - .../k31/22-08-25.canon.build_log | 519 ---- ...2-08-25.canon.high-hit.streaming_query_log | 30 - ...22-08-25.canon.low-hit.streaming_query_log | 30 - .../k31/22-08-25.regular.bench_log | 18 - .../k31/22-08-25.regular.build_log | 497 ---- ...08-25.regular.high-hit.streaming_query_log | 30 - ...-08-25.regular.low-hit.streaming_query_log | 30 - .../k63/22-08-25.canon.bench_log | 18 - .../k63/22-08-25.canon.build_log | 365 --- ...2-08-25.canon.high-hit.streaming_query_log | 30 - ...22-08-25.canon.low-hit.streaming_query_log | 30 - .../k63/22-08-25.regular.bench_log | 18 - .../k63/22-08-25.regular.build_log | 369 --- ...08-25.regular.high-hit.streaming_query_log | 30 - ...-08-25.regular.low-hit.streaming_query_log | 30 - benchmarks/results-22-08-25/results.png | Bin 333308 -> 0 bytes .../k31/22-09-25.canon.bench_log | 15 - .../k31/22-09-25.canon.build_log | 530 ---- ...2-09-25.canon.high-hit.streaming_query_log | 30 - ...22-09-25.canon.low-hit.streaming_query_log | 30 - .../k31/22-09-25.regular.bench_log | 16 - .../k31/22-09-25.regular.build_log | 510 ---- ...09-25.regular.high-hit.streaming_query_log | 30 - ...-09-25.regular.low-hit.streaming_query_log | 30 - .../k63/22-09-25.canon.bench_log | 15 - .../k63/22-09-25.canon.build_log | 383 --- ...2-09-25.canon.high-hit.streaming_query_log | 30 - ...22-09-25.canon.low-hit.streaming_query_log | 30 - .../k63/22-09-25.regular.bench_log | 15 - .../k63/22-09-25.regular.build_log | 372 --- ...09-25.regular.high-hit.streaming_query_log | 30 - ...-09-25.regular.low-hit.streaming_query_log | 30 - benchmarks/results-22-09-25/results.png | Bin 404609 -> 0 bytes .../k31/canon-bench.log | 90 - .../k31/canon-build.log | 2284 ---------------- .../k31/regular-bench.log | 90 - .../k31/regular-build.log | 2206 ---------------- .../k63/canon-bench.log | 90 - .../k63/canon-build.log | 2131 --------------- .../k63/regular-bench.log | 90 - .../k63/regular-build.log | 2101 --------------- .../results-22-10-25/k31/canon-bench.log | 90 - .../results-22-10-25/k31/canon-build.log | 2285 ----------------- .../results-22-10-25/k31/regular-bench.log | 90 - .../results-22-10-25/k31/regular-build.log | 2206 ---------------- .../results-22-10-25/k63/canon-bench.log | 90 - .../results-22-10-25/k63/canon-build.log | 2131 --------------- .../results-22-10-25/k63/regular-bench.log | 90 - .../results-22-10-25/k63/regular-build.log | 2101 --------------- script/build.py | 13 +- script/streaming-query-high-hit.py | 2 +- script/streaming-query-low-hit.sh | 25 - 82 files changed, 81 insertions(+), 30478 deletions(-) delete mode 100644 benchmarks/download-datasets.sh create mode 100644 benchmarks/results-10-11-25/results.png delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.build_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.build_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.build_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.build_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-14-09-25/results.png delete mode 100644 benchmarks/results-21-10-25/k31/canon-bench.log delete mode 100644 benchmarks/results-21-10-25/k31/canon-build.log delete mode 100644 benchmarks/results-21-10-25/k31/regular-bench.log delete mode 100644 benchmarks/results-21-10-25/k31/regular-build.log delete mode 100644 benchmarks/results-21-10-25/k63/canon-bench.log delete mode 100644 benchmarks/results-21-10-25/k63/canon-build.log delete mode 100644 benchmarks/results-21-10-25/k63/regular-bench.log delete mode 100644 benchmarks/results-21-10-25/k63/regular-build.log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.canon.bench_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.canon.build_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.regular.bench_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.regular.build_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k31/22-08-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.canon.bench_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.canon.build_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.regular.bench_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.regular.build_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/k63/22-08-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-08-25/results.png delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.build_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.build_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.build_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.build_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log delete mode 100644 benchmarks/results-22-09-25/results.png delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log delete mode 100644 benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log delete mode 100644 benchmarks/results-22-10-25/k31/canon-bench.log delete mode 100644 benchmarks/results-22-10-25/k31/canon-build.log delete mode 100644 benchmarks/results-22-10-25/k31/regular-bench.log delete mode 100644 benchmarks/results-22-10-25/k31/regular-build.log delete mode 100644 benchmarks/results-22-10-25/k63/canon-bench.log delete mode 100644 benchmarks/results-22-10-25/k63/canon-build.log delete mode 100644 benchmarks/results-22-10-25/k63/regular-bench.log delete mode 100644 benchmarks/results-22-10-25/k63/regular-build.log delete mode 100644 script/streaming-query-low-hit.sh diff --git a/benchmarks/README.md b/benchmarks/README.md index 61831a8..69c06db 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -3,73 +3,24 @@ Benchmarks ---------- -UPDATE - -For these benchmarks we used the whole genomes of the following organisms: - -- Gadus Morhua ("Cod") -- Falco Tinnunculus ("Kestrel") -- Homo Sapiens ("Human") - -for k = 31 and 63. - -The datasets and queries used in these benchmarks can be downloaded -by running the script - -``` -bash download-datasets.sh -``` +For these benchmarks we used the datasets available here +[https://zenodo.org/records/17582116](https://zenodo.org/records/17582116). To run the benchmarks, from within the `build` directory, run -``` -bash ../script/build.sh [prefix] -bash ../script/bench.sh [prefix] -bash ../script/streaming-query-high-hit.sh [prefix] -bash ../script/streaming-query-low-hit.sh [prefix] -``` - -where `[prefix]` should be replaced by a suitable basename, e.g., the current date. - -These are the results obtained on 22/09/25 (see logs [here](results-22-09-25)) -on a machine equipped with an Intel Xeon W-2245 CPU @ 3.90GHz, and running Ubuntu 18.04.6. -The code was compiled with `gcc` 10.3. - -![](results-22-09-25/results.png) - - -## Linux with Intel x86 vs. Apple with M1 arm - -Very interestingly, random lookup queries on an Apple M1 arm processor are much faster than -the same queries (actually, the queries are random, drawn uniformly from the set of indexed -kmers using a randomly generated seed) under Linux with an Intel x86 processor. -This matches the same observation made for PTHash, [here](https://github.com/jermp/pthash/tree/master/benchmarks). -(The performance for streaming queries is the same, instead.) - -For access queries and negative lookups, the trend is the opposite. - -#### Linux, Intel x86 - -Taken from [these logs](results-22-09-25). + python3 ../script/build.py + python3 ../script/bench.py + python3 ../script/streaming-query-high-hit.py - ./sshash bench -i human.k31.sshash - avg_nanosec_per_positive_lookup 880.499 - avg_nanosec_per_negative_lookup 744.67 - avg_nanosec_per_access 512.398 +where `` should be replaced by a suitable basename, e.g., the current date. - ./sshash bench -i human.k31.canon.sshash - avg_nanosec_per_positive_lookup 702.591 - avg_nanosec_per_negative_lookup 427.235 - avg_nanosec_per_access 510.499 +These are the results obtained on 10/11/25 (see logs [here](results-10-11-25)) +on a machine equipped with an AMD Ryzen Threadripper PRO 7985WX processor clocked at 5.40GHz. +The code was compiled with `gcc` 13.3.0. -#### Apple, M1 arm +![](results-10-11-25/results.png) - ./sshash bench -i human.k31.sshash - avg_nanosec_per_positive_lookup 578.065 - avg_nanosec_per_negative_lookup 656.382 - avg_nanosec_per_access 882.288 +The results can be exported in CSV format using - ./sshash bench -i human.k31.canon.sshash - avg_nanosec_per_positive_lookup 622.091 - avg_nanosec_per_negative_lookup 878.432 - avg_nanosec_per_access 886.565 + python3 ../script/print_csv.py ../benchmarks/results-10-11-25/k31 + python3 ../script/print_csv.py ../benchmarks/results-10-11-25/k63 diff --git a/benchmarks/download-datasets.sh b/benchmarks/download-datasets.sh deleted file mode 100644 index 274ed3f..0000000 --- a/benchmarks/download-datasets.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# inputs to index -wget https://zenodo.org/records/7239205/files/cod.k31.unitigs.fa.ust.fa.gz -wget https://zenodo.org/records/7239205/files/cod.k63.unitigs.fa.ust.fa.gz -wget https://zenodo.org/records/7239205/files/kestrel.k31.unitigs.fa.ust.fa.gz -wget https://zenodo.org/records/7239205/files/kestrel.k63.unitigs.fa.ust.fa.gz -wget https://zenodo.org/records/7239205/files/human.k31.unitigs.fa.ust.fa.gz -wget https://zenodo.org/records/7239205/files/human.k63.unitigs.fa.ust.fa.gz - -# queries - -# axolotl -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR216/001/ERR2163351/ERR2163351.fastq.gz - -# ncbi-virus: it's actually low hit... -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR321/ERR321482/ERR321482_1.fastq.gz - -# for jgi-fungi: it's actually low hit... -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR106/023/SRR10664323/SRR10664323_1.fastq.gz - -# kestrel -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR114/043/SRR11449743/SRR11449743_1.fastq.gz - -# cod -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR128/049/SRR12858649/SRR12858649.fastq.gz - -# human, hprc -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR583/004/SRR5833294/SRR5833294.fastq.gz - -# EC -wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR590/005/SRR5901135/SRR5901135_1.fastq.gz - -# SE -wget wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR801/SRR801268/SRR801268_1.fastq.gz diff --git a/benchmarks/print.py b/benchmarks/print.py index 8e56c20..6e60816 100644 --- a/benchmarks/print.py +++ b/benchmarks/print.py @@ -4,6 +4,7 @@ import json import os from statistics import mean, StatisticsError +import math def format_time(microseconds): seconds = microseconds / 1_000_000 @@ -92,31 +93,83 @@ def parse_bench_file(path, canonical_flag): lookup_data[k] = {"k": v["k"], "pos": "NA", "neg": "NA", "access": "NA", "iter": "NA"} return lookup_data + +def parse_streaming_file(path, canonical_flag): + """Parse streaming queries JSON file.""" + stream_data = {} + if not os.path.exists(path): + return stream_data + + with open(path) as f: + for line in f: + line = line.strip() + if not line: + continue + try: + d = json.loads(line) + except json.JSONDecodeError: + print(f"Skipping invalid JSON line in {path}", file=sys.stderr) + continue + + fname = os.path.basename(d["index_filename"]) + collection = fname.split(".")[0].capitalize() + canonical = "yes" if canonical_flag else "no" + + key = (collection, canonical) + num_kmers = int(d["num_kmers"]) + num_pos = int(d["num_positive_kmers"]) + num_ext = int(d["num_extensions"]) + elapsed_ms = int(d["elapsed_millisec"]) + + ns_per_kmer = int(math.ceil(elapsed_ms * 1e6 / num_kmers)) + hit_rate = (num_pos / num_kmers) * 100 if num_kmers else 0 + extension_rate = (num_ext / num_pos) * 100 if num_pos else 0 + + stream_data[key] = { + "ns_per_kmer": f"{ns_per_kmer}", + "hit_rate": f"{hit_rate:.2f}", + "extension_rate": f"{extension_rate:.2f}" + } + return stream_data + + def main(): - if len(sys.argv) != 5: - print("Usage: index_stats_csv.py regular-build.json canon-build.json regular-bench.json canon-bench.json", file=sys.stderr) + if len(sys.argv) != 2: + print("Usage: print.py input_dir", file=sys.stderr) sys.exit(1) - reg_build_path, canon_build_path, reg_bench_path, canon_bench_path = sys.argv[1:] + input_dir = sys.argv[1] + reg_build_path = input_dir + "/regular-build.json" + canon_build_path = input_dir + "/canon-build.json" + reg_bench_path = input_dir + "/regular-bench.json" + canon_bench_path = input_dir + "/canon-bench.json" + reg_stream_path = input_dir + "/regular-streaming-queries-high-hit.json" + canon_stream_path = input_dir + "/canon-streaming-queries-high-hit.json" reg_build = parse_build_file(reg_build_path, False) canon_build = parse_build_file(canon_build_path, True) reg_bench = parse_bench_file(reg_bench_path, False) canon_bench = parse_bench_file(canon_bench_path, True) + reg_stream = parse_streaming_file(reg_stream_path, False) + canon_stream = parse_streaming_file(canon_stream_path, True) # merge everything all_builds = reg_build + canon_build lookup_all = {**reg_bench, **canon_bench} + stream_all = {**reg_stream, **canon_stream} # CSV header - print("k,Collection,m,canonical,bits_per_kmer,total_GB,build_time,positive_lookup_ns,negative_lookup_ns,access_ns,iteration_ns") + print("k,Collection,m,canonical,bits_per_kmer,total_GB,build_time,positive_lookup_ns,negative_lookup_ns,access_ns,iteration_ns,ns_per_kmer,hit_rate,extension_rate") for r in sorted(all_builds, key=lambda x: (int(x["k"]), x["Collection"], x["canonical"])): - key = (r["Collection"], r["m"], r["canonical"]) - lookup = lookup_all.get(key, {"pos": "NA", "neg": "NA", "access": "NA", "iter": "NA", "k": r["k"]}) + lookup = lookup_all.get( + (r["Collection"], r["m"], r["canonical"]), # key + {"pos": "NA", "neg": "NA", "access": "NA", "iter": "NA", "k": r["k"]}) + stream = stream_all.get( + (r["Collection"], r["canonical"]), # key + {"ns_per_kmer": "NA", "hit_rate": "NA", "extension_rate": "NA"}) - print(f"{r['k']},{r['Collection']},{r['m']},{r['canonical']},{r['bits_per_kmer']},{r['total_GB']},{r['build_time']},{lookup['pos']},{lookup['neg']},{lookup['access']},{lookup['iter']}") + print(f"{r['k']},{r['Collection']},{r['m']},{r['canonical']},{r['bits_per_kmer']},{r['total_GB']},{r['build_time']},{lookup['pos']},{lookup['neg']},{lookup['access']},{lookup['iter']},{stream['ns_per_kmer']},{stream['hit_rate']},{stream['extension_rate']}") if __name__ == "__main__": main() - diff --git a/benchmarks/results-10-11-25/results.png b/benchmarks/results-10-11-25/results.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf8e474c969a7b21d8a2233e6470734e7fc4974 GIT binary patch literal 597336 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 z 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

    kG!0g*Spay+oDYfzCKEb_ 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


    fP+E{e2t3J8W_gI4 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

    NzqWIy6vVP+(@2(emjyFS}UO+ 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%0AW2 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 Fe*nh7oz?&V literal 0 HcmV?d00001 diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log deleted file mode 100644 index 0357d14..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.canon.bench_log +++ /dev/null @@ -1,9 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 653.172 -avg_nanosec_per_negative_lookup 374.88 -iterator: avg_nanosec_per_kmer 20.843 -lookup: avg_nanosec_per_positive_lookup 598.942 -avg_nanosec_per_negative_lookup 407.974 -iterator: avg_nanosec_per_kmer 20.694 -lookup: avg_nanosec_per_positive_lookup 868.734 -avg_nanosec_per_negative_lookup 433.989 -iterator: avg_nanosec_per_kmer 20.9212 diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log deleted file mode 100644 index 4c370fe..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.canon.build_log +++ /dev/null @@ -1,536 +0,0 @@ -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding input' 2.30442 [sec] (4.58623 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 2.07889 [sec] (4.13738 [ns/kmer]) -=== step 1: 'parse file' 4.38347 [sec] (8.72392 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 4.30239 [sec] (8.56257 [ns/kmer]) -num_minimizers = 79426371 -num_minimizer_positions = 88821250 -num_super_kmers = 92441796 -building minimizers MPHF with 8 threads and 27 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.36126 [sec] (10.6699 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757864109788551078.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75247 [sec] (7.46813 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.59288 [sec] (5.16032 [ns/kmer]) -num_bits_per_offset = ceil(log2(574653302)) = 30 -constants::min_l = 6 -min_size = 64 -max_bucket_size 155775 -log2_max_bucket_size 18 -num_buckets_larger_than_1_not_in_skew_index 3198593/79426371 (4.02712%) -num_buckets_in_skew_index 7428/79426371 (0.00935206%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 10916988/88821250 (12.291%) -num_minimizer_positions_of_buckets_in_skew_index 1683912/88821250 (1.89584%) -computing minimizers offsets: 1.26063 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2268785 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1392132 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1162932 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 935073 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 655983 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 438277 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 431217 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 155775: 832367 -num_kmers_in_skew_index 8116766 (1.61539%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2268785 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2268785)... - built mphs[0] for 2268785 kmers; bits/key = 2.56 - built positions[0] for 2268785 kmers; bits/key = 7.00016 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1392132 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1392132)... - built mphs[1] for 1392132 kmers; bits/key = 2.5606 - built positions[1] for 1392132 kmers; bits/key = 8.00025 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1162932 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1162932)... - built mphs[2] for 1162932 kmers; bits/key = 2.56092 - built positions[2] for 1162932 kmers; bits/key = 9.00031 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 935073 - building MPHF with 8 threads and 1 partitions (avg. partition size = 935073)... - built mphs[3] for 935073 kmers; bits/key = 2.4185 - built positions[3] for 935073 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 655983 - building MPHF with 8 threads and 1 partitions (avg. partition size = 655983)... - built mphs[4] for 655983 kmers; bits/key = 2.56224 - built positions[4] for 655983 kmers; bits/key = 11.0006 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 438277 - building MPHF with 8 threads and 1 partitions (avg. partition size = 438277)... - built mphs[5] for 438277 kmers; bits/key = 2.56404 - built positions[5] for 438277 kmers; bits/key = 12.0007 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 431217 - building MPHF with 8 threads and 1 partitions (avg. partition size = 431217)... - built mphs[6] for 431217 kmers; bits/key = 2.42117 - built positions[6] for 431217 kmers; bits/key = 13.0007 - lower = 8192; upper = 155775; num_bits_per_pos = 18; num_kmers_in_partition = 832367 - building MPHF with 8 threads and 1 partitions (avg. partition size = 832367)... - built mphs[7] for 832367 kmers; bits/key = 2.41872 - built positions[7] for 832367 kmers; bits/key = 18.0004 -computing skew index took: 6.00298 [sec] -=== step 3: 'build sparse and skew index' 7.33897 [sec] (14.6059 [ns/kmer]) -=== total_time 27.7314 [sec] (55.1908 [ns/kmer]) -total index size: 543132456 [B] -- 543.132 [MB] -SPACE BREAKDOWN: - minimizers: 0.452782 [bits/kmer] (2.86438 [bits/key]) -- 5.236% - pieces: 0.0549683 [bits/kmer] -- 0.635657% - offsets: 4.90028 [bits/kmer] -- 56.6671% - offsets2: 0.651806 [bits/kmer] -- 7.53753% - offsets3: 0.10054 [bits/kmer] -- 1.16265% - start_lists_of_size: 4.26696e-06 [bits/kmer] -- 4.93434e-05% - strings: 2.28734 [bits/kmer] -- 26.4509% - skew_index: 0.199768 [bits/kmer] -- 2.31013% - weights: 2.92956e-06 [bits/kmer] -- 3.38776e-05% - -------------- - total: 8.64748 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9635% -buckets with 2 minimizer positions = 2.5093% -buckets with 3 minimizer positions = 0.679399% -buckets with 4 minimizer positions = 0.290103% -buckets with 5 minimizer positions = 0.153452% -buckets with 6 minimizer positions = 0.0927941% -buckets with 7 minimizer positions = 0.0610528% -buckets with 8 minimizer positions = 0.0427541% -buckets with 9 minimizer positions = 0.0312239% -buckets with 10 minimizer positions = 0.0239568% -buckets with 11 minimizer positions = 0.0190289% -buckets with 12 minimizer positions = 0.0152078% -buckets with 13 minimizer positions = 0.0127741% -buckets with 14 minimizer positions = 0.0104008% -buckets with 15 minimizer positions = 0.00880816% -buckets with 16 minimizer positions = 0.00755039% -max_bucket_size 155775 -2025-09-14 17:35:37: saving data structure to disk... -2025-09-14 17:35:37: DONE -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding input' 4.30204 [sec] (3.73961 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 4.76409 [sec] (4.14125 [ns/kmer]) -=== step 1: 'parse file' 9.06626 [sec] (7.88097 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 9.60368 [sec] (8.34812 [ns/kmer]) -num_minimizers = 193802281 -num_minimizer_positions = 200287417 -num_super_kmers = 208975066 -building minimizers MPHF with 8 threads and 65 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 12.9909 [sec] (11.2925 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757864137927613060.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.50973 [sec] (7.3972 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.25649 [sec] (1.96148 [ns/kmer]) -num_bits_per_offset = ceil(log2(1170866587)) = 31 -constants::min_l = 6 -min_size = 64 -max_bucket_size 3788 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 3847569/193802281 (1.98531%) -num_buckets_in_skew_index 3592/193802281 (0.00185344%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 9809818/200287417 (4.89787%) -num_minimizer_positions_of_buckets_in_skew_index 526479/200287417 (0.262862%) -computing minimizers offsets: 2.00298 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1179637 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 821390 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 443904 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 212956 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 176522 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3788: 79585 -num_kmers_in_skew_index 2913994 (0.253303%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1179637 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1179637)... - built mphs[0] for 1179637 kmers; bits/key = 2.56086 - built positions[0] for 1179637 kmers; bits/key = 7.00028 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 821390 - building MPHF with 8 threads and 1 partitions (avg. partition size = 821390)... - built mphs[1] for 821390 kmers; bits/key = 2.56173 - built positions[1] for 821390 kmers; bits/key = 8.00041 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 443904 - building MPHF with 8 threads and 1 partitions (avg. partition size = 443904)... - built mphs[2] for 443904 kmers; bits/key = 2.42106 - built positions[2] for 443904 kmers; bits/key = 9.00072 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 212956 - building MPHF with 8 threads and 1 partitions (avg. partition size = 212956)... - built mphs[3] for 212956 kmers; bits/key = 2.42657 - built positions[3] for 212956 kmers; bits/key = 10.0017 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 176522 - building MPHF with 8 threads and 1 partitions (avg. partition size = 176522)... - built mphs[4] for 176522 kmers; bits/key = 2.42852 - built positions[4] for 176522 kmers; bits/key = 11.0019 - lower = 2048; upper = 3788; num_bits_per_pos = 12; num_kmers_in_partition = 79585 - building MPHF with 8 threads and 1 partitions (avg. partition size = 79585)... - built mphs[5] for 79585 kmers; bits/key = 2.44287 - built positions[5] for 79585 kmers; bits/key = 12.0047 -computing skew index took: 2.18121 [sec] -=== step 3: 'build sparse and skew index' 4.34837 [sec] (3.77988 [ns/kmer]) -=== total_time 46.7754 [sec] (40.6602 [ns/kmer]) -total index size: 1181985390 [B] -- 1181.99 [MB] -SPACE BREAKDOWN: - minimizers: 0.479119 [bits/kmer] (2.84403 [bits/key]) -- 5.82895% - pieces: 0.00841122 [bits/kmer] -- 0.102331% - offsets: 5.39089 [bits/kmer] -- 65.5853% - offsets2: 0.264347 [bits/kmer] -- 3.21604% - offsets3: 0.0141874 [bits/kmer] -- 0.172604% - start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.26737e-05% - strings: 2.03558 [bits/kmer] -- 24.7648% - skew_index: 0.0271139 [bits/kmer] -- 0.329867% - weights: 1.27956e-06 [bits/kmer] -- 1.5567e-05% - -------------- - total: 8.21965 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 98.0128% -buckets with 2 minimizer positions = 1.66457% -buckets with 3 minimizer positions = 0.165762% -buckets with 4 minimizer positions = 0.0545515% -buckets with 5 minimizer positions = 0.0276849% -buckets with 6 minimizer positions = 0.0167021% -buckets with 7 minimizer positions = 0.0112088% -buckets with 8 minimizer positions = 0.00793438% -buckets with 9 minimizer positions = 0.00591686% -buckets with 10 minimizer positions = 0.00451181% -buckets with 11 minimizer positions = 0.00358923% -buckets with 12 minimizer positions = 0.00282092% -buckets with 13 minimizer positions = 0.00235962% -buckets with 14 minimizer positions = 0.00195251% -buckets with 15 minimizer positions = 0.00164394% -buckets with 16 minimizer positions = 0.00140556% -max_bucket_size 3788 -2025-09-14 17:36:25: saving data structure to disk... -2025-09-14 17:36:25: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding input' 11.4321 [sec] (4.5629 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.13.bin'... -=== step 1.2: 'computing minimizers tuples' 11.1395 [sec] (4.4461 [ns/kmer]) -=== step 1: 'parse file' 22.5717 [sec] (9.00907 [ns/kmer]) - == files to merge = 14 -saving tuples to 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.1: 'merging minimizers tuples' 26.7822 [sec] (10.6896 [ns/kmer]) -num_minimizers = 417553335 -num_minimizer_positions = 474828363 -num_super_kmers = 493836140 -building minimizers MPHF with 8 threads and 140 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 27.6125 [sec] (11.021 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 20.3951 [sec] (8.1403 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1757864185539968457.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.4: 'merging minimizers tuples ' 37.8879 [sec] (15.1222 [ns/kmer]) -num_bits_per_offset = ceil(log2(2895872213)) = 32 -constants::min_l = 6 -min_size = 64 -max_bucket_size 33191 -log2_max_bucket_size 16 -num_buckets_larger_than_1_not_in_skew_index 16634505/417553335 (3.9838%) -num_buckets_in_skew_index 75846/417553335 (0.0181644%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 59861399/474828363 (12.607%) -num_minimizer_positions_of_buckets_in_skew_index 14123980/474828363 (2.97454%) -computing minimizers offsets: 6.62443 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18483007 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14289333 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 10220043 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 7256268 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4841792 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2658327 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1446373 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 33191: 1382491 -num_kmers_in_skew_index 60577634 (2.41784%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18483007 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[0] for 18483007 kmers; bits/key = 2.64291 - built positions[0] for 18483007 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14289333 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[1] for 14289333 kmers; bits/key = 2.51635 - built positions[1] for 14289333 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 10220043 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[2] for 10220043 kmers; bits/key = 2.63949 - built positions[2] for 10220043 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 7256268 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 7256268 kmers; bits/key = 2.72044 - built positions[3] for 7256268 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4841792 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4841792 kmers; bits/key = 2.71841 - built positions[4] for 4841792 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2658327 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2658327)... - built mphs[5] for 2658327 kmers; bits/key = 2.55987 - built positions[5] for 2658327 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1446373 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1446373)... - built mphs[6] for 1446373 kmers; bits/key = 2.56056 - built positions[6] for 1446373 kmers; bits/key = 13.0002 - lower = 8192; upper = 33191; num_bits_per_pos = 16; num_kmers_in_partition = 1382491 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1382491)... - built mphs[7] for 1382491 kmers; bits/key = 2.5606 - built positions[7] for 1382491 kmers; bits/key = 16.0002 -computing skew index took: 14.4326 [sec] -=== step 3: 'build sparse and skew index' 21.4682 [sec] (8.5686 [ns/kmer]) -=== total_time 156.718 [sec] (62.5508 [ns/kmer]) -total index size: 2995577954 [B] -- 2995.58 [MB] -SPACE BREAKDOWN: - minimizers: 0.473465 [bits/kmer] (2.84093 [bits/key]) -- 4.94996% - pieces: 0.0585865 [bits/kmer] -- 0.612509% - offsets: 5.49972 [bits/kmer] -- 57.4983% - offsets2: 0.764561 [bits/kmer] -- 7.9933% - offsets3: 0.180394 [bits/kmer] -- 1.88598% - start_lists_of_size: 8.55736e-07 [bits/kmer] -- 8.94652e-06% - strings: 2.31166 [bits/kmer] -- 24.1679% - skew_index: 0.27662 [bits/kmer] -- 2.892% - weights: 5.8752e-07 [bits/kmer] -- 6.14239e-06% - -------------- - total: 9.56501 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.998% -buckets with 2 minimizer positions = 2.57019% -buckets with 3 minimizer positions = 0.580253% -buckets with 4 minimizer positions = 0.252657% -buckets with 5 minimizer positions = 0.141401% -buckets with 6 minimizer positions = 0.0899801% -buckets with 7 minimizer positions = 0.0622388% -buckets with 8 minimizer positions = 0.0453985% -buckets with 9 minimizer positions = 0.0345565% -buckets with 10 minimizer positions = 0.0272049% -buckets with 11 minimizer positions = 0.0217699% -buckets with 12 minimizer positions = 0.0179227% -buckets with 13 minimizer positions = 0.0150204% -buckets with 14 minimizer positions = 0.0126494% -buckets with 15 minimizer positions = 0.0108367% -buckets with 16 minimizer positions = 0.00935378% -max_bucket_size 33191 -2025-09-14 17:39:02: saving data structure to disk... -2025-09-14 17:39:04: DONE diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log deleted file mode 100644 index 83f38b9..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 17:47:48: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 17:47:59: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 10798.4 millisec / 10.7984 sec / 0.179973 min / 66.131 ns/kmer -2025-09-14 17:47:59: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 17:48:56: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 56221.4 millisec / 56.2214 sec / 0.937023 min / 80.8083 ns/kmer -2025-09-14 17:48:57: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-14 17:52:12: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 195011 millisec / 195.011 sec / 3.25018 min / 124.213 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log deleted file mode 100644 index 9a41038..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 17:54:46: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 17:56:00: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 73785 millisec / 73.785 sec / 1.22975 min / 106.053 ns/kmer -2025-09-14 17:56:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 17:56:08: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 7559.28 millisec / 7.55928 sec / 0.125988 min / 46.2943 ns/kmer -2025-09-14 17:56:09: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-14 17:56:45: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 36117.8 millisec / 36.1178 sec / 0.601963 min / 91.3372 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log deleted file mode 100644 index 42a9725..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.regular.bench_log +++ /dev/null @@ -1,9 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 726.75 -avg_nanosec_per_negative_lookup 650.547 -iterator: avg_nanosec_per_kmer 20.9193 -lookup: avg_nanosec_per_positive_lookup 661.647 -avg_nanosec_per_negative_lookup 685.681 -iterator: avg_nanosec_per_kmer 20.7216 -lookup: avg_nanosec_per_positive_lookup 992.379 -avg_nanosec_per_negative_lookup 753.164 -iterator: avg_nanosec_per_kmer 20.8978 diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log deleted file mode 100644 index aa3562c..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.regular.build_log +++ /dev/null @@ -1,516 +0,0 @@ -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding input' 2.29787 [sec] (4.57318 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.44 [sec] (2.86587 [ns/kmer]) -=== step 1: 'parse file' 3.73842 [sec] (7.44016 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 3.74764 [sec] (7.4585 [ns/kmer]) -num_minimizers = 72390526 -num_minimizer_positions = 78741053 -num_super_kmers = 78741053 -building minimizers MPHF with 8 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.14299 [sec] (10.2355 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757863936570800383.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.21144 [sec] (6.39136 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.03166 [sec] (2.0532 [ns/kmer]) -num_bits_per_offset = ceil(log2(574653302)) = 30 -constants::min_l = 6 -min_size = 64 -max_bucket_size 69558 -log2_max_bucket_size 17 -num_buckets_larger_than_1_not_in_skew_index 2336498/72390526 (3.22763%) -num_buckets_in_skew_index 4518/72390526 (0.00624115%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 7623230/78741053 (9.68139%) -num_minimizer_positions_of_buckets_in_skew_index 1068313/78741053 (1.35674%) -computing minimizers offsets: 0.99687 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1245692 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1024068 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 712068 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 409910 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 444216 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 285146 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 261943 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 69558: 486183 -num_kmers_in_skew_index 4869226 (0.969067%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1245692 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1245692)... - built mphs[0] for 1245692 kmers; bits/key = 2.41792 - built positions[0] for 1245692 kmers; bits/key = 7.00028 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1024068 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1024068)... - built mphs[1] for 1024068 kmers; bits/key = 2.56119 - built positions[1] for 1024068 kmers; bits/key = 8.00034 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 712068 - building MPHF with 8 threads and 1 partitions (avg. partition size = 712068)... - built mphs[2] for 712068 kmers; bits/key = 2.41921 - built positions[2] for 712068 kmers; bits/key = 9.00049 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 409910 - building MPHF with 8 threads and 1 partitions (avg. partition size = 409910)... - built mphs[3] for 409910 kmers; bits/key = 2.42137 - built positions[3] for 409910 kmers; bits/key = 10.0009 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 444216 - building MPHF with 8 threads and 1 partitions (avg. partition size = 444216)... - built mphs[4] for 444216 kmers; bits/key = 2.56391 - built positions[4] for 444216 kmers; bits/key = 11.0008 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 285146 - building MPHF with 8 threads and 1 partitions (avg. partition size = 285146)... - built mphs[5] for 285146 kmers; bits/key = 2.5666 - built positions[5] for 285146 kmers; bits/key = 12.0012 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 261943 - building MPHF with 8 threads and 1 partitions (avg. partition size = 261943)... - built mphs[6] for 261943 kmers; bits/key = 2.42416 - built positions[6] for 261943 kmers; bits/key = 13.0014 - lower = 8192; upper = 69558; num_bits_per_pos = 17; num_kmers_in_partition = 486183 - building MPHF with 8 threads and 1 partitions (avg. partition size = 486183)... - built mphs[7] for 486183 kmers; bits/key = 2.42062 - built positions[7] for 486183 kmers; bits/key = 17.0007 -computing skew index took: 3.60973 [sec] -=== step 3: 'build sparse and skew index' 4.67761 [sec] (9.30933 [ns/kmer]) -=== total_time 21.5498 [sec] (42.8881 [ns/kmer]) -total index size: 493924126 [B] -- 493.924 [MB] -SPACE BREAKDOWN: - minimizers: 0.418287 [bits/kmer] (2.90335 [bits/key]) -- 5.31901% - pieces: 0.0549683 [bits/kmer] -- 0.698985% - offsets: 4.46619 [bits/kmer] -- 56.7928% - offsets2: 0.45515 [bits/kmer] -- 5.78776% - offsets3: 0.063785 [bits/kmer] -- 0.811099% - start_lists_of_size: 4.26696e-06 [bits/kmer] -- 5.42593e-05% - strings: 2.28734 [bits/kmer] -- 29.0861% - skew_index: 0.118285 [bits/kmer] -- 1.50413% - weights: 2.92956e-06 [bits/kmer] -- 3.72527e-05% - -------------- - total: 7.86401 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.7661% -buckets with 2 minimizer positions = 2.08649% -buckets with 3 minimizer positions = 0.528401% -buckets with 4 minimizer positions = 0.211604% -buckets with 5 minimizer positions = 0.112209% -buckets with 6 minimizer positions = 0.0671649% -buckets with 7 minimizer positions = 0.0451164% -buckets with 8 minimizer positions = 0.0319876% -buckets with 9 minimizer positions = 0.0235431% -buckets with 10 minimizer positions = 0.0181944% -buckets with 11 minimizer positions = 0.0148058% -buckets with 12 minimizer positions = 0.0118427% -buckets with 13 minimizer positions = 0.0095413% -buckets with 14 minimizer positions = 0.00797204% -buckets with 15 minimizer positions = 0.00665557% -buckets with 16 minimizer positions = 0.00562228% -max_bucket_size 69558 -2025-09-14 17:32:38: saving data structure to disk... -2025-09-14 17:32:38: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding input' 4.37764 [sec] (3.80532 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 3.2358 [sec] (2.81276 [ns/kmer]) -=== step 1: 'parse file' 7.61669 [sec] (6.62091 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 8.09361 [sec] (7.03548 [ns/kmer]) -num_minimizers = 173245358 -num_minimizer_positions = 176049220 -num_super_kmers = 176049220 -building minimizers MPHF with 8 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 11.5493 [sec] (10.0394 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757863958523789998.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.25958 [sec] (6.31048 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.88591 [sec] (1.63935 [ns/kmer]) -num_bits_per_offset = ceil(log2(1170866587)) = 31 -constants::min_l = 6 -min_size = 64 -max_bucket_size 4013 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 1346106/173245358 (0.776994%) -num_buckets_in_skew_index 1718/173245358 (0.000991657%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 3918362/176049220 (2.22572%) -num_minimizer_positions_of_buckets_in_skew_index 233324/176049220 (0.132533%) -computing minimizers offsets: 1.37583 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 585298 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 326635 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 158808 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 108589 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 32581 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4013: 37778 -num_kmers_in_skew_index 1249689 (0.108631%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 585298 - building MPHF with 8 threads and 1 partitions (avg. partition size = 585298)... - built mphs[0] for 585298 kmers; bits/key = 2.41983 - built positions[0] for 585298 kmers; bits/key = 7.00055 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 326635 - building MPHF with 8 threads and 1 partitions (avg. partition size = 326635)... - built mphs[1] for 326635 kmers; bits/key = 2.42277 - built positions[1] for 326635 kmers; bits/key = 8.0011 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 158808 - building MPHF with 8 threads and 1 partitions (avg. partition size = 158808)... - built mphs[2] for 158808 kmers; bits/key = 2.4294 - built positions[2] for 158808 kmers; bits/key = 9.00227 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 108589 - building MPHF with 8 threads and 1 partitions (avg. partition size = 108589)... - built mphs[3] for 108589 kmers; bits/key = 2.43546 - built positions[3] for 108589 kmers; bits/key = 10.0035 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 32581 - building MPHF with 8 threads and 1 partitions (avg. partition size = 32581)... - built mphs[4] for 32581 kmers; bits/key = 2.48341 - built positions[4] for 32581 kmers; bits/key = 11.0101 - lower = 2048; upper = 4013; num_bits_per_pos = 12; num_kmers_in_partition = 37778 - building MPHF with 8 threads and 1 partitions (avg. partition size = 37778)... - built mphs[5] for 37778 kmers; bits/key = 2.4734 - built positions[5] for 37778 kmers; bits/key = 12.0095 -computing skew index took: 0.998153 [sec] -=== step 3: 'build sparse and skew index' 2.52392 [sec] (2.19395 [ns/kmer]) -=== total_time 38.929 [sec] (33.8396 [ns/kmer]) -total index size: 1066231572 [B] -- 1066.23 [MB] -SPACE BREAKDOWN: - minimizers: 0.428384 [bits/kmer] (2.84459 [bits/key]) -- 5.77751% - pieces: 0.00841122 [bits/kmer] -- 0.11344% - offsets: 4.81907 [bits/kmer] -- 64.9935% - offsets2: 0.105589 [bits/kmer] -- 1.42405% - offsets3: 0.00628774 [bits/kmer] -- 0.0848011% - start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.51353e-05% - strings: 2.03558 [bits/kmer] -- 27.4534% - skew_index: 0.0113627 [bits/kmer] -- 0.153245% - weights: 1.27956e-06 [bits/kmer] -- 1.7257e-05% - -------------- - total: 7.41469 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.222% -buckets with 2 minimizer positions = 0.587049% -buckets with 3 minimizer positions = 0.0858742% -buckets with 4 minimizer positions = 0.0350243% -buckets with 5 minimizer positions = 0.0189223% -buckets with 6 minimizer positions = 0.011583% -buckets with 7 minimizer positions = 0.00779877% -buckets with 8 minimizer positions = 0.00559438% -buckets with 9 minimizer positions = 0.00408611% -buckets with 10 minimizer positions = 0.00312793% -buckets with 11 minimizer positions = 0.0024878% -buckets with 12 minimizer positions = 0.00196542% -buckets with 13 minimizer positions = 0.00159196% -buckets with 14 minimizer positions = 0.0013276% -buckets with 15 minimizer positions = 0.00114116% -buckets with 16 minimizer positions = 0.000962796% -max_bucket_size 4013 -2025-09-14 17:33:17: saving data structure to disk... -2025-09-14 17:33:18: DONE -k = 31, m = 21, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding input' 11.41 [sec] (4.55408 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 7.43234 [sec] (2.96647 [ns/kmer]) -=== step 1: 'parse file' 18.8425 [sec] (7.52063 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 19.8093 [sec] (7.9065 [ns/kmer]) -num_minimizers = 386617003 -num_minimizer_positions = 425284125 -num_super_kmers = 425284125 -building minimizers MPHF with 8 threads and 129 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 25.5026 [sec] (10.1789 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757863998283305165.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.5315 [sec] (6.99736 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 11.5246 [sec] (4.59981 [ns/kmer]) -num_bits_per_offset = ceil(log2(2895872213)) = 32 -constants::min_l = 6 -min_size = 64 -max_bucket_size 34767 -log2_max_bucket_size 16 -num_buckets_larger_than_1_not_in_skew_index 11147152/386617003 (2.88325%) -num_buckets_in_skew_index 47919/386617003 (0.0123944%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 41920449/425284125 (9.85705%) -num_minimizer_positions_of_buckets_in_skew_index 7941744/425284125 (1.8674%) -computing minimizers offsets: 4.95243 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11994340 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8728433 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5803568 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3324419 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2008903 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1146661 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 501339 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 34767: 254893 -num_kmers_in_skew_index 33762556 (1.34757%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11994340 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[0] for 11994340 kmers; bits/key = 2.56071 - built positions[0] for 11994340 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8728433 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8728433 kmers; bits/key = 2.57731 - built positions[1] for 8728433 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5803568 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5803568 kmers; bits/key = 2.55844 - built positions[2] for 5803568 kmers; bits/key = 9.00006 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3324419 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3324419 kmers; bits/key = 3.25356 - built positions[3] for 3324419 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2008903 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2008903)... - built mphs[4] for 2008903 kmers; bits/key = 2.56016 - built positions[4] for 2008903 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1146661 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1146661)... - built mphs[5] for 1146661 kmers; bits/key = 2.56092 - built positions[5] for 1146661 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 501339 - building MPHF with 8 threads and 1 partitions (avg. partition size = 501339)... - built mphs[6] for 501339 kmers; bits/key = 2.56325 - built positions[6] for 501339 kmers; bits/key = 13.0007 - lower = 8192; upper = 34767; num_bits_per_pos = 16; num_kmers_in_partition = 254893 - building MPHF with 8 threads and 1 partitions (avg. partition size = 254893)... - built mphs[7] for 254893 kmers; bits/key = 2.42455 - built positions[7] for 254893 kmers; bits/key = 16.0014 -computing skew index took: 11.1132 [sec] -=== step 3: 'build sparse and skew index' 16.42 [sec] (6.55374 [ns/kmer]) -=== total_time 109.631 [sec] (43.7569 [ns/kmer]) -total index size: 2720226056 [B] -- 2720.23 [MB] -SPACE BREAKDOWN: - minimizers: 0.436946 [bits/kmer] (2.8316 [bits/key]) -- 5.03058% - pieces: 0.0585865 [bits/kmer] -- 0.674509% - offsets: 5.09225 [bits/kmer] -- 58.6273% - offsets2: 0.535416 [bits/kmer] -- 6.16426% - offsets3: 0.101433 [bits/kmer] -- 1.16781% - start_lists_of_size: 8.55736e-07 [bits/kmer] -- 9.85212e-06% - strings: 2.31166 [bits/kmer] -- 26.6143% - skew_index: 0.149505 [bits/kmer] -- 1.72126% - weights: 5.8752e-07 [bits/kmer] -- 6.76414e-06% - -------------- - total: 8.6858 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1044% -buckets with 2 minimizer positions = 1.75374% -buckets with 3 minimizer positions = 0.449247% -buckets with 4 minimizer positions = 0.203979% -buckets with 5 minimizer positions = 0.116523% -buckets with 6 minimizer positions = 0.0751692% -buckets with 7 minimizer positions = 0.051812% -buckets with 8 minimizer positions = 0.0381574% -buckets with 9 minimizer positions = 0.0288166% -buckets with 10 minimizer positions = 0.0225926% -buckets with 11 minimizer positions = 0.0180313% -buckets with 12 minimizer positions = 0.0146659% -buckets with 13 minimizer positions = 0.0123083% -buckets with 14 minimizer positions = 0.0102678% -buckets with 15 minimizer positions = 0.00882372% -buckets with 16 minimizer positions = 0.00752295% -max_bucket_size 34767 -2025-09-14 17:35:08: saving data structure to disk... -2025-09-14 17:35:09: DONE diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log deleted file mode 100644 index d203aab..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 17:42:45: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 17:42:54: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 9379.53 millisec / 9.37953 sec / 0.156325 min / 57.4418 ns/kmer -2025-09-14 17:42:55: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 17:43:51: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 56689.4 millisec / 56.6894 sec / 0.944823 min / 81.4809 ns/kmer -2025-09-14 17:43:53: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-14 17:47:48: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 235200 millisec / 235.2 sec / 3.91999 min / 149.811 ns/kmer diff --git a/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log deleted file mode 100644 index 542be99..0000000 --- a/benchmarks/results-14-09-25/k31/14-09-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 17:52:12: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 17:53:45: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 92907.5 millisec / 92.9075 sec / 1.54846 min / 133.538 ns/kmer -2025-09-14 17:53:46: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 17:53:54: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 7956.93 millisec / 7.95693 sec / 0.132616 min / 48.7296 ns/kmer -2025-09-14 17:53:55: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-14 17:54:46: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 51123.7 millisec / 51.1237 sec / 0.852062 min / 129.285 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log deleted file mode 100644 index a713c1d..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.canon.bench_log +++ /dev/null @@ -1,9 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 839.501 -avg_nanosec_per_negative_lookup 503.289 -iterator: avg_nanosec_per_kmer 20.3145 -lookup: avg_nanosec_per_positive_lookup 697.36 -avg_nanosec_per_negative_lookup 536.61 -iterator: avg_nanosec_per_kmer 20.3157 -lookup: avg_nanosec_per_positive_lookup 954.704 -avg_nanosec_per_negative_lookup 559.445 -iterator: avg_nanosec_per_kmer 20.33 diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log deleted file mode 100644 index 8d3dcc8..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.canon.build_log +++ /dev/null @@ -1,389 +0,0 @@ -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding input' 2.24143 [sec] (4.02711 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.64865 [sec] (2.96207 [ns/kmer]) -=== step 1: 'parse file' 3.89024 [sec] (6.98948 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 1.66089 [sec] (2.98406 [ns/kmer]) -num_minimizers = 28491340 -num_minimizer_positions = 34043772 -num_super_kmers = 35742796 -building minimizers MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.27479 [sec] (4.08704 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866337777965128.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.34655 [sec] (2.4193 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.419702 [sec] (0.754065 [ns/kmer]) -num_bits_per_offset = ceil(log2(621649142)) = 30 -constants::min_l = 6 -min_size = 64 -max_bucket_size 890626 -log2_max_bucket_size 20 -num_buckets_larger_than_1_not_in_skew_index 1198106/28491340 (4.20516%) -num_buckets_in_skew_index 5680/28491340 (0.0199359%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 4772225/34043772 (14.0179%) -num_minimizer_positions_of_buckets_in_skew_index 1983993/34043772 (5.82777%) -computing minimizers offsets: 0.542615 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5364171 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3558842 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2165544 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1626075 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 914447 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1132014 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 713220 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 890626: 4875198 -num_kmers_in_skew_index 20349511 (3.65613%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5364171 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 5364171 kmers; bits/key = 2.65405 - built positions[0] for 5364171 kmers; bits/key = 7.00007 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3558842 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3558842 kmers; bits/key = 3.06667 - built positions[1] for 3558842 kmers; bits/key = 8.0001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2165544 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2165544)... - built mphs[2] for 2165544 kmers; bits/key = 2.56007 - built positions[2] for 2165544 kmers; bits/key = 9.00016 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1626075 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1626075)... - built mphs[3] for 1626075 kmers; bits/key = 2.56039 - built positions[3] for 1626075 kmers; bits/key = 10.0002 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 914447 - building MPHF with 8 threads and 1 partitions (avg. partition size = 914447)... - built mphs[4] for 914447 kmers; bits/key = 2.56134 - built positions[4] for 914447 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1132014 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1132014)... - built mphs[5] for 1132014 kmers; bits/key = 2.5609 - built positions[5] for 1132014 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 713220 - building MPHF with 8 threads and 1 partitions (avg. partition size = 713220)... - built mphs[6] for 713220 kmers; bits/key = 2.4192 - built positions[6] for 713220 kmers; bits/key = 13.0005 - lower = 8192; upper = 890626; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 4875198 kmers; bits/key = 2.70263 - built positions[7] for 4875198 kmers; bits/key = 20.0001 -computing skew index took: 8.02895 [sec] -=== step 3: 'build sparse and skew index' 8.60165 [sec] (15.4543 [ns/kmer]) -=== total_time 18.1938 [sec] (32.6883 [ns/kmer]) -total index size: 339159184 [B] -- 339.159 [MB] -SPACE BREAKDOWN: - minimizers: 0.150699 [bits/kmer] (2.94394 [bits/key]) -- 3.09135% - pieces: 0.0233256 [bits/kmer] -- 0.478488% - offsets: 1.58688 [bits/kmer] -- 32.5523% - offsets2: 0.257224 [bits/kmer] -- 5.27655% - offsets3: 0.106938 [bits/kmer] -- 2.19366% - start_lists_of_size: 3.85206e-06 [bits/kmer] -- 7.90189e-05% - strings: 2.2338 [bits/kmer] -- 45.8228% - skew_index: 0.51599 [bits/kmer] -- 10.5847% - weights: 2.6447e-06 [bits/kmer] -- 5.42518e-05% - -------------- - total: 4.87485 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.7749% -buckets with 2 minimizer positions = 2.30651% -buckets with 3 minimizer positions = 0.761358% -buckets with 4 minimizer positions = 0.355666% -buckets with 5 minimizer positions = 0.200977% -buckets with 6 minimizer positions = 0.12653% -buckets with 7 minimizer positions = 0.0847696% -buckets with 8 minimizer positions = 0.0617767% -buckets with 9 minimizer positions = 0.0458174% -buckets with 10 minimizer positions = 0.0352669% -buckets with 11 minimizer positions = 0.0280963% -buckets with 12 minimizer positions = 0.022821% -buckets with 13 minimizer positions = 0.0187285% -buckets with 14 minimizer positions = 0.0154047% -buckets with 15 minimizer positions = 0.0133093% -buckets with 16 minimizer positions = 0.0113754% -max_bucket_size 890626 -2025-09-14 18:12:36: saving data structure to disk... -2025-09-14 18:12:36: DONE -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding input' 4.19832 [sec] (3.63412 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 3.41341 [sec] (2.95469 [ns/kmer]) -=== step 1: 'parse file' 7.61186 [sec] (6.58892 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 3.30397 [sec] (2.85996 [ns/kmer]) -num_minimizers = 67109831 -num_minimizer_positions = 67978497 -num_super_kmers = 71741056 -building minimizers MPHF with 8 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 4.13569 [sec] (3.57991 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866356203598838.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.80762 [sec] (2.43031 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.787093 [sec] (0.681318 [ns/kmer]) -num_bits_per_offset = ceil(log2(1165088891)) = 31 -constants::min_l = 6 -min_size = 64 -max_bucket_size 2836 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 321047/67109831 (0.47839%) -num_buckets_in_skew_index 892/67109831 (0.00132916%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 1060983/67978497 (1.56076%) -num_minimizer_positions_of_buckets_in_skew_index 129622/67978497 (0.190681%) -computing minimizers offsets: 0.617988 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 936900 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 646176 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 458164 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2836: 40401 -num_kmers_in_skew_index 2311880 (0.200119%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 936900 - building MPHF with 8 threads and 1 partitions (avg. partition size = 936900)... - built mphs[0] for 936900 kmers; bits/key = 2.41855 - built positions[0] for 936900 kmers; bits/key = 7.00038 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 646176 - building MPHF with 8 threads and 1 partitions (avg. partition size = 646176)... - built mphs[1] for 646176 kmers; bits/key = 2.41958 - built positions[1] for 646176 kmers; bits/key = 8.0005 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 458164 - building MPHF with 8 threads and 1 partitions (avg. partition size = 458164)... - built mphs[2] for 458164 kmers; bits/key = 2.42072 - built positions[2] for 458164 kmers; bits/key = 9.00079 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 - building MPHF with 8 threads and 1 partitions (avg. partition size = 209599)... - built mphs[3] for 209599 kmers; bits/key = 2.42681 - built positions[3] for 209599 kmers; bits/key = 10.0016 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 - building MPHF with 8 threads and 1 partitions (avg. partition size = 20640)... - built mphs[4] for 20640 kmers; bits/key = 2.51938 - built positions[4] for 20640 kmers; bits/key = 11.0171 - lower = 2048; upper = 2836; num_bits_per_pos = 12; num_kmers_in_partition = 40401 - building MPHF with 8 threads and 1 partitions (avg. partition size = 40401)... - built mphs[5] for 40401 kmers; bits/key = 2.46845 - built positions[5] for 40401 kmers; bits/key = 12.0092 -computing skew index took: 1.70895 [sec] -=== step 3: 'build sparse and skew index' 2.38415 [sec] (2.06375 [ns/kmer]) -=== total_time 21.0304 [sec] (18.2042 [ns/kmer]) -total index size: 591879628 [B] -- 591.88 [MB] -SPACE BREAKDOWN: - minimizers: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 4.0881% - pieces: 0.00224854 [bits/kmer] -- 0.0548598% - offsets: 1.85892 [bits/kmer] -- 45.3537% - offsets2: 0.0284707 [bits/kmer] -- 0.694626% - offsets3: 0.00347857 [bits/kmer] -- 0.08487% - start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.52795e-05% - strings: 2.01703 [bits/kmer] -- 49.2114% - skew_index: 0.0209999 [bits/kmer] -- 0.512354% - weights: 1.27418e-06 [bits/kmer] -- 3.10874e-05% - -------------- - total: 4.09871 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5203% -buckets with 2 minimizer positions = 0.325268% -buckets with 3 minimizer positions = 0.0665655% -buckets with 4 minimizer positions = 0.028209% -buckets with 5 minimizer positions = 0.0153256% -buckets with 6 minimizer positions = 0.00941591% -buckets with 7 minimizer positions = 0.00646701% -buckets with 8 minimizer positions = 0.00453585% -buckets with 9 minimizer positions = 0.00351811% -buckets with 10 minimizer positions = 0.00259873% -buckets with 11 minimizer positions = 0.002031% -buckets with 12 minimizer positions = 0.00171659% -buckets with 13 minimizer positions = 0.00146476% -buckets with 14 minimizer positions = 0.00115482% -buckets with 15 minimizer positions = 0.000958131% -buckets with 16 minimizer positions = 0.000908958% -max_bucket_size 2836 -2025-09-14 18:12:57: saving data structure to disk... -2025-09-14 18:12:57: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding input' 10.7453 [sec] (3.87805 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 7.95214 [sec] (2.86997 [ns/kmer]) -=== step 1: 'parse file' 18.6976 [sec] (6.74808 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 8.00237 [sec] (2.8881 [ns/kmer]) -num_minimizers = 143944326 -num_minimizer_positions = 168540022 -num_super_kmers = 177417418 -building minimizers MPHF with 8 threads and 48 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 9.10448 [sec] (3.28586 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866377640626458.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.85271 [sec] (2.47318 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.90136 [sec] (0.68621 [ns/kmer]) -num_bits_per_offset = ceil(log2(2961741363)) = 32 -constants::min_l = 6 -min_size = 64 -max_bucket_size 95788 -log2_max_bucket_size 17 -num_buckets_larger_than_1_not_in_skew_index 4117627/143944326 (2.86057%) -num_buckets_in_skew_index 38186/143944326 (0.0265283%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 16761511/168540022 (9.94512%) -num_minimizer_positions_of_buckets_in_skew_index 11989998/168540022 (7.11404%) -computing minimizers offsets: 2.2319 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28814291 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26301059 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23811843 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20591065 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19598470 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18267389 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13542165 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95788: 27801549 -num_kmers_in_skew_index 178727831 (6.45039%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28814291 - building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28814291 kmers; bits/key = 2.54378 - built positions[0] for 28814291 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26301059 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26301059 kmers; bits/key = 2.55149 - built positions[1] for 26301059 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23811843 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 23811843 kmers; bits/key = 2.55863 - built positions[2] for 23811843 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20591065 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 20591065 kmers; bits/key = 2.53983 - built positions[3] for 20591065 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19598470 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[4] for 19598470 kmers; bits/key = 2.58178 - built positions[4] for 19598470 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18267389 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[5] for 18267389 kmers; bits/key = 2.5988 - built positions[5] for 18267389 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13542165 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[6] for 13542165 kmers; bits/key = 2.63222 - built positions[6] for 13542165 kmers; bits/key = 13 - lower = 8192; upper = 95788; num_bits_per_pos = 17; num_kmers_in_partition = 27801549 - building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[7] for 27801549 kmers; bits/key = 2.57505 - built positions[7] for 27801549 kmers; bits/key = 17 -computing skew index took: 37.2083 [sec] -=== step 3: 'build sparse and skew index' 39.5769 [sec] (14.2835 [ns/kmer]) -=== total_time 84.1354 [sec] (30.3649 [ns/kmer]) -total index size: 1802099354 [B] -- 1802.1 [MB] -SPACE BREAKDOWN: - minimizers: 0.146815 [bits/kmer] (2.82607 [bits/key]) -- 2.82169% - pieces: 0.015002 [bits/kmer] -- 0.288328% - offsets: 1.71436 [bits/kmer] -- 32.9488% - offsets2: 0.193578 [bits/kmer] -- 3.72044% - offsets3: 0.138472 [bits/kmer] -- 2.66134% - start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.48715e-05% - strings: 2.13782 [bits/kmer] -- 41.0874% - skew_index: 0.857054 [bits/kmer] -- 16.472% - weights: 5.31253e-07 [bits/kmer] -- 1.02103e-05% - -------------- - total: 5.2031 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1129% -buckets with 2 minimizer positions = 1.66462% -buckets with 3 minimizer positions = 0.467231% -buckets with 4 minimizer positions = 0.212029% -buckets with 5 minimizer positions = 0.120713% -buckets with 6 minimizer positions = 0.0773542% -buckets with 7 minimizer positions = 0.0538271% -buckets with 8 minimizer positions = 0.039179% -buckets with 9 minimizer positions = 0.0302666% -buckets with 10 minimizer positions = 0.0237182% -buckets with 11 minimizer positions = 0.0193575% -buckets with 12 minimizer positions = 0.0158631% -buckets with 13 minimizer positions = 0.013326% -buckets with 14 minimizer positions = 0.0114822% -buckets with 15 minimizer positions = 0.00985728% -buckets with 16 minimizer positions = 0.00859013% -max_bucket_size 95788 -2025-09-14 18:14:22: saving data structure to disk... -2025-09-14 18:14:22: DONE diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log deleted file mode 100644 index 92e6c28..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 18:21:30: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 18:21:44: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 14214.5 millisec / 14.2145 sec / 0.236908 min / 145.086 ns/kmer -2025-09-14 18:21:44: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 18:22:41: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 56499.8 millisec / 56.4998 sec / 0.941663 min / 122.457 ns/kmer -2025-09-14 18:22:41: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-14 18:24:37: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 115519 millisec / 115.519 sec / 1.92532 min / 241.763 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log deleted file mode 100644 index 9233f6b..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 18:25:40: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 18:26:13: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 32568.2 millisec / 32.5682 sec / 0.542803 min / 70.5881 ns/kmer -2025-09-14 18:26:13: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 18:26:18: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 4492.78 millisec / 4.49278 sec / 0.0748797 min / 45.8576 ns/kmer -2025-09-14 18:26:18: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-14 18:26:36: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 17574.8 millisec / 17.5748 sec / 0.292913 min / 54.5655 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log deleted file mode 100644 index e957a20..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.regular.bench_log +++ /dev/null @@ -1,9 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 882.07 -avg_nanosec_per_negative_lookup 698.712 -iterator: avg_nanosec_per_kmer 20.3053 -lookup: avg_nanosec_per_positive_lookup 744.84 -avg_nanosec_per_negative_lookup 742.651 -iterator: avg_nanosec_per_kmer 20.3387 -lookup: avg_nanosec_per_positive_lookup 1023.33 -avg_nanosec_per_negative_lookup 805.361 -iterator: avg_nanosec_per_kmer 20.314 diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log deleted file mode 100644 index 7541d7e..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.regular.build_log +++ /dev/null @@ -1,378 +0,0 @@ -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding input' 2.25906 [sec] (4.05878 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 0.947124 [sec] (1.70167 [ns/kmer]) -=== step 1: 'parse file' 3.20678 [sec] (5.76152 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 1.36049 [sec] (2.44435 [ns/kmer]) -num_minimizers = 24274432 -num_minimizer_positions = 28219881 -num_super_kmers = 28219881 -building minimizers MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.93922 [sec] (3.48413 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866237600095733.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.08409 [sec] (1.94775 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.362544 [sec] (0.651371 [ns/kmer]) -num_bits_per_offset = ceil(log2(621649142)) = 30 -constants::min_l = 6 -min_size = 64 -max_bucket_size 410845 -log2_max_bucket_size 19 -num_buckets_larger_than_1_not_in_skew_index 993045/24274432 (4.09091%) -num_buckets_in_skew_index 3485/24274432 (0.0143567%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 3760523/28219881 (13.3258%) -num_minimizer_positions_of_buckets_in_skew_index 1181456/28219881 (4.18661%) -computing minimizers offsets: 0.408446 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3728511 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2195092 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1214814 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1162612 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 910692 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 980893 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 616111 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 410845: 3780697 -num_kmers_in_skew_index 14589422 (2.62124%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3728511 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3728511 kmers; bits/key = 2.94604 - built positions[0] for 3728511 kmers; bits/key = 7.00009 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2195092 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2195092)... - built mphs[1] for 2195092 kmers; bits/key = 2.41717 - built positions[1] for 2195092 kmers; bits/key = 8.00016 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1214814 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1214814)... - built mphs[2] for 1214814 kmers; bits/key = 2.41794 - built positions[2] for 1214814 kmers; bits/key = 9.0003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1162612 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1162612)... - built mphs[3] for 1162612 kmers; bits/key = 2.56091 - built positions[3] for 1162612 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 910692 - building MPHF with 8 threads and 1 partitions (avg. partition size = 910692)... - built mphs[4] for 910692 kmers; bits/key = 2.4185 - built positions[4] for 910692 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 980893 - building MPHF with 8 threads and 1 partitions (avg. partition size = 980893)... - built mphs[5] for 980893 kmers; bits/key = 2.56127 - built positions[5] for 980893 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 616111 - building MPHF with 8 threads and 1 partitions (avg. partition size = 616111)... - built mphs[6] for 616111 kmers; bits/key = 2.56247 - built positions[6] for 616111 kmers; bits/key = 13.0006 - lower = 8192; upper = 410845; num_bits_per_pos = 19; num_kmers_in_partition = 3780697 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 3780697 kmers; bits/key = 2.9111 - built positions[7] for 3780697 kmers; bits/key = 19.0001 -computing skew index took: 6.35437 [sec] -=== step 3: 'build sparse and skew index' 6.78863 [sec] (12.1969 [ns/kmer]) -=== total_time 14.7418 [sec] (26.486 [ns/kmer]) -total index size: 304541358 [B] -- 304.541 [MB] -SPACE BREAKDOWN: - minimizers: 0.129216 [bits/kmer] (2.96278 [bits/key]) -- 2.95198% - pieces: 0.0233256 [bits/kmer] -- 0.532879% - offsets: 1.35201 [bits/kmer] -- 30.8869% - offsets2: 0.202693 [bits/kmer] -- 4.63057% - offsets3: 0.0636812 [bits/kmer] -- 1.45481% - start_lists_of_size: 3.85206e-06 [bits/kmer] -- 8.80012e-05% - strings: 2.2338 [bits/kmer] -- 51.0316% - skew_index: 0.372554 [bits/kmer] -- 8.51109% - weights: 2.6447e-06 [bits/kmer] -- 6.04187e-05% - -------------- - total: 4.37728 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.8947% -buckets with 2 minimizer positions = 2.3624% -buckets with 3 minimizer positions = 0.729043% -buckets with 4 minimizer positions = 0.320662% -buckets with 5 minimizer positions = 0.173973% -buckets with 6 minimizer positions = 0.108101% -buckets with 7 minimizer positions = 0.0744775% -buckets with 8 minimizer positions = 0.0531217% -buckets with 9 minimizer positions = 0.0397744% -buckets with 10 minimizer positions = 0.0304848% -buckets with 11 minimizer positions = 0.0243919% -buckets with 12 minimizer positions = 0.0200829% -buckets with 13 minimizer positions = 0.0170509% -buckets with 14 minimizer positions = 0.0139076% -buckets with 15 minimizer positions = 0.0119426% -buckets with 16 minimizer positions = 0.0105255% -max_bucket_size 410845 -2025-09-14 18:10:52: saving data structure to disk... -2025-09-14 18:10:52: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding input' 4.28234 [sec] (3.70685 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.94983 [sec] (1.6878 [ns/kmer]) -=== step 1: 'parse file' 6.23273 [sec] (5.39513 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 2.59621 [sec] (2.24731 [ns/kmer]) -num_minimizers = 55460750 -num_minimizer_positions = 56012507 -num_super_kmers = 56012507 -building minimizers MPHF with 8 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.8204 [sec] (3.30699 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866252554976596.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.24347 [sec] (1.94197 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.637693 [sec] (0.551995 [ns/kmer]) -num_bits_per_offset = ceil(log2(1165088891)) = 31 -constants::min_l = 6 -min_size = 64 -max_bucket_size 762 -log2_max_bucket_size 10 -num_buckets_larger_than_1_not_in_skew_index 215802/55460750 (0.389108%) -num_buckets_in_skew_index 496/55460750 (0.000894326%) -skew index num_partitions 4 -num_minimizer_positions_of_buckets_larger_than_1 703872/56012507 (1.25663%) -num_minimizer_positions_of_buckets_in_skew_index 64183/56012507 (0.114587%) -computing minimizers offsets: 0.414947 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 616638 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 406716 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 230283 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 762: 53117 -num_kmers_in_skew_index 1306754 (0.113114%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 616638 - building MPHF with 8 threads and 1 partitions (avg. partition size = 616638)... - built mphs[0] for 616638 kmers; bits/key = 2.41968 - built positions[0] for 616638 kmers; bits/key = 7.00054 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 406716 - building MPHF with 8 threads and 1 partitions (avg. partition size = 406716)... - built mphs[1] for 406716 kmers; bits/key = 2.42142 - built positions[1] for 406716 kmers; bits/key = 8.00087 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 230283 - building MPHF with 8 threads and 1 partitions (avg. partition size = 230283)... - built mphs[2] for 230283 kmers; bits/key = 2.4254 - built positions[2] for 230283 kmers; bits/key = 9.00152 - lower = 512; upper = 762; num_bits_per_pos = 10; num_kmers_in_partition = 53117 - building MPHF with 8 threads and 1 partitions (avg. partition size = 53117)... - built mphs[3] for 53117 kmers; bits/key = 2.45616 - built positions[3] for 53117 kmers; bits/key = 10.0066 -computing skew index took: 0.952059 [sec] -=== step 3: 'build sparse and skew index' 1.41301 [sec] (1.22312 [ns/kmer]) -=== total_time 16.9435 [sec] (14.6665 [ns/kmer]) -total index size: 538074106 [B] -- 538.074 [MB] -SPACE BREAKDOWN: - minimizers: 0.138427 [bits/kmer] (2.88344 [bits/key]) -- 3.71504% - pieces: 0.00224854 [bits/kmer] -- 0.0603456% - offsets: 1.53624 [bits/kmer] -- 41.2291% - offsets2: 0.018888 [bits/kmer] -- 0.506909% - offsets3: 0.00172258 [bits/kmer] -- 0.0462301% - start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.98073e-05% - strings: 2.01703 [bits/kmer] -- 54.1324% - skew_index: 0.0115484 [bits/kmer] -- 0.309932% - weights: 1.27418e-06 [bits/kmer] -- 3.4196e-05% - -------------- - total: 3.72611 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.61% -buckets with 2 minimizer positions = 0.265774% -buckets with 3 minimizer positions = 0.0543952% -buckets with 4 minimizer positions = 0.0225998% -buckets with 5 minimizer positions = 0.012288% -buckets with 6 minimizer positions = 0.00758735% -buckets with 7 minimizer positions = 0.00520188% -buckets with 8 minimizer positions = 0.00363681% -buckets with 9 minimizer positions = 0.00272986% -buckets with 10 minimizer positions = 0.00195634% -buckets with 11 minimizer positions = 0.00165342% -buckets with 12 minimizer positions = 0.00132887% -buckets with 13 minimizer positions = 0.00112332% -buckets with 14 minimizer positions = 0.000903342% -buckets with 15 minimizer positions = 0.000802369% -buckets with 16 minimizer positions = 0.000649108% -max_bucket_size 762 -2025-09-14 18:11:09: saving data structure to disk... -2025-09-14 18:11:09: DONE -k = 63, m = 25, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding input' 10.787 [sec] (3.89307 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 4.63569 [sec] (1.67304 [ns/kmer]) -=== step 1: 'parse file' 15.4231 [sec] (5.56628 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 6.42284 [sec] (2.31804 [ns/kmer]) -num_minimizers = 122641952 -num_minimizer_positions = 141137536 -num_super_kmers = 141137536 -building minimizers MPHF with 8 threads and 41 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 8.33851 [sec] (3.00941 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1757866269859677870.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.50841 [sec] (1.98801 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.4806 [sec] (0.534355 [ns/kmer]) -num_bits_per_offset = ceil(log2(2961741363)) = 32 -constants::min_l = 6 -min_size = 64 -max_bucket_size 150582 -log2_max_bucket_size 18 -num_buckets_larger_than_1_not_in_skew_index 3263958/122641952 (2.66137%) -num_buckets_in_skew_index 28699/122641952 (0.0234006%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 13121826/141137536 (9.29719%) -num_minimizer_positions_of_buckets_in_skew_index 8666415/141137536 (6.1404%) -computing minimizers offsets: 1.64794 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 24843684 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22063432 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19418162 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17914507 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17076822 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 13955142 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 10150958 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 150582: 20601919 -num_kmers_in_skew_index 146024626 (5.27011%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 24843684 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 24843684 kmers; bits/key = 2.59049 - built positions[0] for 24843684 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 22063432 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 22063432 kmers; bits/key = 2.59243 - built positions[1] for 22063432 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19418162 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19418162 kmers; bits/key = 2.57982 - built positions[2] for 19418162 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17914507 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[3] for 17914507 kmers; bits/key = 2.56993 - built positions[3] for 17914507 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17076822 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17076822 kmers; bits/key = 2.5501 - built positions[4] for 17076822 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 13955142 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 13955142 kmers; bits/key = 2.56664 - built positions[5] for 13955142 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 10150958 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[6] for 10150958 kmers; bits/key = 2.65462 - built positions[6] for 10150958 kmers; bits/key = 13 - lower = 8192; upper = 150582; num_bits_per_pos = 18; num_kmers_in_partition = 20601919 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[7] for 20601919 kmers; bits/key = 2.55951 - built positions[7] for 20601919 kmers; bits/key = 18 -computing skew index took: 28.0449 [sec] -=== step 3: 'build sparse and skew index' 29.8099 [sec] (10.7585 [ns/kmer]) -=== total_time 66.9833 [sec] (24.1746 [ns/kmer]) -total index size: 1624368030 [B] -- 1624.37 [MB] -SPACE BREAKDOWN: - minimizers: 0.124989 [bits/kmer] (2.82382 [bits/key]) -- 2.66503% - pieces: 0.015002 [bits/kmer] -- 0.319875% - offsets: 1.46065 [bits/kmer] -- 31.1443% - offsets2: 0.151544 [bits/kmer] -- 3.23125% - offsets3: 0.100088 [bits/kmer] -- 2.1341% - start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.64987e-05% - strings: 2.13782 [bits/kmer] -- 45.583% - skew_index: 0.699854 [bits/kmer] -- 14.9224% - weights: 5.31253e-07 [bits/kmer] -- 1.13275e-05% - -------------- - total: 4.68995 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.3152% -buckets with 2 minimizer positions = 1.58636% -buckets with 3 minimizer positions = 0.422838% -buckets with 4 minimizer positions = 0.186829% -buckets with 5 minimizer positions = 0.106346% -buckets with 6 minimizer positions = 0.0683665% -buckets with 7 minimizer positions = 0.0477504% -buckets with 8 minimizer positions = 0.0356257% -buckets with 9 minimizer positions = 0.0273895% -buckets with 10 minimizer positions = 0.0219101% -buckets with 11 minimizer positions = 0.0175666% -buckets with 12 minimizer positions = 0.0144339% -buckets with 13 minimizer positions = 0.0124484% -buckets with 14 minimizer positions = 0.0107361% -buckets with 15 minimizer positions = 0.0090222% -buckets with 16 minimizer positions = 0.00797117% -max_bucket_size 150582 -2025-09-14 18:12:17: saving data structure to disk... -2025-09-14 18:12:17: DONE diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log deleted file mode 100644 index 7e34907..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 18:18:17: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 18:18:31: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 13556.6 millisec / 13.5566 sec / 0.225943 min / 138.371 ns/kmer -2025-09-14 18:18:31: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 18:19:25: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 53408.5 millisec / 53.4085 sec / 0.890142 min / 115.757 ns/kmer -2025-09-14 18:19:25: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-14 18:21:29: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 124005 millisec / 124.005 sec / 2.06675 min / 259.523 ns/kmer diff --git a/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log deleted file mode 100644 index 2bc20cc..0000000 --- a/benchmarks/results-14-09-25/k63/14-09-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-14 18:24:37: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-14 18:25:13: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 36476.6 millisec / 36.4766 sec / 0.607943 min / 79.0591 ns/kmer -2025-09-14 18:25:14: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-14 18:25:18: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 4611.08 millisec / 4.61108 sec / 0.0768514 min / 47.0651 ns/kmer -2025-09-14 18:25:19: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-14 18:25:40: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 21077.2 millisec / 21.0772 sec / 0.351287 min / 65.4398 ns/kmer diff --git a/benchmarks/results-14-09-25/results.png b/benchmarks/results-14-09-25/results.png deleted file mode 100644 index 8b9d2fb0e9bc7de7cb3ac6b1ed234229ce33dc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325036 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 BV`v4zUcHIzreBGtQm%bC7xL3ltQ|xIBjs z^oXWq|5VCV1fz`~J!`@GBavBNK<{TJX#MhdtJ>m0@z6x znjN@tlm4bS#1Z!JAAOLIZ-CEmyc_!Kg=S+hs#bCmtqtx$Q!rsMJe2)|M*c{s@Qk%1 zV??O!PB^P$-`D1EV)aOKn&$CKp%P;@Dx@8#l!2_;5>OI7#F_B25Ej?2ussb4sIY*Q zzRmM+rwCZ-EerhirZob`hE^&(BRcaXf78}vMN9xT>5m1)OnJ#2%TY0k3CGVMCnVp> z?rubC&=DsW=)1)4e)goqcv#)&8Vs)-@RKIAhYH^qB?&TM??Q`-57ei@q@7RGsZSDe z)q^QQyI|Y3*B(gTB~p=;pANk5W(L zp^ad?&>8a*Xt&zrJIytde6x#Zi~c~o@--Aasz&s5k+*OJHIrFo+}kt)z;`pidkJRs~v(H(6Rq6NBN`6;rjOuQy1%3 z+I|oX;GJvcegzXT^Pu;fyf*SVjfsq*SMQ z3$zsPL)1iifZ#V`&6u)zMJ7LGuNfV5h>cJY1USNK3`dK|=c3K||d(~C% z^UiTQdwzv=)iIn7@-Tcl zeQ%+~3_>M;&hbmFRx_}1sL1e$ERkO?fK9XG{jYDY7oH1{o20(@L}A6TY%}`cQv)}4 z%Vf~Q-(i$IiKUqD%WZ++9XU3Ih%D;TPIR+O)BN7kz;c(Pjn@+nTjcXuRhPULPL942 z%m@84Ppo^z3Tb-;`^JVW4`U`6(phvyThDgte(mevV48YQK0K1%h7ivVkP*0>{C^I ztytEgjgYnR9bN1q`;PZ0TeR)JRErY1^nZW$d42jI*cB=pg@OAzTw-kR4nJjJwfJM9 z0qxH4M?ReqTY|=ezdw@6K|d(h&S_8tWXr5{A9jt*K$?giz49{bPF=zq`5`GI;Jlv^ zu`!)4`0j^#0tOcu{_zd2)W*G?Iy%it5zPX3xF|N7P$n2s%~F*Ihk^5WgbatoEbSsar_NHm@NQ{}3H z8m&y3_^i1GmKeV7fq8>(#75PR&Atslp@F`45`e8%`T?il)J2)9be4HGA3|MZvcQnY z!aJO^4YXflE?J51=j2{{-9EG(i~sdn^K|PsObK^Zq7)xpN~KieJ9-xYg|j^59To28 zDk58YtB(V_l6d$`TF#kQWCyYi6L~}}*qF%oIzF{fbWO3bgGa|_rlhaD~?eHag0`^2oo zMjEh2&tjP>?D{@n&!}S5hooSrh3&n)W7E&W90}A5 ztn+gz5g1%^eIl|^d%q~0$d9qvJr(s3HwKHzWJ+DET&gGaZGobs)6&|6rAFn;+Eb%J zXy5qu4w#Q7?(W+9gQF*o^#QB9Q9@PoSRg%dw&>NW-q~@I)uM@e5vzwptug^uEgGE~d>K<+$&!<{I8+yudf<8BV-vq!3(fk7eds_eP`4 z09dUbOygaBV>5oXJGZkMDd@Nu@cJ`n3-TUTiF2r20DuqD@0`;x4p6`tuNUAieepT; z;lPg8GN$zLy?enfa_xgdeiA~!_)=D-$RKtU!N1zCEE26ZW;E)VgFL5B#s`rdq%6Y9 zz}0i({E6kJviq9|a(?5zetLl%AvIpBtYAWhAD_wN2T#^>c3L5)L-AVueN++c1*i)x zKwMbv#D1x_)`O)bC$0NZg1TFmQ$Vu)({=cR%vC^FbFlwOM^$%${Wc?&-#tJvOY*dx-QxB#We;TlFELonj_+&?`na&tSaKr-qV$7 z(S6kfE(7Dw9O8!d3}d&O$neb7D;nqh_UE1jE;`<=Y5c^j{K~Dh>cj`D=5W7bAC_$d zSB{ZEAcE@i!!NjwZjWj#aC#qqdCmE5{q5U)ZJHnSo#L5t@$U^JN!ZmhG+?@X-XZr` znL3J%;FPD7nw1}dO^0(OiJ0E@!cWez7k6OpD}Z)ZZBzy+xTHvdc&HOhV}@ES+|7Ic zIa4OCf1Jnc!%(dXVQM@| zkq@H=yxr(rCzce{PY50d?hHFvwImw&w86ZQ@ARiklo>=9uk}mE6fjkn)!y8}R!0G? zrIXS+JMar1cI(6|nU-1jET=y&w!L|!O7lP=lye;@Oxrmryb?9iOU^rZAXpg21+b~8 zpX0%5U;2l$!N-*zmjc4k+}TiHk(Yo&N^m6=)miUvYPq=Ei;nBJaX$YuIi1vP%TcA9 zIU2^}WsSFG9ou7F$MDL)_*GsFa^FzwG4H{mi zX{>OmxUEm@P}E^WB&F>YH9FT-*vxR@N##|T>(948a!P8S{#+`hn6QsKshKRcNoTlN zcnTx{zE3jeH6=XIcCXU^u6XwUv3J&QRi@FqSGrTAL%O89QChmY8>Bm>1OaKJOOWo6 z4(SHzM!G?|@jTm^`JQwBgY(1rZDuZ=Ywvfz>sf2v>t3Hn--D%I*yHzyCUS}D;b3ND%r4Sw$WED>1dtc1-t=%S~ZB)VW!|CI7{r--z z9!2|H{DWq>uMfp`cmZ8OGL7+3om1jq@Y@)k!^`=Cte;Ph_dNs?T7wC!*f=k|O*yTn z@}o!l0C*|0v%`7kapy5%i`MBPVMQ2x|6Uz6GXLH?&XU>jVSIMgms8bh z4AxT(v1tC+%kC~xrDj@sDQwJ2+l(p1rr5J3szvlOqbj?3ibT)fTrW5K4>oKL#H)b1 zG;ejDJ4yK9`p)Q&XUp=RD_9H7upfNwPWiGTIlbV1%PF(dr~Ev6wUS*Hfs^;1(RNEW zdVQ_rGj@}o>NxF*qq|nfas2jJwk3!}&G!?E*0=O3ewJz$#gPqkGv2+W`dR&rRSY-d zm#~7b<6Sivh_G?kAM0vAjXGuIXPEi zA=z%rOD0_r|K-P_wN#|dp(F(?@3ZZplCJ_-rsJo~x|JW)E3}WYZzaq=Aj(DS3l^pG zw5~^V_4a=7dn7)jE55Iy3;MHI-zT3iJVL*S!eKiV zqg`hQJ|nm0(dKUqG!`gKh%`l>m(xPKz0&Gkq);(;iY6BKrA!+@aE#u#%GeIlB^~CN z=JoQ`ob)xcxJc{9p&q}VY2oGcEh`$7crqsEH61r(m0mc&u!kFLxxl*IUygtvQ+yFg zpFl-G75PW=xAS&o1GnLL2ak2jBmPeM)|g{#2&frm=U7d4gRX_g6VNp?cdLpbq12j{}^Mn{rE#nlGNEYNy8B2y3MD(67 zCOZ^)QaFS(;#E-!az(B`k5lr?gGmiP$uw8U zO@o_X$3QW1LB$}teLg0Xv>H-=2eYIq!+3*Ez?S^G)q3{!Z4CZ+dpnuCe=(_`!7yxg zBQim#$XS7eCgZPe~O#sFF%gM7(Pym%$1Yd5%zw|Iq$%;KG@nr!7OWh#a81TGvdbfqg*AFTnPp$^aQB3? z-C(pW=sCD}(T%Mjg>ZBQIoj0tQ`_AT*`A_SX+zr&#u{dEM7J|pu(@3NF{=H93togO z0i!1K0K>K>^t$h=-($=-w;GF)d^HA*eU|NQ9DU!!Veb+I)ZbxU+%bDj0&zhSQAFbN z)fVi`yr?=`(1<=-L+&*0{X+)xtOo}}L?~mIGq6p^2FR1`D;FxqXw;rMZt}ReK(O5~ zURQ`*<{VCf9q7pDnhRzfyn8Yld1fOpX91lf-WcuX$B4dh+x&fZ>|u(MT(w9$aWwpv z91Si7jXHJlyN#q^lWUT*%sC$##z-<}{0q9#VM5>MGa0{z{m`Aq?1MX>A6BG{>Ut~B z&X(yhNWEg;T0_Sv@B@GIU5)vuvZ&{{y6`f$uOcajI&MmR8w$J z6tufimNri0+@a>ir=OuZgJ~x)hv89X1zN1rxHQ$Mq*54s7Z%#2eGwv+-jCzA@)<&M zHkqufy%HtUOKOK1tZgDjkxRp$qHh^(@ZOtZS(MJMWsz%k%&3@xLhL++$Q*_o7W8rA zGVeT@cEHA#JZG_5bUX&>;CS2FFuV9>kynhYE^p0=d!l>~x7|drcCBqrpeYr4q144B z-rHf+V>kOYI*#CJwE@e)Mf=H*?%cbT3<`HBdscTB_+DM}tB#{;Pei1=2sexVK)6{7 zD6R7AYQDRN&v(eCl4!g`-N%-vHmrG!*UREbM+uOiP{8)}M`YW-E%(bw!B~Counh%| z&<*CnlxVbpk?pG@Pi>1l10g4xmVT!*bb-TTZ;&?#D_W0#XM}!Yk+)4-_2W^RF7tM` zCtYJB=Fog|p6JvUMVzSZqdJ!Ymof``ySp^+%!c?f|061?JXip8BFoQREjDNunl9E` z{PvRZ5=8@2_LMwyzFyJcWl}Gtb=_MMXByT#_zieP1K7bcJT3Jnc1t2)@D%rR8*gXm zp*MJWDVDRDac?X-s9deaNr?!Hxlt2J8BPG&nTFW;D5{olvHQ8*biqc6V2QMvEBXL&kt zU}VNA;nu19BmOlXMZe*DTzIlF$~zz`PTl~4PW_#8Y1P{pQQjq94Cj|j`eK@^*PFwq z11eqzd^P-yH5B~R>Y0P489|;hHmxMPP3OJoILqVrouV;hV#?1iZ0y>2ux%8s zz3$-F9OtkD1Dc~)xz`ccG(}38rUdD5EAx=jrW);dYqKB@Cjn^ISlfw6$Tf-u-?&H$<7@cDW1hp6Y1d9|hsVGXBJ_mg z7LbNW7ac8rmp+%>*SC?xH^9qf-0p^VB;x`4)%nD5{N)sP`HwB;7=vQBR=-E?B4Vil zv~sNjoKm+==Q&oW*f2=)ubS3P^1Le5GDe9sGva@D>#z`7)PM(XJzJj3*;fcU@F%eM zE0bD!pY-&t?9I2eSFE=xXat7prP_1@uq;Cw74nR0up891@i+|X>Br4~gaYAsZRShk zxhmt*&t+8C|q9eEb=Iw7&TC8J%u;s;(6mw#fAn5I8k>t8$-~LEl7bc>16nKm5 zBG9HIn*3o1Tzc~8Z~N;<+Mxg#kxYwQzJhkz_&Gf;{uk@Z@k$Iy;og z<$MzyhFvvr`5C?)&paJE7vDnNdxnv@#zFX1N?7CIJNq+@Ok@3{zs?OM77V4d#~v1yc< zhF;-;^Wt4hfIye77zwKduiHhkfUKdOb5B4Z*Shcd=3%75@#bjMVX|fp+REq;f$3Q< z!Ex8nm-3dy7aV=Hsr!{*LLaX%K#N1-H`9DnYP4QSv=n^0L3~wjNX;*|&vB;r@w=_X zNfte{Y^`Cd(>(vlO=~EZ;{#0lcEPp~#bEFgybZT>9OV~kGY8B5{ohAW@r&ci&CWYa zWx>y^D*c--gRZ}s>#^G_z~I~83nq73k#me1ewN}*RxhTK^;-4!CvTi>7&DfEw|XNQ zQ^misfPavIX&N3;cUZoz7_IisNbaW{F`t`a<$!?-*AbR!i(b1sZ7`+-4ZoWM3Db-M zM4ox9MI+`{9?|ABYtTt5HULF37Z+qc(m!Lvpt%m3JYw^3)Ms^jf z8B|fX9=uYs`D^7=hf1k-(>>)*I_0f=g*1tSncf9uo0YGPiaAG?sc*j3J*{sZ&ewq3 zcr|iRd#!^|>BpN~!ha}HDZ}7n!xzd1HKJ}Q>d%?0V-uo$Bs=afH}WxxtWL>5gL6#( z*kR6~>z@O6Qlns^Hosv4=fR*8!E^f=``4i0pNDe}G24kw*piH?nwuodFb*&Q#n-8pCc7hX0SV@llRMJu!%3|s9RN42J#8gZX-I7 z%@W}hI3?KJoAVFGQAHrZZO&qg_D&aZ3lMdO5^~#j|J3y&_M%2_uIVE>aG;j@7*w@$ji>N5}KL!?HA!^m=Eh=IY3hysIy)sLtJu=i5pP zE>#6(vthh=Q>qLW8GqoM?ea2{#{If3eNWX#ACKIBMltTNPT1-}BXHlMY22c4ryqWS zH^-7dBVDVs+NM{y7|QLIo_>Hu+NFH*Y33!YfAjblf&}Bd#B%N?8FT8EE}n8!>bvge zK57scxqP}fddI$Rf@R9$UT>`nAe5~fDLL|n3@F1@y-cF!wJZt|BSKq3kL`bQpFhGE zlC5FvdO6Oi`sN-Wf9zX5MVxPl=jX3BF%Gftquiy?(>$+lzwq`#Nk>M?(Ry*tTigRB;vP;cp6n0@s&uhnb?%R$m7XF za9_Vcv|cVwyeJVq>Q0qh_PR912zA+?E!%PUWw{b~3z_)VdndcywF0jH1dGwWCa-2* zhfv=BpPU!ZsY6O%azRcA_LT+V1GzwynPx*}1n=QNtpO5xwDx@4g;)JI)qeJ`gZ8+$ zCS=O1gV;Ho(D4N{h2?!Ij18Ksx9ABjgS8kAyhE2ed=lAV31~dByq|bowU|=5tfn+W%hE{eV09FVJo}2) zTn}dA2MT)w?^_z3FCWXa>#^KQ2^)!Y4I}E5f2liI5MRKE0Sy4Z8U%S`E% zh2@G!P{Gc+>BQS&;U|uNVTxrqEJy8Z2<`3k^`-+souBRyauSF^PJ&Nm+l|BH!5`yQ z$*{G#r!tnUj^2*6k#5dd^yJr0rxc@R`5tRoDR-wz+_Lfp3jU6#QJC0QD+-Ycagys-Ira6rq@E+y zke?n(&tB)Ngrh^a>Si^9l@AvwJ4WBEpa~qlTrF1_A>bq;`4r!h+s*9(VEEszq%4na zce~JC2`n!Hw3rPtgwKu-*w@)xxt$J+eRxt_<%wwL+W)*0P50_Ea_k|7sD^oZS}QG9 z*m9{n(zxxST_2~K2XQSC}r?1ncvwn5Aj?;p7qXVy>WKJ{i{BjZXI=Jf^cM$X6 zBB6Kjsqc7!X8&;X_8rKXev4ZE62737w75)Tw=bU(v(jhpBj5-B?u;c+A?ni zQBD4-+-Tj;0Fg~R{6!7`LX=1j8Sr~sqTxT{{x-X<}=b%hc>TOH@zMx{ltoh z9KVvuh%TMtsUwXBVi~|{egb5aD}GrpF%IHaVYD(@TqH;nG;^$Jk7cUbI$gogkc{F8za;h8>vfBQf$A?Ewp1J!VdKbn!Ed^CFV(NT#SKS#z z++$9DbcSZa*&Gs5Y{aeXH+~^3&8C@W-Bw+<$R^WmB^U5*cQSKChvk81c?|L`P5Wd3 z59Yj2Q+~g$nzFR){8Vs0RV$61(LI##}4Kf}p_Mno!m5{FXQ3u;ZuJCFU2BAt)VwrpYpJ_tX~Lew$e z5G#_cZ1wi6aT%!VwJ2f^r*0`%X}=P;-SJqNL?-cpII4J4)45hP8r+ylquh^E#dRAJ z^`jl@r?nndOv)X$!(mEQW}@osFh!n6shoTomm}sY$m^qDsj4DgHvBl|juAe&3V?>s z8!=P+wPWBB@DYXhYvA21%qXm2kHK6@dh{v*i6`esDbpITx~)TV&F z2irEwA1va!$V57-PxsJ&zH^0SMl>spFLLjtf_l7v2YQgo&Q`sJ=kwXEjMD%9Ky1ZF zujx$jm<_Xw2nu*y-s^%@ah23nC&ryMnqLsPFI3g=oy&Qz953#jOzE{R6PLY+9|!Sp zh5ONpoW%Xz(MzUP16m)JK2&!51Fy37$LQrcg&N|K%61rh{tfP#x*TaGUW3^z$1Iva z*}DB{h#6%c^KO>N<`Ba)yAE#kdwv>^(btEUDyQQMU_1{ZUJLdOBn+LRB&{I@~M#}CC4l>=Bb z@}=je_2(TQ;Z)h^LgOeY~_NqaF}4E2n?9ZHzU|`;EMN#u7SbI z<@DE{@ZNcr-jD1Yd9C$Zf*EKeb+6t>Riu5l{gS6%Gml!mV?fMlObna_YsuJx?2OMu|XhOlXwHF zPNtsGLWM_Rkjyn6TWf`V$LcQKlWi~PdFSjnGy3Lx4K}@7TflF*ldTL?LeE9uw{p(E^ksfTWFLi^7dnTX(#fdoY*K1#aX#I>wu| z(&Bg%V}U=Hk}HBc1VVJf?j0#axwVQKOYH{2MHzjJg7Wxl!W?k4J5gjN-xGP;il9;5 z%sempm1=$O-P9TpXEiz#&~V zC^V>?nG)DKvi}49`m@`NkXl;P-6ce^didBY!VhVbX#!CuWRp2!D?QCzx4|S(f9>^Y zn_I@hh5G%~%;7hGpsxT!BR%nIosNc8wU{K&=?w#E|6ro*Vj{79WvZaf_re1iJqk`q zj&^j{z&`@V2y81+BmIMF%Z?)|!XX@oP|?q#Hv)dVIEh*2luhW?2pncK`rc!$jOjV2 zrE}r#w{M+=xusMt;VK$)8_oEkA=|UI$C;XpRW+puno|Wu`B;O7WWrZtrIzu+a)%QM2lsj4kd9 ze2yqj5FtZ9*Eg6sDKlevEZ>}98uf^})ms9C76fXg_9fC9xQUYJai+&x+*FzmK@PYu zyvAV0(v&=;QJOuh#Wute-9_*P=IBQ+@7uYX&P6(Nb^!uKuKaXk`2fL#%!&D)KYSC-l`lan|tGTeXi^H0+ zUO8H05ptLmMc!lv>&fqO>20L>7|vUR-{J;V&v!!HYI>^{Mvz`IO0k=dB&5wbn~(jp z${ERNQp~yma~Z6DmH`r(ZNqReOjASkugX2)sd#BZZ@skN|BTCF6Y%(*y~HSqm!~yV zrV*X#7wt@M@bp<1(!I)Jzf(W**{&a(+MC=3t|jMZ2;C<#73x!tJjCIj3Tbw%PA5j! zOS!KXZsFMEbiD5E(t@}8{#^6ORV5RuB^#lAX#C)$9vB(kbtSZKi9Hm*4EiE{*}P`uo5V=G zBO^qsg$fMS0aCC=AjOXAQ<}+V_V|7Z$w-U^cHya8+KEullL#~YJkehMz_j6e$! z236{IJ?q(TcOZC+K4fGyEm(+oCa|-H+XoI~RYg@H6(MJNz#C zMXGrMGM8xYv0p_-70E#W@K$UwsKyW!Cqf|@{w#8)sggLh%v>ZQlywf-zH8>|2znUy z_SI_ddn`|9XsnH3&kTLrTuGVh@Wbm+%ZUCSNE_8Wa|Q5gw(G%&Z0R)iB!P_{u5&Nf z8vj_Oi9&%wRra4km8!o~zb@Q-Bz>zkb~_CF(DQsNadx-|?*LVu{Bt-r|1)PpXV*LQ z>$J2$cG!bf;LxSFxwR=q{@2Mj{|yem(7H^$u6VS|M{63ka(OC{2~KfN_Ixw7^$G3= zTCP)gDY#vGlk_y4jNNyEL%ZHBLq?`tGh=1|2ky14Pd9EaZE4A;=;AO)lzoqW8OJTRGCZH!Q7*LG)q_m>0ll?6h874l2FQ3gnra#+sceDz?6Do7wUKY+@cIRQRvE zcc>@f_K_(dtnQ5d6@^4-{aW{Innq=yvB+iP6Gy2lw*=@i z9tQc)v7LX18NAOo?=2qjFRQRjj}=_nIevaZr8hL2p3%=WN8O(*ivQR#6&?l6JjbIl zIxqUJj>IrZg>2Q7c9@<%)v zqh?Fh;ww)BQCsWQIUbgHs|wWh{Wn~_9zSz$vM)c*HyGuPm$T2mk_G_75c-CPI35$d zXX>9`h;DxvCz;f(CJsvd_+AD`d#}?641_;5f|g{Q}7l ze~GZv?aj&|UVxMsSWSzavmPC?tzL;mN^=;u{1_h(b_l5=hZt70j6DLSE}O0K>DW_4^;&wN5N4P?L1|BP&*u1^k8Vq}*=liUkd7%hYv)jQZ7LA4djg zd(D&IJ;#J|lh0Y1^r|4=ngiOc=p1$x!p)?=5o=>OnIOZF&z$BeQ`;jJmAn`*`~9TB zd4|*$>Oi1u6&rwb0`|M4I%}a&>4m}AzaWswe?%Ia`nyT*=fnjR(S)1rH2XY!lEeV! zh?*6~LvjQE_JG5d#r)4}fp1`sz->8n;)5@$i?^GjrNm=cPcj7E(YAnbXC+h^*s}}V zyVsMPGWguTXqP~?wx)~pbi{`Yl2t>j)C@AXVelED);wk2Qibu%<%zU=Y@Oj)AzgYK zwW&3di--3&h9Y_2A4Io!r@8awol8W?;WUXy;N(`V3o4_*@G!=#R|Y!;koA)>tC0A{ zZh^gbHEVqpn%o$Jq;kDN>pJV-SX_$Uz&a_}CQROSqw-A#XPSp$*E>V&q(h#T`XB!%s<(Zo2h}$D(!B__U&y6$VWy#((Sl(@oaH@meND)U ze%B~aj-4rfO@Xm$*Ut_zZ6L2*!_cDq9}|lsY@TLkYEig@BCVQUyG*|3dT>PzWG_=^ zqdw!(B4I!#=EuUtcVgCU0*!J_X;AC9(SD!yDX?-wK!iufmt}6jtJ#CYYI5}@nAO8H zbwE847Zw%iGlBuwH+5C+ej)mt~!G?_7!0(FHDrcgPxAS#nG#M3s#Dw zp@*quFe!q;wS&PwbmX#|k}7xZPKenxGAdiY#nsOSn+%hHhe9N)LH-%!B1-9agpswe zqCTF-5IC(E>chx-x1D`z(R{NK^{GNfiYC{CF9PYI4~gD)DHfJ3bD`?+KCt6N@aFYAuPLH0^k+~j7hCqeh*^_B zC6F0my<7Ls^hDl%H}b>0h1=+V8|^g%QQ*F6b6U$>N~?Qhq{y)eyTuCmdKsA;9T6Oq zP1s9jSFs?v-GW_`ujk^S5hGo|ycuzRW~BK3PJ7r&$ep+wtWg)q9n5%j!KUQaylvyb zwA90ZHF5YhUJm``8%=1u?g&gQoasyZ4Dx<5LCuV2nC8iS!!BmELDe`zlh5{34Xkyx z)5;P(xV;_?bjUnMCezgEu40p zd0ph2c~&ll_n2WYIW)7mjk{9=D#{eWvb0aXE|yG1iF|dF*@MsB)8o0%v%(}gR-a1b zN@gZ>ql*RleJi{5&RUBbms2o{M9J38Lwe-R)0vm-qf`WoR{Hh7qz*=IRYeO^sT0g!T`JtK~IJiKxp|Heuvjuvo+l?OTHfA(x$LvJe z6ls+1dcsUnkd%KAaW8GXFMt%td*x+vfsxI%`wI=H8%0t-$-np7gFclulp%1qwf#hi zp~}rB<9cJ0lPij>FIj`*1$Bbx)OWt&cKg-FBM~H(SzwNefm>bUt==I^_O2xP@}q9$ zO}yy<9&=Ou}Z7w*MN zxoj?p4ylY322@saC+=&$TUz+-+hr*w(k+4JGRd=2Hc{=-Sa_<*?vPnjVr%F4nl*>m zVZXM>X?1$_QGe6kqWl<$i$0Kp5V{mhA)wnh8#=ESi(YG$YxXQ77hXzu;hiR9K`V*Dv~H}{;k&Wf{CF2^vB*d502 zDfEUKsf}a8;65W#f*)gfU^e@OEQk-CkT0Q9)5^6{4xZ3e-6D>}VWi2*Le54qJ9doQ z!2h)rUeE@Hd+FGRcHqS1Fr8B@i(A%%54hNsH9CGy&#cEA<7l|wAOBwc;BmY(=**8n z9yjec1lIr~!(4lz!6>LLj|&0gdEGJ3kHOYQstCTB-RAlg<#L|asdXsaF3$jof({N4Y&jEC@{{5Y^xK^E`yIhw`QW07*f z*VT$Y#}{svvv^#_4KqwZ@z{F71k&G9y7uJ0NC`ND#f#dMSZH{(@$px0b%hj`7uw!> z7n}V=TRY(?INN}DF;<^!fHNz?{?ptEH3Q~#_bK*Nk%=U{aSeO0$P@vm^$Q#Z{iXRW z9!DN4m3n#Nf-_?JKoq2{G47aUckdiUislR9_ezc*FfqxXJ6={f0S&CPqvHwMa<$EO zKW=Ch4wX>(fU9il@`kM6aLqV#*lnL6u7+Ng(C;g}IJBuWuH@+GM}#2igB|y%X_i zE*b`-PKY@|Z^iANl;0)`$;P7H4FS?_CiJXcS}Yxa7t#ighQ*?)39_IHZ?ph4n(_rm zg94uC;{(_%*gTrO{H09EEyobuYS*Holi@woLwjk{nn{Ev@|l!-MTIRC@)4!@H_9@qR)E1{EATR^A~+F! z%V8W%dr8zS;Nt<@@v&dG0SMliVEC$811(B=DiI z^Clz?g?8uzyIeMTxm~N*)Un*yLUZg)3i1qOUO76BW=jO7Ak_UIj$mh!rXdDRL-v*Z z;Ux6gDX2zH;)e`=S2wZ<5ACIHX_dSxJ{KnT?xNM@tV1`&uFo7imr*@az{jp_|Ell^ z(v9(rs-}HJ<{@VDoG|5c+PvpU3zkBkl#x+uAMHm*mq#EH^iq8icHXX4g-5E>i57fH zUJ|$g%8UyW5Sbh*EkeClF_EDULY6h1bFuTk70(tj$vSYv(Ris*gTTr}H>bk;GMHk{ zC!1dk9`Gh8Z=jPchcrC5oLggJyHDVj(5SXVXr19Fk z#G%y`f!*qSsrtIpCwp294od{b&E^#IF;Y?5iqF57mmM8Vk_77M$^agnBoFKd?IWd` zGdq5Lelq559Qf3iA?(8E@w+X7*+9Qg_WhyZ?82+qh-dwSllijWx*FGAKAt+;k6aEA><0Pr=;nGKhK%802i{SVJbzj$8z*)e%@WyFhxNS_)R8a@Vv*^cYMS=Y;-dTF=`o#z;~rhT+y>zE6wRCfx8Hg%9x0lWT(rM}vy-|zH__UrRmA7z3f!>=tK)UWS=e&h}E zorCXEa@EDt{Yh8Ja(bgPoqb!2@`^^8E}dK)J$trP@W{~iYi)$ru5?zLVX=2YoD~id zcywT?+Bm~IuFH!J;h1bwWTS}SXYNd;SS0Vl@9@snJ(Byw#ntG#ZX!JJ)gQVgxqO$}%85mA<~?7rr#lswP}c7@sR{U9Bi{?kns^EE+`_uWE4{nxDB4d zLMa;=Y*hY`U0$;KzSCtjSt(ZyXn72xaNIZiE5)I=>@(iLZ&@uBVLn1E>#tq6pZ;gB zMU}-7+$64savR}mKx_95|7z!4c!=kKq<;C*J2X@a>ey70swRRRynLojPII}SXD>p+ z8cv>lVZ*P^ZMOfSOnQajq-<41*w8wr%J^sxl3VR{ezd!Q+?qp~bwI!M= zRM%reQzJT@XsTup|AA~unf`k$fj3@NB^ou{u*uMfD2xrhI0H)QMA}>GwmVFYpVyg`Xh<)PBaIJEf?K^lQ9`5SYFIEHNrxUgs~vXu<0|+@6>L_S}Wkea&a!f+Mfji~6QVDp&^X z0Z^xQZ<~i$PxbB{QbXz7Gnbg!HAcd-6`tk%+D|NT+1N&%4_$NlR5QZpdeVzZNEHjU z#(6Mvw}f8g2B2{!%b!Y(wBJE}Md|gvm?Y}}q#JD=nace0nUjMBW1lgF*0Q7wm+=|1=}~wU z5gr$N*LO*bIH?-AyR<}1Hgv;KA1CIC?ZFW7X$Jd#a;`>>{K^VB>}?SsGdQKGk}V`3%-_pSZn!0pwg?uUV24C{9V>m{|Or^b5fjM?&-1qW4)p91_(zxJTb zzWYKiO%XEa@AelP;1LA$$`(;NuZf1cjwlkChWyxI@B$!fla&@wYao7R#b+}Q%iDL> zS|U%IfqrfnRx$#A0{q?|;1qeJBh)nWC zR0zKpEIc@B`2%G=5?Ji$G~L#XJ6V4~04u-NhZ;kfp~&>!=v1g}xEBBtk-C8;c2`b5 zXk?|#V2WSnZ#&?OwF7TSak#Y2aD@jN%ss)I-}10v-)I9Ta2M ztB^F(m$Dh$IRCK#Uj6emRVlGdHQhSjx_vErArK|0V&kkQ2Lm{3(&I~Jt^+ERNiR7J zk@~G?Du5EoVI6629$$J}y~+vI;&(zo*cMlb(UCj^lM+0gFEneuy5h^>(DBS_Y;1aj zWn-#D!Jb~dG`WP5=r3zYga~pHz{eFv{X#!1w0jCGX<2@<*$PkO*b$zTVF{_R9WcB@}i=~Sc_2grI< zEA%sz3#5;z;oG|ZQcZLrUkW$gG73;S1OaeY`RzDZr;~}N{)|==iito2b9iM?sUT>x zEo)TGmaoofGo1$}EFV>H8X5h_K48DQv6Hu?t~nfRCRIFp9VyaH4i=`nx%5|IO-hG;;IBd!4}#!I>8*V9tMU!t5}6c*BRw)`R9xO zw#H^c{R z{P6xE5P?uqglI&x>FN0Y{g+=@&m$XUV;m9D4gM0WK44Zt0{1Yx@0tw&VSLB|Tg&I` z*cciopeyA_q-Ws{fd4zzKv~l7q0zIH-;2pM{g8+Jj3UMXVt-is{(3g@A5aq6|Nq$k z4?S%Wp9=$EtIP&V0bins1tt2TNpmA`nZas&%3iD_Ne;LtBwU|K=L-btQt-aYZ`rHK zdFT724gFb8Xq*z@PS9GEr$g`rIK*eG02V*-X@h2W;#))lkE1a-1B3;s_5t;c$1(8A z?=%GXI~KsD846%CJV&4rkhpnCPm@Uy+ive{_YXb<=jLD_3+>Ad`!L0q?~pW$r4d`q6Wu*lqGQJv=i(Hw;sit#Wg25I;QbqSC zcbrpzr%>t}&3Ge&b_39vyGH}@R-jf6=3~%kdjq?_Tu_h1_qcqw;?3c=A%{Ka)P2Bl;=cDf@RbGP{FVvBA*0&Mr|FLFEyt_i28Gf@m`0?9Np90WhCL3hydb{qE&} zU6GC>^za%<5`*UBXFPd8C~=drw+rLbb-|QM<9a=k&KUtnZ@D{0nFL1i*WRQ8 zgw)?hU=bL}@ag=u(9+gq{epw_KQ9NM<~4!s41uPFG@F01dl>$IVR5n#Yhw!L5FQ|z zCGm4j6v_Jeiw1 z>R9YSuNjPqSfpEIpPCaPISJkXPVt|%eRUj9Mb?C>8j}|f>*3j zz$6+G%|5H0tZzMD8Bp_%36V`|snr6#7`QdMd?llZa=-w152FA|J#hH1Ve|e%EvYbs z3b8PO~-oNSny0C38di(_O@QWLqvR#5~F0@;JRwy9>E?vE}C>YRYj6xi~Fg zHQbR{kk})z?YDsxFb;OLR28j*=D(Zpi#A70``+ypaAX_!+av@D7Zgr*_Cye^t9Eqj z^la3J6^?;%ZJ82>_l&J}ozu6s=}4N0Y!FD3Yj7{2xN#t(NCXPU0?Z_=&PtG$o52~^ z;s_}!TU&p7O?AefJpo^Ul3rgH7PlCEpyh!1hH)Zq2T44wH|r4zv{kw3PC&p_wGXVI8g&Ka;mk_h?F4L9ZF=tO=MJ)p^9&p^yiTQI?}i!Ft+4L_B7kB z=;T={{R^gePJH`>px5Z7)>aRhT}_OA$p_HXT>-2nntzgs0!#|vr$wRp-j@Y=B+{M7 zq12@Jbz&W#;p-@0{r$E6B0@iW0!lwMIame$7bh9`Pp<(3uQQtXHwp?R!L(S3843mb zzEub?&3^z32!+!>Hw9Wq(CaEMJdvKSyQl*kik5&65BA%jMH$A<607paaD=n{{qHXR2&su$FXwZ<)@h0q*;lgb zElmNK6;Yh2cIuV8z~3K+tKA;?;E#CZU`T|s{>-P!-j~7Pi=mNlgt_@w>lkD)*TM%> zV#wm!dZL@p`woDN18hKTgY9*;Ak9-?Jo|_K@R_Pca}v-WqQ}uUM{sR~P$5H5kwOAK z)3BfvuH;Q9QRF=KmIIHSM22e_-u=ajETln$_?GE^jogmMWy;^eBbz-=zji$$YH!cy1T--#5(B(PblYGk#SG>RGFkZpTnA}i1Z2x%=(|2}$dzLv zxc#ZSk5_=fG_GV4IollgHjtf%PC4z^<}r+_l)U}JyunGMLigKP$Ze+km)9yvFt5R- zlw-L-72V}=C$UVhTq#ZIg8No-VK$VQ3vLKh^1(3maygJU@V!iA(!NE)DRj?T;X@g# zvzg8Fq>6d@OT=2M)eUt7Ggbe){VLPO?*gyS1XI8lMXXMOZI3|+c#P#tDmzSih1!?a zY(8h3(nYVO^n4!tqbC7kM@`ZC`JLrXAD_U#4kR@9qnX5F)w1HQAHQKh1S*;PpK&aX z;08ttpV`0O*p!a{mXB+b&MquvUb8crBT4$1N}QLX{{thpb+^>rZf>*-7f8YRr`R-# znF5}sx@3rKcdwWP$hJi`lz~>ImnX&Z^WPtXy#L{M7y4AI4LAIm@wBy?nJ{wTtD(k? zW}M@*Jxy)2|09BM02QIkvNG$x%z{7yh3A|?hArU3Yw=H6K>#T$T+f}i@B_jm$mSkr z0gBivXB_1#QEh^V&Zp_+Cf5kN2fr?YtzV(i@h>_BkkcDq?Z=EulgXuWaJVfs@TAhG zQ%)-ZsNGlJ`>Q<`**DYWdZ7UGMkZG);v6yk8K3)0rq@2*-SKaCwx$xY&$QQIVf|-V zEQJ|{Hcd<@zlC+o5A%nZoVUbwyza-Pl+TYqYsa+}4D%SApA2Eofd`r z-*t4JH=aqwAIM+7Mz0UPxNiJiEPZi;?SdZjK=w6p0Z4rpVEt}Z9#Jcpw}=y01LVk~ zOcS6i2zBnu=&AF{*3~D2?;MaSdweFfbI}A~(-dm!aFsQ05_=Z*qHmqYuzY#z<6Ll;d{DkASM8 z4?NyrDzR-3w|skdLyf)ddG(fX%$C>gpQ){w=P!F~T%{*e?8D#k6b6r!j!DKpg!@%T zE?L}lprH)Y`$1JgWOrJl~D06|YF(IR@6fhFt+SeR_v-$goCOCo0oa(fSuDC$1N zxjw$Rjzc-7&I>+Xl*SqJmOMEqdNL{?oA=MP27Dx?vu8E{BMSX1Eo9B`Ak{TYZQvzv zRV-|UZm|?NJvTR^4)FEAMEBa0X{kz{&F()c#HBb4#hl_a+J8U{Q&N=DqFOj-?cl zb2Ruesy-5RuosSX{Pc5#YpYWsi0_0J)1D~A%-4MHJvV88}~i-X~k383?9Bzn|FH{t1m0o#Nw@L zlG0{g{KT`|=@b8nVG|XEq-gh};g9}B(#PS$SE=Kmi%=WRBLqD7hlytFl5)%yp6dgd z%3fhQ#N)_`g7>OaxqF`rvm;AoqSX1aM^=t{db%I zpsg*i)qHOo?Xo_gh(XLXX66ZwU?AoOFh8b&yMhyq;`eA#Ol*ch*OM#>IDKG8)nMxc zt7ea#l|2vCalgui5bPVcR>Dy?VpT?$&VcMv%BU4Q6$#^ zl`i~B$VPeYqLjud>$=gINR=0ZV#xyBIyh2MfP&@zc&5twJ!60BwiCA~Fnp%TGr6LJ z9()V<&%9<60@9^Q)IT*0osY^>7oK4dZ&n;q0CK#gc0}GBT*3iH(X9> z^`zJpshkGudAqCYF_~_=Ur0XT*EQQLNzI-esCgE;TATNN?-GZBiDxImpx0K-N*Yw7 zyJCM$}-#R*BDC*dfaIOk|)j9w!T*}?=BGAD?M)*@zqeUkqE+IkX&D? z#u;z;^Xt3C8rJ}Q6Z>-M^BgCH3`4u`WsKwVO+IPclV#EZFXrRTUfxtYPNi;tFE3BZ zBp;#au>@?u8EWTXZn?W~yqy-wx^-SL%JZUmJWEcr;OLQ&0>i!edRx#E%tn&DVA}8V z^!~1V(euW7?t1lshdksuBl?6;n4`X#=XWi|_4R+^BEYDwoh7c*AF*eG**-z}+ z#roP2`1$|gf|K@)X+9BSw4%)Tl58RLOri5KywO)UHC6iGnCc$ADaZ&ovy<&u|9k%c zO!YRCfnzfC=FS0^gFE0qE)BipX!7AM9P$_hMn+T0@(d0OOw=dc7ry-2_$n?#z+P@+ zs0+{FlD3Ct9JKU}0D|mKN9DSebbmI#Yer;yfjI**p!RMut>N#EWXgl*!4t^i^L<4e zndoHvi@~b#>Q*)<=j6vLapE8ICY~dFB67;zIS&m-)+`$*O1 zT5p5@!lgX9p!w>26r|k1?l)hZ7;Mk;=wRn~9x7&Bo>;#3LSf^bKBW5KGCSDqAn+2D z`L9yzbFt}ortD*PSPi5n=#<4WCVvp#{n?a>f=R$AB( zu$mTn#6(a<@eqb%FgY*IY~&Q0bwvE~StJ!Qhxpa4NK??>;|j(BAV#j8?9QE&ewwQ;LLrJ_1X^N&r>vCx zK(RnB?(;hu5Rc|=0=w>R2&j_^ZRrSc*@C0%do#F99%qQXihUrLYuse}`)AWfg=A3e zsFW<2fNdZaFn`uTmaH$HcZD=GAE*O)131Y?40eCI)jdI$izQQJR8Bcm08Zb24=(+8 z$K!d|;n9($4mUxPoToiL+siM&ESHK9H{Xd{g%yIT}A*Z93qxTd3+&$ z$7T=I3w`4Dw2ED<-gGI&2lbX~mpsGgX9~hR>87r9(Z8(*XH7Mb{>o?x;fh^6!ohRUv}Vb;C_%5;B<#NRcOhWPtDS;mAehmTc<;CJyT1CFSI*{tXTj!dheM7=0d;A_tj{db(upI=jqZ#((_YL!^Gg}(?@Wg%lN6ecR8pl zvnVEW1eiRx(iFpcu1}jni8AOHs7K-ChEhh2uf~_2;#%IaOM9P;4G(5KWaj`kkWsx$ z7}-S0@4QIU<#&q5V2t-xwa$|yxtJ{gu}-SPQ#pWtq_3hL;S(Bfoz2gPx@1<(G0>&2 zx!f5khG&`DQkAtnnEiV0o&EF&+8Vnb`p6-NuPLz&EZ59UtcixEY8BqeTQ^z%Y8*M z>@)bi@WfaLMp}cQQx*P5Th9VeZVP`;^D)bGo3qx3B2ym9G|=@dl2!K{|5`BVgRC>+p*UykeIZc$WILcCs;K0`Ok`(O;@23XgDJRnOXIQq+(SrRCEsN}5qpnC*Qrm1EMe6jp z>Pe||wx7X4y!fvl#7uzSpS5RFKAkLYIo3ZK3;-%U7Iaq7#g(|VgJ*f4h)rgtE3N>L zem44*HJlEM-=Ohvci3)pi)bg0F97W7X$!(tF-Q+%Pe~U_u7m&nu8)x2){%mx^W(#k zVxKQB-1c^ajEdlCnMQ%Rt%@y#t@nWQ9D5XSMi&BA`dJvs$Pms-nLbh304J9GBmp~; ziRT%V;4rC_%EYT&Cshbw0Z#GS$wMxYPK3t8o53lQalo06o>4GguhEW4yoxy+p6n_c z-}Xm(fhu3^#`clMmi^>M#%fCUcu8yh=UT#->%Ex~YB_?%1%|km`^F1jy)@tRi2<_L zgx`MoGLZwy=$sUHc14^{rqwcZ0XpRXl8TyQyL48M7piA^C2#!DExv|^F3 z4WnyxWxi}uZ1mX6Cmny^|4S!W1$d(?HgBDJWFT-J&%P`nzO|l&5P+X3eN!e7Nb)57 zS!EsffSq4K*9auKih+JiG)to@WpaM{lX%>s-yA&2i<^Mb6bei~ znIa3dU#GeqT4HX|IL=mAd+(AtdUP@LNF?>t?(#6XzF25ht+Ah^i}zg|(HT+0cObU& z!twAkTzgrYS>iV7Stu#@?Tr1Vj{3LIPk6=Qq+{vfx5k-#D`hr=veKxr7Etr3!2e=E z*BcDFb@%pMN5fJ8O>u>A&iI~dr3~?x%@ZsIc%UThh=?OJ^?fp&vw%?5@8WNPOS{Y* z&_+eE#=j#6aPH>9T)$K%j4I0(lN+OMX#)Z@p%G6cSAo&RJ9zxBO#B(Ru|I%t8Po*@ z*z)-7)o<7UR>}t(WVq(R(a0DlATNCvh9-nd)CE|}k>wcv2XNO)cnc4$+^3BF$LFgE z19=9Awr&A{*-41fL36K&2U01-{S99fS@$M}0i2G0@Vt|rLXFz**CaGsRhz+3P2QryQH@yqw>lN&~YLQHiQOE%st zX-n@+OvNG>sffPgzNZ9iy$RtV(g~O;m{@e0WR~|+RJ?je7SfX{w`h(;CvMI-CjCyD za(x#5=KR&SznR?79B%&m)BfCeYIfzN3Hv?nJ*C^}ii^4T!1Ug#6Hzf?z~r5|+>8?J|@2i!s@Mn4Y65w(28_`s>;2JBozE=$LP= z-br2PYpa$#bUUqR|II+W`CD=9VU+`U7?QJI@CqYm;!K)FLGHMC)nE2n@Z8%^JKmy~ z=mVj3`rDOhf=nS!LxmDdBz$|ScdwKLUdcCj`2~2TS@rxDxST&W(P^FU?y zyGf68AG;4R#WvqRYMb|EzapBQ17qGt4|?b^T8_T9f<66nyRO)EZ_eFHt8w>+SI(-0 ze85;sFflP63n9yuHNH1o%$^bc=D*PQyN0~+t3nt|IS{B?N*{8F=mg)pYJw1y(IMa< zQgBh3*6Cv)9zWq2XqEf-x3eIM#znMuslXoyKG5`gL-hnb5Wwqk_l-Xqcqk6zo-`su z9zA%fTlM|9WCDb99}P>rvKWYfxr({5|N8dlS`eZv(i3i#I&6wvzi0%np^gOuN@m(L97hq?G z@+kP96PCgSCrt3@Io&@e+f3EQ3IcSY4A{g7H4YkFO=Y^g$3HvMeoo?7Lw@t zT^t#}W)^7gZsA{zQyF|_zI(AV`qm@QYlk7KyEC1E zdorE)|EoqGr4Vp9=q!e^h*aQoL|dI|h#;G}`sqP2cUwgh1PX$vaKd8V+$oO&4fm}W zp-0D%-hFck1-ePCG#>#`kdOz;xn)CG%gTy){P$hYXG3yyr?1mC+CJwpH`U##JLq>B zaE-Pvnj@ZB)qS@UGtgF{G{iR!(^Wd~)2YY-`d2EzBcgyfi3b!yfBdrrBRCvoi6u6? zeVW#TWrXmO8XAe4iFQl}$UmDGN(at|#bH3^RxTwFgV1lq$kburPEr>m;CAZi@?)^1 zFnFr6d`X3>B5qy_vux_xtU}<*H@TA8apv>)Vzrh}?q2LrK5*mUawbcR=~ifZ!f$2W zvLmMkJ~cM*55&{Lx+!u-60ailUYyBfMk*z{WZ<Cwgv5 z|L^7z05d0TX2EnT>j-#gDnN`lAiOKxaX9my|48RQ8-FLe|M$NKDM7qXc8Vh;ioivZ zGTXO%x1r&-2j(4eyScvWvoxI*&vxS#OUDPj9GHbI@+EZn0 zgl39qgDV-%_1VoCy*31{cgyq=K`Oov^b!LQzqbAzj`H!w&!hILS|YjtXSZ9$>XS@? z5Sz9-{dsj0NZ2Up=THZa%~}kaw=8n*}H|*v$oG(mD^Yg;9d`r zBSa(Iw>*6Aev$@XMS~8kqLinnii=>pNW8Qd7Z2H#r)}fOOaMkfE+Zyp2zIYqS#DA9 z6BjUDCh2ua;gHQnGBU;>rqLmE39AGh+(nYgzN{{faDSW9EyRae9@wF;MGO?~Sp*`I zVqo=i!spEfVnbNsN89e7*&}i7A6XwUc&msj1+(=}q};nQde&cI1VqSlbd=2@iB951 zi{W&NAMw~|`~gu}Q?;w$i-8nsL<;(|%9%gr@ z;0b(@pE5d+;)zdnG9La>8;#SDAG*)SAQ3POeO&S=7T67Erhe^^t=xLvFWT9KzxA!u zhKELma%}2?APfkxxWd8Mkj)5TUD~rpBSXD>&#}DmTS@XHDXF&E2aCrgCv>Ja8nOBIv0mWz?xfw;SA`ktT z9wWMk^OQ*<;BQQnNa8({y;0O^rq-4E$#t`pK4{+W)F6vdrr8-fi_h$l&_xnO2s;Lr zLZCkhH2rPk_)s`m>|kuny)N+B$|Xz5JBe09BeLD`a1)7U-{=9T{V9 zV@>|4?=donZo#`i&F620OQBT&?3ZuBax4$tBC>xpx2qw+6-#&5u-VksZy|o+Mv4p| zTsCe4>4*sD*7xJ}Wa)r#MVfvudpfHpl2jp?0fcLGfJVp>`-+=7{C)P3nf1w7=Iy)u z^sT$S?iFYd!5Va}7Ly|o&md|tN%UW!h08}q|M8GL;iUGbPPUMF#9|GP16JEd)>nKE&J{*-`SR+eIQ)u z!?8jgz;!b8^cXlZK|C(F`Mj8T1r+6E4vcP#1MdR#RpSz<;{l&l7`as3O z4!Se9^5i#$9gaRer`^rMLEN$WiN2^SAEffLDe#IJ*rlLQw5K#lP+cN})O#;i`<9pF za)B;BmUI?i2O9s0n_eUV51dM}L{-L9umrg2l2G8fNJ1ONG&000@tjZ&oC?pZ?<9YY zzfBBlzelJC=j#Y^R|&Y9yrCe;Fk*l&^8mgKvioE&hVMBjKi-sgerict1kG#7G-s{V zLXQ5xgLjrM`aSBd_~g62ATxZp_Sx=b~znOhI?n<8C) zNSs@j4Zd{S*lLu^9DcQ8YrXKH&O!|w$m+y?hI^*}hc}XVcG$aFU{~xhZ!K3e4>9?z z5BnT9PonFA&&-&<@#36$ufv6;cwefx{gbqNS7Js#O9vgmi#(qjKA9XBcl=V(bXD+s z*51H+*v6U}i!({W9axm_Z=6)mfxd6?4d=_v3Sn%QYBD2|AQALzTH@B;3fBW*9iwHt z_&>0JZ58OzB@;;Te^==|T|JFHvS1$3y!`7??@jYd2Tx$esbv=XY>?73_BEMjAsK6ZO0hE)Rl$TVkgtm)pp<6a-sacA9lmmQTh~*68Ae; zHY}+c6P>>@>}07Z4|1hUrFhRm;Z|JCu|wz9iXQ+S;Q1LU=MhMJDwm=yg1QAm|^(l^IxC7r1m#lzW2FEtZ>cPA%37s1InG4wx`Ouu*EO; z`AcF8%WlqcZ*WU=KH-UZA45Y>abgQqG%-fMrxwNGYF-8Hax%q-Qp*W3`%pHziEnKE zY-ZRo+)+HZ8q2mS%<(pQrqgG=;*sqT2@F+qjB(fF+c!gjUmdMzLJq--#HT|1aXdyv z)T9<{kN8o5<3&RA88#1Grg@afPbNQEm7^uyCz>HMabEvDdiVLm!v?s1eMu zmd$+RSp7M7Z&$f}$d+so0M&%9>jSs}XZA`r&3Z5XX=cY4a_m0(pVIvRX%}R z@jL`z`1rY{urp1^ko~a-EmYFBMbehzCxne;3H>j8emDJ%DsQ>g zzx-1kKnR9}A7>8sUAfg1Zdr6HS@)W~zmuABi?qEB(I0bZq1j1foDEf_6EDku^(mb> z%$Fr`@Sw27SB~~iGs9i9kw9Q2fWeAT<=#RRk67m^>OZEpQ27Sf$^x&ckYtDw$br_@ z^VB3z76y>nK6=y;C4tvWzGjt`rtaqb!Q^Ai|MCkJ|4gmBxZnPq=eeMbJ8@q+C+W{? z;oBd=++ec6@ckuu|M%WhxKdAVTJ7A11~w8vrm>>qJDAelf^wygNXD(s6L^Zur7b{& z5r;tcx(D3iY4ho`J+WirG5qA@MzS>M3+^q^A^>Ul7J~Db#n|^i_TU?_2@K5h=`VIs z6W(H|9F-#{oLS0#^%EC#xj}!GR>cbLR*yrd*2VwMyDnD^KgP#rQi;Ft*cy}Fsp!Bq z@4ylu0DO5|eI|R|IO3NypthFol@O@v`36SVv;Op4!8!oFqe|G%O#EtWM)HE@uYbH+ zh};5L*e+c5TW+o!r!A9IEg?{qKh@uL40^AA`W_8R>`K=^5j_Y!4Y>Jz6A9*1!6;wN ztM7bS@IR!kV@OG?sIvP7Iwrn>I!3OGW6%H;1&YR>omhYQ;er3Ftg&p~ad)=H96&V7 z0D??yS;EhJ(NN4LbuIf-VJ8`@w80j zZFYI{`Nz_YmjM@NqZ%!egQY;Q_|N0BYtI_w*d;j|MOB?QE~AzjR;R=3hTjA8*)dJ*-!+I$-krSnNY5_FXJ_?g`> zIOy3ZbcQi>D|8m|_{5?yEJdgf_3l|b8*w!j8b=mlz7QLNIOc9`ShnoqxMFwJ^tOj# z_?ZNpIb!(IZ3{Vo2LHnbyeU}S<9W}On6-yLzzlcJ6TtTFh4t2V*w3i`r}wX7)vy-H zp*Hn$>ia3)4GVq9i-+zEIRsv7JWl6u?kO_nYZydyG z#aMs^eri51J`6Pe(82HOLhWW^LC(R<7E$rE?8s_9k~xPZ$N$_GAt6%a;fr})l`KJZ zeo&`dvDJLBhaZB1mDqCdIRMO~HwS6Tu-zeKG}QgWu9xk~1dJqsP$W(H#c$0@pjDUH z1|P!LbflMH<&e6qqRgnn7!n?- zd6#|;mmdI_Vi0NQb4gJRHp%3$6H4FxHrdSb#yw%4=K~~_{hW<3 zpqmDUPHo7DToOOfNA)?s?o0jMj%v9%hzo!LEL6VPMrOvd3vCGt4mGV26A%jELW4=_KqzoCI!ePqXh~`(_(%kf z6M+yuSrgb)p@&~-e-s6fnX^2qA_LdJ)Y+kgb{)8{ln+otG2_IqJ(sL5aOEjzWeM!W z|GvhALAzop*>%c|IiQjd^!$539uikT9f^(}`?Y(sn*;%lOvh97Q3J3GJO_gU3owgV zAvw8=R%Jh#gK2PYAj|MThiL3j@j7`t6+<>3`Oij_&*E+&IqZ+2jEdF%@Gv+49nG(q zbA2_MH-i*V%<+9|C|@bH55edV4d`gi(IK>_pUH3oA7AcE*Hg7)?;|LGg-IP#%ZNy} zWAIkU1&^R7n9&?ctP;WaTDS6FbK>2c4F`1Emp3sL#L+B6^DAg*+o3Xo3X*fn$D{f+ zcD=P{e@2gnM4pHO8~fR~8kuWlMCTOcJT{bt4c4A-+*xnJ+n@dMI%EXpaVThL6B{iv z5(y%1-}iYR5KHz@iDo-NX?u;XITV#oW?s@5HV7?7=Tg)52IIOcWyt=_4Vy5=x9LjD zkjwZ>1yj;C081T5a8A>XgGaYtZ8ItrtBMvxBdUp5C9+p1&8yUx`Wb=e5(rJ?TfGN# z*1(&P-Z)TOI`;YMO5J#wbEGAKFAHiXdooRIkU~+k*Fo*j0SsC67PWTxW5A{!T4G2vO*1$ z%SDe{v;+WAAff?46dj(zvK*&*Qu+@G#AAA-m@cLW5NqPZ#FDxK9EUMNPT)iT@sp6~ zZ$(773hl45xp1D6HtV*4DXb)3#%TK2_LD8_qeKG?CmIm;x(EFIzY+7!Q7;ty7E;V2_K zKfn!KNkn>!a1t~IXL@4kD&0^s5EzD&Mi0iw0M87anr|Z-gttSOFLYmR<-)(`03It` z7WUhzxlU5zWwd>PM}u}L9XxG*>%<##@%A<4C6M}EZupZ%Z1P1=`+KSnAt0eBEFsc4 ztAIHSHst<`_I4`lp`jm`)7R0#$wL((qiXSGE!WeH)5xYA&BnugXug4P{wbS z%J05`Q&-2OE2441gm5TP6p*1OU_w+qNh5lgJc|nxtI9v=*WkHtPb7@`R8acji0p9J z*e|^lQkPAy4gI4I(}t>}1!M}m*Y>FznkBB*LR!s1PL%Ux6rb|pNzc%9RNRb9z9Mk7( z2(l7oV@3145YF7yJEe_PmhLw$yL?w!6g5|p!)=Nc;K(|vV+!QsQuo4IlmtIrV&#*d znb0(M)sS6-NG4niRi5<8$LzIh9Wvq``;I$*A^8aM;w}|~rV7ITklq5cRqD^{_xgcSd#?vQNM`;i)#1hG2l>I zj^-PR{{=|%%tk@_q<-fQUBNsCnJ-7Qt<_h&qSm0N-DhJ63EVV0`INKyV=AqGU z!M^^;ys*4rUjY z*$=)yE-8pibannGNs7i=PG&TSyFlv@Pdn5RBfohO!}VR>=&rBOH+4% z4x*r+oPryuWcM{8EZ+@ye0`2;LD778YQ531DbP++wrW<*q8`?sir#Vwrc#b<|1}$> z#czV$3X6Sjf*{uncR^-joKfFXy_}@0e|3>!7smx#E!YZ}=pq}fDJ8);dOAwFni_{0 z4Yj7?%ki@>6Yf^Yu1?bjo%Y)AwL@DgV-eq&GhNEw<$v&j9-1Tenj_-EZSqs3x++4T zhdSvA+53ut*L(N`ujqr=z;*71l#Mc1_rbh&TI&4^Qk%$CCKhX5|&YM!gnmYb`WLMhQcCM}3>G`RBTt%L$Z!k|Nc z)Kgcg`HH%Pf!ZNG+^FBk!N($h^k6ke0m;Ol%b-@JEMx?tuJyGO+Zgdpg<}wj47z3T zIZNl`^xDm&Cy!Z=Q8CCJs}p<`Q4`RcRm%0Mo|`pZFjiIl0DVEYz$rI2Gx>`MF=p2( zg#r)1JYCrR<9w+xr<6n3NwQKQgf~6I;p}j&(1R)+(`Bb&G_wT>~b<^z%H^V)&(`o z;5X-rO+dV>6W)W4oQ}l+sL>PP`_`K;ana3Ex{XL`s6<(%D4|y(iP!yW=X#PT%4fLndDpcGC>aw-hfq_(Rx|_zE687x_Noi30o8>t}9F< zDiUMc(XFWf@XX9l5Wf-V(6gZx1=ko=)M7{&)cs`80qF{npof7 z0DUS#4!*~r5F7)okuUsS^6WJz%f5dp8_fM2bb`3d($&Nrm8VHCIT-98s@$I1Y*^as zS3lg-JhzMAuWD(&P**6Bi?Jj~ajcz@^XRxroH--BWK1*EfEBIoROxq39Zt7^@QW7_ zcd{hyHMC5kRf8=BuP0Eb^HJd#&?7EDEz2yx8l+Nx$m2+q4>42u5PJ1$+6=XF?nR@b zk9np^kczH>@Rd>x{lEgyqV)4O5fBMr2BTfzj&gEJUnJAAD076^P_jLUq*euIsaGko zApI2^+-m_O%+RcXTyYa$(2Zc{zQk2V3U|`a8j~fM`h)~`JfmC=jOX$Hd#p;-4 zUc&FRj%HB_ALXW=)^iswn~EP#T;$^G*E8%pox3TYam*cbQ*$BXOb4#vs|iY~g%!|c z3bx!kVUMpr>|_51Vr|+-^G?!1FyfT4hF@ju+kjxe_KU>aN_Ca%Y;LpPMHCeviE_X= z5AiP!wbt>hTvLJS08(g87nic`&v)mu=1ve4UFB!f0dO%kA^?EF`@@446rfg10*M!l zN1#RnU}rY8Us5vl?~9m5F(ya$@GG_A{aMQ|ts4kXq8YDqUa|9#dUULfzEC^wqU<~> zOWe!#H(OJz#&J$Z4h^Ufy1nvylawuuZ>r9*2~jD|s2~sc9|rB?jBVC`Iv4*Mw5*K^ zIBWzeOZ1|6O@M#4me1RVdHIhyOFq!DF?Be2}Hti`dLhGOxFBxWe<$4P^iVnNng zY(Km3}u+t`BN=a*J^w?#4|K#b##};EmQU{#z)QZPZ#Lm!@yeF{ys)H`_ z5~jWu&|m!tkjXVg>xA}5!}c`5|6_+px)aTs1jilVm#2{GsPL~+O)Vn-z}!Pk8LT?c zOS$&gx!JH($M!oILLdpr(in})(lksy+yWJdMzM@Cvj^<)k|OQXpS3PJN?-d#huR_? z#Y^D%lbm>>+P`CrXLVPLb;)9VHE0TgOFMXQnPf_OLUGcHgo6e%fU1L%JDu;?Bt!Pq zV5o2u@W7IR{jr#KbpnU>sf|%*b?q*uR1&=R>@KF1VU917K*4c#8gB$|MA#g7Fo%@# zDo*T##mj8vOBVNqS?sFokdVAXMH`Aas7~h<;@W#uSKd!aTX@B)(X!9Q9aW;e5(c@B?*u_ zhp};LKdW~?E&vIr!AHPTS>@`Aln_i*x-jkZ1VrRp!O+EJ-yL@&AV(BdqGzP!DP3V4Qy&E<)oE6`>FaQAs{|xW z5pC~VYSlfPU;TJSdG%=emlU}fLE3-f^-e9{kY}HWRX;Tm^{Qcf`c`N`D3ZM1MWN+< zyQH0B-cusVYiUJE@zhj{Is}i(M7wT7;MIv&lIkN|IK+fDzM}@6a@!nfYnnY0pt1xV zGsbxX{F<}=$i_$dl`g*sUq~-_v)}f z^5MFxU+@(_NeLCMP*B$|fm#v$ZZeapIXNDd#R)>WXa^#K-a6oxx$~wnO z&I3XH9!+9vH)Zb}Q>o8;*%W${GSy=wC2eb5u3 zl<*WxDtl*A@Z|T`qgay1zMhg4AsgmO5@Cn!&4x0@;>C#)a;gVGpJ}{1k0j7obxL(< z#rx_3Wb_U0W|x50tD4rAjQNpsss86H*12`vFfg3pr~FLhu*!Ii#;tvd$Vn6SF!L*P zr8+52z6)8|ZbR1elL)bYLRRw!hFr9gp3z%ZP8?yOKA5MNdtC9{HH<^zAn#!|+@{`@ zKP^Rr%S|Cvr%;&^+CxC*8MHrS7#EkIl%Bpmd6Tw&4C38fx*9Y7ipsXx$ z^yOF1^CsmbA^^(0Se3NV4=qQc)h61DHA>O zqH(wLqjt%v;YppXI=a#+-;kj6RdPT!BB^Mn%sUe6b|j$i`&RFi($gq${_IzU zF8t0lDUDbNFRD?Gd`UU{_n>m(EkkVDm`+}9+Ir%N{`q_HWzR~iQH1=s<;MfR-qy5? z)jgy5R|39h&7Qz}$VuGs@Da^@9ya?|xo#$H0vxz6Hm_lpG zn(s*R3@@B=!?<#@y)eQq>jQl_qcKELBSjd^Hc+X3pGHa2>>MaT_+xa?Y^VOaN7s7mHGcq*Bk4`T%y~44`nc(@0Gd>%G{L@V^aZ?tMp=$H3n#`N5 zJSIaVdj}xe`_-ge8}VOrknSA_+YYKYJ3Lr{f!R4?SBTCu^P? z?mJ2=aLc4w{14Q%BP58PYBp>pI867MEdRrYP=)7$H-hCjJXd2JU*_qCzX9Rsp*o^VSwL@V{+QgyG*0d&Z&ihF2D|_(oDCLZe3(K=2BjIjk+vVe7Rccg2`CXSyH4jBk(L(p^1dkiVBo+iJES^ zZZ7XcdV*?x?#s&sV>N@q$%`|LgHcd=A2vmx%z|XGnqgm-kiekz#)i3z#36*o<)_z% z;v^KhWF-Jc(%j{*GA96%R`%fVXqFdaJ7D4sJVE?3MZ`l}ctbmXb0dr5L@=a*{nj$Y zpU8`$b`SFQ31Mmq{&X8xMVxxQ?JaRemfvqiCJ)nf-VM^)YrvZWZdO4w^TadOGg9J5 z|G2&XGq$RN+vDlZX&Zz|#Y@9~2$F>lsAuyiK{`jT1K(MS z{j^zh0oA(56&qNZ$+!Pl8f&X%&$rRVf>6ap5Wy$ml(EJa4{&UWZ8jF7uSipc{_39U z1IavB_2WU1?NY);ErN8&3$XPmZY3&}f5XTDj`b6@@sJOBP$=+Os5)201 z5+o=Ww z$7kOZvJ`|Px-TI_7~S|9jXJtqem{laq>Y#@{RGVfpH{pXP17VrvNgDTM5|pEs?`ei z2?3Ex%AtNORYN7v>8mkLF*F>M?bPq z+k+=#{lh}J66SG~_tz+7#64+TC)DN9Sz-?s&(1b-(_CFwFpA!3>I=BMY(6X6A>S!m zcm54HzkEqTpwoTUS^;lMyV9QTEBk7PJGJaHo-#G>xfIbnM!RTzrq0RP<2)XYdJTg? zoTK<4yxS}r7DJB&)82Z^_sBD_tctj8F3uaekY2Q+;^vb-DmH4Yo#%o{ptweqIE|dL z;g|##ri>jHRG;J5J>5Q{8d&e-OD%O^)3mH z=VEL*D#$Hg;0x`B;{j=uDAA-b*`g) zCeDsF`fbQz4MAFpfIb=z0EzQ0*&egDhx75re$ybMz2-+S#E8Zb2Sckv?a*Q#Lj4VW zvZ(CC@bziu70Vu$Q!aXL9q>A>R&nb?if-PlHfGTA=j&Bh;XXH~=VQp5BkA2X9Q65s znO*VG?#Cs!0oloJWI@Vg1a|K`I-3QV|}uS#}141*vHGg z+7Ex8GUNiQrSG9rSp#WE`0317~U0A{&ngH2$*2(t%{DYNl5rJN-Q^Z&UDD8((3v%Pb520yK zl#YYTp-^l}E>9&!igG7R;oBr`0Yw@{*s2pP5Se2$71cnC&vOxG-ZF6=6NqeK2hu6T z0pGn6Hhh=~tJ2)5xQ>s+efx`k&E^%zTHm<+WyA;wJ0&war}dSo^M%nT^r2hQ9E*dp z3`h}0+Z99SGN^OFhn_LHQ-`yfmo=T}3w`^LN$yYW(nISKMdAJ%rL7sybD0WR6OG+j z_jb>4@}tqABHgInfvCV277VXlA5I@pv9aS^78w6ONRGOy3fI;BB)_s zgM56OhJP0h>V`=|d*}TxcEh|reOG-zMHB!EF?dB8`Z|bXO-J89q1N^_4;XJ~m0u02 zwCL{pAPVCT4fXH%3sppuy2o%zwGNZFBxZoAnj(F5la(QLl4?gfheHCB{=QJxpVR<- z8H;NrrbCiB2xLKN&R?Gl7evWNNKraVpViss>O@Z$Aw$MahZa0QaiyGtS6GeShP7B zqcuPVxSxr}zE==LDR@lrdT|a^>cszYzLZ^Mi>_zsw$js$z3C5WVW&0*xy;pi^2adZ zEY*)i46V-kXWa9PfU^--HSl#K2Ok^8a`*c!ue+pP{R{teFKZCKx2m>rA==Z#T440gC2~pQWFx9X7l>!m)K4LRVy7CYLSQrS5)QT4K99eCm_mwXY*c*fwIOVD`332 zH6joR$P+9K#NC>k*n(1qh?Tf_x*uRHr&u5b$h>XUV(?CD2o;wUMcq1nzwpDk9YKpa z*G{Yr*CKY16k~vVvj+P0YZfU5=yPxhI~RH!H4T9r!)x1(WGfa(FgMx+_Z9ki&<6&9 z+OS6PE;oKg6Diu2$IZx4()nYGnPN7}c}l(hPQKlFGZbHq1r5`bk79%Dkps(@74Z#z zBSFr#69s52XwELDF_lT?QmG96<|2@K@wbJinDUb#73 z{H;dar7T5J4(h{(gTEith~>A_(()4fK8mI$x?iflc=l7VBgZPc8{=xe8Q3*?`CGf@ z7!cM9nc9LCZ8aBZciUIvYW|k=#7N*Q8wcc^px_DydV>45?6t)c8*n=O+TaB=C2dU$ zd6FUbHJ7A5@Bw7N%fAg9rV|w>01`!|5hMf~JSyrR>5j~rhI$zmzP~Bhb1cYq{{o#$ zdx-F(OJR1yZvWYa2n9UhtkBSNOYYY zexKO^<*AVg^zwb$>9HTcs5_S#4kdN3zDWFusfcM}6I!;Q&^`?HHvA`|wD0pJJsmcZ z`C)y*UOPX`30K`~k%OsZO4UtjRuDLvncSE*LS~*1W}wT2I!_`8AsFA2a;t#Xt+d4* zG4k~ZpG;d61|o62{XYK())Ux}@U^H`(k%m^oIQTe2hwTjMS)5|yXQgUq(&a?E2XWL zYOei$a2W({&s4qNsh=Xygla8eJeBz|?NBwiYS?mLTZkIsb4n75GXDO_Grju(2ePcb zIOyYIX0yx;@8baLjcytHUuwFgXiyZg=koW*E5Na0pfg8FoP?(LI|V>_Ch1hYtnml4 z3-wg$&ijGXCLKj@#!d?OFNlgbH$r$+H~vs@k=-h3v<^XKQJ%_kJ`Izac`@ zhZ#9HhxQPff8zGve2@$-L@b|F_=V_tQDz?!OObsw{v)mWiZFqESa1cC6n#C6*ciY8 z#fjde5erbz08d3tDWMf&;|1+rl+EU2bf-p9$H-r!b-~=*rSWiPf>}EKK5Ijz?oqI* zLvh8hbh`2f2&zbxZHoi2N;sM;C}Trp-sRd)#t;Gk-C8RKn^UMBQJZm zn%!qD_qIU%+RORLT^8*ginrG>wnS`#a3izHn)n}%e=4A;YjB-q1 zn4+oC@Jd3EV5ohnNT7P>x5C?dQf3xp6uvQ=DjzvKH|qhA9CVfNwUclNwQBqID{C*^ zuCzoj0XuD1TMBjKF$@w?3nbu_%()YW>ms1?aOr=r_trsO_Fw;?bV^Gp@S&wkKuQ`V zMG&O~X(UCuq@+_iB_t)J1qGCDkQ5MO z-o}oa;IQ#M=$`fCgn3NI<|}aEnrufE-%-x=Px*74{xNG@a?c}elTv|@PW)~JArXvj zh*>pBytaw-{*6>f*J8fHKwzYZ7{dV5Sv`LD_N;O^Rc0P)&23rss$-E1w)P7YXVlkc zEv9c7;BRB6IdhMS{;4{}%`kkJr;WBT_U9ByZ6h!)VG>ikn&d-58o2wBp45+j`%(vc zn8K3A9ZbO?j^tTwg%U4-K)|vwB+}rBcP~hUK z^WNG7-JX&laSqsMrS7`cRWAX@tl_8qi;+0*3F_oh&wMcPGrw$~{cujDKZ=)8N|J{k z(WxXvdvNCT3;#V7KB|V9gp54dd(-xH`{DQFx5KgxrfQ_6|JI7RI z@C>vdy&#zorD6+nDtGJ&%CgtmMKL}yuUanHLDjfnDMliqnq}`H<)wMsPS1nY zOA|Ufp=4)Q1EM~u9zLltID3Llb5y`-7yhWOi7e0jp)rfqt-~kiY0%8-O_5Pe z=H{S?3|&HoOsA0Ec-w1c74&%R${e48?eD>Ih6GpNn{~%LDNli2){1`=vXES)-vm?e zl^X7AHnmigpK1EFFs9L4kAB^u^^MR9_2OR@u1_H8$!SJ-JR4v}3$xI=%?0DQdM0gG zQM53`S;L!TxnYZ&Yq;NY_ovDY!e1$5Jr8{~rI%0W$G6mxIMDM^KvXYsQ}O4CYxx9k=eiGMth|Ne;J_gV=V`8jy;1zKC@2;+-7*mE} z2d*pJl}n@<7w|oG8G$*HDx_s`i<(5JA;G4#%k3uTTF@@W3YBixq42x!E$?*wejiyF@wEo-3&30ovTpJmb|C%t ztj1qjhVb6|r@neO8~^fKP!uZ4fe}U{W)*z5Ro&mgQIx4wF*8+Puzj;iSTZ+|Q;Pav zUvwgqpVa)W(a}%%?Svb#Jr{tk=lusq7PYb9uLW8KOHWE9Jq=TE{9Z4&SH4S;=~^d$ zdKL%XQ{dOR_dFOyr%8AX4ixpzfu3C=rDCl71FW0NNA>CZBh&O?W(Fcv^ zE0fcBS_WMdxoWPuc!O|_+R&Z(X#4a1d9P-zHYw^I$0QjTBB&tkrgJweu$!?L?RBpU zveFE)wn7FgE#;7loouA71g#A3PbvdK81Cs?6;W#bZZT1DSkxNlTG<}mvwDtntU$E# zAwHABjXO+e?3dMK$6%>SV;>FYXH|Ypjm%wW{f0q(R{xs)%w0hG^yx(#wj50wbOL(^ zPm1@CEe>o#YSh~EP=9Pv2a@%|yPOl0Y8jA=b@zm!!oKXnN2)x(xX%t6y0XZn?Bg4T z^wax7+xA13qDEfhs+eWg>$NbMK;`%JLDtc(iWqw1n_ zEaFffuJ)tmB6)#oz0If~yT321_Oce~-TTJeIJFkA8Nb@NbvC>nbcd-YX8^LM$jgpR zcPNPi@Skz6i~{z7)mUMkPm3a8;COEdi~f)~nnp;e7Rtc9?7xkn5$NKVmu$S=syhqa z2LpaKekq!ke8kpAzV*LlxQnHhcA<(9^E#l5Zq0+S%@z9t#uhG||GfcpMDSTa+>I~&I-+oIUz_chg~ zL^cTf$#j4BvQq3{R7jw7nPH>WjuVXds6MBX8+u3HAz@A46{=!_C74>jRs1rBQ_VP} zhcQ)-GrHq)r)ggjeN-@b*Qq8T7M8OJs|;SscaA_)VA>chP&Hww%Q4blIF7VdIUW`7 zaiTd%`-6%*zk1XHWzVxc`77+6EpNQd*Cma^124BJ zdMFqdiKFpSU7|**nKLW}kTgnv&E|{z`pWp*lUyU0tw$HP?P7VR6CR(ZPXr`Lm^%yggW7*UzJI8_hPK ztY!#qLJ^R$$Vg?Qm77zRP9@B_hcPsafVV;B2Pq#7YQI(07S}pcTd4%+ttVLz(kUOU zc!-_d9(;-E!xqdp>FT6b;P*o_p$6K=4O4J3onU17inQhO86S7ZyB~i8PKbo@dE$$63w^^N&+QBe!-IcT0^R{4*S2)LQ<_29D0we_v+otFHC*A3qT z!x%oz2w4uqjXi(+Ip8ZY9@LIQNm9-%hV@-}E);<-?TcUj)Smj{5`!OL0F~xnP<&Eu zkZwP`eQSd@1Dz(EIpHsVo#2goQ&4ELptxtn{FtG}W6zYv>C#Wr47=)ZXXjoE9}<2j z2{+oqAS?RM2~HEArKf~>9BNAj8)jH_uPgl2#g*3kD(}8~93@w4DjC|A_=K}uuSV$x zaeMO-gwv?(wFc=OEf`m1TW|;tw(nbkV<>@R;bx`mjl1jT~Gusap zO(W?D{d9+?-`+?|vj1W|>V8@{Bc{ujF!wHVxYL&?q*?7fk=i6}t16B*zImXt8PUI( zpW)m!(GvNn7m>9zwPS^=gdGQ_6srsb9vKCqh1n>@Tq&vUdk>f&a`r5jc$sH0P-WB$ zslO*N{z^wRq%q`{EUSWd>-aSibR^4N1T-8eNd_Xe5B+fIQEVSD2qaORE=*zgd6<_x z{6ju|-FX(q)}PFiz<#EMjA;x4t7>O98vKXMKJm{rtWcpbd5G5yymnfb;TF#pLM3wW|J zg2mA5_ZAenhkv5197jEyJ`Oiy2^JcGiBkS&qK>&LB=*{ zx3E!BZu#cy0SgS0(KS@a(UJV{V8sn}Y*@hNhzGcIq*nE&6GK=@<*sbZsXvx5X8>BE zyEB`lGy;^W`&MJa5cZNpiu_JsQ(gl-l*zPQf;g`BpVJ=Vf`YXb~I3%cyVsiP!Iss+~su^BeKR@aJl0UKv=)D zK#zIDgMUB!@7Ya@=YFl^#HL77zRhd5^OKz?tUDc&2FQS5A24eBve*X{i*NL6*mYkM z1W=k9W>vh3$2ZJhvQ2qRO~v-d217WEO|my6%kG<^Ew{?^`K(}hx8n#X;*!x?FQ@#MnV{cXl?2Bse(f)RxxDKQW zV97lFO)~av&&T+K<#r&FyZ-t5NYlQt;-Yw*%a7ac#-qFU)naR*V&h317JH>B{y@CT zmnTrtqcy4;Rof7Lc2|ZUQ0wXO7B!R?3l>B$s6OkyeH=x&u2L8#g>UQS z?uKfS(l(z~^m`@v+!ttfX>XAJ3In<;-CP?t7#OByK3x3evN@^#MH?<+?#avpg%_Pd z1nzBh{5unmV}m&?oYe1ZEL~724BjSfB_F1FZ112YI5H%D&?$iTsk{LvFb*w{ho$U3 z1Ia^95lIYx5A5y)ucM7#-0tHKU0JY2;p$uW@4VT@#cMb_zPrDmA{@t{^}uJZbKm2x z4MPRNO(dM}YJ@y(!H2ci5PW`i%YNoosMg*MwwcBToasON`;9Eah+tdVR&CUoA%dMn z@aaFJ%Q7hSfT(wkBrNlhvOemeIBK||S$A7QzNSTb3=e8z9Z9B7G8Dm7SoJ=#h3^9=6~_We&&PCUcD&-d7u>)z8hAc(T`F5dpLUaukM7d(GqEb7&333YO^ z;+DlAEVbA`Z-H4exvbEqHFGg5D@em8N7C5#> z!(+&bqLXFoFslHQ1F8&^L5a5L$Ct=R;z zk3tCX0BXt`+F=ByQa_)b(PjEao8`|o(mwMbzBGF~e#j)9VL$WA5VKm1bAu6ELVy37 zrorgi!-Uru2~|qRS_rxwZ#Y&AA+7Sq>?7%c5%fa6S#vR9(=l+EPkeh*S_SV~=?G9& zJwT|cLV!jk3Fcw-NJHLAO8j%m~NR`>mN2FGF71yrS z3>{68GF(HMvUO;Nbxgl=|6Wbm3}w(xC?OXdqiOG?v!n_R4q04$zNZAmkdv;(^%ly;J1?zbSx45>zz$M*1Y}#D-FUo z*Gme}9ZwCSHG;xvF+;wD-jx;SVxD#9%HB@_y}HakB?yN8*;;qzzb?21FnnlZ6N$1a z0T)Dg?x0TV;Y-6biJw^o@7KOy;i4`8g#JQhgY5<|m6R}B1q;B>yT@K%#HD#~X-v;V zpDW48V*yJ{aS;2moo4C=<>%dky%*j)9PaHDjbUfu&v37$QsR)x3aC#4eJm%w5lY4X zIvNv}+R1FLJdR#6-rqD!tE@D+3okqFB10DtE8FKbdQ2a{+F(5QL`H=eS##=RzC7BJ zXC*m+Ab)b=3^rjm(3gWJBG+KKcI zooaH;#sB&JD-w{Vs>Xr0#S*;4M6ExfoFLq!68U|Q{g;BAT_aIDu+{xJ$x$)Xm=I-x+=ln$1V$n#fT4m6;%gEF6}B0u6xf<5PBLy+KW+IWq6kvko5?SK`LRvwxhDe^ zCn?nasc`6A;$Y-o>yC4h-+aOF?m|1kXCy5}C>0_Qy!YuBC|PoM3P5`GVhUVDC;Y>1 z1Nir;_p^axpGbWRAq!b?TNBBKlR>x(!^!x25%u_v&o(XQ!?!f7Hw2b|cI}}~=%Y^o zdj`z<;fR7LnDxy5QxJMU*CJec;Ry3lo`nl2CA)a7@n^$1+2dI_ngLbFyDtqsJ3ZKlqa{a%G32XOc@gIknr+=hw-1>~G$ zzrMeJpQ*I|GWJHiHkU6@h2}v?1O2&F97^{Xa&1L`^kC+F^eBK;{Q!fcPCjWUq& zx26x9frR*?6GTM#VGoUbk94Xa1?XG1M`j+J7Q@*iIwPqfkx4A2_!B5aU@BbWYdOyI z@4>c^^YLF#NVINM)^GM{eT!70uD}%a(BKSjhPjnJ<2_+D^_5@|CVWz+w(DbnnZL?R z1AQ75ySj;cro&P{DF~=|DWGoYDw`kt=sAKEPTSrneNCBKfktYs6iv$t$Ooau7RWId zYsWOmfnlSi=D1Dp>=)2!Ttc#Ff09rRaj;3>2=(M#z-TZI_bzPP$7i+w6#SE!-_*mI8JGnS$V(FJ7hoGH7^msnD`fs0Fx?q4S`y>Dlp~*2AD% z*I@eL5}kw_g=z|KlD6RQ;lF3G9+0DT0*arB*?%BQ;*I__8nuL=^(S#5gfvWVT{qcM zT>lQUNNf&}joF%bVX=f2$B1tf+YBmFFsotJTaPf&T*M{~N9Z7E%5mjrmQUckI$+R( zLn)S?hq*^4KNzw?F0qSKupYJpUX~YuN(=#l#>VyG48Ix-@6bOq_+Oi^)4j%gh_e3Y zgpCQE@EH~fsah(3F1J6x?D~5IkoSX(gbNgszPOcgCw_wy$7Bb+~=N)=NugN^l! zICT>HgyhmHQi1wItwzUnOkLfYP^utJH?vu09}r3{xQ>E z(+K<3N{@&A{xH{n@v^0vum&RbyqmG~f_a36`+>uZT7;NFFu<=dl4vYC`#9*sd&piQ zum~t`8N1!fFC>!hU|v>CWGS>pEc~9?4q|4`EqvpDEIc+G(f_DE)&tZP|31mO1@OJM zpvi0nTGOSrU_Up9!FrK2Ds*aGdZf800K5fqo)|bp6fmple;uO0PH=(-y0KV3X@mhp zWQCtvuSu}6By5!l4I@C@9$9PVLd6+imhcsIhg@S3vibzmWY~Yz*F@s85X>-&VEf(X zT<^58X%sx4e7q8DyYcz)m2G68z{d0wV>2vbg;asu08FMIak#rXlDVT#mh%Y#8t zDq#MpEQVslz~|EYe0#`^AfW%xM2|2rd(UbTY8LGTLb zx2ne9V2k|K!Hj;6^quCPMv&=6O5gi)BF!{{;?#mHxC3GgquOZcHsIdF>yB<*WPJ#c ze&&@gKmOzSXeQSdC2=ym=&0Wd=Ou*!kCxiCkb(bj{mKHj5)gG}U4;OcJwjA8cq|qe zsN8BJF8t1NkU{?g{H4cMol;}$GJn;8KQJoPU%BOTxq+ydlsX8u#WxQY;j9<7GTq&*9dzHWDvhxKcL}+A?C7@o&chPs|wLH0670P+vq&v_P{UI z-0A^M-h=t#!nw9#Er_!O2mreAduDv~Xj)-&ks_H@WTH2nQyI@3Y4$?< zOXm|zIdI?jb8J=x`O&St6#e1%3qVEp%&I$ckMy7WcXUtKy3&%ew???+?35j(-b@tr zm3Bm>14ts-XysS`F`Mq9fLaU)YBdrs@a>X!W@NOj-)s~Rme2>TSq)JX8id?NNXWfT zp5s?IoGIKT|AFPJjy6N?8aR#0f;JzNBnbA6{_$(({nl3Dht6|JO4Wdoq5OVtZt zj0+{^OSEqUrg?~a5lC5*pUYR0jV*6Mr%Um(>u;0zELV##H?g7{axA%A6%Bc&&cA+a zb0M*$$QKW@6Zg{cdd_9NX0N&_2rrf$*Y2tyb=9y&gdu38_|8kY7eF!B^Gy)yvl&xR zIW3qktb9(8i=2g0ca*??LLo!SsxFmgkM^zx8?Vb;4aKqZHRUDZY6K~tEXH%0JcUwsau z5g_ISt)Mq6EO1Gb%mGvWV4 zTRPS>y~+MZ4~J1-wu3MqVmcMHD5_w;vn2*}?XmHS2L=P_!m0?X(@X`@G^Jqofsn^E z<$)V1xTOSBOobOP83hR1d*mOAcmJev;*40SDI;-nA?N-_Kp$}Vc9b>)#w_>xYN}ZW zLQ3`)S|ERbS0{N^M;!zF&t^ERe(&)`D2oDc1&T|-4=J8JR23d1FSOM%%d=+xgRACm z#=j(rv@Ahc2ER9;it<3*ITN+6c_Sk~V?tif*h>6-Z+ofl@hBQ8G zMMpBHezqY1nqPC6ZP33(BZv22Tma7J1XgW$>|vr`Jmj|^d^7EeqA`VjZ*hILK0;-s zk}ZFOMd2zWZ7F9(KkoPee1^>l&@zz_1w{aD{XKH0lHbRo)Zlm?HZ`~l{wL);33%j2 z^r_$c$;r7NW;4cNGmG9WIFE~8FgPR3$QSSu8NtTVT%S#(MyzUx$bBrZs?g|jPyX}5 zn+oNB0SpTIhsBB##Gu4vUg}c#aP4arkeYo1N-oI!VmyGYPBnrE8GInQWEsg*PXaxn zbUv*qhB1L{V57@}RvhaAGMVy(_DUGl3(r-WJMW+Vj{mjZFnUd5vq!TIZ;Z+0RX(D2 z*7_`UbbgEtfmgBdw0(u4V8@&C>pRSVUjk~l3f&sZXe7ZXRmUsbr+1q&S%fxD98(rN zpk(6g^79Mbw-o#b=n2rqpxM6s*iv+GXu&H@jaT|yI+iy-n3s{Z+(pvNwgWSb^E5L+ z5K<`)jL-}+X0RX~A6H*JJiSvfko9Y5^sDoCbW9R|V5YgCJ1gu8snq!MnzmHj)YW&X zZiV)r>rH{(T`-~xnBOjuhxc`6I(5-3BEU@8dPB*q6jhul`%+4+rbg+Tiiib(_0MCs zz*l0`=6S@H|O5R z>hI29eY9}s6zS)o*x}84!*hi<+4y#ag~DJr6X16vqeZ{yqHLm-wS6xAR2VkC!t6D}>R2u~f@I=51@Jo_ zd5bLxdH|?w$d!!x;%3v48hG#;86Cfb1J%VR1+d zBDHvDoR3Yv4sQ=$>{#_AJNrLrgez^bD zJQ&P#qR6nJDV!10xy8u2`K9@tKVQrhF|E^EVN5<&>o8P$cm&K1`e)mYeg|2x5~s`` z1Quh-f2t(=mmmku|DJzhsMRZN>&s!I`3c(taU{Z2*0wxB$_8=TP*DNuTN?Kas$-hV zAL2LGZzfa6&+S6wutPxZ&V;7yzZ4vkBLsvM2zPWJDgU(l9@ZXI2v%xuuAEYL*TXQS zI^Zqj|3toQs_o~W9(q)RuWzj1Qe`^s6)@;oYPuD11J#M1R8n1spg#7~l$3oJ#cYBY=n<-}W z+zG0D^?>)dcLu$T0myt$b}?qe7~CxRn(-cjL@W)48X&6ZkI4kZ1vYd^%ZutzT*w^} zco_tAAZS66ljJ$?4IE9~_?4i#Akb!hrwXiSS4<*Sp@M%)2HCf$(%dW|kqf1tUR>x7 z`@zrnsq9SaCM%nLf_5cUt38+W%-58eZR&tHpH z)?a{D-+m+DP0av0bF5pPe+)&8C96KNF-DoM>Y>h)bsvZH4E&EaHT=yK+zD1*`X0)| zhhR?iH<6!{1T}f1{ko0FHXaZkvoTh3*K?zN=}GErkG_HTF&3#&-2)D10}~}TCRX?o zjsQ#HT-=Y+2s{2oAchy_m%~@j$

    8;EZDXAYfX1Quavl_eWaoP%q%;^zS1K^=(r31ydBfRY|KvmfD{V-vP2S-oYEN6f&NC`lwN z=gBsG7!FP&|IYIJs#8aq3^Sxt(NV31)^P8N-sCH90}h7`GroQs8gq{p$^PCoHq>&* zsXLPlZoOndcvIxJrce;e_>~zkIF(82bIGDM;}uCnu6=+Bf^oec)dh7;AKrAvPyYyd zn#kif`GOY&_-&J3#x#7$Kz;Uhd6D0YgNgUAn_ufb)epTG8PcFNWDD4UwE30LLON8O zh{vp6C`Q*hQ;zEuX`GL3jPx?u5g`6qR{^q~$f!q}_dNm}@0Vw#q7RuP>0jU?xKV zwD4ILbpIr4os3%gY121Y$N4s?TI62=_W%0NtFp+iKzm&ET6F0@MNnh&#}zzS9TaLL zuzMGPS*Vdkn{oQ-!%j`F01z2(G4B?GP5t6LWfvX~dlED3Ns#IPsz43gUTWtpKrA|K<4 zJXyvOjN3PR1_J}Cwa)1BsHxX|pc_dvPQ>0|mA9){z2hZ8H(X#HlV7UtQhbr90h_|bY?mJpr@d+AcQ=vP>fS=l56y9P-ZsV8*Zv3|9 zEYCf3C!^Vp8GcGjV8VQUXVuh75oiv6%(^Ws&(h7|Qi= z=%iA}n+6p97Dy`%1KO#H54S6CxZC8kxSatl=HeA7@#dQdOrA?GHb`$5%1m#3{5qcl zcUxNpCX0+TK5o>z%j$4^wI@@@iIDB)6J}0e0hc-F{X^#af z2e<~Teb~Q+c4d6Lk7I3xELiCL_Z;1=t6Q|l_dG+QKWdu+@+6r|D$zTi+s;;j;WN!v zqF(Yk2=Qaff#=4c@F#W6cv3}v=`dhc1>fty!TF>7<-fUXKBUj#SzY@W?Bha1T5_bD z$e^j6JWJlF26$u@?cT%F}fg2{-v3cDk2ZS0^Pwe zbrF%+ut=~oPS4H7WN|w@oyhZzc5JEOf*$-ZckBa=Nm*+zXPF1m{>A)Oi#af1t~I!y zmr^eHe&XY(`S~(yu%5vn8zkj9A}Jt3p-D8;l{njWL6@dOum1Zag(}R0^Q9ue;8vcnCElpltV}(yDF`429el_Kr{7LYbyZu0Ez6wd$!D6Ap zo?#L>YzN4sPM=FeS|OPKcRkqox$UhE@SHzI6$uVTx6<6jhaxiuB-*jfmEdD&yzXV9 zfgE6e)GMe0V-_X+fR|R|??7-``4)@sCzYCen-trI7xC`L$&kX=FkLx&4mA8GO7q$k z$!;1n*GtD@WHJ$&_w9jx?DLuLdL(L1_A|1LJy>LWO*rlNR6w4ghYF2e^uWULhX^ew zsr6Z^gdT+3<|oyM%ivuS%u2O;{|g`hdk$Xe?0;fAHMwD@A+gpzv{fJ)aJ?HY{Yz%! zza32oIhSF&)PY8~r&EHb)s+7LI2b|s;Rqq%;2yppUV1GV`Xg0^{fh0dtb@NMDJ%cG z{-a5oth}sJ#sz$`t4tpRw4Mb?3o^+_58(RrO^gn4U|6}%kcK&f(|?)eIgL6GV3XmY z)BD4=+h7TnlNf&u;tC!H_`p&|A>$vGjxR~)J;J+U8xvTe8kNkadOPNVuc%nPc#@jL zruoHs#hYMn#PwPI?DH5_+gEFyZ)^=1d6Az#Vrek#Jgz{cAcs{jE%e<5lrzmeI+0GPve6NV^--*qnrCdbTE(O>@V3EM{w`r1otyA5Iruu6X>ifbyDX`@2%lC{BmM?tr9e$E#9o< z8rYAqoB{E86hv8pubx_r4xLUv;~9;F_{8W(kF704jFta!#a|HPQ3CbAh9x2=7;dNZ zns{w2?F2;>s;8R`7fkwra-y^6Iddn>(B2*IfRV-sD2Idrm-_oW%~fErB!#S6pYd-X z7C{G0`ad`x#6pDdV>k$*xE`~#eK_co^!SvvC|J7;T))q-)xn|0b^1*MNJxiz;z}pj zAR2b{nDN1JJU;exUla3%}(|;$U!$UuJ%VJKrLG%otsM?{c!HuBdhyV+nIFUlXlqP zyM(sPy}8yy>kW=$|BRgb&UJOv5EO)?aMrr%z10o@qGrvdz@KW`OQ*gHD-tMx%anJ9 zN*ZPpoSiy>IVqIhtJwN7mLMnqEIpDD0t;tt8JBsD9V}cX%1l(1B!?l%zfETn9Jhh3 zz8g0hcsgY5P!%Zz=^^o01!@qa3+_g}dYL7JK5P@s2%&9MNtwgd-ydxbD8+9|P-#A9 zEc)jaJg$=}@FD#5CYv7uFtChh|3X=D5g|Zt4<+WaD>Zmip<8SH915Tzx{Xf?8lY{s z{1stBID;Y6;NRouSb`Clf5ET7_AqoBx^h#$jK!vgs%%Q{Z;Jj;mmvzahgCywMqX`c zYk~O1!}7BwSgREUGu=IbU|9$@);}pr6hXx|9kTEa*j+NCf0|pK%(FwaZ3tU;_HV-B z`VI(!sQHnrHvm3}l3}g%mY7<# zd{6KmLGnV;1!oWHo{_*cNHLkBpCeO9aj60*VLt|gAimXQGTsI+#b&%bWxx)Cn1G#P z&knCW*S2Mx39r4F-&?)N2Cog5uNn!j%`-YZDKBBwpIx_k8*&rB%PYCThwYNOdbt0U zXn~umCFzl&b_SZt-f!HmK0kQtLJBSXf~dZ{$$}%Qwv?AK;;%FxtPN!$#aNx==wN7q zDvuB*i%vbnKnu7HrGJh%G!ld}@Fmzev)Yp=dmpf;U2+fGnStY8QK<)=5SqZEJ-T)_ ztMHP7qG*>jLoWQTA-v)+nts9ezU@KBtXAFUxS;wA3mC~6B{+smrbwUf1qbT6|a zAMf5I!h?eqywrn?3}?dhHF_R-62H{Qd~49eaJ8Qml=Fdf^S&Fy&n^sNNlil9Ydy_x z7r!HTETkR|(`Zy!CWL~}rM!*M{cH3t>)_@sGy$bU@F0w+|3C2R5yN>1~<-h_85E*q? zqb1pH8lghA0!Sv>SYK1JawwlswmwHSGo5kq&2kXLJSd@nsLywyHcpQ8y}ezhzXF{d z!U_&+J=hVDtBrl&H%r*QoTrf`K2dLig(b*Z^_UeljTM5^9~tLQ7UhDlvj0w%w*_1{ zj0CZ5LMBr##32DIabi+17plMYz=c02t@e+CAV~;4`$=7`bKeKOEGGz*qlD6uE*3KU zcUTjViG(lK%yHAuH11@Mm1KgJ#^tZ8hR~@&)>C}{UA2T@A(0x7jAy2VnRqe6?FNX+ z+FRVttyolHM$KMg?mXPuC~cWm#P?u8@5RjjIk%lDC==zPNs13-4kwtMb7c@_y+P_Q zDxgeS=z}(LU{6C}5hX1Mrp?1=6zMV&MHkX^sDXB)!}>sP%;PjyxRCoZ=}aRxy~6++ z1SkF?=rmLI(5I#XbYPLLRhFxu@DeoPkZAxdYkBCKC_%A67Lm+q!kuknh`*J&Xa5|JqjsDJhsIoX)^dB z*fQD=+AeBKkgqMhok?UhY03+J$l2aXyMH}YL~raJUu})(WrtoIctM#$^fXv55(zWX zh|#3r76t742u!-PeSbp0b-w}`*WiAmT4xXBfFv+6q*-?~bP4teQMv=;p2pE=ojY#vo4eq_c>p`n+2PX8)lig4()Mrgvy{SaLNjh&%s}Zu<*?@uQkB#(i{oI z_rHnD+KxO}?9!0ig7tcb%+iSsu{>a|>UHCP--3Wcl{QiDrY?l|NShqCz|EEM#A*Dl zbr#Rmi);kx9jMDv=P6>CF<1ZI@^R>kT>~q_xrN0uN3@5z64}I(=lkmivigQg_dCM8 z%9O04&C?jn9gN<`eN5WZ1eCdp2$@2n7R>7)xWn`592mxt1A6!e$O4c>AQ$4=5&{qz z+Q{t^g#a}UPGDJM$>Bo2pe|}|I|9DIL2K)Q7^GYOVGDKt%-#2g1?r@%%5S+PIH7QH zH*g^P5=2z@mdDCd+%!@|ZG~W0TbQRvO;zWi{N-}}=G(Q-u55-0d{9XU7{C(bpZgCF zUS!#I0Hp8zeE+xEI_prW+G6#|0MbE{sm<-GuNjOL;mM6T&|h+!V!| zh}Q+QpE*)^Bt1?nEy&Ww9@>b43bJWtZ zT{pu14u8>;8N6d|-|#pPClrMy_t@S2!7Lpm5oSs!70|vd<+`FPD!NM%M3n}2 z@@~P5J@c`g^U=ip%eMrbm;%+V2#WJ!K9iv*C6Q%|)#vbg5x+H?$iS1tPlPso2mYmz z5~lfgi}6=|iInKC_#QEq{$dO8-x9*3aE;|AiQBde@cNm}A?42CELEk8TO327YHTrB zzExS4Ue23xXc!&(qfH*wD;{?_kWe8JP>gd?)B<^VBT4u4dkN_!8>+uL>TQn8eo6vMDM@T#HaDNh+nfz1r5p{3L&k|FBG}i#g7m?i;NvTg&y%>j&`k zR9FR*2AogR1N`lTzzKW9vUWs?OKCMpl@SF8NC0m#hOVoUPK~bY=0Mh;=y3Nsruofa z?KHtzH1z79L?6ZqS{ZXr$uj#0bRJGy<&GB&c;WWAN%5;RaY&`;Hgf7S!TGVEzjPR7 zM6YfqLgVgP8FiMWD6lIGk%@Pe!Au(;&%aE722YC!heBZIxWR~Xmib!YH{Gj$x0z8A zHVhIE^d#Z7I>*wUWYWQHO`E)C{~6`KRbv&E$dnBaJ19xXcV?Ahhx52Ef_e95U*U*p z@=Z5gwdT5X+x14Bj>Hx_ToyeXg*c83*J4RI8C=`|B9M$i`3tU|2DmKKjgPo6-WF5f z_Qa^rHpliUDJGNf_wEcOdL*IhUSCm1Ry|7)^aD-m*8=wVV8uO4-M6tIX=zF!{fYl zHdnZ4;G+W7BxpYhpPwWdGyE+)DPt**b-JzrX2#3KFLiMtWkc@8by(6(&1@sH*(c( z@w;;>v&xS;b5?E?V#)n`QUJy4GJHfp-Ufhx%*p5thcU&Oud#VKZifc>Z(Y6epfta$ z=ZgiFT#hF^C%s#R;~jiw&9BtW@Lm+^vpRNn(^o~Wp?4vP@5|s(z4{nlH{he%D>2r^ z2&GCB_x@d1c(OxpZbGW* z%Tcxw*we5jge#m<9alZ4^{TE=bJY1Fi#Q7N6^SNYNuaz04I@fo0QZ~SO-g+atHP$Y2+dcWkLH@-R)>u%kf^s^j2A<=*VQb5v0IihyaUdKfis*eBQLrdl$YE~h*! z9QVziq*xAQ0iS5w{F(n2KlA*%Gu`#Ze*aCUM#KohS?!FM65=5@RILaKZMR2!v<@dH z*QvRZj6*Xm0~U0SQ1vUPy%kt3myqlV4Jx#0tGCA+JL`;aJ;a|S=k&aW5=0VHB$;x= z<8PKfOJScjp%zbh(f+YUg(mi&o$$zXRl>zZVnHn|BWC`XAT06&pZYCw)m`4pJehdjh3 z@k`&L1bKfE$_*B9=i9wWv?=FEJTwG5fg8XHHt*H^M-3$qY9aKN{@A1!?+6>{QzS6s z%P^RFmNlCD;?6CD0a%7!%DTF z<7NUKyJaYy+f|z%Nsh=@B5H*QJR&6j>%XWx`vCL~>9-!i?{PN)X`#8C=(z~v2ArW# z#DXUyinqj+<9}Z!bKtZU2A#B#tiA65m%cLjS|x=Wl%;pEFqTQhY2dVvZc!>EZDp1BEI zv*t$B7APUG)oHS?ajg9Px1=yW9`&>_f$`Lxz z+`Ek6d$B^@1m$GhQb~6oJS{t%wfJzA*8@Dsa^=KUA+DF{UYRp9{9NaJOuw!7;67whg)h*`Es8sJz~vX-fQbm z*y1P5QXMw=rdJSk^Pf&i4v8}(M~zDcG8}lerx}D#JS1L5uDoK$3pHA*w z-;6q!;aecX;4IRp#CwO-SA*|h!>S#(M4Cgd$Jn?%UxY3^h~-8EAz0@D2~CPGcJ8Vc zrB=OxO5G%didRK|0?sp;OCZHMkFD96G0j71(7vv8s|-KDHjM43`=^*sii|97A(9%$ z1BS*t(y#dT?P_Oo&JfNwl07}xZE`Z(mb$0+9!bc9%@jIwaea&1b7QRYzWZ%r@St8( ztLsCf&M#_no0dtz%t+d>Hc9ppwSR0pyb|(4r_bY`PIfGn37tCt6ygAG)ma&R0})80 zQljZ0gb3C0<7O)j3gta~!9}XN609c0Jy%(C!yh!y(pB|tO*?Q*=xbkHZ^R~}BSF^z zslMBqn-vAuYKiHS!oVfvPV-ob*ZrSY>&@~?Vnnn~rXGnZdH&?ykb;vdrhYZMk7B-z zOMq6FVX|&euuTXyb7*&LVx0-~OO48SPD%>X{N1`qMv;W-u;*yVe*8@^GyBC!yZbB> zgz{_u?^B-sps4>}dH#Rp`JYoBLFS$_C|s{X_9ld2ay%D;sRjVtW3EK!dRJ&EN@(Ui zj23=6{Qgy%eD`J)wF#h1v^;-64Z#|A$sY8zh`b_2c3KVsdn6~$Cz#t4IvUr$|D$e% z4)ZAxKpa3lXGZ)8#=KL3Giq``@?gNSFwJs900Y5+c>YgGD8l%$Thl?4P&!JV*t{8 zb?wNlhw8ih#sZM=*g!qRYI8T$EJlydb3F!$*$J-0H1f+jtS`^U)P$nbpt3ZGNv;-W z{loevgU_z4tr-kx>u)vt{n{2ifbnkq%gn^f7LesfsT+@zThzY1=JGtm{txU|$*y}1 z+4yHQ;H9tU69AOCXp-+K&#>e{)VBLaoCU8I0+wjVU`4x%rfZasF3!{~ef;`&aHC|* z|tSzd6_LF`!PX~qZq^{XTXK3H( z?I-#*Wo<)8p_9AicySd7N%-M&-*`gX(bl2;0O9L#hV^vmu>SUbRyOPi82~bQyVvF7 zcjmJMr|;0(+-et*24I=c!w(mbN?DM)cVdE#P+~fzQpA?h8 zNva+obpQE&5Qw|JF-*Ea*6WQKC*m%#ec8pd+w1R}l3Ed7ZC@HZTJtVgXFZLqDG3Rd z)u8s928PT5;7%|W`hy{H7AHj5LnlIb;wrvVgMrCj=ts9 z*7h1{S6cF#l~r{KMp+5{nAp1R(EN+)Bz3E@XU6u%_fh8qT@DK|B$#x`LODZ`c^a?d zTR-e%C5$r$Xhh-krDCU_k5(FR1BtIrnY(AUaR1fcs&y zXQNM!_bH`@u42%e91W=k!YkK5#uGO%<^$Ih-*21wM}?PxyfnPhjay+{6we)Qm7(?1h>_U2t}5dE z>$DuoC`QpY-+7m-rSB8Icl;PmxB2^PMc2$bjiXLovL)DwZG{(2)G5$K{qohEMQ%Sp zsLZeLU8W1o1RSMSk4|iy!{s`TB;c`0zI7SL_SA%YHep}6ko$< zklBokCyw8Yi?$b;G%W)Mptk;K*NueT=Pv0Y@xomDa+0(xi96lVI$*SFi$rIvnI+Z< zP6CuoShgl2QnMpFI-PB6pmH#Y07~#?s$FDcg3>%BvwLSr~ zMD&us(A2{^{L%*`pZr=UxW0t#CL&`6GtQUoDgzqf|Jrtw_`7?heq2jcr|HrJbI-h( zCE#dl-h_ToG>+I6E?W&b^8m2Z)aIkLD#ac>#gyu)JG5S)?|We`{XB1`widAnVqFhK zbti(i=ioMfT-na6@g&uu05@>xX?jn_sFf`Nbj08a1WYPR1~XK3CMYTS6K|u;}i_pj#TGQ%Xue;LID} zcYNIqJjHAdfnOX+R6gq8ln+s)PI!#rgJ3pI z$7jm@wk0^9a9^l$0)2z@Q1zQaeC^%q!WOvNai{mz{EqK`&q3^M%e1dHnHx#i_vF{V zXqjRph<=d2pYK9n^HPF2tRyEBFCKE|`pCl%h%G0qppIsgU9#X>f|CD$hxX8wrozz7 zTN%6YYR$_KFFr-|D*sn-q1!uDZG3B4A$qDD_7K2gG0&t65SWtLBwi+L`8!!e$nRj} zC*Q#2;uP$eE?~K#cXXYHh<-X)y&uTzA5dUsP|@*hy-`a?@T?kA;iPL3T%T?TR9jB_@Bl7 z`tFXRKdnBIT{P@GT7QV-4Q4U$1`imWi~OBo(nre z8RR4R%_%9A1O2|K_tDN>uR+k$xIu+vRJ|IGWHs)Kv`p7HtA&$eVfe zsjnpEL;mT2iMYV3VjP9pQDZE0RKubBmN@JrXOS)L$FAs+)L}Dp%Qo>jIq$o+;%X=F z21ip~peu0vxiJ`>39ofPg>- zMZgrRAY>lcEA3Qpw7+cl5`)H!5}S62iiB1|hR%~8OWJirNw2I?Vw%1aA$ZA19Bn@d zuIAm{EL+qYy$$ERds`%F@gh{(sDOZEtS~qKqAfV~JKuWiT?~>gL2M$!5%zjY;u}OM zP|-pnv?VGI+&5#z%0vh>#lZgPqf5O{YCaAMhZq6Tp$O zycs9O0~VqDfNl@vf+wukkr&9#x5dcN#rA9VDu4E^?V9ipf-Sy`zj(>AWb(C!l?MFM z&pyd!!|r;TvU&DAv}E+2==Afv`A&#!OC#9>XWwsYWO`Ur?-?aIX=FQWJbLg+D)J5h zSH*FhKIzwgzBPu^eA!O$yhm-yR>Q_Jn@waVVLdLk zs83a?z!n(}oDU>*=qFm6vP`i1kpG3QG_sGyqc)fYapjHX#M^y{&p>gauQJq0FQ!Me zg;R3yE&e6b8>Y@Nhn8`dVq^u{#{p(|4cr>#6!;#dim4^xDG)S#g_HsNH*(N-4n<_c z?v&3|;;*RTHdS!FkdF%>YW-p>hwJq){mUDJEh@9|yL@TUf z9JwWAcAirx+Q)2LC{7wjhMus1Qi0$d#eBSx9j7LCowP|wjoDwIm)=-P+6Bp;HYM${m}8k zSDKq;#+3zFbrEhY$_G1O&*fM7^ZY8NnDVK7I3DA$%@R6FZ>4O?)$Gb2`DqS;GZ~@R zE)*4G8QEqq*a1BQE80pjO2-gdy}XgsBMm^|XhS`xoY#6UB>&E_#+PcCiTXKU$Ndwn zX4krSTHb`~7L^(0J66O8%vuO*?MDn1E!WktM=lHe-HsF0p$Eh7G?0_W;%c6VzQ34; z*)ldh%lPsowvg>ep(I0fd`@-|&24P_rV3PdJ7-XpgO0Zr=BM3451b&r+4EOP!o-Lc>nFe(Dzs{0%9holSNjW|L{)j zKVMBcuyP=96!vt;EPa?F&7<09tsN?@fEP%*sp}B%u!y2%>I|xAG!Z{kK#fF8u~=zQ zS_1FZco%fk*~@1XtRdB+5D)!PR!{uEDSK?g+K-T&Szn3ZlZT**e4M89xVGBq?nbh$ zflBU20(OC8k^2pr+rVIwo|Zd(J!dAkc^o$ERu~_?W(YtNiM^;( z93l21y`j&qXgGmFohBg7<7BEjJ5f$@d#l5n&=R$qI=t(j0j;7(X z$pg5eoJK=j0NLs3?~RM0ZcD8c_4ce*9U8>k-qZzQpNez~#)4^OO$gR%0_}Q^52O9S`>8}%N zZ!c_r&0e=+4#8ItkbKv<2W_f8F6mQ_^~j1ZR2sJeTBP0{%muHb)TuhNP={7}O9iJm zmb~(#cC~d0aEFM-E*V~Tsgz{geU>u3U$*S}7|Q#Yh=9UBqT~R8&1YX;NWTRj;M?jK zO3O2;ZMY_L=#46^pM8Roj;>_$Y!2dd-ms>6IK2&@>V|~GE8r!Z{)d;SP{f*@O1dU_ zX~_Ra+iD1-Y2Ut0Tv3?(r1-53f`%}`%s0X?IP>M6MMSe?6w``^>qcOdj|;Ype4?Ie z=urNi`-}V;JjUGzzD{PO2ivg4u|U93>iSn{H3|TNiUcWw@-#~>n%!MKd;BMC%^ZjQUmhSWPk#VOP{ndWa_@xGbC*#N#;mj}bc^-k^nYpdG zW>wiF0!iK8c%T~Y-ClYugNq^SyoqKeN(~M>rzcb9LHi{R`tjkC-O-<3rf+=$swTX> zf4_P89lt6=x|8InT+ALJ5Q$@v$k2bF6OkyBZr~fV4Ie0_)2NH zJ`u`d?gv(Xb6xM%Rh>UdlQ z$#~6p-!u!M`SJ`xEAv`nWW4U4`k5VP9T^^R^)mCVJ9v!TmPGG^J!pd0FOcd>2fVHG z;_;;MSDup1m0vwY$X%zOs!_(q<4Q0ZEc`vr$Ul8jV;GMSb@_OIpqB6Dmt=8FZqmfP zHxIS7t-)7JEd7~Pf%{2pWzNvgM|g}PJXyqw;Ss!*apXUcxwx};;~i<)l1on(i+KLD z>3ojkR_on%00g>t)qhDV-Z7Io632upXj*(dYgUnjrutUu;qe&O!iy<|k-JsC_WUMa zoBkIStc(p%mj5Ju>C2x}9A8+@-daK7Nytj~TJ@C4q03*Tj)(q2HNJY(y>IBD#^Y$$cA-U(HK^>`w1^1A8tN-odF z9!V84h*45boYiI93fPsM**JmrC6{ z=CHhgSTa+TMjm7*=#syOyHiM`!5?bi{*Mpsxd#u(BO;aYM%H>#T*eaj; z6)%^!M*d1b^c1Ik;4|+R#~Q4RZyUKTQ?u5nzP^GN|HyN1*WOy@D%Q+-10cSfifAHd zKW8T4^8hvTN+WwTbJ-JbjkS#|(kT$U#1DRmF|E1V$lRF1c1QXK+74y!uNwGCo@Vpq zf#o~fJ1emy0a%pSBcEf{ zWcRm&C_ULv&@4I&_;Al-2!vS&8Cb{b4yt#@GXsfrY+lsqy1kQ^K~B?zcB^EX*ZY_C zGoM}TNpX@T9|C6bf;)T2CWL`gNR|GTo!ebxJarXFjjB-)chB1OyZC5% zF$Xh1|LxSD4!0Y*KC_h`0P2_GnKl(5`xLjQzBVwSB*fc9g2-;J$aa@`?`>N_hC|+p zl_mjNUbID z$_yuO4gco=dOFKfBpB70MB(z>K|5@ZiLNz_8yHrJ|6y2>lSPBC!vM~M+~_BR%U~IQ zWOccso)i6ro`>|yg*BF%#O<f%3@D9j!jE#M!UV1xfokFhn0oKt;f`!LjV3kKoa;j+Ht zgAU5r&tbQ>_EUD!@EG-KR3bR9vy%+`c{XkAKJ=cC`FbH9V^!}3+?zUkuJiS$*W}xY zCsX30e>XmK5{ycN4b~N@77-$gt9m>6m&aUthsb$HYD6aeAiL%kxv2V@>22xM=RFuS zl>)(UmbIrF-0Bs_6D;j7zLB}`9ePhXeqAfaC5yuxaELoCpJpCEfMfBg8|xty?((7(R^ z=vJw-4eV#C2FrcUO3Gp&u(EvTTA|78pYb!-X}- zcy}Ni8ruLwc(7(L&eq7Ge0Fs5s%Aq=z-1{U(xZ`>nil@|2y!U)s&yOfk`&9L zXoN5ft0nGvzNsN}1rFQswl5#qIT0DWKZ1Wo#aJlvOz8?eaOSv*4Y)9+ccIb{>!|1| zZMNP;&;9W4L*;fV%fH^~`C80g4F=MsgR-YP@fVWR-QLVJO8>k`9;JgWd>3^sGp8bh zMV3oWktep;5MR9076$Tp%H%!l zP$P|*>Dl?XH@@-4`1J~QMVySKzfk>HdZlRlXnXjG1ZQZ~R6p8F^p*7vhf&^v&^=kY>mN8i%AoyW{_Ev7gg0ELu_J{B=MW=CWWwv zabc|imF4=E-+;+WCF&-U_w;f`Y4%K??|x`*Br@`#kg;mj-%bwmn#V*q=^797b$<)Z zQL%u17(GTf7sz|!IZ5#pF-`LK%+^^`<-W9P$V`RZzDM(p0QWSfnw~@#cM^oBgqF}^ zsv_5j+BykSvf1J!6S~%W>D^?I>5#z)EHIHF3C>CJVUv@>Fb$V}=Qwf}&3gLV zsjQEdG!XMkxJ58|`eP?{6%r~gghjO6Rkf>22(^#Yfkl=}ciBkmQ`jt|nMw&Qjwmk? zIkWqaHSl(`Qbz_Uh^V`Oz9zBpbIh&m9kStki|S*;ZZ&5+rCedp;_$^ia zckX9f&C6c7l)ryj*`8i9Nk!K47P&golNlV8%Td6 z$Xs8)I@Jm(uhxX!(gX(I%2%!4sPl4@`+Smn<-Q{a1tzjsHS!M?bdh zr~r2d$iWQeO(L-}o};O!!hG{=BI}W>>Yh7*W*MvNyb48Kan`+ANwMpXIuL&>&`KA(+VLzo03xf;GIm`TVvR>Z$6tA0;`pM~bquH02-8 zGICvZX2#{9rY2pwn2Ygra9$I-^f!*-1+isuGk0Q}w(W#jX!Dc*yjOuuGY#^;6?6=l zX)kqswm@+jho?OcZXN*gN?MZW5O-fce6s@QbLeAc;IaF;rCC>Qzhdna6K|KGPV9d! zxcF2E>8o6^$f+~;?zNFeeZ-l}WDF!Z^sE}%FqXfZ;QMj2z{>H1pB9GA+mZOgYpUWN zDcb?)(jC>gBDlz_YbK0ieL1J;&-(p!8jC3_n#>XQkBz^6h4FpQ?XOJ2_P%mXsrT4| z{MPFUCDre&B|qvEZp`mmDKuc&U$M!QT)dnXQ!-wwJyHyi)qPP=04|n4yQ3Q)3Hmcj z&ICC)GEb_T*q;u5xozwggSelTGXg>+JPp6eT*7nwc0YdY?x?@YRJRw#gSw^@B0wEI z7&F~c6Grz6j$6oEb0%NSM*Sb@DpD7pG~#sv<7%Q?0JQyRq}o3y9Vzc0UN1XWnXv23VQ@nio)FhUVl|af{DGiJGWh@2^fTVRw0kCQGjwD zo{ij@dLG#4MljH*{o2&miz%UQ<@=$e5;pZ$S-eM}2g8&Qm0r+e#g6*cXNICdw<)UT z<+0^J9q>^Xt?t88nI7#+*SM>wm0@BBmQZOr%$A+yQJ`xO;w_31VcV%Ydz^r2Qf@R5 zZ4OIGW`0&7YRH{&Ez@#I;<(2JkA+ckL46F=T~4NnH3of<7I$z`Tar zp+vg4VOhtw4mp9HRJQtu^PIw|=|;X=i9)y-wB@>DXr>ppjooqHK?_3M{rGa5CRmj;{B2ch@?#(g`wIzz>D2IG*`50PH7Xm^)!{PJOMfsD9df&)x+(Q) z6tA|ymsB_znRkgpom9R*Q9$r?&DsgDPjLe5>vcZcD83)HioB7l z7Z3YY;f*{STfh>N()!_g438bi@vg8BQ!5bUjyU+fRH;W>$8G-p8WQ*Mm?(Y@BqGHh zeR9Q|CRfH7=;`G@IJp=e9kx~p$_Ny?AM+({{iUZHCZ;|aDv89tkRp4RRxIxpW?1xu z()O1<@Ms|ZtE*@5m3+L+0(%jYn}959IBUFXVyyxewAn0FMPhcJfgyVr_t(sLna{XdQ+mJ!%rrhABHko zhgS#dCy8Vjz5-J0XIm`eKv12UJ)a!#3)cG4maac9LPfNB zF{d4VZKYRaB9g`l#90%Nb(8N2-fEB`io~!c*nYHYC32h#M`>OIvXXV@QlHLhvnsnX zvz|(iyGS_6bsBc9Xn6}^f#zBSr%(*c!SJy!I71j^A+>6-a6=&pwR-p_r=`cyA9^@r zk4GIj0!dS9*XKefR0s@%^dpQT>F47K99@9|Q61$VcB>L_k0w}9AK{M5eDUXn@h%Nr zq~wcwVOh}%^gGYkVA6554{_$iBPo(ssh6aOybBT>-#d1FMj+S!oT`u-E{yA9uHs`e zUBMJJyUGpT*5JTR&*i9s!)xzak0y0#-bsy1F+|l*FG9q##X&aOCIz;-XXI6{)OaLx z+YI#tJG{wWD5OrDkf_9LOs=DJxQPNXq0Y)V8JB9UuU+f+Amx3X%!wW`TcotimCFy|vozr7j|Mz6Pe zzgxHeWfnQJln*m7D981C`~a!>yYm*TY?C=YLm#MuAaLWskp%;S)afVCnS$ z*+$D?9oI70D#!0I&$d?<@pGa0S0?~Y?rinR_e0r~czIpvxtPnnmHoP7K1U+RlCLFiUN@Zj=XOgh4K?lT<)auzgp4bZ`*ZCm6>SI$~_9b&Ix(#=`5? z0l;M#wo(((wtaKx!yW1cw)~vs$U)QaS4iB#>>zBbGx0ipi2XsUDZf6cZ;fCPT-u&< zf%*&F@k_HIB{91!{6)zU1;Vi(#*wp<`2fSM6z+x_@lZ1XH^_QblS8^z{~fs*D@y6KS3=J4tl zZm+BS_CA~C#8U4cNRf{H6O%tUi!@?`=asMlMeTp_Fty2f>&d=p%ZAQL(j;^~dy0Nh zA*Q|+3xoU?MbjHYb9cDY*3GAM?mCYF2$-#kLw}j6bS>Cc zQQyuDX6@Uny;+3u$nKCQWzGY}9tKldvscCmg0!%vcdH|HOi_!ljm$6(b}!$0WnpwC z$7=n_<+x(cb9F3YEEKY=>qb0?N-DJq#X=H}&Z2Yq!uCRmuHiI=2}M%rnHN#yrBkRB z?Z3@Zm!qjt^HC8YnbxN3&zuL%!s0=qIF9}~+Ki}grjw)^NHiZVu4#y4UZYgL@OklQ zTAMzs$9EVwDrjJhjEwp;z=~2UTX2cATELipX-s!eK}aUEgN3kW55@KiW^ZY-P$QE@ zXDeLx1ur9&k!^2-Tpp$HUFIW?lQLe9=;shZa?|y7v4<1#hHw75)0mU)o&_*rTVmR@ zQIeBj_4zJC!>hZH_VNDDZg6B zIQBJa@hTe)$-eY`lGn7hB3rYs)xoiQeTnpt3@pfx>?wC!EmiF%-bCB?IHtc`81YE^ z+e1DTlLvI7WYM|Ih6LK-d;7Bg;jdkt(_?CIFpp%4|IZP8_T|}+B29sbp$?)Mg9d(4 z$^cb{9iP<0xys}t@KW#;EpF*z5<7v;UVZq(QD!YUg9)#I3#I)G8m43M~Go74bU&Y zKc;&h!V550(f`6+)_9D!WvianG0eUUhy!|VI8UtRJAJI=YHYoVQLdv~OKEX`=yF6RuRGrsZ@EyNEwSAZ()lO(<)VO2?nr^wb+grm_L+ckGRcKyZ` zL&EZ}*$wut)Zr=UJvJJul!)bb)HKg?g!jv#M0wQ*zI1yKaEW~F;jkVm+yJ#AD;YsA zXJcwG!?9xXx*MPY0iBZgD|?FNAAeOdCy*Z={uC6?kFnx3AyS=v4WU^m|MY3dgW& z!X7&vZ!f(Svuhv`x9yU3o0+K16<4CU1bxo&MP|L56dg|NLuM~xqVD#m&*RniWfMmL zdc@`usM#%XsymoANazEG|MNqoq~g3YV-($@ptHUsOaSv^$%8w3ZhP~I+mEB%%BND0 zJ(&9R9dCSg;#W=~sHc;drB+P;p{t;?;nP*d=U@|je(FY#@nU)U6Wx3&@IG>i^17vwgQvp%lu3Y4ObSW5 zfYo{0f9{QvozhK!7Wz>qtR&Qr)Wma0+*Xt{cnBx0Ds+i{3xmzLOHaQP`Yq|6~#M7kj#nn>rD^I!Q!8Mx2 za-0hnY4QGfSz!MGN(`$Z3BtibcEc5#(J;x=^eURLljt9VBhAanBVi~pxfSq)!ftYPyLEXo3>I0 zQRkKH3{5*Q!$r~+R5((B9VSZt`fd|0*kR~Cc^t?0xa^7!P(MX%MEP5~{i84=WehDj zt9SnJv=x^9&nLCL>?ynmX~m2d&qVK3705IbNxS~gy&Vq``vd644MbXvuo3b1GCsG# zRvmjN?c(Afi}TA7OoMtSEpHJ9ZwV058}xK6zr?^K zD0Diddpdpong4)=OVEE@PoH!dPrPX}r;%@y8rJ3f3cz8BU$@3<;oBUBgp{-(Zri^X z^@yUtD#Rr%;P!C_oORqUKd%n5fVXC>UV8bXTBpH%`OZ!m#923RjbSf}t6r4ZLD_=oNST0J!7E&3UYm8t|5u-+C$*Lj|-$wEqu#jR-Ju zfj1~YvH6llTFV46`v{p5*sT$p8={I&_xa^&kQjwI0L;W8iCh#yg2NU;htV5Oy>x_}IdJY58-Rj4u|{Z(sP)6V?DQdQ z)QN-LBjb-DVfTaI@zIVWNUZNkw<7V)UNFIDALc;LmY``a$sNR!e7-9BA`9M=yJ3iD z!Kag)NwQ57papAy%cZC_MHIgK0}Mt#2bZ$IexBy0rkQoT6i?6~(0poZ6L z?x1pw1L1oj{OQBPUaeAH_+4IB98x@|h{ShCT@qpKq$KxyavtPH-cVb*l+1>;kqQ1=3ZFaywvonx zJTW^X?tWH&sPuAHp@3-dk}|an`i%RymyOGiRV=be_*M>sRrK{X>qL8N$g=kopN+n$ z_oDJS*iS}lcES9j<kyEe970UQfdegXB=Z9W$;%7ZB9x0mW$eqY%8d3pZ`bHm$y zy(Q~0H@sWCUYc&-|H6pTnd=Z;_!oKHFDLV=`oVqwOG08#OA;V9C=_)U{2w3ieE}&w zA^(i+JCsrUWASQA`ectGY<|Rk_vJOptV=eymasi)4)!$`e^kagp%zPd@Z#94#hyPT z5B^hkgv98HL&{wOQ~bJ#)|_Z5GW%%NgO>}Raw2h2o(3-pw&@hZ;}Y+&yTXQ zC80j8B-KKSd}X9gAwG?#B;(nL-d`Mk`ox!)_M4DBW^*n4xkdAmkn4q{gGfC;n<57u z3*5w%@@FjWgY|8&nP3i>NGbR`EWdILoXi;vRKMF6KO}ZMBC0ne9RStC@Xn!@K691Z zhDn&f0YtCI1L2dq_}7)+%w&5s`!~-avn)fZw*Y0IYVhVg@&8D?tm;^SKC(e-&DQa9sYV&+uAY#n&5?_y}mb zO9q1#e=OKPXKo0#^g-0cB`abTmA9lNB+_6-GZ6u&PnsERer*eLwLtY&&m7o@L^RVU z?Y|N6x5i)i%){Q)r=;?I2_vun3KW*jDHlPq*#XVuiO9x+#t22>uXjknNX@OS7?5 z!F$wi@w72$^Qln9Cog!$vv&omJiC0iIn$Q`lp`A`0?Trh1p(P^t`mU`)99UHu z#1m%kjYm^t0bry)8Q*Oqr;vaoe}vkxhT@Z@PA%tOD%ix2CfFdp`SO+vtS2AI(?+{6 z?{)ckL`f-L-cz(??%{x9kt+>1>ThrPU`JYt3yvmJ`~}$ILb`dkiCRbYI;Qnc>F=NQ zP_GN(VPoB4uloVqmBR5*RE#G)xZFH6d%G={brSi|vEf_#l&XXW{#s>rCjW+M4sn1?t zV-C(l%K8f4S^m*v$jxa$n>W+1s@#F!+pVH8Q~;v(3q2k0K5W+xO`oCEIgBc5#b2b{ zu+ya*0{Cqk{U;X}5Jh}Clj5_cAWdU6>dX4@4V|vJHs&DTuxjDm(+8g})SUn+;|7l( zBH;EiS*QitVEx07D0v#r^wCHSA-n3T?db93T_Tz7rVCgmJtHTT#H2hKP(D;tN=Vgu z^|?6I*@RPPoT9nUfm8vl7SRUR2eL0Etb38nN|(D~C+lisjg zodKx`@h$a8)jE}y=uR6TJDj@abDE0HvhI=Mp9ENOHvT9wBDDN-?6{X7(}jm`hrH&K z$;Qo*ou=^2cE+9i5ZCZ%6X*cJHYyE)>u%DRWa~IHf`b>|mr3ym)FiRY4z-8wn=k$T zHcpV?6<|{AzQO;SvAmfVr7Aa%6YKu_RBH5k0{TwBvBy|NslHW=ZX39H%$mgqKXKHS zeet}~(1Gbd7eri37J7~nBY$t{7nOCIh0-!o@bxM;(io$0z2qmrJ1HvjD^H2F;GOJA zio?l&_`eb-q*dxdRGRE|5?bgmG~^d1PHjRx8bV)1T2e3Q07$9rQ2fJCH*Ce1KBY-k zy+MhQO?Ee5MBVl1FvJ}Xdlyx1R4^IJ1mINpHxsf5=!`ltDyS#x9jdqWmK6vJ$RKx$ zR{8Uqhyf2J{F~Su*DTe1kdVfZxv;aoBGr$!Ge~a!tnm@F;}RN8_3MUeZ?v(6qY#SL zLR^|}zBp`lTv~V=)CMXl6Sq~wa03Hm$#%)t2;h#!L$A4Vs-Pqg<^kGj)gNwNL+X*t z*jTaI^Ji-aOV1A&^^UssYUvt$eM*@^up!^L6G$Rt>wCC;8;<3*tG;k7yC@Z`p>Sx| zxK^Yg*BK%kp7_f)SrYr@Q6L!y0^xjRuUMKR#oy0wvzfT(N^Hie&@2Jc!EAnB|#G{1y1&Ib2{Q3;&PH!k%{Xqcr z(jc^nbMDzZ@d!0qaM^SH?y{U2L@O4jo<*vqw>Dlpv9j?HuZH0uZQd5P4=FKIuV&Mu zv zs#9Di>~w;_PpjFuS_Knmm|P2CDme&qDNKe#N05Xk-cU(*gAa55`tPxi#a^`Vh_ zL$>y{@(iWIw+8G|?MVyzIpeAnJ#q?R^DU+2laGaBGZ&x*Wn90;I1Hg4eXI@@8FBDL zKK(2;dyxskPzvgeb?hO*&Bo=zIo%^PZ^a7m8-?!M!cA0qi=fRG(|j%M1?@T6ObF6S zvOXaRnC^MXHjV9a~9nnR+_X zY$V%;{YHNP>8(48|Yq9rx7o8-v`64pxg55W{ znj#%fP1xaQ?H=M(1d`Fn8}*w^IUdOfKy<}B3|<_M->v{6A<(B zk)TUHax`({@WgP2TwzC+D1v5GGx;cnivb`b|6?p4^MI&E`ZJ@(J;$!GRi{qWY^?uYE$$2UHv%Cl_eg zsy3TX<-6^7!#Q5$IczAzHNSu!ppxJhL<~2hD{ul_AHo+KNOywVG$*x%Qr(lx0uASK zVCn=h_oJ_0$xorlQ*Sc-i=jWF{A~t>M-tiZM@HF@A8?v50d!w+?N5-{L`hAeft6aA z?EfInC%N8RRCXMqcu&UZxCw$CqR-)a6)7Fd9l*`K9rDTPt^zLuFlFt??9|9_AS`bfe>q(gfegtAX0**0v@2Nk^%?B)>~3v?Oj1j^9(mtC zu)Oov`STHCvRG9)8C)f(X!j4Ak|3+3I>{evKq|S&R#NE=ZqUIS4n@C#gdv$F*8WE~cHo#6 z4g@$~V}@h;BrOx|!goM=eR-DGrQ3dhB6kY`Il!u3n`6$#_!#uL)-Xn&hf!Q-OoEw4 zft&73^1`VA*c#oQ1;fw|IedUHu8t(||4ZU2^Oqt!w%egM?rPz>I>L#o;z*Jx@F8-R z8LIUp;=Wh+kymXhgGTNnfl9+y={5V~zw?*dYmX1t5+u4$d%oL))7=i`*=&7PPsgEV z&$@6f;r{T=0Tb_R1It$`Z4$kj7P}i%&S2;psBD8;Dvbmc?u^38zW>_5I=*7D;9?wn z!w?m!&aW>}z4!{W2Cm&If8}F%G4~CE#-+P6Amc0Hf1Gy4j7x;tDNAS^DxFqZ%nEcp-Mzj#C|PL7=OB0^ulY|h zJeK!_>Mcm4+6E_~{64r{XzH{5V{Rr&Cr5pmyb5~bP_!8;H4d$IoNC{4l6=U}>_6Vl4XWyecmCLQZUkD&xwo#^0OS|bFT+&I z_KR+xr^<}O08E;K3YjKnWEl5|ck<0r3f#~d%a4M8fun%hl z`zUnZG%Nw^V^8qC^J_`KK8h&&4>u9)<0O0R1zh&=^EB>9mT%0KYn$E+SFG%3woY@e zc3hZ#_T=C(inIfSGSv|vUZZ8XA6y555=Wj6wZ<=^?hCEZcvznx7f4Bj7PJG2vb@Yv zsdXU_abAxfKrX>^t&h~rY}d9*L>OsYW3wosXe-h!AS#RoNr=-=gywT-3%2^={(wDg zjuHImeKsy+zInZ+h%4&~3pGbSgbYrFMOJS0XtX2Mtuq}5H8#t_mdGk6^Sogpu=kIA*RrqxN_$y;NATF7JoL? z5H59PNKwj70=U#IZ@>P2t*~QYGWNRKQl-?GyFvfQ(_IGcI%LUf?XDcHw3@p zUps&nS-S&pSg9q`T26c0sGI5xf)W-&Tt0&@B`Uw8F;)&6<>&RoMSH^T923^u=#$_t z^h@REmPpe9G3xiyIKcxDy3Xk=b~5&`^L1tw0@`}^t0dFbe0;LukMTnGpb zx1r#vn%*!`x|A$X(8PWM5dkOiK_)u!XVsFl)Tv@D<*(mJaXxRTFHLy=}MUL*R$ zX<+Lvp3;fs4wX+?Sx2-TCYI~Co4`cgY9YnJZ-9WGq#G(PFaaF<`OgRFdz3@a(w;s6 zwhMSSFq1JTjZz4`=?hj1ta}Laupxz0@QvSA(9@qMWPa$s%^R!gOzPEMnBpU_SwlwT z27v~d1>diDeb7-`$bne!^H;55&9@X&2g$pB0D{}k+|TM3sn#w5)&t3e?cW%nJ?Uz0 zAh+}LkHnD%B&f(96O-SEgo~2rvtl8>ZB6<{XhEbm+)n4*cW=dc4@mDEh6p_#dJy|# z8rfLu1(y4Ec=sJ3^XPW*QdL*W65FO#uM6R|bl*jwjO^JSh{nqTS{)CbbE$2cC7fgk zh3SzFtx%dr(bSV;xYkpApmo)HbIAt*;w>AQ-0tin(Be4#jRrtjd(&bmcB>E=rDu-H znMg;{E0%phdX0h4@9UL+F?{*<3gss~F6Rq42N6mcOp*ceQ2)4DKXP)xLAZ6}YlglX z9E5=o6~YjCWB6H?8r}s-Lq&|IR^eq5>mn zZ+q2E@sUu>Mcp{bf61b~p}4O9keW6Gsj*&}D}4Y+&2Pi2vjX;j)Yx%k9n2F!KX?*Q z#{x)A)qUPyf158g_WQlk5FQaM*h%QD+!~eDyUNH7oRry;oa6h~EOS~Mi!-W^v?GHj@5NR`LH&a!mW5{C|^U$|fGz z26O*|6Z`}QumpM&&-yATfYtyAo=5Q9LqmZ4wT_Ptr?0DRAa?pTEJle>C+=YbQ9Fch znG6kFsX&dw<*^1KXiOM@5El_7Hs_azH;3ciqWj*6&p1$5)|d7dIJ~9ZyfZ$3xaXM( zc}8OhPFo`P2kt`~OxE|T-}tzTw+a+WRB7`>sj|@owjt?Y&@LnZ=c)ttjB#{PK?t}2v zK(XQLX9juf5`_>(?$~Ce21e(TXfbPusXC9eW-=@XiF$_22X$1**y@jIZIIE{;G5_R z0JQa!b06{!Px~&bQ`v9A_Hiq)#z=1hXvnmW*A_To8+0A__X-j4Y|AX{a~a$~uq^HyP2UFMxu;H3GccCO_)qJ^LiB#jCMGtWmasInI4zfQEkZ^Rxk1R*@z zw+|ZAUx4jHYW#RhHsee!B#iML46D%x0EYIXE8aPlQE3oIVaBAQMY`P@w+9$(;=cPSNx8-w#js zy@#&y=jB@!E6}GJ1i@4KGY*s*1CjO^lKp~jXYR+r@ohy$>C28~y&3fvP0;m5#ene5p|r6e8$u27V*l#qkXuk))WRu_e21fnFTTiNBlTcnAbAwBHE zMTI#?%PokC?8b?|@B^-xCQNlXcK7h_jmq7T6AIMK4ChL`M# z2v{6Ln5V@f&4X}MAj>3pvfh_Z!c#>#`v|nIK`vD3uQ12 z7`%&Z?PRcccKwHxf8H_tA{k%E*p=FUd%6T!Nq4-Y

      b`fl>bQs|gEu`U>0Jd_Oc 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%0AmIoz>Q;)pAOiZri5 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
      Gi3K`tZlzx&PM5vT5b|RcA=?iTWtV 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�%hU0s@32m8A2(wyl7u}u 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�=lZB1K{s31v_2re=b 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%0AajjNx^q@W1a~U%n3Zsdw(;V|dFy&t6%XfR74^ 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

      MH8s!C#MiUEGE8u+;m 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 diff --git a/benchmarks/results-21-10-25/k31/canon-bench.log b/benchmarks/results-21-10-25/k31/canon-bench.log deleted file mode 100644 index a418396..0000000 --- a/benchmarks/results-21-10-25/k31/canon-bench.log +++ /dev/null @@ -1,60 +0,0 @@ -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 493.626 -avg_nanosec_per_negative_lookup 385.292 -avg_nanosec_per_access 281.621 -iterator: avg_nanosec_per_kmer 2.63384 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 501.748 -avg_nanosec_per_negative_lookup 373.86 -avg_nanosec_per_access 291.295 -iterator: avg_nanosec_per_kmer 2.61373 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 500.88 -avg_nanosec_per_negative_lookup 367.389 -avg_nanosec_per_access 293.958 -iterator: avg_nanosec_per_kmer 2.62232 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 484.986 -avg_nanosec_per_negative_lookup 399.162 -avg_nanosec_per_access 293.428 -iterator: avg_nanosec_per_kmer 2.67223 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 457.164 -avg_nanosec_per_negative_lookup 416.709 -avg_nanosec_per_access 282.156 -iterator: avg_nanosec_per_kmer 2.67729 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 474.531 -avg_nanosec_per_negative_lookup 408.218 -avg_nanosec_per_access 284.635 -iterator: avg_nanosec_per_kmer 2.6488 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 655.503 -avg_nanosec_per_negative_lookup 451.126 -avg_nanosec_per_access 359.515 -iterator: avg_nanosec_per_kmer 2.65759 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 668.818 -avg_nanosec_per_negative_lookup 455.108 -avg_nanosec_per_access 357.84 -iterator: avg_nanosec_per_kmer 2.64798 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 688.694 -avg_nanosec_per_negative_lookup 453.546 -avg_nanosec_per_access 357.927 -iterator: avg_nanosec_per_kmer 2.64782 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 914.137 -avg_nanosec_per_negative_lookup 482.048 -avg_nanosec_per_access 584.089 -iterator: avg_nanosec_per_kmer 2.5831 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 905.911 -avg_nanosec_per_negative_lookup 488.805 -avg_nanosec_per_access 565.096 -iterator: avg_nanosec_per_kmer 2.58853 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 900.103 -avg_nanosec_per_negative_lookup 489.907 -avg_nanosec_per_access 594.617 -iterator: avg_nanosec_per_kmer 2.58483 diff --git a/benchmarks/results-21-10-25/k31/canon-build.log b/benchmarks/results-21-10-25/k31/canon-build.log deleted file mode 100644 index 72e5d57..0000000 --- a/benchmarks/results-21-10-25/k31/canon-build.log +++ /dev/null @@ -1,1512 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash -k = 31, m = 19, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.495 [sec] (2.97533 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.72095 [sec] (1.43483 [ns/kmer]) -=== step 1: 'parse file' 2.21604 [sec] (4.41034 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 6.54638 [sec] (13.0285 [ns/kmer]) -num_minimizers = 79426371 -num_minimizer_positions = 88526066 -num_super_kmers = 92154774 -building minimizers MPHF with 64 threads and 27 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.51905 [sec] (7.00358 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050791626727933.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.38993 [sec] (6.7466 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.87132 [sec] (3.72429 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 3197650/79426371 (4.02593%) -num_buckets_in_skew_index 6880/79426371 (0.00866211%) -max_bucket_size 147214 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 10752816/88526066 (12.1465%) -num_minimizer_positions_of_buckets_in_skew_index 1551409/88526066 (1.75249%) -computing minimizers offsets: 1.1424 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2182228 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1371921 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1169036 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 902499 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 639097 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 421119 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 427767 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147214: 794079 -num_kmers_in_skew_index 7907746 (1.57379%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2182228 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2182228)... - built mphs[0] for 2182228 kmers; bits/key = 2.56006 - built positions[0] for 2182228 kmers; bits/key = 7.00017 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1371921 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1371921)... - built mphs[1] for 1371921 kmers; bits/key = 2.41774 - built positions[1] for 1371921 kmers; bits/key = 8.00027 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1169036 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1169036)... - built mphs[2] for 1169036 kmers; bits/key = 2.41802 - built positions[2] for 1169036 kmers; bits/key = 9.00029 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 902499 - building MPHF with 64 threads and 1 partitions (avg. partition size = 902499)... - built mphs[3] for 902499 kmers; bits/key = 2.56144 - built positions[3] for 902499 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 639097 - building MPHF with 64 threads and 1 partitions (avg. partition size = 639097)... - built mphs[4] for 639097 kmers; bits/key = 2.41949 - built positions[4] for 639097 kmers; bits/key = 11.0005 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 421119 - building MPHF with 64 threads and 1 partitions (avg. partition size = 421119)... - built mphs[5] for 421119 kmers; bits/key = 2.56399 - built positions[5] for 421119 kmers; bits/key = 12.0008 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 427767 - building MPHF with 64 threads and 1 partitions (avg. partition size = 427767)... - built mphs[6] for 427767 kmers; bits/key = 2.42113 - built positions[6] for 427767 kmers; bits/key = 13.0009 - lower = 8192; upper = 147214; num_bits_per_pos = 18; num_kmers_in_partition = 794079 - building MPHF with 64 threads and 1 partitions (avg. partition size = 794079)... - built mphs[7] for 794079 kmers; bits/key = 2.56168 - built positions[7] for 794079 kmers; bits/key = 18.0004 -computing skew index took: 4.43997 [sec] -=== step 3: 'build sparse and skew index' 5.70242 [sec] (11.3489 [ns/kmer]) -=== total_time 23.2451 [sec] (46.2622 [ns/kmer]) -total index size: 544657921 [B] -- 544.658 [MB] -SPACE BREAKDOWN: - mphf: 0.452783 [bits/kmer] (2.86438 [bits/key]) -- 5.22134% - strings_offsets: 0.144419 [bits/kmer] -- 1.66539% - control_codewords: 4.90028 [bits/kmer] -- 56.5084% - mid_load_buckets: 0.642004 [bits/kmer] -- 7.40338% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.92052e-05% - strings: 2.24566 [bits/kmer] -- 25.8962% - skew_index: 0.286624 [bits/kmer] -- 3.30525% - weights: 2.92956e-06 [bits/kmer] -- 3.37827e-05% - -------------- - total: 8.67177 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9654% -buckets with 2 minimizer positions = 2.53925% -buckets with 3 minimizer positions = 0.675583% -buckets with 4 minimizer positions = 0.28192% -buckets with 5 minimizer positions = 0.149202% -buckets with 6 minimizer positions = 0.0892487% -buckets with 7 minimizer positions = 0.058988% -buckets with 8 minimizer positions = 0.041485% -buckets with 9 minimizer positions = 0.0300794% -buckets with 10 minimizer positions = 0.0233059% -buckets with 11 minimizer positions = 0.0180872% -buckets with 12 minimizer positions = 0.0147483% -buckets with 13 minimizer positions = 0.0122642% -buckets with 14 minimizer positions = 0.0100269% -buckets with 15 minimizer positions = 0.00859412% -buckets with 16 minimizer positions = 0.00724822% -max_bucket_size 147214 -2025-10-21 14:46:55: saving data structure to disk... -2025-10-21 14:46:55: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 19 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash -k = 31, m = 19, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.71437 [sec] (2.3595 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.34791 [sec] (1.17169 [ns/kmer]) -=== step 1: 'parse file' 4.06241 [sec] (3.5313 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 14.7371 [sec] (12.8104 [ns/kmer]) -num_minimizers = 193802281 -num_minimizer_positions = 200203180 -num_super_kmers = 208893778 -building minimizers MPHF with 64 threads and 65 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 8.37286 [sec] (7.27822 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050815633902437.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.93344 [sec] (6.89625 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 6.09755 [sec] (5.30037 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 3847381/193802281 (1.98521%) -num_buckets_in_skew_index 3359/193802281 (0.00173321%) -max_bucket_size 3537 -log2_max_bucket_size 12 -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 9765802/200203180 (4.87795%) -num_minimizer_positions_of_buckets_in_skew_index 485837/200203180 (0.242672%) -computing minimizers offsets: 1.95079 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1156188 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 794276 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 431933 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 210507 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 155247 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3537: 79585 -num_kmers_in_skew_index 2827736 (0.245805%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1156188 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1156188)... - built mphs[0] for 1156188 kmers; bits/key = 2.41808 - built positions[0] for 1156188 kmers; bits/key = 7.00033 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 794276 - building MPHF with 64 threads and 1 partitions (avg. partition size = 794276)... - built mphs[1] for 794276 kmers; bits/key = 2.56179 - built positions[1] for 794276 kmers; bits/key = 8.00044 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 431933 - building MPHF with 64 threads and 1 partitions (avg. partition size = 431933)... - built mphs[2] for 431933 kmers; bits/key = 2.42104 - built positions[2] for 431933 kmers; bits/key = 9.0008 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 210507 - building MPHF with 64 threads and 1 partitions (avg. partition size = 210507)... - built mphs[3] for 210507 kmers; bits/key = 2.56934 - built positions[3] for 210507 kmers; bits/key = 10.0016 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 155247 - building MPHF with 64 threads and 1 partitions (avg. partition size = 155247)... - built mphs[4] for 155247 kmers; bits/key = 2.42999 - built positions[4] for 155247 kmers; bits/key = 11.0024 - lower = 2048; upper = 3537; num_bits_per_pos = 12; num_kmers_in_partition = 79585 - building MPHF with 64 threads and 1 partitions (avg. partition size = 79585)... - built mphs[5] for 79585 kmers; bits/key = 2.44287 - built positions[5] for 79585 kmers; bits/key = 12.0047 -computing skew index took: 1.57572 [sec] -=== step 3: 'build sparse and skew index' 3.80209 [sec] (3.30502 [ns/kmer]) -=== total_time 45.0054 [sec] (39.1216 [ns/kmer]) -total index size: 1193798175 [B] -- 1193.8 [MB] -SPACE BREAKDOWN: - mphf: 0.478076 [bits/kmer] (2.83783 [bits/key]) -- 5.75871% - strings_offsets: 0.100021 [bits/kmer] -- 1.20481% - control_codewords: 5.39089 [bits/kmer] -- 64.9364% - mid_load_buckets: 0.263161 [bits/kmer] -- 3.16993% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.24494e-05% - strings: 2.0304 [bits/kmer] -- 24.4573% - skew_index: 0.0392517 [bits/kmer] -- 0.472809% - weights: 1.27956e-06 [bits/kmer] -- 1.5413e-05% - -------------- - total: 8.3018 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 98.0131% -buckets with 2 minimizer positions = 1.66716% -buckets with 3 minimizer positions = 0.165207% -buckets with 4 minimizer positions = 0.0541841% -buckets with 5 minimizer positions = 0.0274011% -buckets with 6 minimizer positions = 0.0165545% -buckets with 7 minimizer positions = 0.0109854% -buckets with 8 minimizer positions = 0.00783015% -buckets with 9 minimizer positions = 0.0058312% -buckets with 10 minimizer positions = 0.00442048% -buckets with 11 minimizer positions = 0.00347622% -buckets with 12 minimizer positions = 0.00275281% -buckets with 13 minimizer positions = 0.00227964% -buckets with 14 minimizer positions = 0.00191742% -buckets with 15 minimizer positions = 0.00159286% -buckets with 16 minimizer positions = 0.00138234% -max_bucket_size 3537 -2025-10-21 14:47:41: saving data structure to disk... -2025-10-21 14:47:41: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.4621 [sec] (2.97807 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.82.bin'... -=== step 1.2: 'computing minimizers tuples' 3.26857 [sec] (1.30447 [ns/kmer]) -=== step 1: 'parse file' 10.7308 [sec] (4.28258 [ns/kmer]) - == files to merge = 83 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.1: 'merging minimizers tuples' 38.4114 [sec] (15.3297 [ns/kmer]) -num_minimizers = 417581788 -num_minimizer_positions = 472564790 -num_super_kmers = 491650762 -building minimizers MPHF with 64 threads and 140 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 20.127 [sec] (8.03257 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 18.1536 [sec] (7.245 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050862109929341.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.4: 'merging minimizers tuples ' 25.1065 [sec] (10.0198 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 16645723/417581788 (3.98622%) -num_buckets_in_skew_index 69819/417581788 (0.0167198%) -max_bucket_size 28572 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 59127954/472564790 (12.5121%) -num_minimizer_positions_of_buckets_in_skew_index 12570590/472564790 (2.66008%) -computing minimizers offsets: 6.13112 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18311376 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14093331 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 9943202 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6883204 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4459079 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2331974 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1374707 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 28572: 1246991 -num_kmers_in_skew_index 58643864 (2.34044%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18311376 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[0] for 18311376 kmers; bits/key = 2.66379 - built positions[0] for 18311376 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14093331 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[1] for 14093331 kmers; bits/key = 2.54555 - built positions[1] for 14093331 kmers; bits/key = 8.00003 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 9943202 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[2] for 9943202 kmers; bits/key = 2.65828 - built positions[2] for 9943202 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6883204 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 6883204 kmers; bits/key = 2.78306 - built positions[3] for 6883204 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4459079 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4459079 kmers; bits/key = 2.72379 - built positions[4] for 4459079 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2331974 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2331974)... - built mphs[5] for 2331974 kmers; bits/key = 2.56 - built positions[5] for 2331974 kmers; bits/key = 12.0002 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1374707 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1374707)... - built mphs[6] for 1374707 kmers; bits/key = 2.56063 - built positions[6] for 1374707 kmers; bits/key = 13.0003 - lower = 8192; upper = 28572; num_bits_per_pos = 15; num_kmers_in_partition = 1246991 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1246991)... - built mphs[7] for 1246991 kmers; bits/key = 2.41795 - built positions[7] for 1246991 kmers; bits/key = 15.0003 -computing skew index took: 9.93495 [sec] -=== step 3: 'build sparse and skew index' 16.7772 [sec] (6.69567 [ns/kmer]) -=== total_time 129.307 [sec] (51.6054 [ns/kmer]) -total index size: 2992410434 [B] -- 2992.41 [MB] -SPACE BREAKDOWN: - mphf: 0.473665 [bits/kmer] (2.84221 [bits/key]) -- 4.95776% - strings_offsets: 0.153147 [bits/kmer] -- 1.60296% - control_codewords: 5.49959 [bits/kmer] -- 57.5631% - mid_load_buckets: 0.755123 [bits/kmer] -- 7.90372% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.95599e-06% - strings: 2.24545 [bits/kmer] -- 23.5027% - skew_index: 0.427034 [bits/kmer] -- 4.46969% - weights: 5.87466e-07 [bits/kmer] -- 6.14889e-06% - -------------- - total: 9.55401 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9971% -buckets with 2 minimizer positions = 2.58951% -buckets with 3 minimizer positions = 0.57957% -buckets with 4 minimizer positions = 0.249566% -buckets with 5 minimizer positions = 0.139449% -buckets with 6 minimizer positions = 0.0886526% -buckets with 7 minimizer positions = 0.0610177% -buckets with 8 minimizer positions = 0.0445565% -buckets with 9 minimizer positions = 0.0338573% -buckets with 10 minimizer positions = 0.0265459% -buckets with 11 minimizer positions = 0.021249% -buckets with 12 minimizer positions = 0.0173949% -buckets with 13 minimizer positions = 0.0145279% -buckets with 14 minimizer positions = 0.0123581% -buckets with 15 minimizer positions = 0.0105172% -buckets with 16 minimizer positions = 0.00905643% -max_bucket_size 28572 -2025-10-21 14:49:53: saving data structure to disk... -2025-10-21 14:49:54: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.466 [sec] (4.69754 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.113.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.114.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.115.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.116.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.117.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.118.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.119.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.120.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.121.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.122.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.123.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.124.bin'... -=== step 1.2: 'computing minimizers tuples' 9.26741 [sec] (2.4925 [ns/kmer]) -=== step 1: 'parse file' 26.7336 [sec] (7.19007 [ns/kmer]) - == files to merge = 125 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -=== step 2.1: 'merging minimizers tuples' 60.9427 [sec] (16.3907 [ns/kmer]) -num_minimizers = 553041851 -num_minimizer_positions = 734186748 -num_super_kmers = 761111664 -building minimizers MPHF with 64 threads and 185 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 23.0843 [sec] (6.20861 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 25.8549 [sec] (6.95377 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050994948769757.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -=== step 2.4: 'merging minimizers tuples ' 40.6889 [sec] (10.9434 [ns/kmer]) -num_bits_per_offset = 33 -num_buckets_larger_than_1_not_in_skew_index 82029767/553041851 (14.8325%) -num_buckets_in_skew_index 169162/553041851 (0.0305876%) -max_bucket_size 111238 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 230030103/734186748 (31.3313%) -num_minimizer_positions_of_buckets_in_skew_index 33313723/734186748 (4.5375%) -computing minimizers offsets: 15.453 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 42246613 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 33148891 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 25299495 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17873655 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 11858924 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 7965543 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5764491 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 111238: 6866438 -num_kmers_in_skew_index 151024050 (4.06184%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 42246613 - building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... - built mphs[0] for 42246613 kmers; bits/key = 2.54722 - built positions[0] for 42246613 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 33148891 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[1] for 33148891 kmers; bits/key = 2.58892 - built positions[1] for 33148891 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 25299495 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[2] for 25299495 kmers; bits/key = 2.55132 - built positions[2] for 25299495 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17873655 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[3] for 17873655 kmers; bits/key = 2.57485 - built positions[3] for 17873655 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 11858924 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[4] for 11858924 kmers; bits/key = 2.54906 - built positions[4] for 11858924 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 7965543 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[5] for 7965543 kmers; bits/key = 2.67668 - built positions[5] for 7965543 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5764491 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 5764491 kmers; bits/key = 2.57296 - built positions[6] for 5764491 kmers; bits/key = 13.0001 - lower = 8192; upper = 111238; num_bits_per_pos = 17; num_kmers_in_partition = 6866438 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[7] for 6866438 kmers; bits/key = 2.78884 - built positions[7] for 6866438 kmers; bits/key = 17.0001 -computing skew index took: 22.3991 [sec] -=== step 3: 'build sparse and skew index' 39.1337 [sec] (10.5251 [ns/kmer]) -=== total_time 216.438 [sec] (58.2117 [ns/kmer]) -total index size: 5337366354 [B] -- 5337.37 [MB] -SPACE BREAKDOWN: - mphf: 0.421212 [bits/kmer] (2.83182 [bits/key]) -- 3.66781% - strings_offsets: 0.300083 [bits/kmer] -- 2.61305% - control_codewords: 5.05724 [bits/kmer] -- 44.0372% - mid_load_buckets: 2.04162 [bits/kmer] -- 17.7779% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.0212e-06% - strings: 2.8909 [bits/kmer] -- 25.1732% - skew_index: 0.772955 [bits/kmer] -- 6.73071% - weights: 3.95899e-07 [bits/kmer] -- 3.44739e-06% - -------------- - total: 11.484 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 85.1369% -buckets with 2 minimizer positions = 11.3164% -buckets with 3 minimizer positions = 1.94211% -buckets with 4 minimizer positions = 0.566909% -buckets with 5 minimizer positions = 0.267343% -buckets with 6 minimizer positions = 0.159787% -buckets with 7 minimizer positions = 0.106973% -buckets with 8 minimizer positions = 0.0766779% -buckets with 9 minimizer positions = 0.0576396% -buckets with 10 minimizer positions = 0.0450601% -buckets with 11 minimizer positions = 0.035992% -buckets with 12 minimizer positions = 0.0292114% -buckets with 13 minimizer positions = 0.0242584% -buckets with 14 minimizer positions = 0.0205086% -buckets with 15 minimizer positions = 0.0175954% -buckets with 16 minimizer positions = 0.0151079% -max_bucket_size 111238 -2025-10-21 14:53:33: saving data structure to disk... -2025-10-21 14:53:36: DONE diff --git a/benchmarks/results-21-10-25/k31/regular-bench.log b/benchmarks/results-21-10-25/k31/regular-bench.log deleted file mode 100644 index 1a2e994..0000000 --- a/benchmarks/results-21-10-25/k31/regular-bench.log +++ /dev/null @@ -1,60 +0,0 @@ -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 653.685 -avg_nanosec_per_negative_lookup 706.219 -avg_nanosec_per_access 278.818 -iterator: avg_nanosec_per_kmer 2.64226 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 632.57 -avg_nanosec_per_negative_lookup 702.513 -avg_nanosec_per_access 293.313 -iterator: avg_nanosec_per_kmer 2.62006 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 653.451 -avg_nanosec_per_negative_lookup 703.665 -avg_nanosec_per_access 278.433 -iterator: avg_nanosec_per_kmer 2.6177 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 628.015 -avg_nanosec_per_negative_lookup 763.91 -avg_nanosec_per_access 292.017 -iterator: avg_nanosec_per_kmer 2.62204 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 631.261 -avg_nanosec_per_negative_lookup 762.701 -avg_nanosec_per_access 287.12 -iterator: avg_nanosec_per_kmer 2.66403 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 624.861 -avg_nanosec_per_negative_lookup 761.346 -avg_nanosec_per_access 286.968 -iterator: avg_nanosec_per_kmer 2.65551 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 880.11 -avg_nanosec_per_negative_lookup 828.219 -avg_nanosec_per_access 356.447 -iterator: avg_nanosec_per_kmer 2.6528 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 888.85 -avg_nanosec_per_negative_lookup 836.238 -avg_nanosec_per_access 377.639 -iterator: avg_nanosec_per_kmer 2.64126 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 892.655 -avg_nanosec_per_negative_lookup 837.356 -avg_nanosec_per_access 360.707 -iterator: avg_nanosec_per_kmer 2.67303 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1149.97 -avg_nanosec_per_negative_lookup 906.528 -avg_nanosec_per_access 581.879 -iterator: avg_nanosec_per_kmer 2.58061 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1135.41 -avg_nanosec_per_negative_lookup 898.131 -avg_nanosec_per_access 587.958 -iterator: avg_nanosec_per_kmer 2.59557 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1126.64 -avg_nanosec_per_negative_lookup 893.839 -avg_nanosec_per_access 587.36 -iterator: avg_nanosec_per_kmer 2.57272 diff --git a/benchmarks/results-21-10-25/k31/regular-build.log b/benchmarks/results-21-10-25/k31/regular-build.log deleted file mode 100644 index 8cc2114..0000000 --- a/benchmarks/results-21-10-25/k31/regular-build.log +++ /dev/null @@ -1,1473 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.50637 [sec] (2.99795 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.584493 [sec] (1.16325 [ns/kmer]) -=== step 1: 'parse file' 2.09095 [sec] (4.16138 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.6288 [sec] (11.2024 [ns/kmer]) -num_minimizers = 72381146 -num_minimizer_positions = 78455681 -num_super_kmers = 78455681 -building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.20004 [sec] (6.36867 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050427547351769.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.88284 [sec] (5.73738 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.86003 [sec] (3.70181 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) -num_buckets_in_skew_index 4215/72381146 (0.00582334%) -max_bucket_size 70346 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) -num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) -computing minimizers offsets: 0.874378 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 -num_kmers_in_skew_index 4740893 (0.943527%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... - built mphs[0] for 1260546 kmers; bits/key = 2.56076 - built positions[0] for 1260546 kmers; bits/key = 7.00029 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 - building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... - built mphs[1] for 994175 kmers; bits/key = 2.41831 - built positions[1] for 994175 kmers; bits/key = 8.00033 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 - building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... - built mphs[2] for 665719 kmers; bits/key = 2.41938 - built positions[2] for 665719 kmers; bits/key = 9.00051 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 - building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... - built mphs[3] for 408608 kmers; bits/key = 2.42149 - built positions[3] for 408608 kmers; bits/key = 10.0008 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 - building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... - built mphs[4] for 423234 kmers; bits/key = 2.56407 - built positions[4] for 423234 kmers; bits/key = 11.0009 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 - building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... - built mphs[5] for 271419 kmers; bits/key = 2.42412 - built positions[5] for 271419 kmers; bits/key = 12.0014 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 - building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... - built mphs[6] for 288814 kmers; bits/key = 2.42387 - built positions[6] for 288814 kmers; bits/key = 13.0013 - lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 - building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... - built mphs[7] for 428378 kmers; bits/key = 2.56398 - built positions[7] for 428378 kmers; bits/key = 17.0008 -computing skew index took: 2.6436 [sec] -=== step 3: 'build sparse and skew index' 3.62623 [sec] (7.21687 [ns/kmer]) -=== total_time 19.2889 [sec] (38.3885 [ns/kmer]) -total index size: 495332369 [B] -- 495.332 [MB] -SPACE BREAKDOWN: - mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 5.30379% - strings_offsets: 0.144419 [bits/kmer] -- 1.83123% - control_codewords: 4.46561 [bits/kmer] -- 56.624% - mid_load_buckets: 0.439286 [bits/kmer] -- 5.57015% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 5.41051e-05% - strings: 2.24566 [bits/kmer] -- 28.4749% - skew_index: 0.173169 [bits/kmer] -- 2.19578% - weights: 2.92956e-06 [bits/kmer] -- 3.71468e-05% - -------------- - total: 7.88643 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.8721% -buckets with 2 minimizer positions = 2.00417% -buckets with 3 minimizer positions = 0.51765% -buckets with 4 minimizer positions = 0.211311% -buckets with 5 minimizer positions = 0.109826% -buckets with 6 minimizer positions = 0.0661802% -buckets with 7 minimizer positions = 0.0437061% -buckets with 8 minimizer positions = 0.0308464% -buckets with 9 minimizer positions = 0.0235614% -buckets with 10 minimizer positions = 0.0177228% -buckets with 11 minimizer positions = 0.0139967% -buckets with 12 minimizer positions = 0.0112902% -buckets with 13 minimizer positions = 0.00931044% -buckets with 14 minimizer positions = 0.00771748% -buckets with 15 minimizer positions = 0.00632347% -buckets with 16 minimizer positions = 0.00528591% -max_bucket_size 70346 -2025-10-21 14:40:47: saving data structure to disk... -2025-10-21 14:40:47: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.74263 [sec] (2.38407 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.14784 [sec] (0.997776 [ns/kmer]) -=== step 1: 'parse file' 3.89059 [sec] (3.38195 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.4548 [sec] (10.8265 [ns/kmer]) -num_minimizers = 173258591 -num_minimizer_positions = 175959772 -num_super_kmers = 175959772 -building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 7.10969 [sec] (6.18019 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050448102927448.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.62701 [sec] (5.76062 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 4.21109 [sec] (3.66055 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) -num_buckets_in_skew_index 1541/173258591 (0.000889422%) -max_bucket_size 3747 -log2_max_bucket_size 12 -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) -num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) -computing minimizers offsets: 1.34162 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 -num_kmers_in_skew_index 1185367 (0.10304%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 - building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... - built mphs[0] for 559507 kmers; bits/key = 2.41999 - built positions[0] for 559507 kmers; bits/key = 7.00068 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 - building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... - built mphs[1] for 317132 kmers; bits/key = 2.42276 - built positions[1] for 317132 kmers; bits/key = 8.00111 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 - building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... - built mphs[2] for 144139 kmers; bits/key = 2.43099 - built positions[2] for 144139 kmers; bits/key = 9.00242 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 - building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... - built mphs[3] for 106543 kmers; bits/key = 2.43597 - built positions[3] for 106543 kmers; bits/key = 10.0034 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 - building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... - built mphs[4] for 21308 kmers; bits/key = 2.51323 - built positions[4] for 21308 kmers; bits/key = 11.0171 - lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 - building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... - built mphs[5] for 36738 kmers; bits/key = 2.4746 - built positions[5] for 36738 kmers; bits/key = 12.0098 -computing skew index took: 0.677349 [sec] -=== step 3: 'build sparse and skew index' 2.24693 [sec] (1.95317 [ns/kmer]) -=== total_time 36.5402 [sec] (31.763 [ns/kmer]) -total index size: 1077792931 [B] -- 1077.79 [MB] -SPACE BREAKDOWN: - mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.68775% - strings_offsets: 0.100021 [bits/kmer] -- 1.33448% - control_codewords: 4.81944 [bits/kmer] -- 64.3013% - mid_load_buckets: 0.102577 [bits/kmer] -- 1.36859% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.48656e-05% - strings: 2.0304 [bits/kmer] -- 27.0897% - skew_index: 0.0163494 [bits/kmer] -- 0.218135% - weights: 1.27956e-06 [bits/kmer] -- 1.70719e-05% - -------------- - total: 7.49509 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.2421% -buckets with 2 minimizer positions = 0.571193% -buckets with 3 minimizer positions = 0.0840564% -buckets with 4 minimizer positions = 0.0345576% -buckets with 5 minimizer positions = 0.0184735% -buckets with 6 minimizer positions = 0.011514% -buckets with 7 minimizer positions = 0.00772718% -buckets with 8 minimizer positions = 0.00537809% -buckets with 9 minimizer positions = 0.00392246% -buckets with 10 minimizer positions = 0.00304862% -buckets with 11 minimizer positions = 0.00236583% -buckets with 12 minimizer positions = 0.0019139% -buckets with 13 minimizer positions = 0.00156356% -buckets with 14 minimizer positions = 0.00127613% -buckets with 15 minimizer positions = 0.00105276% -buckets with 16 minimizer positions = 0.000939636% -max_bucket_size 3747 -2025-10-21 14:41:25: saving data structure to disk... -2025-10-21 14:41:27: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.63075 [sec] (3.04538 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.72.bin'... -=== step 1.2: 'computing minimizers tuples' 2.63305 [sec] (1.05083 [ns/kmer]) -=== step 1: 'parse file' 10.2639 [sec] (4.09626 [ns/kmer]) - == files to merge = 73 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 35.422 [sec] (14.1367 [ns/kmer]) -num_minimizers = 386687326 -num_minimizer_positions = 423023926 -num_super_kmers = 423023926 -building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 17.0605 [sec] (6.80875 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050487310676357.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 15.7585 [sec] (6.28913 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 8.17596 [sec] (3.26297 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) -num_buckets_in_skew_index 42372/386687326 (0.0109577%) -max_bucket_size 22972 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) -num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) -computing minimizers offsets: 4.73824 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 -num_kmers_in_skew_index 32063746 (1.27964%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[0] for 11807213 kmers; bits/key = 2.55841 - built positions[0] for 11807213 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8389556 kmers; bits/key = 2.61352 - built positions[1] for 8389556 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5343660 kmers; bits/key = 2.66261 - built positions[2] for 5343660 kmers; bits/key = 9.00007 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3076413 kmers; bits/key = 3.34298 - built positions[3] for 3076413 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... - built mphs[4] for 1855446 kmers; bits/key = 2.56022 - built positions[4] for 1855446 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... - built mphs[5] for 1008178 kmers; bits/key = 2.41829 - built positions[5] for 1008178 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 - building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... - built mphs[6] for 375770 kmers; bits/key = 2.42182 - built positions[6] for 375770 kmers; bits/key = 13.001 - lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 - building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... - built mphs[7] for 207510 kmers; bits/key = 2.42618 - built positions[7] for 207510 kmers; bits/key = 15.0018 -computing skew index took: 7.2995 [sec] -=== step 3: 'build sparse and skew index' 12.626 [sec] (5.03895 [ns/kmer]) -=== total_time 99.3069 [sec] (39.6328 [ns/kmer]) -total index size: 2716053216 [B] -- 2716.05 [MB] -SPACE BREAKDOWN: - mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 5.03015% - strings_offsets: 0.153147 [bits/kmer] -- 1.76606% - control_codewords: 5.0927 [bits/kmer] -- 58.7281% - mid_load_buckets: 0.516242 [bits/kmer] -- 5.95319% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 9.86726e-06% - strings: 2.24545 [bits/kmer] -- 25.8941% - skew_index: 0.227926 [bits/kmer] -- 2.6284% - weights: 5.87466e-07 [bits/kmer] -- 6.77454e-06% - -------------- - total: 8.67167 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1918% -buckets with 2 minimizer positions = 1.69205% -buckets with 3 minimizer positions = 0.442612% -buckets with 4 minimizer positions = 0.201662% -buckets with 5 minimizer positions = 0.114623% -buckets with 6 minimizer positions = 0.0734475% -buckets with 7 minimizer positions = 0.0506719% -buckets with 8 minimizer positions = 0.0368406% -buckets with 9 minimizer positions = 0.0280203% -buckets with 10 minimizer positions = 0.0218197% -buckets with 11 minimizer positions = 0.0175108% -buckets with 12 minimizer positions = 0.0142045% -buckets with 13 minimizer positions = 0.0116337% -buckets with 14 minimizer positions = 0.00980818% -buckets with 15 minimizer positions = 0.00832637% -buckets with 16 minimizer positions = 0.00717712% -max_bucket_size 22972 -2025-10-21 14:43:08: saving data structure to disk... -2025-10-21 14:43:12: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.4683 [sec] (4.69816 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.113.bin'... -=== step 1.2: 'computing minimizers tuples' 6.7069 [sec] (1.80384 [ns/kmer]) -=== step 1: 'parse file' 24.1754 [sec] (6.50203 [ns/kmer]) - == files to merge = 114 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.1: 'merging minimizers tuples' 52.4673 [sec] (14.1112 [ns/kmer]) -num_minimizers = 544808214 -num_minimizer_positions = 661139039 -num_super_kmers = 661139039 -building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 22.4277 [sec] (6.032 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 23.2325 [sec] (6.24844 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761050592819250875.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.4: 'merging minimizers tuples ' 38.2339 [sec] (10.2831 [ns/kmer]) -num_bits_per_offset = 33 -num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) -num_buckets_in_skew_index 108291/544808214 (0.0198769%) -max_bucket_size 81171 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) -num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) -computing minimizers offsets: 11.0043 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 -num_kmers_in_skew_index 88257432 (2.37371%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28872109 kmers; bits/key = 2.53953 - built positions[0] for 28872109 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21161002 kmers; bits/key = 2.665 - built positions[1] for 21161002 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 14619521 kmers; bits/key = 2.58618 - built positions[2] for 14619521 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 8967010 kmers; bits/key = 2.51981 - built positions[3] for 8967010 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 5825185 kmers; bits/key = 2.55049 - built positions[4] for 5825185 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3889571 kmers; bits/key = 2.9515 - built positions[5] for 3889571 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... - built mphs[6] for 2412718 kmers; bits/key = 2.41709 - built positions[6] for 2412718 kmers; bits/key = 13.0002 - lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... - built mphs[7] for 2510316 kmers; bits/key = 2.55991 - built positions[7] for 2510316 kmers; bits/key = 17.0001 -computing skew index took: 15.7677 [sec] -=== step 3: 'build sparse and skew index' 27.8448 [sec] (7.48895 [ns/kmer]) -=== total_time 188.382 [sec] (50.6658 [ns/kmer]) -total index size: 4810783158 [B] -- 4810.78 [MB] -SPACE BREAKDOWN: - mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 4.01359% - strings_offsets: 0.300083 [bits/kmer] -- 2.89907% - control_codewords: 4.98195 [bits/kmer] -- 48.1301% - mid_load_buckets: 1.32295 [bits/kmer] -- 12.7809% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.57082e-06% - strings: 2.8909 [bits/kmer] -- 27.9287% - skew_index: 0.439676 [bits/kmer] -- 4.24766% - weights: 3.95899e-07 [bits/kmer] -- 3.82474e-06% - -------------- - total: 10.351 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 90.4966% -buckets with 2 minimizer positions = 7.33042% -buckets with 3 minimizer positions = 1.04104% -buckets with 4 minimizer positions = 0.358078% -buckets with 5 minimizer positions = 0.190444% -buckets with 6 minimizer positions = 0.119606% -buckets with 7 minimizer positions = 0.0815559% -buckets with 8 minimizer positions = 0.059031% -buckets with 9 minimizer positions = 0.0448457% -buckets with 10 minimizer positions = 0.0349758% -buckets with 11 minimizer positions = 0.0279273% -buckets with 12 minimizer positions = 0.022929% -buckets with 13 minimizer positions = 0.0189582% -buckets with 14 minimizer positions = 0.0159649% -buckets with 15 minimizer positions = 0.0135407% -buckets with 16 minimizer positions = 0.0117506% -max_bucket_size 81171 -2025-10-21 14:46:23: saving data structure to disk... -2025-10-21 14:46:31: DONE diff --git a/benchmarks/results-21-10-25/k63/canon-bench.log b/benchmarks/results-21-10-25/k63/canon-bench.log deleted file mode 100644 index 643fe6d..0000000 --- a/benchmarks/results-21-10-25/k63/canon-bench.log +++ /dev/null @@ -1,60 +0,0 @@ -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 631.809 -avg_nanosec_per_negative_lookup 459.727 -avg_nanosec_per_access 306.545 -iterator: avg_nanosec_per_kmer 2.79586 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 634.897 -avg_nanosec_per_negative_lookup 478.023 -avg_nanosec_per_access 300.399 -iterator: avg_nanosec_per_kmer 2.78933 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 621.437 -avg_nanosec_per_negative_lookup 476.323 -avg_nanosec_per_access 295.998 -iterator: avg_nanosec_per_kmer 2.8806 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 547.037 -avg_nanosec_per_negative_lookup 499.846 -avg_nanosec_per_access 332.06 -iterator: avg_nanosec_per_kmer 2.80736 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 561.943 -avg_nanosec_per_negative_lookup 507.71 -avg_nanosec_per_access 333.119 -iterator: avg_nanosec_per_kmer 2.84461 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 579.655 -avg_nanosec_per_negative_lookup 490.51 -avg_nanosec_per_access 337.485 -iterator: avg_nanosec_per_kmer 2.8116 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 735.346 -avg_nanosec_per_negative_lookup 530.724 -avg_nanosec_per_access 374.906 -iterator: avg_nanosec_per_kmer 2.84612 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 735.027 -avg_nanosec_per_negative_lookup 537.467 -avg_nanosec_per_access 358.872 -iterator: avg_nanosec_per_kmer 2.82918 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 734.37 -avg_nanosec_per_negative_lookup 538.679 -avg_nanosec_per_access 363.887 -iterator: avg_nanosec_per_kmer 2.81595 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1240.37 -avg_nanosec_per_negative_lookup 600.328 -avg_nanosec_per_access 681.789 -iterator: avg_nanosec_per_kmer 2.90587 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1242.4 -avg_nanosec_per_negative_lookup 592.073 -avg_nanosec_per_access 675.422 -iterator: avg_nanosec_per_kmer 2.89704 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1249.58 -avg_nanosec_per_negative_lookup 617.213 -avg_nanosec_per_access 672.296 -iterator: avg_nanosec_per_kmer 2.89418 diff --git a/benchmarks/results-21-10-25/k63/canon-build.log b/benchmarks/results-21-10-25/k63/canon-build.log deleted file mode 100644 index 21ba48b..0000000 --- a/benchmarks/results-21-10-25/k63/canon-build.log +++ /dev/null @@ -1,1358 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash -k = 63, m = 23, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.49378 [sec] (2.68383 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.432659 [sec] (0.777345 [ns/kmer]) -=== step 1: 'parse file' 1.92653 [sec] (3.46133 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.51493 [sec] (4.51849 [ns/kmer]) -num_minimizers = 28491340 -num_minimizer_positions = 33953502 -num_super_kmers = 35654865 -building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.5921 [sec] (2.86047 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051518311224487.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.39365 [sec] (2.50392 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.50184 [sec] (2.69831 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 1198247/28491340 (4.20565%) -num_buckets_in_skew_index 5423/28491340 (0.0190339%) -max_bucket_size 883901 -log2_max_bucket_size 20 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 4734136/33953502 (13.943%) -num_minimizer_positions_of_buckets_in_skew_index 1931696/33953502 (5.68924%) -computing minimizers offsets: 0.501097 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5318600 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3430041 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2141998 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1598076 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 923867 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1202937 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 584748 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 883901: 4875198 -num_kmers_in_skew_index 20075465 (3.6069%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5318600 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 5318600 kmers; bits/key = 2.6732 - built positions[0] for 5318600 kmers; bits/key = 7.00006 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3430041 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3430041 kmers; bits/key = 3.16615 - built positions[1] for 3430041 kmers; bits/key = 8.00011 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2141998 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2141998)... - built mphs[2] for 2141998 kmers; bits/key = 2.56004 - built positions[2] for 2141998 kmers; bits/key = 9.00017 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1598076 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1598076)... - built mphs[3] for 1598076 kmers; bits/key = 2.56044 - built positions[3] for 1598076 kmers; bits/key = 10.0002 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 923867 - building MPHF with 64 threads and 1 partitions (avg. partition size = 923867)... - built mphs[4] for 923867 kmers; bits/key = 2.41848 - built positions[4] for 923867 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1202937 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1202937)... - built mphs[5] for 1202937 kmers; bits/key = 2.41798 - built positions[5] for 1202937 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 584748 - building MPHF with 64 threads and 1 partitions (avg. partition size = 584748)... - built mphs[6] for 584748 kmers; bits/key = 2.41989 - built positions[6] for 584748 kmers; bits/key = 13.0006 - lower = 8192; upper = 883901; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 4875198 kmers; bits/key = 2.70264 - built positions[7] for 4875198 kmers; bits/key = 20.0001 -computing skew index took: 6.24053 [sec] -=== step 3: 'build sparse and skew index' 6.78871 [sec] (12.1971 [ns/kmer]) -=== total_time 15.7178 [sec] (28.2396 [ns/kmer]) -total index size: 343387376 [B] -- 343.387 [MB] -SPACE BREAKDOWN: - mphf: 0.150698 [bits/kmer] (2.94393 [bits/key]) -- 3.05328% - strings_offsets: 0.115799 [bits/kmer] -- 2.34618% - control_codewords: 1.58688 [bits/kmer] -- 32.1514% - mid_load_buckets: 0.255171 [bits/kmer] -- 5.16998% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.8046e-05% - strings: 2.21266 [bits/kmer] -- 44.8304% - skew_index: 0.614414 [bits/kmer] -- 12.4485% - weights: 2.6447e-06 [bits/kmer] -- 5.35838e-05% - -------------- - total: 4.93563 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.7753% -buckets with 2 minimizer positions = 2.3214% -buckets with 3 minimizer positions = 0.763049% -buckets with 4 minimizer positions = 0.352742% -buckets with 5 minimizer positions = 0.198513% -buckets with 6 minimizer positions = 0.123876% -buckets with 7 minimizer positions = 0.0836956% -buckets with 8 minimizer positions = 0.0605798% -buckets with 9 minimizer positions = 0.0453261% -buckets with 10 minimizer positions = 0.0344771% -buckets with 11 minimizer positions = 0.0273838% -buckets with 12 minimizer positions = 0.0223928% -buckets with 13 minimizer positions = 0.0183845% -buckets with 14 minimizer positions = 0.0152924% -buckets with 15 minimizer positions = 0.0128916% -buckets with 16 minimizer positions = 0.011242% -max_bucket_size 883901 -2025-10-21 14:58:54: saving data structure to disk... -2025-10-21 14:58:54: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 23 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash -k = 63, m = 23, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.67734 [sec] (2.31754 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.690769 [sec] (0.597939 [ns/kmer]) -=== step 1: 'parse file' 3.36823 [sec] (2.91558 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.01886 [sec] (4.34439 [ns/kmer]) -num_minimizers = 67109831 -num_minimizer_positions = 67975722 -num_super_kmers = 71738384 -building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.95231 [sec] (2.55556 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051534413588756.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.68431 [sec] (2.32358 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.51591 [sec] (1.31219 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 321065/67109831 (0.478417%) -num_buckets_in_skew_index 884/67109831 (0.00131724%) -max_bucket_size 2827 -log2_max_bucket_size 12 -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 1059674/67975722 (1.5589%) -num_minimizer_positions_of_buckets_in_skew_index 128166/67975722 (0.188547%) -computing minimizers offsets: 0.56221 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 928806 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 663068 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 440012 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2827: 40401 -num_kmers_in_skew_index 2302526 (0.19931%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 928806 - building MPHF with 64 threads and 1 partitions (avg. partition size = 928806)... - built mphs[0] for 928806 kmers; bits/key = 2.56131 - built positions[0] for 928806 kmers; bits/key = 7.0004 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 663068 - building MPHF with 64 threads and 1 partitions (avg. partition size = 663068)... - built mphs[1] for 663068 kmers; bits/key = 2.56222 - built positions[1] for 663068 kmers; bits/key = 8.00053 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 440012 - building MPHF with 64 threads and 1 partitions (avg. partition size = 440012)... - built mphs[2] for 440012 kmers; bits/key = 2.4211 - built positions[2] for 440012 kmers; bits/key = 9.00077 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 - building MPHF with 64 threads and 1 partitions (avg. partition size = 209599)... - built mphs[3] for 209599 kmers; bits/key = 2.42681 - built positions[3] for 209599 kmers; bits/key = 10.0016 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 - building MPHF with 64 threads and 1 partitions (avg. partition size = 20640)... - built mphs[4] for 20640 kmers; bits/key = 2.51938 - built positions[4] for 20640 kmers; bits/key = 11.0171 - lower = 2048; upper = 2827; num_bits_per_pos = 12; num_kmers_in_partition = 40401 - building MPHF with 64 threads and 1 partitions (avg. partition size = 40401)... - built mphs[5] for 40401 kmers; bits/key = 2.46845 - built positions[5] for 40401 kmers; bits/key = 12.0092 -computing skew index took: 1.33443 [sec] -=== step 3: 'build sparse and skew index' 1.9801 [sec] (1.714 [ns/kmer]) -=== total_time 17.5197 [sec] (15.1653 [ns/kmer]) -total index size: 605351935 [B] -- 605.352 [MB] -SPACE BREAKDOWN: - mphf: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 3.99712% - strings_offsets: 0.0958241 [bits/kmer] -- 2.28588% - control_codewords: 1.85892 [bits/kmer] -- 44.3443% - mid_load_buckets: 0.0284356 [bits/kmer] -- 0.678329% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.42718e-05% - strings: 2.01672 [bits/kmer] -- 48.1088% - skew_index: 0.0245431 [bits/kmer] -- 0.585475% - weights: 1.27418e-06 [bits/kmer] -- 3.03955e-05% - -------------- - total: 4.192 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5203% -buckets with 2 minimizer positions = 0.325687% -buckets with 3 minimizer positions = 0.0664463% -buckets with 4 minimizer positions = 0.0280764% -buckets with 5 minimizer positions = 0.0153182% -buckets with 6 minimizer positions = 0.00938015% -buckets with 7 minimizer positions = 0.0064387% -buckets with 8 minimizer positions = 0.00455075% -buckets with 9 minimizer positions = 0.00351215% -buckets with 10 minimizer positions = 0.002557% -buckets with 11 minimizer positions = 0.00203398% -buckets with 12 minimizer positions = 0.00170765% -buckets with 13 minimizer positions = 0.00146178% -buckets with 14 minimizer positions = 0.0011727% -buckets with 15 minimizer positions = 0.000971542% -buckets with 16 minimizer positions = 0.000882136% -max_bucket_size 2827 -2025-10-21 14:59:12: saving data structure to disk... -2025-10-21 14:59:12: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 7.03029 [sec] (2.5368 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.5595 [sec] (0.56273 [ns/kmer]) -=== step 1: 'parse file' 8.58989 [sec] (3.09957 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.0868 [sec] (4.36138 [ns/kmer]) -num_minimizers = 143958008 -num_minimizer_positions = 168149002 -num_super_kmers = 177039547 -building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.1304 [sec] (2.21209 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051552624720127.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.44138 [sec] (2.32431 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 4.52086 [sec] (1.6313 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 4129918/143958008 (2.86884%) -num_buckets_in_skew_index 37666/143958008 (0.0261646%) -max_bucket_size 95733 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 16748054/168149002 (9.96025%) -num_minimizer_positions_of_buckets_in_skew_index 11610524/168149002 (6.9049%) -computing minimizers offsets: 2.11228 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28852944 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26454379 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23917963 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20620416 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19906671 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18190089 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13420307 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95733: 26873605 -num_kmers_in_skew_index 178236374 (6.43147%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28852944 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28852944 kmers; bits/key = 2.52607 - built positions[0] for 28852944 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26454379 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26454379 kmers; bits/key = 2.55531 - built positions[1] for 26454379 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23917963 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 23917963 kmers; bits/key = 2.56705 - built positions[2] for 23917963 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20620416 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 20620416 kmers; bits/key = 2.55759 - built positions[3] for 20620416 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19906671 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[4] for 19906671 kmers; bits/key = 2.54825 - built positions[4] for 19906671 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18190089 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[5] for 18190089 kmers; bits/key = 2.65521 - built positions[5] for 18190089 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13420307 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[6] for 13420307 kmers; bits/key = 2.65235 - built positions[6] for 13420307 kmers; bits/key = 13 - lower = 8192; upper = 95733; num_bits_per_pos = 17; num_kmers_in_partition = 26873605 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[7] for 26873605 kmers; bits/key = 2.56978 - built positions[7] for 26873605 kmers; bits/key = 17 -computing skew index took: 24.5205 [sec] -=== step 3: 'build sparse and skew index' 26.8782 [sec] (9.69871 [ns/kmer]) -=== total_time 64.6475 [sec] (23.3274 [ns/kmer]) -total index size: 1825988568 [B] -- 1825.99 [MB] -SPACE BREAKDOWN: - mphf: 0.146358 [bits/kmer] (2.81751 [bits/key]) -- 2.7766% - strings_offsets: 0.11255 [bits/kmer] -- 2.13523% - control_codewords: 1.71421 [bits/kmer] -- 32.5208% - mid_load_buckets: 0.193388 [bits/kmer] -- 3.66882% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.4677e-05% - strings: 2.11826 [bits/kmer] -- 40.1861% - skew_index: 0.986348 [bits/kmer] -- 18.7123% - weights: 5.31156e-07 [bits/kmer] -- 1.00767e-05% - -------------- - total: 5.27111 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.105% -buckets with 2 minimizer positions = 1.67628% -buckets with 3 minimizer positions = 0.468323% -buckets with 4 minimizer positions = 0.210326% -buckets with 5 minimizer positions = 0.119884% -buckets with 6 minimizer positions = 0.0768592% -buckets with 7 minimizer positions = 0.0534996% -buckets with 8 minimizer positions = 0.0389544% -buckets with 9 minimizer positions = 0.0301845% -buckets with 10 minimizer positions = 0.0236083% -buckets with 11 minimizer positions = 0.0192897% -buckets with 12 minimizer positions = 0.015772% -buckets with 13 minimizer positions = 0.0133018% -buckets with 14 minimizer positions = 0.0114506% -buckets with 15 minimizer positions = 0.00978341% -buckets with 16 minimizer positions = 0.0086164% -max_bucket_size 95733 -2025-10-21 15:00:17: saving data structure to disk... -2025-10-21 15:00:18: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.7736 [sec] (4.68612 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.84.bin'... -=== step 1.2: 'computing minimizers tuples' 10.4057 [sec] (1.75571 [ns/kmer]) -=== step 1: 'parse file' 38.1794 [sec] (6.44185 [ns/kmer]) - == files to merge = 85 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 31.571 [sec] (5.32683 [ns/kmer]) -num_minimizers = 214434189 -num_minimizer_positions = 412025173 -num_super_kmers = 429075029 -building minimizers MPHF with 64 threads and 72 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 9.65249 [sec] (1.62862 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051618995830037.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.1801 [sec] (2.39254 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 10.5451 [sec] (1.77922 [ns/kmer]) -num_bits_per_offset = 34 -num_buckets_larger_than_1_not_in_skew_index 66836768/214434189 (31.1689%) -num_buckets_in_skew_index 177364/214434189 (0.0827126%) -max_bucket_size 826761 -log2_max_bucket_size 20 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 197768423/412025173 (47.9991%) -num_minimizer_positions_of_buckets_in_skew_index 66836693/412025173 (16.2215%) -computing minimizers offsets: 11.899 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 112523772 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 106762115 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 99828516 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 95194090 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 85601489 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 82825801 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 70302719 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 826761: 218656277 -num_kmers_in_skew_index 871694779 (14.7077%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 112523772 - building MPHF with 64 threads and 38 partitions (avg. partition size = 3000000)... - built mphs[0] for 112523772 kmers; bits/key = 2.55734 - built positions[0] for 112523772 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 106762115 - building MPHF with 64 threads and 36 partitions (avg. partition size = 3000000)... - built mphs[1] for 106762115 kmers; bits/key = 2.54037 - built positions[1] for 106762115 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 99828516 - building MPHF with 64 threads and 34 partitions (avg. partition size = 3000000)... - built mphs[2] for 99828516 kmers; bits/key = 2.54621 - built positions[2] for 99828516 kmers; bits/key = 9 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 95194090 - building MPHF with 64 threads and 32 partitions (avg. partition size = 3000000)... - built mphs[3] for 95194090 kmers; bits/key = 2.54182 - built positions[3] for 95194090 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 85601489 - building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... - built mphs[4] for 85601489 kmers; bits/key = 2.55966 - built positions[4] for 85601489 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 82825801 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[5] for 82825801 kmers; bits/key = 2.55903 - built positions[5] for 82825801 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 70302719 - building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... - built mphs[6] for 70302719 kmers; bits/key = 2.53828 - built positions[6] for 70302719 kmers; bits/key = 13 - lower = 8192; upper = 826761; num_bits_per_pos = 20; num_kmers_in_partition = 218656277 - building MPHF with 64 threads and 73 partitions (avg. partition size = 3000000)... - built mphs[7] for 218656277 kmers; bits/key = 2.55521 - built positions[7] for 218656277 kmers; bits/key = 20 -computing skew index took: 132.665 [sec] -=== step 3: 'build sparse and skew index' 145.398 [sec] (24.5324 [ns/kmer]) -=== total_time 249.526 [sec] (42.1014 [ns/kmer]) -total index size: 6363775476 [B] -- 6363.78 [MB] -SPACE BREAKDOWN: - mphf: 0.102649 [bits/kmer] (2.83714 [bits/key]) -- 1.195% - strings_offsets: 0.273643 [bits/kmer] -- 3.18565% - control_codewords: 1.26632 [bits/kmer] -- 14.742% - mid_load_buckets: 1.13453 [bits/kmer] -- 13.2078% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.21134e-06% - strings: 3.2463 [bits/kmer] -- 37.7923% - skew_index: 2.56641 [bits/kmer] -- 29.8772% - weights: 2.48364e-07 [bits/kmer] -- 2.89137e-06% - -------------- - total: 8.58985 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 68.7484% -buckets with 2 minimizer positions = 20.1778% -buckets with 3 minimizer positions = 6.4974% -buckets with 4 minimizer positions = 2.0858% -buckets with 5 minimizer positions = 0.794975% -buckets with 6 minimizer positions = 0.393712% -buckets with 7 minimizer positions = 0.24135% -buckets with 8 minimizer positions = 0.166445% -buckets with 9 minimizer positions = 0.122788% -buckets with 10 minimizer positions = 0.0940265% -buckets with 11 minimizer positions = 0.0750543% -buckets with 12 minimizer positions = 0.0603994% -buckets with 13 minimizer positions = 0.0499459% -buckets with 14 minimizer positions = 0.0416757% -buckets with 15 minimizer positions = 0.0353955% -buckets with 16 minimizer positions = 0.0305488% -max_bucket_size 826761 -2025-10-21 15:04:29: saving data structure to disk... -2025-10-21 15:04:33: DONE diff --git a/benchmarks/results-21-10-25/k63/regular-bench.log b/benchmarks/results-21-10-25/k63/regular-bench.log deleted file mode 100644 index ef9c0d1..0000000 --- a/benchmarks/results-21-10-25/k63/regular-bench.log +++ /dev/null @@ -1,60 +0,0 @@ -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 769.798 -avg_nanosec_per_negative_lookup 750.216 -avg_nanosec_per_access 295.061 -iterator: avg_nanosec_per_kmer 2.91164 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 760.167 -avg_nanosec_per_negative_lookup 746.572 -avg_nanosec_per_access 296.021 -iterator: avg_nanosec_per_kmer 2.79237 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 757.86 -avg_nanosec_per_negative_lookup 745.3 -avg_nanosec_per_access 310.214 -iterator: avg_nanosec_per_kmer 2.78571 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 706.44 -avg_nanosec_per_negative_lookup 812.075 -avg_nanosec_per_access 339.81 -iterator: avg_nanosec_per_kmer 2.78666 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 702.187 -avg_nanosec_per_negative_lookup 825.28 -avg_nanosec_per_access 341.688 -iterator: avg_nanosec_per_kmer 2.78945 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 689.162 -avg_nanosec_per_negative_lookup 814.183 -avg_nanosec_per_access 337.107 -iterator: avg_nanosec_per_kmer 2.7933 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 940.952 -avg_nanosec_per_negative_lookup 903.069 -avg_nanosec_per_access 375.989 -iterator: avg_nanosec_per_kmer 2.81406 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 947.225 -avg_nanosec_per_negative_lookup 896.248 -avg_nanosec_per_access 369.196 -iterator: avg_nanosec_per_kmer 2.81377 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 936.429 -avg_nanosec_per_negative_lookup 889.431 -avg_nanosec_per_access 362.546 -iterator: avg_nanosec_per_kmer 2.82993 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1511.05 -avg_nanosec_per_negative_lookup 1030.67 -avg_nanosec_per_access 680.146 -iterator: avg_nanosec_per_kmer 2.90132 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1525.74 -avg_nanosec_per_negative_lookup 1046.12 -avg_nanosec_per_access 670.539 -iterator: avg_nanosec_per_kmer 2.91647 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1552.93 -avg_nanosec_per_negative_lookup 1148.84 -avg_nanosec_per_access 684.755 -iterator: avg_nanosec_per_kmer 2.89824 diff --git a/benchmarks/results-21-10-25/k63/regular-build.log b/benchmarks/results-21-10-25/k63/regular-build.log deleted file mode 100644 index b0a92aa..0000000 --- a/benchmarks/results-21-10-25/k63/regular-build.log +++ /dev/null @@ -1,1339 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.55137 [sec] (2.78729 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.351973 [sec] (0.632379 [ns/kmer]) -=== step 1: 'parse file' 1.91926 [sec] (3.44828 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.03731 [sec] (3.66038 [ns/kmer]) -num_minimizers = 24306363 -num_minimizer_positions = 28148872 -num_super_kmers = 28148872 -building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.34348 [sec] (2.41379 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051229117226260.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.0756 [sec] (1.9325 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.607938 [sec] (1.09226 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) -num_buckets_in_skew_index 3271/24306363 (0.0134574%) -max_bucket_size 414759 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) -num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) -computing minimizers offsets: 0.372545 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 -num_kmers_in_skew_index 14306719 (2.57044%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3558021 kmers; bits/key = 3.06724 - built positions[0] for 3558021 kmers; bits/key = 7.0001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... - built mphs[1] for 2129998 kmers; bits/key = 2.56007 - built positions[1] for 2129998 kmers; bits/key = 8.00016 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... - built mphs[2] for 1247229 kmers; bits/key = 2.56071 - built positions[2] for 1247229 kmers; bits/key = 9.00028 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... - built mphs[3] for 1130328 kmers; bits/key = 2.56088 - built positions[3] for 1130328 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... - built mphs[4] for 1022110 kmers; bits/key = 2.41826 - built positions[4] for 1022110 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 - building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... - built mphs[5] for 790746 kmers; bits/key = 2.4189 - built positions[5] for 790746 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 - building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... - built mphs[6] for 666283 kmers; bits/key = 2.5622 - built positions[6] for 666283 kmers; bits/key = 13.0005 - lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 3762004 kmers; bits/key = 2.9235 - built positions[7] for 3762004 kmers; bits/key = 19.0001 -computing skew index took: 4.88703 [sec] -=== step 3: 'build sparse and skew index' 5.29821 [sec] (9.51912 [ns/kmer]) -=== total_time 12.2818 [sec] (22.0663 [ns/kmer]) -total index size: 308878208 [B] -- 308.878 [MB] -SPACE BREAKDOWN: - mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.93534% - strings_offsets: 0.115799 [bits/kmer] -- 2.6083% - control_codewords: 1.35379 [bits/kmer] -- 30.4933% - mid_load_buckets: 0.196907 [bits/kmer] -- 4.43522% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.67656e-05% - strings: 2.21266 [bits/kmer] -- 49.8391% - skew_index: 0.430136 [bits/kmer] -- 9.68858% - weights: 2.6447e-06 [bits/kmer] -- 5.95704e-05% - -------------- - total: 4.43961 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.0459% -buckets with 2 minimizer positions = 2.25565% -buckets with 3 minimizer positions = 0.699874% -buckets with 4 minimizer positions = 0.315284% -buckets with 5 minimizer positions = 0.173597% -buckets with 6 minimizer positions = 0.108305% -buckets with 7 minimizer positions = 0.0716932% -buckets with 8 minimizer positions = 0.0520522% -buckets with 9 minimizer positions = 0.0388458% -buckets with 10 minimizer positions = 0.0301485% -buckets with 11 minimizer positions = 0.0240019% -buckets with 12 minimizer positions = 0.0204144% -buckets with 13 minimizer positions = 0.0165265% -buckets with 14 minimizer positions = 0.013984% -buckets with 15 minimizer positions = 0.0120051% -buckets with 16 minimizer positions = 0.00972996% -max_bucket_size 414759 -2025-10-21 14:54:01: saving data structure to disk... -2025-10-21 14:54:01: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.94493 [sec] (2.54917 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.529738 [sec] (0.458548 [ns/kmer]) -=== step 1: 'parse file' 3.51638 [sec] (3.04383 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 3.99632 [sec] (3.45927 [ns/kmer]) -num_minimizers = 55464592 -num_minimizer_positions = 56006004 -num_super_kmers = 56006004 -building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.56062 [sec] (2.2165 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051241732396776.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.1358 [sec] (1.84877 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.20158 [sec] (1.0401 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) -num_buckets_in_skew_index 490/55464592 (0.000883447%) -max_bucket_size 794 -log2_max_bucket_size 10 -skew index num_partitions 4 -num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) -num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) -computing minimizers offsets: 0.416387 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 -num_kmers_in_skew_index 1294137 (0.112022%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 - building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... - built mphs[0] for 604884 kmers; bits/key = 2.41964 - built positions[0] for 604884 kmers; bits/key = 7.00061 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 - building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... - built mphs[1] for 417805 kmers; bits/key = 2.42142 - built positions[1] for 417805 kmers; bits/key = 8.00082 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 - building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... - built mphs[2] for 221219 kmers; bits/key = 2.42569 - built positions[2] for 221219 kmers; bits/key = 9.00147 - lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... - built mphs[3] for 50229 kmers; bits/key = 2.45946 - built positions[3] for 50229 kmers; bits/key = 10.0073 -computing skew index took: 0.738825 [sec] -=== step 3: 'build sparse and skew index' 1.22735 [sec] (1.06241 [ns/kmer]) -=== total_time 14.638 [sec] (12.6709 [ns/kmer]) -total index size: 551471055 [B] -- 551.471 [MB] -SPACE BREAKDOWN: - mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.62484% - strings_offsets: 0.0958241 [bits/kmer] -- 2.50922% - control_codewords: 1.53635 [bits/kmer] -- 40.2303% - mid_load_buckets: 0.0184383 [bits/kmer] -- 0.482819% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.85973e-05% - strings: 2.01672 [bits/kmer] -- 52.8092% - skew_index: 0.0131204 [bits/kmer] -- 0.343567% - weights: 1.27418e-06 [bits/kmer] -- 3.33653e-05% - -------------- - total: 3.81888 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.6239% -buckets with 2 minimizer positions = 0.253291% -buckets with 3 minimizer positions = 0.0530717% -buckets with 4 minimizer positions = 0.0227569% -buckets with 5 minimizer positions = 0.012325% -buckets with 6 minimizer positions = 0.00748405% -buckets with 7 minimizer positions = 0.00509695% -buckets with 8 minimizer positions = 0.00359148% -buckets with 9 minimizer positions = 0.00270803% -buckets with 10 minimizer positions = 0.0021383% -buckets with 11 minimizer positions = 0.00159201% -buckets with 12 minimizer positions = 0.00125666% -buckets with 13 minimizer positions = 0.00109619% -buckets with 14 minimizer positions = 0.000941141% -buckets with 15 minimizer positions = 0.000795102% -buckets with 16 minimizer positions = 0.000685122% -max_bucket_size 794 -2025-10-21 14:54:16: saving data structure to disk... -2025-10-21 14:54:16: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 8.09582 [sec] (2.92129 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.12861 [sec] (0.407246 [ns/kmer]) -=== step 1: 'parse file' 9.23531 [sec] (3.33246 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 9.86942 [sec] (3.56127 [ns/kmer]) -num_minimizers = 122838669 -num_minimizer_positions = 140756047 -num_super_kmers = 140756047 -building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.05366 [sec] (1.82356 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051256920728827.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.16079 [sec] (1.86222 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.65627 [sec] (1.31933 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) -num_buckets_in_skew_index 28203/122838669 (0.0229594%) -max_bucket_size 147936 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) -num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) -computing minimizers offsets: 1.59397 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 -num_kmers_in_skew_index 145458128 (5.2487%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 25196923 kmers; bits/key = 2.56001 - built positions[0] for 25196923 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21919654 kmers; bits/key = 2.60671 - built positions[1] for 21919654 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19634878 kmers; bits/key = 2.55594 - built positions[2] for 19634878 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 18051454 kmers; bits/key = 2.60116 - built positions[3] for 18051454 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17018125 kmers; bits/key = 2.58264 - built positions[4] for 17018125 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 14085569 kmers; bits/key = 2.54674 - built positions[5] for 14085569 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[6] for 9296403 kmers; bits/key = 2.72206 - built positions[6] for 9296403 kmers; bits/key = 13 - lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[7] for 20255122 kmers; bits/key = 2.57505 - built positions[7] for 20255122 kmers; bits/key = 18 -computing skew index took: 17.8792 [sec] -=== step 3: 'build sparse and skew index' 19.6673 [sec] (7.09673 [ns/kmer]) -=== total_time 52.6427 [sec] (18.9956 [ns/kmer]) -total index size: 1647878152 [B] -- 1647.88 [MB] -SPACE BREAKDOWN: - mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.63218% - strings_offsets: 0.11255 [bits/kmer] -- 2.36601% - control_codewords: 1.46273 [bits/kmer] -- 30.7492% - mid_load_buckets: 0.146928 [bits/kmer] -- 3.08869% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.62633e-05% - strings: 2.11826 [bits/kmer] -- 44.5296% - skew_index: 0.791283 [bits/kmer] -- 16.6342% - weights: 5.31156e-07 [bits/kmer] -- 1.11659e-05% - -------------- - total: 4.75695 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.4557% -buckets with 2 minimizer positions = 1.46862% -buckets with 3 minimizer positions = 0.405135% -buckets with 4 minimizer positions = 0.185188% -buckets with 5 minimizer positions = 0.10523% -buckets with 6 minimizer positions = 0.0680771% -buckets with 7 minimizer positions = 0.0480598% -buckets with 8 minimizer positions = 0.0352926% -buckets with 9 minimizer positions = 0.0271502% -buckets with 10 minimizer positions = 0.0217871% -buckets with 11 minimizer positions = 0.0176866% -buckets with 12 minimizer positions = 0.014607% -buckets with 13 minimizer positions = 0.0121411% -buckets with 14 minimizer positions = 0.0105985% -buckets with 15 minimizer positions = 0.00909811% -buckets with 16 minimizer positions = 0.00794457% -max_bucket_size 147936 -2025-10-21 14:55:10: saving data structure to disk... -2025-10-21 14:55:10: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.7607 [sec] (4.68394 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.77.bin'... -=== step 1.2: 'computing minimizers tuples' 6.30247 [sec] (1.06339 [ns/kmer]) -=== step 1: 'parse file' 34.0633 [sec] (5.74734 [ns/kmer]) - == files to merge = 78 -saving tuples to 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -=== step 2.1: 'merging minimizers tuples' 25.733 [sec] (4.34182 [ns/kmer]) -num_minimizers = 213541130 -num_minimizer_positions = 352863220 -num_super_kmers = 352863220 -building minimizers MPHF with 64 threads and 72 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 9.45393 [sec] (1.59512 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761051311159724395.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 12.1472 [sec] (2.04955 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 7.89336 [sec] (1.33181 [ns/kmer]) -num_bits_per_offset = 34 -num_buckets_larger_than_1_not_in_skew_index 46977519/213541130 (21.9993%) -num_buckets_in_skew_index 144818/213541130 (0.0678174%) -max_bucket_size 1007380 -log2_max_bucket_size 20 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 135755886/352863220 (38.4727%) -num_minimizer_positions_of_buckets_in_skew_index 50688541/352863220 (14.3649%) -computing minimizers offsets: 8.5109 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 104047212 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 96849105 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 91470632 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 82637027 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 76747174 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 64811875 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 52461784 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 1007380: 169863610 -num_kmers_in_skew_index 738888419 (12.4669%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 104047212 - building MPHF with 64 threads and 35 partitions (avg. partition size = 3000000)... - built mphs[0] for 104047212 kmers; bits/key = 2.5546 - built positions[0] for 104047212 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 96849105 - building MPHF with 64 threads and 33 partitions (avg. partition size = 3000000)... - built mphs[1] for 96849105 kmers; bits/key = 2.52764 - built positions[1] for 96849105 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 91470632 - building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... - built mphs[2] for 91470632 kmers; bits/key = 2.57678 - built positions[2] for 91470632 kmers; bits/key = 9 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 82637027 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[3] for 82637027 kmers; bits/key = 2.56911 - built positions[3] for 82637027 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 76747174 - building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... - built mphs[4] for 76747174 kmers; bits/key = 2.52767 - built positions[4] for 76747174 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 64811875 - building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... - built mphs[5] for 64811875 kmers; bits/key = 2.55269 - built positions[5] for 64811875 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 52461784 - building MPHF with 64 threads and 18 partitions (avg. partition size = 3000000)... - built mphs[6] for 52461784 kmers; bits/key = 2.51634 - built positions[6] for 52461784 kmers; bits/key = 13 - lower = 8192; upper = 1007380; num_bits_per_pos = 20; num_kmers_in_partition = 169863610 - building MPHF with 64 threads and 57 partitions (avg. partition size = 3000000)... - built mphs[7] for 169863610 kmers; bits/key = 2.5614 - built positions[7] for 169863610 kmers; bits/key = 20 -computing skew index took: 103.968 [sec] -=== step 3: 'build sparse and skew index' 113.129 [sec] (19.0878 [ns/kmer]) -=== total_time 202.42 [sec] (34.1534 [ns/kmer]) -total index size: 5752839438 [B] -- 5752.84 [MB] -SPACE BREAKDOWN: - mphf: 0.102688 [bits/kmer] (2.85007 [bits/key]) -- 1.32241% - strings_offsets: 0.273643 [bits/kmer] -- 3.52396% - control_codewords: 1.26104 [bits/kmer] -- 16.2397% - mid_load_buckets: 0.778786 [bits/kmer] -- 10.0292% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.65857e-06% - strings: 3.2463 [bits/kmer] -- 41.8057% - skew_index: 2.10274 [bits/kmer] -- 27.0791% - weights: 2.48364e-07 [bits/kmer] -- 3.19842e-06% - -------------- - total: 7.76521 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 77.9329% -buckets with 2 minimizer positions = 15.8251% -buckets with 3 minimizer positions = 3.56019% -buckets with 4 minimizer positions = 1.02035% -buckets with 5 minimizer positions = 0.441893% -buckets with 6 minimizer positions = 0.254278% -buckets with 7 minimizer positions = 0.167918% -buckets with 8 minimizer positions = 0.119343% -buckets with 9 minimizer positions = 0.0889281% -buckets with 10 minimizer positions = 0.0689127% -buckets with 11 minimizer positions = 0.0548967% -buckets with 12 minimizer positions = 0.0444776% -buckets with 13 minimizer positions = 0.0366801% -buckets with 14 minimizer positions = 0.0309748% -buckets with 15 minimizer positions = 0.0263528% -buckets with 16 minimizer positions = 0.0226486% -max_bucket_size 1007380 -2025-10-21 14:58:34: saving data structure to disk... -2025-10-21 14:58:37: DONE diff --git a/benchmarks/results-22-08-25/k31/22-08-25.canon.bench_log b/benchmarks/results-22-08-25/k31/22-08-25.canon.bench_log deleted file mode 100644 index 43d8ede..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.canon.bench_log +++ /dev/null @@ -1,18 +0,0 @@ -avg_nanosec_per_positive_lookup 851.547 -avg_nanosec_per_negative_lookup 546.268 -avg_nanosec_per_positive_lookup_advanced 832.321 -avg_nanosec_per_negative_lookup_advanced 546.19 -avg_nanosec_per_access 438.159 -iterator: avg_nanosec_per_kmer 19.9811 -avg_nanosec_per_positive_lookup 825.457 -avg_nanosec_per_negative_lookup 618.156 -avg_nanosec_per_positive_lookup_advanced 806.324 -avg_nanosec_per_negative_lookup_advanced 617.424 -avg_nanosec_per_access 367.28 -iterator: avg_nanosec_per_kmer 19.8861 -avg_nanosec_per_positive_lookup 1150.02 -avg_nanosec_per_negative_lookup 678.759 -avg_nanosec_per_positive_lookup_advanced 1122.07 -avg_nanosec_per_negative_lookup_advanced 678.793 -avg_nanosec_per_access 617.36 -iterator: avg_nanosec_per_kmer 20.0176 diff --git a/benchmarks/results-22-08-25/k31/22-08-25.canon.build_log b/benchmarks/results-22-08-25/k31/22-08-25.canon.build_log deleted file mode 100644 index 01ee042..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.canon.build_log +++ /dev/null @@ -1,519 +0,0 @@ -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding_input' 2.8923 [sec] (5.75621 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 3.93549 [sec] (7.83236 [ns/kmer]) -=== step 1: 'parse_file' 6.82794 [sec] (13.5889 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.bin' -num_super_kmers = 50000000 -num_minimizers = 79497428 -num_minimizer_positions = 88981380 -num_super_kmers = 92581339 -building minimizers MPHF with 8 threads and 27 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 10.2729 [sec] (20.445 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 4.93769 [sec] (9.82693 [ns/kmer]) -bits_per_offset = ceil(log2(574653302)) = 30 -reading from 'tmp_dir/sshash.tmp.run_1755868267671453525.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868289780971210.bucket_pairs.0.bin'... -num_singletons 76295418/79497428 (95.9722%) -building: 0.225122 [sec] -computing minimizers offsets: 0.220248 [sec] -encoding: 0.023241 [sec] -=== step 3: 'build_sparse_index' 0.915665 [sec] (1.82235 [ns/kmer]) -max_bucket_size 257522 -log2_max_bucket_size 18 -num_buckets_in_skew_index 7311/79497428 (0.00919652%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2248357 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1370324 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1150821 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 912964 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 540380 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 486826 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 257522: 1682941 -num_kmers_in_skew_index 8392613 (1.67029%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2248357 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2248357)... - built mphs[0] for 2248357 kmers; bits/key = 2.34415 - built positions[0] for 2248357 kmers; bits/key = 7.00017 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1370324 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1370324)... - built mphs[1] for 1370324 kmers; bits/key = 2.3762 - built positions[1] for 1370324 kmers; bits/key = 8.00026 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1150821 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1150821)... - built mphs[2] for 1150821 kmers; bits/key = 2.39401 - built positions[2] for 1150821 kmers; bits/key = 9.00032 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 912964 - building MPHF with 8 threads and 1 partitions (avg. partition size = 912964)... - built mphs[3] for 912964 kmers; bits/key = 2.37507 - built positions[3] for 912964 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 540380 - building MPHF with 8 threads and 1 partitions (avg. partition size = 540380)... - built mphs[4] for 540380 kmers; bits/key = 2.42893 - built positions[4] for 540380 kmers; bits/key = 11.0006 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 486826 - building MPHF with 8 threads and 1 partitions (avg. partition size = 486826)... - built mphs[5] for 486826 kmers; bits/key = 2.44339 - built positions[5] for 486826 kmers; bits/key = 12.0007 - lower = 4096; upper = 257522; num_bits_per_pos = 18; num_kmers_in_partition = 1682941 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1682941)... - built mphs[6] for 1682941 kmers; bits/key = 2.36554 - built positions[6] for 1682941 kmers; bits/key = 18.0002 -num_bits_for_skew_index 108203008(0.215344 [bits/kmer]) -=== step 4: 'build_skew_index' 10.9446 [sec] (21.7818 [ns/kmer]) -=== total_time 33.8988 [sec] (67.465 [ns/kmer]) -total index size: 537058306 [B] -- 537.058 [MB] -SPACE BREAKDOWN: - minimizers: 0.414084 [bits/kmer] (2.61723 [bits/key]) -- 4.84265% - pieces: 0.0549683 [bits/kmer] -- 0.642846% - sizes: 0.266349 [bits/kmer] -- 3.11491% - offsets: 5.31269 [bits/kmer] -- 62.1311% - strings: 2.28734 [bits/kmer] -- 26.75% - skew_index: 0.215344 [bits/kmer] -- 2.51842% - weights: 2.92956e-06 [bits/kmer] -- 3.42607e-05% - -------------- - total: 8.55077 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9722% -buckets with 2 minimizer positions = 2.50518% -buckets with 3 minimizer positions = 0.677682% -buckets with 4 minimizer positions = 0.290043% -buckets with 5 minimizer positions = 0.153082% -buckets with 6 minimizer positions = 0.0915476% -buckets with 7 minimizer positions = 0.0610259% -buckets with 8 minimizer positions = 0.0427511% -buckets with 9 minimizer positions = 0.0309167% -buckets with 10 minimizer positions = 0.0241329% -buckets with 11 minimizer positions = 0.0189478% -buckets with 12 minimizer positions = 0.0152961% -buckets with 13 minimizer positions = 0.0126696% -buckets with 14 minimizer positions = 0.0103953% -buckets with 15 minimizer positions = 0.0089223% -buckets with 16 minimizer positions = 0.00736124% -max_bucket_size 257522 -2025-08-22 15:11:41: saving data structure to disk... -2025-08-22 15:11:41: DONE -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding_input' 5.58902 [sec] (4.85833 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 8.64104 [sec] (7.51134 [ns/kmer]) -=== step 1: 'parse_file' 14.2302 [sec] (12.3697 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_minimizers = 194060478 -num_minimizer_positions = 200550710 -num_super_kmers = 209203487 -building minimizers MPHF with 8 threads and 65 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 23.852 [sec] (20.7336 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 17.9844 [sec] (15.6332 [ns/kmer]) -bits_per_offset = ceil(log2(1170866587)) = 31 -reading from 'tmp_dir/sshash.tmp.run_1755868301923422455.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868358305024462.bucket_pairs.0.bin'... -num_singletons 190204211/194060478 (98.0129%) -building: 0.522711 [sec] -computing minimizers offsets: 0.431731 [sec] -encoding: 0.006292 [sec] -=== step 3: 'build_sparse_index' 2.05202 [sec] (1.78374 [ns/kmer]) -max_bucket_size 4596 -log2_max_bucket_size 13 -num_buckets_in_skew_index 3610/194060478 (0.00186024%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1215283 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 758996 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 448292 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 299144 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 146091 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 69238 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 4596: 20320 -num_kmers_in_skew_index 2957364 (0.257073%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1215283 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1215283)... - built mphs[0] for 1215283 kmers; bits/key = 2.39053 - built positions[0] for 1215283 kmers; bits/key = 7.00029 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 758996 - building MPHF with 8 threads and 1 partitions (avg. partition size = 758996)... - built mphs[1] for 758996 kmers; bits/key = 2.39428 - built positions[1] for 758996 kmers; bits/key = 8.00046 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 448292 - building MPHF with 8 threads and 1 partitions (avg. partition size = 448292)... - built mphs[2] for 448292 kmers; bits/key = 2.36442 - built positions[2] for 448292 kmers; bits/key = 9.00085 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 299144 - building MPHF with 8 threads and 1 partitions (avg. partition size = 299144)... - built mphs[3] for 299144 kmers; bits/key = 2.42404 - built positions[3] for 299144 kmers; bits/key = 10.0012 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 146091 - building MPHF with 8 threads and 1 partitions (avg. partition size = 146091)... - built mphs[4] for 146091 kmers; bits/key = 2.54658 - built positions[4] for 146091 kmers; bits/key = 11.0025 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 69238 - building MPHF with 8 threads and 1 partitions (avg. partition size = 69238)... - built mphs[5] for 69238 kmers; bits/key = 2.79315 - built positions[5] for 69238 kmers; bits/key = 12.0054 - lower = 4096; upper = 4596; num_bits_per_pos = 13; num_kmers_in_partition = 20320 - building MPHF with 8 threads and 1 partitions (avg. partition size = 20320)... - built mphs[6] for 20320 kmers; bits/key = 3.1189 - built positions[6] for 20320 kmers; bits/key = 13.0173 -num_bits_for_skew_index 31446064(0.0273349 [bits/kmer]) -=== step 4: 'build_skew_index' 4.9767 [sec] (4.32606 [ns/kmer]) -=== total_time 63.0952 [sec] (54.8464 [ns/kmer]) -total index size: 1177377532 [B] -- 1177.38 [MB] -SPACE BREAKDOWN: - minimizers: 0.442785 [bits/kmer] (2.62485 [bits/key]) -- 5.40799% - pieces: 0.00841122 [bits/kmer] -- 0.102731% - sizes: 0.26922 [bits/kmer] -- 3.28814% - offsets: 5.40427 [bits/kmer] -- 66.0055% - strings: 2.03558 [bits/kmer] -- 24.8618% - skew_index: 0.0273349 [bits/kmer] -- 0.333857% - weights: 1.27956e-06 [bits/kmer] -- 1.5628e-05% - -------------- - total: 8.18761 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 98.0129% -buckets with 2 minimizer positions = 1.66443% -buckets with 3 minimizer positions = 0.16605% -buckets with 4 minimizer positions = 0.0545351% -buckets with 5 minimizer positions = 0.0276455% -buckets with 6 minimizer positions = 0.0167922% -buckets with 7 minimizer positions = 0.0113021% -buckets with 8 minimizer positions = 0.00793722% -buckets with 9 minimizer positions = 0.00581262% -buckets with 10 minimizer positions = 0.00442542% -buckets with 11 minimizer positions = 0.0035762% -buckets with 12 minimizer positions = 0.00283056% -buckets with 13 minimizer positions = 0.00231526% -buckets with 14 minimizer positions = 0.00193806% -buckets with 15 minimizer positions = 0.00159744% -buckets with 16 minimizer positions = 0.00142327% -max_bucket_size 4596 -2025-08-22 15:12:45: saving data structure to disk... -2025-08-22 15:12:45: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding_input' 14.6222 [sec] (5.83616 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 18.7553 [sec] (7.48581 [ns/kmer]) -=== step 1: 'parse_file' 33.3776 [sec] (13.322 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_minimizers = 418360623 -num_minimizer_positions = 475672736 -num_super_kmers = 494602342 -building minimizers MPHF with 8 threads and 140 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 56.7126 [sec] (22.6357 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.1.bin'... - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_minimizers = 418360623 -num_minimizer_positions = 475672736 -num_super_kmers = 494602342 -=== step 2.1: 're-sorting minimizers tuples' 56.9092 [sec] (22.7142 [ns/kmer]) -bits_per_offset = ceil(log2(2895872213)) = 32 -reading from 'tmp_dir/sshash.tmp.run_1755868365759028075.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868513137485517.bucket_pairs.0.bin'... -num_singletons 401627906/418360623 (96.0004%) -building: 1.19106 [sec] -computing minimizers offsets: 0.895773 [sec] -encoding: 0.119168 [sec] -=== step 3: 'build_sparse_index' 4.60948 [sec] (1.83979 [ns/kmer]) -max_bucket_size 20140 -log2_max_bucket_size 15 -num_buckets_in_skew_index 75633/418360623 (0.0180784%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18467007 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14212219 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 10399161 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 7124477 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4413430 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3140606 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 20140: 2808524 -num_kmers_in_skew_index 60565424 (2.41735%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18467007 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[0] for 18467007 kmers; bits/key = 2.3997 - built positions[0] for 18467007 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14212219 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[1] for 14212219 kmers; bits/key = 2.39549 - built positions[1] for 14212219 kmers; bits/key = 8.00003 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 10399161 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[2] for 10399161 kmers; bits/key = 2.42642 - built positions[2] for 10399161 kmers; bits/key = 9.00004 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 7124477 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 7124477 kmers; bits/key = 2.55041 - built positions[3] for 7124477 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4413430 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4413430 kmers; bits/key = 2.57025 - built positions[4] for 4413430 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3140606 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3140606 kmers; bits/key = 3.07188 - built positions[5] for 3140606 kmers; bits/key = 12.0001 - lower = 4096; upper = 20140; num_bits_per_pos = 15; num_kmers_in_partition = 2808524 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2808524)... - built mphs[6] for 2808524 kmers; bits/key = 2.33795 - built positions[6] for 2808524 kmers; bits/key = 15.0001 -num_bits_for_skew_index 685490320(0.2736 [bits/kmer]) -=== step 4: 'build_skew_index' 21.0846 [sec] (8.41553 [ns/kmer]) -=== total_time 172.694 [sec] (68.9273 [ns/kmer]) -total index size: 2956652772 [B] -- 2956.65 [MB] -SPACE BREAKDOWN: - minimizers: 0.437715 [bits/kmer] (2.62135 [bits/key]) -- 4.63645% - pieces: 0.0585865 [bits/kmer] -- 0.620573% - sizes: 0.283783 [bits/kmer] -- 3.00594% - offsets: 6.07538 [bits/kmer] -- 64.3529% - strings: 2.31166 [bits/kmer] -- 24.4861% - skew_index: 0.2736 [bits/kmer] -- 2.89808% - weights: 5.8752e-07 [bits/kmer] -- 6.22325e-06% - -------------- - total: 9.44072 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.0004% -buckets with 2 minimizer positions = 2.56942% -buckets with 3 minimizer positions = 0.58% -buckets with 4 minimizer positions = 0.252326% -buckets with 5 minimizer positions = 0.141037% -buckets with 6 minimizer positions = 0.0897776% -buckets with 7 minimizer positions = 0.0621464% -buckets with 8 minimizer positions = 0.0453446% -buckets with 9 minimizer positions = 0.0348078% -buckets with 10 minimizer positions = 0.0270769% -buckets with 11 minimizer positions = 0.0216744% -buckets with 12 minimizer positions = 0.0178129% -buckets with 13 minimizer positions = 0.0150052% -buckets with 14 minimizer positions = 0.0125844% -buckets with 15 minimizer positions = 0.0107302% -buckets with 16 minimizer positions = 0.00926139% -max_bucket_size 20140 -2025-08-22 15:15:38: saving data structure to disk... -2025-08-22 15:15:40: DONE diff --git a/benchmarks/results-22-08-25/k31/22-08-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-08-25/k31/22-08-25.canon.high-hit.streaming_query_log deleted file mode 100644 index def2335..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-22 15:27:26: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-22 15:27:39: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 12803.2 millisec / 12.8032 sec / 0.213386 min / 78.4089 ns/kmer -2025-08-22 15:27:40: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-22 15:28:51: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 71394.1 millisec / 71.3941 sec / 1.1899 min / 102.616 ns/kmer -2025-08-22 15:28:52: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-08-22 15:32:45: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 233067 millisec / 233.067 sec / 3.88445 min / 148.453 ns/kmer diff --git a/benchmarks/results-22-08-25/k31/22-08-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-08-25/k31/22-08-25.canon.low-hit.streaming_query_log deleted file mode 100644 index 5c8d9b2..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-22 15:36:57: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-22 15:38:39: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 102225 millisec / 102.225 sec / 1.70375 min / 146.93 ns/kmer -2025-08-22 15:38:40: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-22 15:38:51: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 10896.7 millisec / 10.8967 sec / 0.181611 min / 66.7331 ns/kmer -2025-08-22 15:38:52: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-08-22 15:39:49: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 57071.6 millisec / 57.0716 sec / 0.951193 min / 144.327 ns/kmer diff --git a/benchmarks/results-22-08-25/k31/22-08-25.regular.bench_log b/benchmarks/results-22-08-25/k31/22-08-25.regular.bench_log deleted file mode 100644 index 3738874..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.regular.bench_log +++ /dev/null @@ -1,18 +0,0 @@ -avg_nanosec_per_positive_lookup 1025.96 -avg_nanosec_per_negative_lookup 967.926 -avg_nanosec_per_positive_lookup_advanced 1026.55 -avg_nanosec_per_negative_lookup_advanced 982.257 -avg_nanosec_per_access 433.153 -iterator: avg_nanosec_per_kmer 19.9873 -avg_nanosec_per_positive_lookup 1029.57 -avg_nanosec_per_negative_lookup 1113.39 -avg_nanosec_per_positive_lookup_advanced 1025.88 -avg_nanosec_per_negative_lookup_advanced 1113.5 -avg_nanosec_per_access 368.153 -iterator: avg_nanosec_per_kmer 19.7098 -avg_nanosec_per_positive_lookup 1433.59 -avg_nanosec_per_negative_lookup 1237.58 -avg_nanosec_per_positive_lookup_advanced 1431.06 -avg_nanosec_per_negative_lookup_advanced 1237.18 -avg_nanosec_per_access 615.355 -iterator: avg_nanosec_per_kmer 20.0418 diff --git a/benchmarks/results-22-08-25/k31/22-08-25.regular.build_log b/benchmarks/results-22-08-25/k31/22-08-25.regular.build_log deleted file mode 100644 index b236841..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.regular.build_log +++ /dev/null @@ -1,497 +0,0 @@ -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding_input' 2.89863 [sec] (5.76882 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 3.1134 [sec] (6.19624 [ns/kmer]) -=== step 1: 'parse_file' 6.01219 [sec] (11.9654 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.bin' -num_super_kmers = 50000000 -num_minimizers = 72482370 -num_minimizer_positions = 78855216 -num_super_kmers = 78855216 -building minimizers MPHF with 8 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 9.30152 [sec] (18.5118 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 4.88481 [sec] (9.72169 [ns/kmer]) -bits_per_offset = ceil(log2(574653302)) = 30 -reading from 'tmp_dir/sshash.tmp.run_1755868060474121895.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868080735611640.bucket_pairs.0.bin'... -num_singletons 70140084/72482370 (96.7685%) -building: 0.201497 [sec] -computing minimizers offsets: 0.211199 [sec] -encoding: 0.022981 [sec] -=== step 3: 'build_sparse_index' 0.781283 [sec] (1.5549 [ns/kmer]) -max_bucket_size 121065 -log2_max_bucket_size 17 -num_buckets_in_skew_index 4443/72482370 (0.00612977%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1230971 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 971702 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 653362 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 485695 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 456634 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 396335 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 121065: 729292 -num_kmers_in_skew_index 4923991 (0.979967%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1230971 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1230971)... - built mphs[0] for 1230971 kmers; bits/key = 2.38542 - built positions[0] for 1230971 kmers; bits/key = 7.00029 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 971702 - building MPHF with 8 threads and 1 partitions (avg. partition size = 971702)... - built mphs[1] for 971702 kmers; bits/key = 2.37213 - built positions[1] for 971702 kmers; bits/key = 8.00035 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 653362 - building MPHF with 8 threads and 1 partitions (avg. partition size = 653362)... - built mphs[2] for 653362 kmers; bits/key = 2.41116 - built positions[2] for 653362 kmers; bits/key = 9.00058 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 485695 - building MPHF with 8 threads and 1 partitions (avg. partition size = 485695)... - built mphs[3] for 485695 kmers; bits/key = 2.46163 - built positions[3] for 485695 kmers; bits/key = 10.0007 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 456634 - building MPHF with 8 threads and 1 partitions (avg. partition size = 456634)... - built mphs[4] for 456634 kmers; bits/key = 2.36636 - built positions[4] for 456634 kmers; bits/key = 11.0007 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 396335 - building MPHF with 8 threads and 1 partitions (avg. partition size = 396335)... - built mphs[5] for 396335 kmers; bits/key = 2.39147 - built positions[5] for 396335 kmers; bits/key = 12.0008 - lower = 4096; upper = 121065; num_bits_per_pos = 17; num_kmers_in_partition = 729292 - building MPHF with 8 threads and 1 partitions (avg. partition size = 729292)... - built mphs[6] for 729292 kmers; bits/key = 2.40424 - built positions[6] for 729292 kmers; bits/key = 17.0005 -num_bits_for_skew_index 61101328(0.121603 [bits/kmer]) -=== step 4: 'build_skew_index' 6.61853 [sec] (13.1721 [ns/kmer]) -=== total_time 27.5983 [sec] (54.9259 [ns/kmer]) -total index size: 489355410 [B] -- 489.355 [MB] -SPACE BREAKDOWN: - minimizers: 0.381049 [bits/kmer] (2.64152 [bits/key]) -- 4.89072% - pieces: 0.0549683 [bits/kmer] -- 0.705511% - sizes: 0.238212 [bits/kmer] -- 3.05742% - offsets: 4.7081 [bits/kmer] -- 60.4279% - strings: 2.28734 [bits/kmer] -- 29.3577% - skew_index: 0.121603 [bits/kmer] -- 1.56076% - weights: 2.92956e-06 [bits/kmer] -- 3.76005e-05% - -------------- - total: 7.79127 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.7685% -buckets with 2 minimizer positions = 2.08482% -buckets with 3 minimizer positions = 0.527127% -buckets with 4 minimizer positions = 0.213044% -buckets with 5 minimizer positions = 0.111486% -buckets with 6 minimizer positions = 0.0671115% -buckets with 7 minimizer positions = 0.0451641% -buckets with 8 minimizer positions = 0.0320781% -buckets with 9 minimizer positions = 0.0239672% -buckets with 10 minimizer positions = 0.0183534% -buckets with 11 minimizer positions = 0.0144821% -buckets with 12 minimizer positions = 0.0117215% -buckets with 13 minimizer positions = 0.00959682% -buckets with 14 minimizer positions = 0.00787226% -buckets with 15 minimizer positions = 0.006683% -buckets with 16 minimizer positions = 0.00565379% -max_bucket_size 121065 -2025-08-22 15:08:08: saving data structure to disk... -2025-08-22 15:08:08: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding_input' 5.61036 [sec] (4.87688 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 6.5896 [sec] (5.7281 [ns/kmer]) -=== step 1: 'parse_file' 12.2001 [sec] (10.6051 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_minimizers = 173450846 -num_minimizer_positions = 176257872 -num_super_kmers = 176257872 -building minimizers MPHF with 8 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 20.7783 [sec] (18.0618 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 9.57706 [sec] (8.32499 [ns/kmer]) -bits_per_offset = ceil(log2(1170866587)) = 31 -reading from 'tmp_dir/sshash.tmp.run_1755868088398204210.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868131094619778.bucket_pairs.0.bin'... -num_singletons 172100966/173450846 (99.2218%) -building: 0.449571 [sec] -computing minimizers offsets: 0.343787 [sec] -encoding: 0.00637 [sec] -=== step 3: 'build_sparse_index' 1.43792 [sec] (1.24993 [ns/kmer]) -max_bucket_size 2826 -log2_max_bucket_size 12 -num_buckets_in_skew_index 1711/173450846 (0.000986447%) -num_partitions 6 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 580154 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 340341 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 185473 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 84383 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 46606 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2826: 19860 -num_kmers_in_skew_index 1256817 (0.109251%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 580154 - building MPHF with 8 threads and 1 partitions (avg. partition size = 580154)... - built mphs[0] for 580154 kmers; bits/key = 2.42711 - built positions[0] for 580154 kmers; bits/key = 7.00062 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 340341 - building MPHF with 8 threads and 1 partitions (avg. partition size = 340341)... - built mphs[1] for 340341 kmers; bits/key = 2.41466 - built positions[1] for 340341 kmers; bits/key = 8.00101 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 185473 - building MPHF with 8 threads and 1 partitions (avg. partition size = 185473)... - built mphs[2] for 185473 kmers; bits/key = 2.48222 - built positions[2] for 185473 kmers; bits/key = 9.00202 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 84383 - building MPHF with 8 threads and 1 partitions (avg. partition size = 84383)... - built mphs[3] for 84383 kmers; bits/key = 2.71619 - built positions[3] for 84383 kmers; bits/key = 10.0039 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46606 - building MPHF with 8 threads and 1 partitions (avg. partition size = 46606)... - built mphs[4] for 46606 kmers; bits/key = 2.81543 - built positions[4] for 46606 kmers; bits/key = 11.0077 - lower = 2048; upper = 2826; num_bits_per_pos = 12; num_kmers_in_partition = 19860 - building MPHF with 8 threads and 1 partitions (avg. partition size = 19860)... - built mphs[5] for 19860 kmers; bits/key = 3.16455 - built positions[5] for 19860 kmers; bits/key = 12.0169 -num_bits_for_skew_index 13163728(0.0114427 [bits/kmer]) -=== step 4: 'build_skew_index' 2.54635 [sec] (2.21345 [ns/kmer]) -=== total_time 46.5397 [sec] (40.4553 [ns/kmer]) -total index size: 1069708868 [B] -- 1069.71 [MB] -SPACE BREAKDOWN: - minimizers: 0.395755 [bits/kmer] (2.62482 [bits/key]) -- 5.3201% - pieces: 0.00841122 [bits/kmer] -- 0.113071% - sizes: 0.238026 [bits/kmer] -- 3.19976% - offsets: 4.74965 [bits/kmer] -- 63.8491% - strings: 2.03558 [bits/kmer] -- 27.3641% - skew_index: 0.0114427 [bits/kmer] -- 0.153824% - weights: 1.27956e-06 [bits/kmer] -- 1.72009e-05% - -------------- - total: 7.43887 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.2218% -buckets with 2 minimizer positions = 0.587822% -buckets with 3 minimizer positions = 0.0855418% -buckets with 4 minimizer positions = 0.0349903% -buckets with 5 minimizer positions = 0.0188924% -buckets with 6 minimizer positions = 0.0115975% -buckets with 7 minimizer positions = 0.0076944% -buckets with 8 minimizer positions = 0.00552548% -buckets with 9 minimizer positions = 0.00401266% -buckets with 10 minimizer positions = 0.00314556% -buckets with 11 minimizer positions = 0.00248082% -buckets with 12 minimizer positions = 0.002049% -buckets with 13 minimizer positions = 0.0016385% -buckets with 14 minimizer positions = 0.00134851% -buckets with 15 minimizer positions = 0.00113923% -buckets with 16 minimizer positions = 0.000967998% -max_bucket_size 2826 -2025-08-22 15:08:55: saving data structure to disk... -2025-08-22 15:08:55: DONE -k = 31, m = 21, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding_input' 14.5875 [sec] (5.82232 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 14.7039 [sec] (5.86877 [ns/kmer]) -=== step 1: 'parse_file' 29.2915 [sec] (11.6911 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_minimizers = 389285242 -num_minimizer_positions = 428077581 -num_super_kmers = 428077581 -building minimizers MPHF with 8 threads and 130 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 52.7403 [sec] (21.0503 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 27.426 [sec] (10.9466 [ns/kmer]) -bits_per_offset = ceil(log2(2895872213)) = 32 -reading from 'tmp_dir/sshash.tmp.run_1755868135630793919.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755868245426962616.bucket_pairs.0.bin'... -num_singletons 378034182/389285242 (97.1098%) -building: 1.07647 [sec] -computing minimizers offsets: 0.764063 [sec] -encoding: 0.119168 [sec] -=== step 3: 'build_sparse_index' 3.7931 [sec] (1.51394 [ns/kmer]) -max_bucket_size 25155 -log2_max_bucket_size 15 -num_buckets_in_skew_index 48318/389285242 (0.012412%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 12097707 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8788211 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5689032 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3350962 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1911299 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1185372 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 25155: 644733 -num_kmers_in_skew_index 33667316 (1.34377%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 12097707 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[0] for 12097707 kmers; bits/key = 2.51293 - built positions[0] for 12097707 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8788211 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8788211 kmers; bits/key = 2.37002 - built positions[1] for 8788211 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5689032 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5689032 kmers; bits/key = 2.37617 - built positions[2] for 5689032 kmers; bits/key = 9.00007 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3350962 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3350962 kmers; bits/key = 2.90674 - built positions[3] for 3350962 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1911299 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1911299)... - built mphs[4] for 1911299 kmers; bits/key = 2.35739 - built positions[4] for 1911299 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1185372 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1185372)... - built mphs[5] for 1185372 kmers; bits/key = 2.39578 - built positions[5] for 1185372 kmers; bits/key = 12.0003 - lower = 4096; upper = 25155; num_bits_per_pos = 15; num_kmers_in_partition = 644733 - building MPHF with 8 threads and 1 partitions (avg. partition size = 644733)... - built mphs[6] for 644733 kmers; bits/key = 2.40658 - built positions[6] for 644733 kmers; bits/key = 15.0006 -num_bits_for_skew_index 368007536(0.146883 [bits/kmer]) -=== step 4: 'build_skew_index' 17.1404 [sec] (6.84126 [ns/kmer]) -=== total_time 130.391 [sec] (52.0432 [ns/kmer]) -total index size: 2708856220 [B] -- 2708.86 [MB] -SPACE BREAKDOWN: - minimizers: 0.406625 [bits/kmer] (2.61704 [bits/key]) -- 4.70114% - pieces: 0.0585865 [bits/kmer] -- 0.67734% - sizes: 0.258258 [bits/kmer] -- 2.98582% - offsets: 5.46748 [bits/kmer] -- 63.2116% - strings: 2.31166 [bits/kmer] -- 26.726% - skew_index: 0.146883 [bits/kmer] -- 1.69817% - weights: 5.8752e-07 [bits/kmer] -- 6.79253e-06% - -------------- - total: 8.6495 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1098% -buckets with 2 minimizer positions = 1.75083% -buckets with 3 minimizer positions = 0.44863% -buckets with 4 minimizer positions = 0.203142% -buckets with 5 minimizer positions = 0.116347% -buckets with 6 minimizer positions = 0.0749733% -buckets with 7 minimizer positions = 0.0518841% -buckets with 8 minimizer positions = 0.0381006% -buckets with 9 minimizer positions = 0.0288385% -buckets with 10 minimizer positions = 0.0224391% -buckets with 11 minimizer positions = 0.0179622% -buckets with 12 minimizer positions = 0.0146718% -buckets with 13 minimizer positions = 0.0122715% -buckets with 14 minimizer positions = 0.0103271% -buckets with 15 minimizer positions = 0.00873164% -buckets with 16 minimizer positions = 0.00747652% -max_bucket_size 25155 -2025-08-22 15:11:06: saving data structure to disk... -2025-08-22 15:11:07: DONE diff --git a/benchmarks/results-22-08-25/k31/22-08-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-08-25/k31/22-08-25.regular.high-hit.streaming_query_log deleted file mode 100644 index 6eaf5d6..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-22 15:20:47: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-22 15:21:01: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 13179 millisec / 13.179 sec / 0.21965 min / 80.7104 ns/kmer -2025-08-22 15:21:01: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-22 15:22:23: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 81847.8 millisec / 81.8478 sec / 1.36413 min / 117.642 ns/kmer -2025-08-22 15:22:24: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-08-22 15:27:26: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 301953 millisec / 301.953 sec / 5.03256 min / 192.33 ns/kmer diff --git a/benchmarks/results-22-08-25/k31/22-08-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-08-25/k31/22-08-25.regular.low-hit.streaming_query_log deleted file mode 100644 index efc2d47..0000000 --- a/benchmarks/results-22-08-25/k31/22-08-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-22 15:32:46: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-22 15:35:10: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 144520 millisec / 144.52 sec / 2.40867 min / 207.722 ns/kmer -2025-08-22 15:35:11: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-22 15:35:25: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 14211.5 millisec / 14.2115 sec / 0.236859 min / 87.0339 ns/kmer -2025-08-22 15:35:26: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-08-22 15:36:57: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 91073.5 millisec / 91.0735 sec / 1.51789 min / 230.313 ns/kmer diff --git a/benchmarks/results-22-08-25/k63/22-08-25.canon.bench_log b/benchmarks/results-22-08-25/k63/22-08-25.canon.bench_log deleted file mode 100644 index 405a5ed..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.canon.bench_log +++ /dev/null @@ -1,18 +0,0 @@ -avg_nanosec_per_positive_lookup 932.74 -avg_nanosec_per_negative_lookup 636.919 -avg_nanosec_per_positive_lookup_advanced 903.182 -avg_nanosec_per_negative_lookup_advanced 635.834 -avg_nanosec_per_access 382.206 -iterator: avg_nanosec_per_kmer 19.9772 -avg_nanosec_per_positive_lookup 854.129 -avg_nanosec_per_negative_lookup 715.394 -avg_nanosec_per_positive_lookup_advanced 823.575 -avg_nanosec_per_negative_lookup_advanced 712.864 -avg_nanosec_per_access 320.935 -iterator: avg_nanosec_per_kmer 19.9017 -avg_nanosec_per_positive_lookup 1168.7 -avg_nanosec_per_negative_lookup 793.31 -avg_nanosec_per_positive_lookup_advanced 1138.05 -avg_nanosec_per_negative_lookup_advanced 790.911 -avg_nanosec_per_access 498.022 -iterator: avg_nanosec_per_kmer 19.9255 diff --git a/benchmarks/results-22-08-25/k63/22-08-25.canon.build_log b/benchmarks/results-22-08-25/k63/22-08-25.canon.build_log deleted file mode 100644 index 8b06d7d..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.canon.build_log +++ /dev/null @@ -1,365 +0,0 @@ -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding_input' 3.06586 [sec] (5.50833 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 2.30899 [sec] (4.1485 [ns/kmer]) -=== step 1: 'parse_file' 5.37497 [sec] (9.65704 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.bin' -num_minimizers = 28789847 -num_minimizer_positions = 33868028 -num_super_kmers = 35598946 -building minimizers MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 4.23508 [sec] (7.60903 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 1.92984 [sec] (3.46728 [ns/kmer]) -bits_per_offset = ceil(log2(621649142)) = 30 -reading from 'tmp_dir/sshash.tmp.run_1755933730548601913.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933742116440678.bucket_pairs.0.bin'... -num_singletons 27569809/28789847 (95.7623%) -building: 0.081542 [sec] -computing minimizers offsets: 0.118891 [sec] -encoding: 0.008141 [sec] -=== step 3: 'build_sparse_index' 0.377037 [sec] (0.677411 [ns/kmer]) -max_bucket_size 308505 -log2_max_bucket_size 19 -num_buckets_in_skew_index 5779/28789847 (0.020073%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5298924 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3701291 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2357254 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1249465 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1155039 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1137726 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 308505: 4187635 -num_kmers_in_skew_index 19087334 (3.42936%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5298924 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 5298924 kmers; bits/key = 2.39231 - built positions[0] for 5298924 kmers; bits/key = 7.00006 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3701291 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3701291 kmers; bits/key = 2.74283 - built positions[1] for 3701291 kmers; bits/key = 8.0001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2357254 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2357254)... - built mphs[2] for 2357254 kmers; bits/key = 2.34474 - built positions[2] for 2357254 kmers; bits/key = 9.00014 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1249465 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1249465)... - built mphs[3] for 1249465 kmers; bits/key = 2.39151 - built positions[3] for 1249465 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1155039 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1155039)... - built mphs[4] for 1155039 kmers; bits/key = 2.39906 - built positions[4] for 1155039 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1137726 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1137726)... - built mphs[5] for 1137726 kmers; bits/key = 2.39532 - built positions[5] for 1137726 kmers; bits/key = 12.0003 - lower = 4096; upper = 308505; num_bits_per_pos = 19; num_kmers_in_partition = 4187635 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 4187635 kmers; bits/key = 2.62161 - built positions[6] for 4187635 kmers; bits/key = 19.0001 -num_bits_for_skew_index 254157024(0.456636 [bits/kmer]) -=== step 4: 'build_skew_index' 11.3275 [sec] (20.3517 [ns/kmer]) -=== total_time 23.2444 [sec] (41.7625 [ns/kmer]) -total index size: 331637748 [B] -- 331.638 [MB] -SPACE BREAKDOWN: - minimizers: 0.137431 [bits/kmer] (2.65691 [bits/key]) -- 2.88312% - pieces: 0.0233256 [bits/kmer] -- 0.48934% - sizes: 0.0900651 [bits/kmer] -- 1.88945% - offsets: 1.82549 [bits/kmer] -- 38.2963% - strings: 2.2338 [bits/kmer] -- 46.8621% - skew_index: 0.456636 [bits/kmer] -- 9.57962% - weights: 2.6447e-06 [bits/kmer] -- 5.54822e-05% - -------------- - total: 4.76675 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.7623% -buckets with 2 minimizer positions = 2.31119% -buckets with 3 minimizer positions = 0.765655% -buckets with 4 minimizer positions = 0.357056% -buckets with 5 minimizer positions = 0.200974% -buckets with 6 minimizer positions = 0.126135% -buckets with 7 minimizer positions = 0.0851446% -buckets with 8 minimizer positions = 0.0608339% -buckets with 9 minimizer positions = 0.0458495% -buckets with 10 minimizer positions = 0.035773% -buckets with 11 minimizer positions = 0.0286247% -buckets with 12 minimizer positions = 0.0232721% -buckets with 13 minimizer positions = 0.0190901% -buckets with 14 minimizer positions = 0.0160543% -buckets with 15 minimizer positions = 0.0139007% -buckets with 16 minimizer positions = 0.012098% -max_bucket_size 308505 -2025-08-23 09:22:33: saving data structure to disk... -2025-08-23 09:22:33: DONE -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding_input' 5.82317 [sec] (5.04061 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 4.48244 [sec] (3.88006 [ns/kmer]) -=== step 1: 'parse_file' 10.3057 [sec] (8.92079 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.bin' -num_super_kmers = 50000000 -num_minimizers = 67576153 -num_minimizer_positions = 68454274 -num_super_kmers = 72275777 -building minimizers MPHF with 8 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 7.9737 [sec] (6.90214 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 3.67553 [sec] (3.18159 [ns/kmer]) -bits_per_offset = ceil(log2(1165088891)) = 31 -reading from 'tmp_dir/sshash.tmp.run_1755933753979807462.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933775988195505.bucket_pairs.0.bin'... -num_singletons 67252894/67576153 (99.5216%) -building: 0.172239 [sec] -computing minimizers offsets: 0.149836 [sec] -encoding: 0.00163 [sec] -=== step 3: 'build_sparse_index' 0.595998 [sec] (0.515904 [ns/kmer]) -max_bucket_size 1910 -log2_max_bucket_size 11 -num_buckets_in_skew_index 948/67576153 (0.00140286%) -num_partitions 5 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 988498 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 672272 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 348636 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 197046 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1910: 181617 -num_kmers_in_skew_index 2388069 (0.206714%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 988498 - building MPHF with 8 threads and 1 partitions (avg. partition size = 988498)... - built mphs[0] for 988498 kmers; bits/key = 2.36143 - built positions[0] for 988498 kmers; bits/key = 7.00033 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 672272 - building MPHF with 8 threads and 1 partitions (avg. partition size = 672272)... - built mphs[1] for 672272 kmers; bits/key = 2.41267 - built positions[1] for 672272 kmers; bits/key = 8.00048 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 348636 - building MPHF with 8 threads and 1 partitions (avg. partition size = 348636)... - built mphs[2] for 348636 kmers; bits/key = 2.41728 - built positions[2] for 348636 kmers; bits/key = 9.00093 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 197046 - building MPHF with 8 threads and 1 partitions (avg. partition size = 197046)... - built mphs[3] for 197046 kmers; bits/key = 2.53553 - built positions[3] for 197046 kmers; bits/key = 10.0018 - lower = 1024; upper = 1910; num_bits_per_pos = 11; num_kmers_in_partition = 181617 - building MPHF with 8 threads and 1 partitions (avg. partition size = 181617)... - built mphs[4] for 181617 kmers; bits/key = 2.49237 - built positions[4] for 181617 kmers; bits/key = 11.002 -num_bits_for_skew_index 25156768(0.021776 [bits/kmer]) -=== step 4: 'build_skew_index' 3.32103 [sec] (2.87473 [ns/kmer]) -=== total_time 25.872 [sec] (22.3951 [ns/kmer]) -total index size: 595424366 [B] -- 595.424 [MB] -SPACE BREAKDOWN: - minimizers: 0.153137 [bits/kmer] (2.61795 [bits/key]) -- 3.71397% - pieces: 0.00224854 [bits/kmer] -- 0.0545332% - sizes: 0.0921592 [bits/kmer] -- 2.23511% - offsets: 1.8369 [bits/kmer] -- 44.5498% - strings: 2.01703 [bits/kmer] -- 48.9184% - skew_index: 0.021776 [bits/kmer] -- 0.528127% - weights: 1.27418e-06 [bits/kmer] -- 3.09023e-05% - -------------- - total: 4.12326 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5216% -buckets with 2 minimizer positions = 0.324159% -buckets with 3 minimizer positions = 0.0663932% -buckets with 4 minimizer positions = 0.0279063% -buckets with 5 minimizer positions = 0.0153235% -buckets with 6 minimizer positions = 0.00951519% -buckets with 7 minimizer positions = 0.00640907% -buckets with 8 minimizer positions = 0.0046984% -buckets with 9 minimizer positions = 0.0034302% -buckets with 10 minimizer positions = 0.00267254% -buckets with 11 minimizer positions = 0.00206138% -buckets with 12 minimizer positions = 0.00169438% -buckets with 13 minimizer positions = 0.00130075% -buckets with 14 minimizer positions = 0.00118385% -buckets with 15 minimizer positions = 0.00103439% -buckets with 16 minimizer positions = 0.00086273% -max_bucket_size 1910 -2025-08-23 09:22:59: saving data structure to disk... -2025-08-23 09:23:00: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = true, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding_input' 14.791 [sec] (5.33817 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 10.4363 [sec] (3.76652 [ns/kmer]) -=== step 1: 'parse_file' 25.2275 [sec] (9.10473 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_minimizers = 144189268 -num_minimizer_positions = 168680035 -num_super_kmers = 177508359 -building minimizers MPHF with 8 threads and 49 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 18.4473 [sec] (6.65772 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 9.18088 [sec] (3.31343 [ns/kmer]) -bits_per_offset = ceil(log2(2961741363)) = 32 -reading from 'tmp_dir/sshash.tmp.run_1755933780186790770.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933833177503584.bucket_pairs.0.bin'... -num_singletons 140024257/144189268 (97.1114%) -building: 0.400078 [sec] -computing minimizers offsets: 0.370622 [sec] -encoding: 0.029527 [sec] -=== step 3: 'build_sparse_index' 1.56987 [sec] (0.566573 [ns/kmer]) -max_bucket_size 79613 -log2_max_bucket_size 17 -num_buckets_in_skew_index 38094/144189268 (0.0264194%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28443207 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26786499 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23905222 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20445613 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19605913 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 17586499 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 79613: 41784999 -num_kmers_in_skew_index 178557952 (6.44425%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28443207 - building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28443207 kmers; bits/key = 2.39412 - built positions[0] for 28443207 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26786499 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26786499 kmers; bits/key = 2.34704 - built positions[1] for 26786499 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23905222 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 23905222 kmers; bits/key = 2.33992 - built positions[2] for 23905222 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20445613 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 20445613 kmers; bits/key = 2.37543 - built positions[3] for 20445613 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19605913 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[4] for 19605913 kmers; bits/key = 2.40323 - built positions[4] for 19605913 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 17586499 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[5] for 17586499 kmers; bits/key = 2.37019 - built positions[5] for 17586499 kmers; bits/key = 12 - lower = 4096; upper = 79613; num_bits_per_pos = 17; num_kmers_in_partition = 41784999 - building MPHF with 8 threads and 14 partitions (avg. partition size = 3000000)... - built mphs[6] for 41784999 kmers; bits/key = 2.34184 - built positions[6] for 41784999 kmers; bits/key = 17 -num_bits_for_skew_index 2392171696(0.863348 [bits/kmer]) -=== step 4: 'build_skew_index' 56.036 [sec] (20.2237 [ns/kmer]) -=== total_time 110.461 [sec] (39.8661 [ns/kmer]) -total index size: 1797885300 [B] -- 1797.89 [MB] -SPACE BREAKDOWN: - minimizers: 0.136439 [bits/kmer] (2.62188 [bits/key]) -- 2.62842% - pieces: 0.015002 [bits/kmer] -- 0.289004% - sizes: 0.0902443 [bits/kmer] -- 1.7385% - offsets: 1.94808 [bits/kmer] -- 37.5285% - strings: 2.13782 [bits/kmer] -- 41.1837% - skew_index: 0.863348 [bits/kmer] -- 16.6318% - weights: 5.31253e-07 [bits/kmer] -- 1.02342e-05% - -------------- - total: 5.19093 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1114% -buckets with 2 minimizer positions = 1.66722% -buckets with 3 minimizer positions = 0.46733% -buckets with 4 minimizer positions = 0.21225% -buckets with 5 minimizer positions = 0.119966% -buckets with 6 minimizer positions = 0.0769385% -buckets with 7 minimizer positions = 0.0535934% -buckets with 8 minimizer positions = 0.0393088% -buckets with 9 minimizer positions = 0.0300556% -buckets with 10 minimizer positions = 0.024146% -buckets with 11 minimizer positions = 0.0194904% -buckets with 12 minimizer positions = 0.0157328% -buckets with 13 minimizer positions = 0.0133685% -buckets with 14 minimizer positions = 0.011428% -buckets with 15 minimizer positions = 0.00992723% -buckets with 16 minimizer positions = 0.00851728% -max_bucket_size 79613 -2025-08-23 09:24:50: saving data structure to disk... -2025-08-23 09:24:51: DONE diff --git a/benchmarks/results-22-08-25/k63/22-08-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-08-25/k63/22-08-25.canon.high-hit.streaming_query_log deleted file mode 100644 index b2718c2..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-23 09:34:27: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-23 09:34:42: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 15679.6 millisec / 15.6796 sec / 0.261326 min / 160.041 ns/kmer -2025-08-23 09:34:43: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-23 09:35:47: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 64725 millisec / 64.725 sec / 1.07875 min / 140.284 ns/kmer -2025-08-23 09:35:48: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-08-23 09:38:00: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 131771 millisec / 131.771 sec / 2.19619 min / 275.777 ns/kmer diff --git a/benchmarks/results-22-08-25/k63/22-08-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-08-25/k63/22-08-25.canon.low-hit.streaming_query_log deleted file mode 100644 index ea51d30..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-23 09:39:25: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-23 09:40:04: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 38764.7 millisec / 38.7647 sec / 0.646078 min / 84.0183 ns/kmer -2025-08-23 09:40:04: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-23 09:40:09: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 5264.96 millisec / 5.26496 sec / 0.0877494 min / 53.7392 ns/kmer -2025-08-23 09:40:10: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-08-23 09:40:33: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 23143.3 millisec / 23.1433 sec / 0.385721 min / 71.8544 ns/kmer diff --git a/benchmarks/results-22-08-25/k63/22-08-25.regular.bench_log b/benchmarks/results-22-08-25/k63/22-08-25.regular.bench_log deleted file mode 100644 index 03359dd..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.regular.bench_log +++ /dev/null @@ -1,18 +0,0 @@ -avg_nanosec_per_positive_lookup 1034.49 -avg_nanosec_per_negative_lookup 896.958 -avg_nanosec_per_positive_lookup_advanced 1014.59 -avg_nanosec_per_negative_lookup_advanced 890.945 -avg_nanosec_per_access 377.176 -iterator: avg_nanosec_per_kmer 19.9634 -avg_nanosec_per_positive_lookup 972.898 -avg_nanosec_per_negative_lookup 1060.07 -avg_nanosec_per_positive_lookup_advanced 960.465 -avg_nanosec_per_negative_lookup_advanced 1061.94 -avg_nanosec_per_access 320.355 -iterator: avg_nanosec_per_kmer 19.891 -avg_nanosec_per_positive_lookup 1409.64 -avg_nanosec_per_negative_lookup 1217.53 -avg_nanosec_per_positive_lookup_advanced 1396.28 -avg_nanosec_per_negative_lookup_advanced 1220.85 -avg_nanosec_per_access 496.434 -iterator: avg_nanosec_per_kmer 19.9095 diff --git a/benchmarks/results-22-08-25/k63/22-08-25.regular.build_log b/benchmarks/results-22-08-25/k63/22-08-25.regular.build_log deleted file mode 100644 index ac3c70d..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.regular.build_log +++ /dev/null @@ -1,369 +0,0 @@ -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding_input' 3.10708 [sec] (5.58238 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 1.56406 [sec] (2.81009 [ns/kmer]) -=== step 1: 'parse_file' 4.67165 [sec] (8.39341 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.bin' -num_minimizers = 24248598 -num_minimizer_positions = 27934907 -num_super_kmers = 27934907 -building minimizers MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 3.46371 [sec] (6.22314 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 1.76154 [sec] (3.16489 [ns/kmer]) -bits_per_offset = ceil(log2(621649142)) = 30 -reading from 'tmp_dir/sshash.tmp.run_1755933599801487843.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933609722074208.bucket_pairs.0.bin'... -num_singletons 23245919/24248598 (95.865%) -building: 0.069716 [sec] -computing minimizers offsets: 0.113133 [sec] -encoding: 0.008816 [sec] -=== step 3: 'build_sparse_index' 0.316554 [sec] (0.568743 [ns/kmer]) -max_bucket_size 125977 -log2_max_bucket_size 17 -num_buckets_in_skew_index 3708/24248598 (0.0152916%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3934591 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2384651 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1364707 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1027535 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 960390 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1043360 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 125977: 2191893 -num_kmers_in_skew_index 12907127 (2.31898%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3934591 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3934591 kmers; bits/key = 2.76002 - built positions[0] for 3934591 kmers; bits/key = 7.00008 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2384651 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2384651)... - built mphs[1] for 2384651 kmers; bits/key = 2.34627 - built positions[1] for 2384651 kmers; bits/key = 8.00015 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1364707 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1364707)... - built mphs[2] for 1364707 kmers; bits/key = 2.3775 - built positions[2] for 1364707 kmers; bits/key = 9.00024 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1027535 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1027535)... - built mphs[3] for 1027535 kmers; bits/key = 2.35714 - built positions[3] for 1027535 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 960390 - building MPHF with 8 threads and 1 partitions (avg. partition size = 960390)... - built mphs[4] for 960390 kmers; bits/key = 2.36344 - built positions[4] for 960390 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1043360 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1043360)... - built mphs[5] for 1043360 kmers; bits/key = 2.3558 - built positions[5] for 1043360 kmers; bits/key = 12.0003 - lower = 4096; upper = 125977; num_bits_per_pos = 17; num_kmers_in_partition = 2191893 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2191893)... - built mphs[6] for 2191893 kmers; bits/key = 2.349 - built positions[6] for 2191893 kmers; bits/key = 17.0002 -num_bits_for_skew_index 161524192(0.290205 [bits/kmer]) -=== step 4: 'build_skew_index' 11.9882 [sec] (21.5388 [ns/kmer]) -=== total_time 22.2016 [sec] (39.889 [ns/kmer]) -total index size: 295698804 [B] -- 295.699 [MB] -SPACE BREAKDOWN: - minimizers: 0.122343 [bits/kmer] (2.80819 [bits/key]) -- 2.87855% - pieces: 0.0233256 [bits/kmer] -- 0.548814% - sizes: 0.0748157 [bits/kmer] -- 1.76029% - offsets: 1.50569 [bits/kmer] -- 35.4266% - strings: 2.2338 [bits/kmer] -- 52.5576% - skew_index: 0.290205 [bits/kmer] -- 6.82807% - weights: 2.6447e-06 [bits/kmer] -- 6.22255e-05% - -------------- - total: 4.25018 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.865% -buckets with 2 minimizer positions = 2.37909% -buckets with 3 minimizer positions = 0.729951% -buckets with 4 minimizer positions = 0.320592% -buckets with 5 minimizer positions = 0.176509% -buckets with 6 minimizer positions = 0.110357% -buckets with 7 minimizer positions = 0.0750971% -buckets with 8 minimizer positions = 0.0535371% -buckets with 9 minimizer positions = 0.0403364% -buckets with 10 minimizer positions = 0.0317585% -buckets with 11 minimizer positions = 0.0251602% -buckets with 12 minimizer positions = 0.0203888% -buckets with 13 minimizer positions = 0.0167927% -buckets with 14 minimizer positions = 0.0142235% -buckets with 15 minimizer positions = 0.0120502% -buckets with 16 minimizer positions = 0.0107346% -max_bucket_size 125977 -2025-08-23 09:20:22: saving data structure to disk... -2025-08-23 09:20:22: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding_input' 5.86916 [sec] (5.08042 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 3.06841 [sec] (2.65605 [ns/kmer]) -=== step 1: 'parse_file' 8.93806 [sec] (7.73691 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.bin' -num_super_kmers = 50000000 -num_minimizers = 55336139 -num_minimizer_positions = 55891145 -num_super_kmers = 55891145 -building minimizers MPHF with 8 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 6.75738 [sec] (5.84928 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 2.92471 [sec] (2.53167 [ns/kmer]) -bits_per_offset = ceil(log2(1165088891)) = 31 -reading from 'tmp_dir/sshash.tmp.run_1755933622178164247.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933640842386460.bucket_pairs.0.bin'... -num_singletons 55120943/55336139 (99.6111%) -building: 0.140172 [sec] -computing minimizers offsets: 0.126715 [sec] -encoding: 0.001673 [sec] -=== step 3: 'build_sparse_index' 0.451677 [sec] (0.390977 [ns/kmer]) -max_bucket_size 2412 -log2_max_bucket_size 12 -num_buckets_in_skew_index 483/55336139 (0.000872847%) -num_partitions 6 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 558629 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 454245 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 172997 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 117563 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 24468 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2412: 34188 -num_kmers_in_skew_index 1362090 (0.117904%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 558629 - building MPHF with 8 threads and 1 partitions (avg. partition size = 558629)... - built mphs[0] for 558629 kmers; bits/key = 2.42488 - built positions[0] for 558629 kmers; bits/key = 7.00068 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 454245 - building MPHF with 8 threads and 1 partitions (avg. partition size = 454245)... - built mphs[1] for 454245 kmers; bits/key = 2.35556 - built positions[1] for 454245 kmers; bits/key = 8.00076 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 172997 - building MPHF with 8 threads and 1 partitions (avg. partition size = 172997)... - built mphs[2] for 172997 kmers; bits/key = 2.50881 - built positions[2] for 172997 kmers; bits/key = 9.00196 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 117563 - building MPHF with 8 threads and 1 partitions (avg. partition size = 117563)... - built mphs[3] for 117563 kmers; bits/key = 2.6113 - built positions[3] for 117563 kmers; bits/key = 10.0031 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 24468 - building MPHF with 8 threads and 1 partitions (avg. partition size = 24468)... - built mphs[4] for 24468 kmers; bits/key = 3.11329 - built positions[4] for 24468 kmers; bits/key = 11.0145 - lower = 2048; upper = 2412; num_bits_per_pos = 12; num_kmers_in_partition = 34188 - building MPHF with 8 threads and 1 partitions (avg. partition size = 34188)... - built mphs[5] for 34188 kmers; bits/key = 2.92079 - built positions[5] for 34188 kmers; bits/key = 12.0108 -num_bits_for_skew_index 14300368(0.0123786 [bits/kmer]) -=== step 4: 'build_skew_index' 2.03785 [sec] (1.76399 [ns/kmer]) -=== total_time 21.1097 [sec] (18.2728 [ns/kmer]) -total index size: 539043674 [B] -- 539.044 [MB] -SPACE BREAKDOWN: - minimizers: 0.126057 [bits/kmer] (2.63168 [bits/key]) -- 3.37698% - pieces: 0.00224854 [bits/kmer] -- 0.060237% - sizes: 0.0753247 [bits/kmer] -- 2.0179% - offsets: 1.49978 [bits/kmer] -- 40.1782% - strings: 2.01703 [bits/kmer] -- 54.035% - skew_index: 0.0123786 [bits/kmer] -- 0.331614% - weights: 1.27418e-06 [bits/kmer] -- 3.41345e-05% - -------------- - total: 3.73283 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.6111% -buckets with 2 minimizer positions = 0.265087% -buckets with 3 minimizer positions = 0.0543786% -buckets with 4 minimizer positions = 0.0223181% -buckets with 5 minimizer positions = 0.0120283% -buckets with 6 minimizer positions = 0.00758456% -buckets with 7 minimizer positions = 0.00500216% -buckets with 8 minimizer positions = 0.00356367% -buckets with 9 minimizer positions = 0.0027848% -buckets with 10 minimizer positions = 0.00213423% -buckets with 11 minimizer positions = 0.00165895% -buckets with 12 minimizer positions = 0.00135897% -buckets with 13 minimizer positions = 0.00110778% -buckets with 14 minimizer positions = 0.0010373% -buckets with 15 minimizer positions = 0.000778876% -buckets with 16 minimizer positions = 0.000674062% -max_bucket_size 2412 -2025-08-23 09:20:43: saving data structure to disk... -2025-08-23 09:20:43: DONE -k = 63, m = 25, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, l = 6, lambda = 7, canonical = false, weighted = false, verbose = true -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding_input' 14.9665 [sec] (5.40151 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.6.bin'... -=== step 1.2: 'computing_minimizers_tuples' 6.68663 [sec] (2.41324 [ns/kmer]) -=== step 1: 'parse_file' 21.6571 [sec] (7.81617 [ns/kmer]) - == files to merge = 7 -saving tuples to 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_minimizers = 123313717 -num_minimizer_positions = 141776281 -num_super_kmers = 141776281 -building minimizers MPHF with 8 threads and 42 partitions (avg. partition size = 3000000)... -=== step 2: 'build_minimizers' 15.2699 [sec] (5.51099 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.0.bin'... -=== step 2.1: 're-sorting minimizers tuples' 7.31977 [sec] (2.64174 [ns/kmer]) -bits_per_offset = ceil(log2(2961741363)) = 32 -reading from 'tmp_dir/sshash.tmp.run_1755933643610613567.minimizers.bin'... -sorting buffer... -saving to file 'tmp_dir/sshash.tmp.run_1755933687969368724.bucket_pairs.0.bin'... -num_singletons 119993445/123313717 (97.3075%) -building: 0.337069 [sec] -computing minimizers offsets: 0.265635 [sec] -encoding: 0.030089 [sec] -=== step 3: 'build_sparse_index' 1.19223 [sec] (0.430283 [ns/kmer]) -max_bucket_size 57745 -log2_max_bucket_size 16 -num_buckets_in_skew_index 29393/123313717 (0.023836%) -num_partitions 7 -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25252953 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22813094 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 20384491 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17949961 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17766307 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14306293 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 57745: 23435747 -num_kmers_in_skew_index 141908846 (5.12157%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25252953 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 25252953 kmers; bits/key = 2.40003 - built positions[0] for 25252953 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 22813094 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 22813094 kmers; bits/key = 2.4057 - built positions[1] for 22813094 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 20384491 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 20384491 kmers; bits/key = 2.38124 - built positions[2] for 20384491 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17949961 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[3] for 17949961 kmers; bits/key = 2.33793 - built positions[3] for 17949961 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17766307 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17766307 kmers; bits/key = 2.35372 - built positions[4] for 17766307 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14306293 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 14306293 kmers; bits/key = 2.4122 - built positions[5] for 14306293 kmers; bits/key = 12 - lower = 4096; upper = 57745; num_bits_per_pos = 16; num_kmers_in_partition = 23435747 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[6] for 23435747 kmers; bits/key = 2.37151 - built positions[6] for 23435747 kmers; bits/key = 16 -num_bits_for_skew_index 1802215056(0.650429 [bits/kmer]) -=== step 4: 'build_skew_index' 40.6604 [sec] (14.6746 [ns/kmer]) -=== total_time 86.0994 [sec] (31.0737 [ns/kmer]) -total index size: 1604769320 [B] -- 1604.77 [MB] -SPACE BREAKDOWN: - minimizers: 0.116538 [bits/kmer] (2.61856 [bits/key]) -- 2.5152% - pieces: 0.015002 [bits/kmer] -- 0.323782% - sizes: 0.0762021 [bits/kmer] -- 1.64464% - offsets: 1.63737 [bits/kmer] -- 35.3387% - strings: 2.13782 [bits/kmer] -- 46.1397% - skew_index: 0.650429 [bits/kmer] -- 14.038% - weights: 5.31253e-07 [bits/kmer] -- 1.14658e-05% - -------------- - total: 4.63336 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.3075% -buckets with 2 minimizer positions = 1.58914% -buckets with 3 minimizer positions = 0.42399% -buckets with 4 minimizer positions = 0.18754% -buckets with 5 minimizer positions = 0.106614% -buckets with 6 minimizer positions = 0.0690572% -buckets with 7 minimizer positions = 0.0483636% -buckets with 8 minimizer positions = 0.0358646% -buckets with 9 minimizer positions = 0.0274284% -buckets with 10 minimizer positions = 0.0217713% -buckets with 11 minimizer positions = 0.0177231% -buckets with 12 minimizer positions = 0.014541% -buckets with 13 minimizer positions = 0.0122655% -buckets with 14 minimizer positions = 0.010633% -buckets with 15 minimizer positions = 0.00920011% -buckets with 16 minimizer positions = 0.00797721% -max_bucket_size 57745 -2025-08-23 09:22:09: saving data structure to disk... -2025-08-23 09:22:10: DONE diff --git a/benchmarks/results-22-08-25/k63/22-08-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-08-25/k63/22-08-25.regular.high-hit.streaming_query_log deleted file mode 100644 index 7f05e44..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-23 09:30:11: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-23 09:30:29: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 17741.3 millisec / 17.7413 sec / 0.295688 min / 181.084 ns/kmer -2025-08-23 09:30:29: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-23 09:31:43: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 74173.7 millisec / 74.1737 sec / 1.23623 min / 160.764 ns/kmer -2025-08-23 09:31:44: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-08-23 09:34:26: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 162745 millisec / 162.745 sec / 2.71242 min / 340.6 ns/kmer diff --git a/benchmarks/results-22-08-25/k63/22-08-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-08-25/k63/22-08-25.regular.low-hit.streaming_query_log deleted file mode 100644 index 248d810..0000000 --- a/benchmarks/results-22-08-25/k63/22-08-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-08-23 09:38:00: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-08-23 09:38:47: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 47146.1 millisec / 47.1461 sec / 0.785768 min / 102.184 ns/kmer -2025-08-23 09:38:47: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-08-23 09:38:53: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 5930.07 millisec / 5.93008 sec / 0.0988346 min / 60.528 ns/kmer -2025-08-23 09:38:54: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-08-23 09:39:25: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 30772.8 millisec / 30.7728 sec / 0.512881 min / 95.5424 ns/kmer diff --git a/benchmarks/results-22-08-25/results.png b/benchmarks/results-22-08-25/results.png deleted file mode 100644 index bc4ec170792d1e1a78df4cbf88640e378295b2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333308 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 X`R$}zN8F(=A5cH1rIMp`-S2+@Yq302 diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log deleted file mode 100644 index b3a922d..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.canon.bench_log +++ /dev/null @@ -1,15 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 535.238 -lookup_uint: avg_nanosec_per_positive_lookup 507.966 -avg_nanosec_per_negative_lookup 374.646 -avg_nanosec_per_access 352.13 -iterator: avg_nanosec_per_kmer 20.1425 -lookup: avg_nanosec_per_positive_lookup 503.807 -lookup_uint: avg_nanosec_per_positive_lookup 480.337 -avg_nanosec_per_negative_lookup 406.413 -avg_nanosec_per_access 371.677 -iterator: avg_nanosec_per_kmer 20.0371 -lookup: avg_nanosec_per_positive_lookup 702.591 -lookup_uint: avg_nanosec_per_positive_lookup 679.425 -avg_nanosec_per_negative_lookup 427.235 -avg_nanosec_per_access 510.499 -iterator: avg_nanosec_per_kmer 20.1687 diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log deleted file mode 100644 index 75a0091..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.canon.build_log +++ /dev/null @@ -1,530 +0,0 @@ -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding input' 2.31093 [sec] (4.59918 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 2.1582 [sec] (4.29522 [ns/kmer]) -=== step 1: 'parse file' 4.46929 [sec] (8.89474 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 4.41628 [sec] (8.78923 [ns/kmer]) -num_minimizers = 79426371 -num_minimizer_positions = 88821250 -num_super_kmers = 92441796 -building minimizers MPHF with 8 threads and 27 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.3561 [sec] (10.6596 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758544918132373232.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75659 [sec] (7.47633 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.02586 [sec] (2.04166 [ns/kmer]) -num_bits_per_offset = ceil(log2(574653302)) = 30 -max_bucket_size 155775 -log2_max_bucket_size 18 -num_buckets_larger_than_1_not_in_skew_index 3198593/79426371 (4.02712%) -num_buckets_in_skew_index 7428/79426371 (0.00935206%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 10916988/88821250 (12.291%) -num_minimizer_positions_of_buckets_in_skew_index 1683912/88821250 (1.89584%) -computing minimizers offsets: 1.30397 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2268785 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1392132 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1162932 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 935073 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 655983 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 438277 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 431217 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 155775: 832367 -num_kmers_in_skew_index 8116766 (1.61539%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2268785 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2268785)... - built mphs[0] for 2268785 kmers; bits/key = 2.56 - built positions[0] for 2268785 kmers; bits/key = 7.00016 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1392132 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1392132)... - built mphs[1] for 1392132 kmers; bits/key = 2.5606 - built positions[1] for 1392132 kmers; bits/key = 8.00025 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1162932 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1162932)... - built mphs[2] for 1162932 kmers; bits/key = 2.56092 - built positions[2] for 1162932 kmers; bits/key = 9.00031 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 935073 - building MPHF with 8 threads and 1 partitions (avg. partition size = 935073)... - built mphs[3] for 935073 kmers; bits/key = 2.4185 - built positions[3] for 935073 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 655983 - building MPHF with 8 threads and 1 partitions (avg. partition size = 655983)... - built mphs[4] for 655983 kmers; bits/key = 2.56224 - built positions[4] for 655983 kmers; bits/key = 11.0006 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 438277 - building MPHF with 8 threads and 1 partitions (avg. partition size = 438277)... - built mphs[5] for 438277 kmers; bits/key = 2.56404 - built positions[5] for 438277 kmers; bits/key = 12.0007 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 431217 - building MPHF with 8 threads and 1 partitions (avg. partition size = 431217)... - built mphs[6] for 431217 kmers; bits/key = 2.42117 - built positions[6] for 431217 kmers; bits/key = 13.0007 - lower = 8192; upper = 155775; num_bits_per_pos = 18; num_kmers_in_partition = 832367 - building MPHF with 8 threads and 1 partitions (avg. partition size = 832367)... - built mphs[7] for 832367 kmers; bits/key = 2.41872 - built positions[7] for 832367 kmers; bits/key = 18.0004 -computing skew index took: 6.32683 [sec] -=== step 3: 'build sparse and skew index' 7.70924 [sec] (15.3428 [ns/kmer]) -=== total_time 26.7334 [sec] (53.2044 [ns/kmer]) -total index size: 549290580 [B] -- 549.291 [MB] -SPACE BREAKDOWN: - minimizers: 0.452782 [bits/kmer] (2.86438 [bits/key]) -- 5.1773% - strings_endpoints: 0.153015 [bits/kmer] -- 1.74964% - offsets: 4.90028 [bits/kmer] -- 56.0318% - offsets2: 0.651806 [bits/kmer] -- 7.45302% - offsets3: 0.10054 [bits/kmer] -- 1.14961% - start_lists_of_size: 4.26696e-06 [bits/kmer] -- 4.87902e-05% - strings: 2.28734 [bits/kmer] -- 26.1543% - skew_index: 0.199768 [bits/kmer] -- 2.28423% - weights: 2.92956e-06 [bits/kmer] -- 3.34978e-05% - -------------- - total: 8.74553 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9635% -buckets with 2 minimizer positions = 2.5093% -buckets with 3 minimizer positions = 0.679399% -buckets with 4 minimizer positions = 0.290103% -buckets with 5 minimizer positions = 0.153452% -buckets with 6 minimizer positions = 0.0927941% -buckets with 7 minimizer positions = 0.0610528% -buckets with 8 minimizer positions = 0.0427541% -buckets with 9 minimizer positions = 0.0312239% -buckets with 10 minimizer positions = 0.0239568% -buckets with 11 minimizer positions = 0.0190289% -buckets with 12 minimizer positions = 0.0152078% -buckets with 13 minimizer positions = 0.0127741% -buckets with 14 minimizer positions = 0.0104008% -buckets with 15 minimizer positions = 0.00880816% -buckets with 16 minimizer positions = 0.00755039% -max_bucket_size 155775 -2025-09-22 14:42:25: saving data structure to disk... -2025-09-22 14:42:25: DONE -k = 31, m = 19, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding input' 4.31978 [sec] (3.75502 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 5.09074 [sec] (4.4252 [ns/kmer]) -=== step 1: 'parse file' 9.41073 [sec] (8.1804 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 9.73956 [sec] (8.46624 [ns/kmer]) -num_minimizers = 193802281 -num_minimizer_positions = 200287417 -num_super_kmers = 208975066 -building minimizers MPHF with 8 threads and 65 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 12.7565 [sec] (11.0887 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758544945308198938.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.57548 [sec] (7.45435 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 9.391 [sec] (8.16325 [ns/kmer]) -num_bits_per_offset = ceil(log2(1170866587)) = 31 -max_bucket_size 3788 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 3847569/193802281 (1.98531%) -num_buckets_in_skew_index 3592/193802281 (0.00185344%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 9809818/200287417 (4.89787%) -num_minimizer_positions_of_buckets_in_skew_index 526479/200287417 (0.262862%) -computing minimizers offsets: 2.2088 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1179637 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 821390 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 443904 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 212956 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 176522 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3788: 79585 -num_kmers_in_skew_index 2913994 (0.253303%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1179637 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1179637)... - built mphs[0] for 1179637 kmers; bits/key = 2.56086 - built positions[0] for 1179637 kmers; bits/key = 7.00028 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 821390 - building MPHF with 8 threads and 1 partitions (avg. partition size = 821390)... - built mphs[1] for 821390 kmers; bits/key = 2.56173 - built positions[1] for 821390 kmers; bits/key = 8.00041 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 443904 - building MPHF with 8 threads and 1 partitions (avg. partition size = 443904)... - built mphs[2] for 443904 kmers; bits/key = 2.42106 - built positions[2] for 443904 kmers; bits/key = 9.00072 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 212956 - building MPHF with 8 threads and 1 partitions (avg. partition size = 212956)... - built mphs[3] for 212956 kmers; bits/key = 2.42657 - built positions[3] for 212956 kmers; bits/key = 10.0017 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 176522 - building MPHF with 8 threads and 1 partitions (avg. partition size = 176522)... - built mphs[4] for 176522 kmers; bits/key = 2.42852 - built positions[4] for 176522 kmers; bits/key = 11.0019 - lower = 2048; upper = 3788; num_bits_per_pos = 12; num_kmers_in_partition = 79585 - building MPHF with 8 threads and 1 partitions (avg. partition size = 79585)... - built mphs[5] for 79585 kmers; bits/key = 2.44287 - built positions[5] for 79585 kmers; bits/key = 12.0047 -computing skew index took: 2.32617 [sec] -=== step 3: 'build sparse and skew index' 4.70918 [sec] (4.09352 [ns/kmer]) -=== total_time 54.5824 [sec] (47.4465 [ns/kmer]) -total index size: 1195312570 [B] -- 1195.31 [MB] -SPACE BREAKDOWN: - minimizers: 0.479119 [bits/kmer] (2.84403 [bits/key]) -- 5.76396% - strings_endpoints: 0.10109 [bits/kmer] -- 1.21614% - offsets: 5.39089 [bits/kmer] -- 64.8541% - offsets2: 0.264347 [bits/kmer] -- 3.18018% - offsets3: 0.0141874 [bits/kmer] -- 0.170679% - start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.24209e-05% - strings: 2.03558 [bits/kmer] -- 24.4887% - skew_index: 0.0271139 [bits/kmer] -- 0.326189% - weights: 1.27956e-06 [bits/kmer] -- 1.53935e-05% - -------------- - total: 8.31233 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 98.0128% -buckets with 2 minimizer positions = 1.66457% -buckets with 3 minimizer positions = 0.165762% -buckets with 4 minimizer positions = 0.0545515% -buckets with 5 minimizer positions = 0.0276849% -buckets with 6 minimizer positions = 0.0167021% -buckets with 7 minimizer positions = 0.0112088% -buckets with 8 minimizer positions = 0.00793438% -buckets with 9 minimizer positions = 0.00591686% -buckets with 10 minimizer positions = 0.00451181% -buckets with 11 minimizer positions = 0.00358923% -buckets with 12 minimizer positions = 0.00282092% -buckets with 13 minimizer positions = 0.00235962% -buckets with 14 minimizer positions = 0.00195251% -buckets with 15 minimizer positions = 0.00164394% -buckets with 16 minimizer positions = 0.00140556% -max_bucket_size 3788 -2025-09-22 14:43:20: saving data structure to disk... -2025-09-22 14:43:20: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding input' 11.3953 [sec] (4.54823 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.13.bin'... -=== step 1.2: 'computing minimizers tuples' 11.5039 [sec] (4.59155 [ns/kmer]) -=== step 1: 'parse file' 22.8994 [sec] (9.13984 [ns/kmer]) - == files to merge = 14 -saving tuples to 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.1: 'merging minimizers tuples' 27.5279 [sec] (10.9872 [ns/kmer]) -num_minimizers = 417553335 -num_minimizer_positions = 474828363 -num_super_kmers = 493836140 -building minimizers MPHF with 8 threads and 140 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 27.7076 [sec] (11.0589 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 20.5021 [sec] (8.18299 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1758545000812468429.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -=== step 2.4: 'merging minimizers tuples ' 35.7576 [sec] (14.272 [ns/kmer]) -num_bits_per_offset = ceil(log2(2895872213)) = 32 -max_bucket_size 33191 -log2_max_bucket_size 16 -num_buckets_larger_than_1_not_in_skew_index 16634505/417553335 (3.9838%) -num_buckets_in_skew_index 75846/417553335 (0.0181644%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 59861399/474828363 (12.607%) -num_minimizer_positions_of_buckets_in_skew_index 14123980/474828363 (2.97454%) -computing minimizers offsets: 6.66934 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 18483007 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 14289333 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 10220043 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 7256268 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4841792 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2658327 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1446373 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 33191: 1382491 -num_kmers_in_skew_index 60577634 (2.41784%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 18483007 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[0] for 18483007 kmers; bits/key = 2.64291 - built positions[0] for 18483007 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 14289333 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[1] for 14289333 kmers; bits/key = 2.51635 - built positions[1] for 14289333 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 10220043 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[2] for 10220043 kmers; bits/key = 2.63949 - built positions[2] for 10220043 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 7256268 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 7256268 kmers; bits/key = 2.72044 - built positions[3] for 7256268 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4841792 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4841792 kmers; bits/key = 2.71841 - built positions[4] for 4841792 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2658327 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2658327)... - built mphs[5] for 2658327 kmers; bits/key = 2.55987 - built positions[5] for 2658327 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1446373 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1446373)... - built mphs[6] for 1446373 kmers; bits/key = 2.56056 - built positions[6] for 1446373 kmers; bits/key = 13.0002 - lower = 8192; upper = 33191; num_bits_per_pos = 16; num_kmers_in_partition = 1382491 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1382491)... - built mphs[7] for 1382491 kmers; bits/key = 2.5606 - built positions[7] for 1382491 kmers; bits/key = 16.0002 -computing skew index took: 14.7756 [sec] -=== step 3: 'build sparse and skew index' 21.8723 [sec] (8.72991 [ns/kmer]) -=== total_time 156.267 [sec] (62.3709 [ns/kmer]) -total index size: 3029549959 [B] -- 3029.55 [MB] -SPACE BREAKDOWN: - minimizers: 0.473465 [bits/kmer] (2.84093 [bits/key]) -- 4.89446% - strings_endpoints: 0.167061 [bits/kmer] -- 1.727% - offsets: 5.49972 [bits/kmer] -- 56.8536% - offsets2: 0.764561 [bits/kmer] -- 7.90367% - offsets3: 0.180394 [bits/kmer] -- 1.86483% - start_lists_of_size: 8.55736e-07 [bits/kmer] -- 8.8462e-06% - strings: 2.31166 [bits/kmer] -- 23.8969% - skew_index: 0.27662 [bits/kmer] -- 2.85957% - weights: 5.8752e-07 [bits/kmer] -- 6.07351e-06% - -------------- - total: 9.67349 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.998% -buckets with 2 minimizer positions = 2.57019% -buckets with 3 minimizer positions = 0.580253% -buckets with 4 minimizer positions = 0.252657% -buckets with 5 minimizer positions = 0.141401% -buckets with 6 minimizer positions = 0.0899801% -buckets with 7 minimizer positions = 0.0622388% -buckets with 8 minimizer positions = 0.0453985% -buckets with 9 minimizer positions = 0.0345565% -buckets with 10 minimizer positions = 0.0272049% -buckets with 11 minimizer positions = 0.0217699% -buckets with 12 minimizer positions = 0.0179227% -buckets with 13 minimizer positions = 0.0150204% -buckets with 14 minimizer positions = 0.0126494% -buckets with 15 minimizer positions = 0.0108367% -buckets with 16 minimizer positions = 0.00935378% -max_bucket_size 33191 -2025-09-22 14:45:57: saving data structure to disk... -2025-09-22 14:45:58: DONE diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log deleted file mode 100644 index da1388b..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-22 14:47:56: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-22 14:48:03: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 7116.47 millisec / 7.11647 sec / 0.118608 min / 43.5825 ns/kmer -2025-09-22 14:48:04: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-22 14:48:48: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 44111.6 millisec / 44.1116 sec / 0.735193 min / 63.4026 ns/kmer -2025-09-22 14:48:49: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-22 14:51:29: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 159868 millisec / 159.868 sec / 2.66446 min / 101.828 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log deleted file mode 100644 index 1f00751..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-22 14:51:29: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-22 14:52:36: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 66567.4 millisec / 66.5674 sec / 1.10946 min / 95.6788 ns/kmer -2025-09-22 14:52:36: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-22 14:52:43: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 6415.18 millisec / 6.41517 sec / 0.10692 min / 39.2876 ns/kmer -2025-09-22 14:52:44: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-22 14:53:20: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 35571.2 millisec / 35.5712 sec / 0.592854 min / 89.955 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log deleted file mode 100644 index b3fc097..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.regular.bench_log +++ /dev/null @@ -1,16 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 657.587 -lookup_uint: avg_nanosec_per_positive_lookup 606.03 -avg_nanosec_per_negative_lookup 638.93 -avg_nanosec_per_access 353.624 -iterator: avg_nanosec_per_kmer 20.1514 -lookup: avg_nanosec_per_positive_lookup 635.15 -lookup_uint: avg_nanosec_per_positive_lookup 580.118 -avg_nanosec_per_negative_lookup 690.095 -avg_nanosec_per_access 371.206 -iterator: avg_nanosec_per_kmer 20.019 -lookup: avg_nanosec_per_positive_lookup 880.499 -lookup_uint: avg_nanosec_per_positive_lookup 827.422 -avg_nanosec_per_negative_lookup 744.67 -avg_nanosec_per_access 512.398 -iterator: avg_nanosec_per_kmer 20.1606 - diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log deleted file mode 100644 index db48c82..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.regular.build_log +++ /dev/null @@ -1,510 +0,0 @@ -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 27657185 bases, 24657215 kmers -read 200000 sequences, 54659411 bases, 48659441 kmers -read 300000 sequences, 82042065 bases, 73042095 kmers -read 400000 sequences, 109137740 bases, 97137770 kmers -read 500000 sequences, 135591611 bases, 120591641 kmers -read 600000 sequences, 162605989 bases, 144606019 kmers -read 700000 sequences, 189421730 bases, 168421760 kmers -read 800000 sequences, 214809276 bases, 190809306 kmers -read 900000 sequences, 240465564 bases, 213465594 kmers -read 1000000 sequences, 265968295 bases, 235968325 kmers -read 1100000 sequences, 291953235 bases, 258953265 kmers -read 1200000 sequences, 316684260 bases, 280684290 kmers -read 1300000 sequences, 341304215 bases, 302304245 kmers -read 1400000 sequences, 365519325 bases, 323519355 kmers -read 1500000 sequences, 388985606 bases, 343985636 kmers -read 1600000 sequences, 411705914 bases, 363705944 kmers -read 1700000 sequences, 434632801 bases, 383632831 kmers -read 1800000 sequences, 456140575 bases, 402140605 kmers -read 1900000 sequences, 477396896 bases, 420396926 kmers -read 2000000 sequences, 498761432 bases, 438761462 kmers -read 2100000 sequences, 518417062 bases, 455417092 kmers -read 2200000 sequences, 537930862 bases, 471930892 kmers -read 2300000 sequences, 556305688 bases, 487305718 kmers -read 2400000 sequences, 573938040 bases, 501938070 kmers -=== step 1.1: 'encoding input' 2.26235 [sec] (4.5025 [ns/kmer]) -read 2406269 sequences, 574653270 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.287336 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.52123 [sec] (3.02753 [ns/kmer]) -=== step 1: 'parse file' 3.78371 [sec] (7.5303 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 3.74893 [sec] (7.46107 [ns/kmer]) -num_minimizers = 72390526 -num_minimizer_positions = 78741053 -num_super_kmers = 78741053 -building minimizers MPHF with 8 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 4.99695 [sec] (9.94488 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758534223925892631.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.21692 [sec] (6.40227 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.969803 [sec] (1.93009 [ns/kmer]) -num_bits_per_offset = ceil(log2(574653302)) = 30 -max_bucket_size 69558 -log2_max_bucket_size 17 -num_buckets_larger_than_1_not_in_skew_index 2336498/72390526 (3.22763%) -num_buckets_in_skew_index 4518/72390526 (0.00624115%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 7623230/78741053 (9.68139%) -num_minimizer_positions_of_buckets_in_skew_index 1068313/78741053 (1.35674%) -computing minimizers offsets: 0.979831 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1245692 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1024068 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 712068 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 409910 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 444216 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 285146 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 261943 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 69558: 486183 -num_kmers_in_skew_index 4869226 (0.969067%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1245692 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1245692)... - built mphs[0] for 1245692 kmers; bits/key = 2.41792 - built positions[0] for 1245692 kmers; bits/key = 7.00028 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1024068 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1024068)... - built mphs[1] for 1024068 kmers; bits/key = 2.56119 - built positions[1] for 1024068 kmers; bits/key = 8.00034 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 712068 - building MPHF with 8 threads and 1 partitions (avg. partition size = 712068)... - built mphs[2] for 712068 kmers; bits/key = 2.41921 - built positions[2] for 712068 kmers; bits/key = 9.00049 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 409910 - building MPHF with 8 threads and 1 partitions (avg. partition size = 409910)... - built mphs[3] for 409910 kmers; bits/key = 2.42137 - built positions[3] for 409910 kmers; bits/key = 10.0009 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 444216 - building MPHF with 8 threads and 1 partitions (avg. partition size = 444216)... - built mphs[4] for 444216 kmers; bits/key = 2.56391 - built positions[4] for 444216 kmers; bits/key = 11.0008 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 285146 - building MPHF with 8 threads and 1 partitions (avg. partition size = 285146)... - built mphs[5] for 285146 kmers; bits/key = 2.5666 - built positions[5] for 285146 kmers; bits/key = 12.0012 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 261943 - building MPHF with 8 threads and 1 partitions (avg. partition size = 261943)... - built mphs[6] for 261943 kmers; bits/key = 2.42416 - built positions[6] for 261943 kmers; bits/key = 13.0014 - lower = 8192; upper = 69558; num_bits_per_pos = 17; num_kmers_in_partition = 486183 - building MPHF with 8 threads and 1 partitions (avg. partition size = 486183)... - built mphs[7] for 486183 kmers; bits/key = 2.42062 - built positions[7] for 486183 kmers; bits/key = 17.0007 -computing skew index took: 3.85367 [sec] -=== step 3: 'build sparse and skew index' 4.90973 [sec] (9.77129 [ns/kmer]) -=== total_time 21.6261 [sec] (43.0399 [ns/kmer]) -total index size: 500082250 [B] -- 500.082 [MB] -SPACE BREAKDOWN: - minimizers: 0.418287 [bits/kmer] (2.90335 [bits/key]) -- 5.25351% - strings_endpoints: 0.153015 [bits/kmer] -- 1.9218% - offsets: 4.46619 [bits/kmer] -- 56.0934% - offsets2: 0.45515 [bits/kmer] -- 5.71649% - offsets3: 0.063785 [bits/kmer] -- 0.801111% - start_lists_of_size: 4.26696e-06 [bits/kmer] -- 5.35912e-05% - strings: 2.28734 [bits/kmer] -- 28.7279% - skew_index: 0.118285 [bits/kmer] -- 1.48561% - weights: 2.92956e-06 [bits/kmer] -- 3.67939e-05% - -------------- - total: 7.96206 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.7661% -buckets with 2 minimizer positions = 2.08649% -buckets with 3 minimizer positions = 0.528401% -buckets with 4 minimizer positions = 0.211604% -buckets with 5 minimizer positions = 0.112209% -buckets with 6 minimizer positions = 0.0671649% -buckets with 7 minimizer positions = 0.0451164% -buckets with 8 minimizer positions = 0.0319876% -buckets with 9 minimizer positions = 0.0235431% -buckets with 10 minimizer positions = 0.0181944% -buckets with 11 minimizer positions = 0.0148058% -buckets with 12 minimizer positions = 0.0118427% -buckets with 13 minimizer positions = 0.0095413% -buckets with 14 minimizer positions = 0.00797204% -buckets with 15 minimizer positions = 0.00665557% -buckets with 16 minimizer positions = 0.00562228% -max_bucket_size 69558 -2025-09-22 11:44:05: saving data structure to disk... -2025-09-22 11:44:05: DONE -k = 31, m = 20, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 158452704 bases, 155452734 kmers -read 200000 sequences, 318155284 bases, 312155314 kmers -read 300000 sequences, 484429755 bases, 475429785 kmers -read 400000 sequences, 657902795 bases, 645902825 kmers -read 500000 sequences, 832407154 bases, 817407184 kmers -read 600000 sequences, 1004979671 bases, 986979701 kmers -=== step 1.1: 'encoding input' 4.28193 [sec] (3.72212 [ns/kmer]) -read 682245 sequences, 1170866555 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.035583 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 3.51667 [sec] (3.05691 [ns/kmer]) -=== step 1: 'parse file' 7.79875 [sec] (6.77917 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 8.13306 [sec] (7.06977 [ns/kmer]) -num_minimizers = 173245358 -num_minimizer_positions = 176049220 -num_super_kmers = 176049220 -building minimizers MPHF with 8 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 11.4833 [sec] (9.98201 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758534245955637334.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.21551 [sec] (6.27217 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.00477 [sec] (1.74268 [ns/kmer]) -num_bits_per_offset = ceil(log2(1170866587)) = 31 -max_bucket_size 4013 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 1346106/173245358 (0.776994%) -num_buckets_in_skew_index 1718/173245358 (0.000991657%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 3918362/176049220 (2.22572%) -num_minimizer_positions_of_buckets_in_skew_index 233324/176049220 (0.132533%) -computing minimizers offsets: 1.40661 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 585298 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 326635 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 158808 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 108589 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 32581 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4013: 37778 -num_kmers_in_skew_index 1249689 (0.108631%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 585298 - building MPHF with 8 threads and 1 partitions (avg. partition size = 585298)... - built mphs[0] for 585298 kmers; bits/key = 2.41983 - built positions[0] for 585298 kmers; bits/key = 7.00055 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 326635 - building MPHF with 8 threads and 1 partitions (avg. partition size = 326635)... - built mphs[1] for 326635 kmers; bits/key = 2.42277 - built positions[1] for 326635 kmers; bits/key = 8.0011 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 158808 - building MPHF with 8 threads and 1 partitions (avg. partition size = 158808)... - built mphs[2] for 158808 kmers; bits/key = 2.4294 - built positions[2] for 158808 kmers; bits/key = 9.00227 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 108589 - building MPHF with 8 threads and 1 partitions (avg. partition size = 108589)... - built mphs[3] for 108589 kmers; bits/key = 2.43546 - built positions[3] for 108589 kmers; bits/key = 10.0035 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 32581 - building MPHF with 8 threads and 1 partitions (avg. partition size = 32581)... - built mphs[4] for 32581 kmers; bits/key = 2.48341 - built positions[4] for 32581 kmers; bits/key = 11.0101 - lower = 2048; upper = 4013; num_bits_per_pos = 12; num_kmers_in_partition = 37778 - building MPHF with 8 threads and 1 partitions (avg. partition size = 37778)... - built mphs[5] for 37778 kmers; bits/key = 2.4734 - built positions[5] for 37778 kmers; bits/key = 12.0095 -computing skew index took: 0.993522 [sec] -=== step 3: 'build sparse and skew index' 2.54755 [sec] (2.21449 [ns/kmer]) -=== total_time 39.1829 [sec] (34.0603 [ns/kmer]) -total index size: 1079558752 [B] -- 1079.56 [MB] -SPACE BREAKDOWN: - minimizers: 0.428384 [bits/kmer] (2.84459 [bits/key]) -- 5.70618% - strings_endpoints: 0.10109 [bits/kmer] -- 1.34654% - offsets: 4.81907 [bits/kmer] -- 64.1912% - offsets2: 0.105589 [bits/kmer] -- 1.40647% - offsets3: 0.00628774 [bits/kmer] -- 0.0837542% - start_lists_of_size: 1.8637e-06 [bits/kmer] -- 2.4825e-05% - strings: 2.03558 [bits/kmer] -- 27.1145% - skew_index: 0.0113627 [bits/kmer] -- 0.151354% - weights: 1.27956e-06 [bits/kmer] -- 1.7044e-05% - -------------- - total: 7.50737 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.222% -buckets with 2 minimizer positions = 0.587049% -buckets with 3 minimizer positions = 0.0858742% -buckets with 4 minimizer positions = 0.0350243% -buckets with 5 minimizer positions = 0.0189223% -buckets with 6 minimizer positions = 0.011583% -buckets with 7 minimizer positions = 0.00779877% -buckets with 8 minimizer positions = 0.00559438% -buckets with 9 minimizer positions = 0.00408611% -buckets with 10 minimizer positions = 0.00312793% -buckets with 11 minimizer positions = 0.0024878% -buckets with 12 minimizer positions = 0.00196542% -buckets with 13 minimizer positions = 0.00159196% -buckets with 14 minimizer positions = 0.0013276% -buckets with 15 minimizer positions = 0.00114116% -buckets with 16 minimizer positions = 0.000962796% -max_bucket_size 4013 -2025-09-22 11:44:45: saving data structure to disk... -2025-09-22 11:44:45: DONE -k = 31, m = 21, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k31.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 21756494 bases, 18756524 kmers -read 200000 sequences, 43415082 bases, 37415112 kmers -read 300000 sequences, 65780160 bases, 56780190 kmers -read 400000 sequences, 87471486 bases, 75471516 kmers -read 500000 sequences, 109226866 bases, 94226896 kmers -read 600000 sequences, 131648019 bases, 113648049 kmers -read 700000 sequences, 153316395 bases, 132316425 kmers -read 800000 sequences, 176702606 bases, 152702636 kmers -read 900000 sequences, 198938131 bases, 171938161 kmers -read 1000000 sequences, 220949217 bases, 190949247 kmers -read 1100000 sequences, 244049472 bases, 211049502 kmers -read 1200000 sequences, 267074826 bases, 231074856 kmers -read 1300000 sequences, 288917293 bases, 249917323 kmers -read 1400000 sequences, 311411250 bases, 269411280 kmers -read 1500000 sequences, 333749577 bases, 288749607 kmers -read 1600000 sequences, 356425695 bases, 308425725 kmers -read 1700000 sequences, 378782863 bases, 327782893 kmers -read 1800000 sequences, 401743561 bases, 347743591 kmers -read 1900000 sequences, 424135183 bases, 367135213 kmers -read 2000000 sequences, 446879049 bases, 386879079 kmers -read 2100000 sequences, 468734269 bases, 405734299 kmers -read 2200000 sequences, 490603237 bases, 424603267 kmers -read 2300000 sequences, 513905163 bases, 444905193 kmers -read 2400000 sequences, 537439218 bases, 465439248 kmers -read 2500000 sequences, 560503353 bases, 485503383 kmers -read 2600000 sequences, 583973645 bases, 505973675 kmers -read 2700000 sequences, 606563596 bases, 525563626 kmers -read 2800000 sequences, 629471143 bases, 545471173 kmers -read 2900000 sequences, 653036453 bases, 566036483 kmers -read 3000000 sequences, 676313831 bases, 586313861 kmers -read 3100000 sequences, 700155099 bases, 607155129 kmers -read 3200000 sequences, 723256428 bases, 627256458 kmers -read 3300000 sequences, 745736801 bases, 646736831 kmers -read 3400000 sequences, 768718458 bases, 666718488 kmers -read 3500000 sequences, 791774449 bases, 686774479 kmers -read 3600000 sequences, 814593816 bases, 706593846 kmers -read 3700000 sequences, 838379879 bases, 727379909 kmers -read 3800000 sequences, 860634933 bases, 746634963 kmers -read 3900000 sequences, 884047075 bases, 767047105 kmers -read 4000000 sequences, 907479686 bases, 787479716 kmers -read 4100000 sequences, 930543338 bases, 807543368 kmers -read 4200000 sequences, 953267462 bases, 827267492 kmers -read 4300000 sequences, 976927833 bases, 847927863 kmers -read 4400000 sequences, 1000738248 bases, 868738278 kmers -read 4500000 sequences, 1024531209 bases, 889531239 kmers -read 4600000 sequences, 1047717223 bases, 909717253 kmers -read 4700000 sequences, 1071027493 bases, 930027523 kmers -read 4800000 sequences, 1094084552 bases, 950084582 kmers -read 4900000 sequences, 1117956137 bases, 970956167 kmers -read 5000000 sequences, 1141125024 bases, 991125054 kmers -read 5100000 sequences, 1164319107 bases, 1011319137 kmers -read 5200000 sequences, 1187390563 bases, 1031390593 kmers -read 5300000 sequences, 1211053129 bases, 1052053159 kmers -read 5400000 sequences, 1234026672 bases, 1072026702 kmers -read 5500000 sequences, 1257295769 bases, 1092295799 kmers -read 5600000 sequences, 1279760698 bases, 1111760728 kmers -read 5700000 sequences, 1303188807 bases, 1132188837 kmers -read 5800000 sequences, 1326902250 bases, 1152902280 kmers -read 5900000 sequences, 1350165652 bases, 1173165682 kmers -read 6000000 sequences, 1373185888 bases, 1193185918 kmers -read 6100000 sequences, 1396446455 bases, 1213446485 kmers -read 6200000 sequences, 1420887422 bases, 1234887452 kmers -read 6300000 sequences, 1444176084 bases, 1255176114 kmers -read 6400000 sequences, 1467761803 bases, 1275761833 kmers -read 6500000 sequences, 1491517469 bases, 1296517499 kmers -read 6600000 sequences, 1515086149 bases, 1317086179 kmers -read 6700000 sequences, 1537506202 bases, 1336506232 kmers -read 6800000 sequences, 1560946391 bases, 1356946421 kmers -read 6900000 sequences, 1583945488 bases, 1376945518 kmers -read 7000000 sequences, 1606825999 bases, 1396826029 kmers -read 7100000 sequences, 1630889570 bases, 1417889600 kmers -read 7200000 sequences, 1653502338 bases, 1437502368 kmers -read 7300000 sequences, 1676836074 bases, 1457836104 kmers -read 7400000 sequences, 1700581893 bases, 1478581923 kmers -read 7500000 sequences, 1723991216 bases, 1498991246 kmers -read 7600000 sequences, 1747267694 bases, 1519267724 kmers -read 7700000 sequences, 1769997128 bases, 1538997158 kmers -read 7800000 sequences, 1793090725 bases, 1559090755 kmers -read 7900000 sequences, 1816572169 bases, 1579572199 kmers -read 8000000 sequences, 1839912405 bases, 1599912435 kmers -read 8100000 sequences, 1863462142 bases, 1620462172 kmers -read 8200000 sequences, 1887689183 bases, 1641689213 kmers -read 8300000 sequences, 1911245326 bases, 1662245356 kmers -read 8400000 sequences, 1934891774 bases, 1682891804 kmers -read 8500000 sequences, 1958265360 bases, 1703265390 kmers -read 8600000 sequences, 1981114530 bases, 1723114560 kmers -read 8700000 sequences, 2005160537 bases, 1744160567 kmers -read 8800000 sequences, 2028270585 bases, 1764270615 kmers -read 8900000 sequences, 2051383223 bases, 1784383253 kmers -read 9000000 sequences, 2074474142 bases, 1804474172 kmers -read 9100000 sequences, 2096460797 bases, 1823460827 kmers -read 9200000 sequences, 2119508963 bases, 1843508993 kmers -read 9300000 sequences, 2142674047 bases, 1863674077 kmers -read 9400000 sequences, 2164744513 bases, 1882744543 kmers -read 9500000 sequences, 2187346618 bases, 1902346648 kmers -read 9600000 sequences, 2209977347 bases, 1921977377 kmers -read 9700000 sequences, 2232411621 bases, 1941411651 kmers -read 9800000 sequences, 2254902856 bases, 1960902886 kmers -read 9900000 sequences, 2277498326 bases, 1980498356 kmers -read 10000000 sequences, 2299499706 bases, 1999499736 kmers -read 10100000 sequences, 2321026083 bases, 2018026113 kmers -read 10200000 sequences, 2343732502 bases, 2037732532 kmers -read 10300000 sequences, 2364673146 bases, 2055673176 kmers -read 10400000 sequences, 2386756547 bases, 2074756577 kmers -read 10500000 sequences, 2407972829 bases, 2092972859 kmers -read 10600000 sequences, 2429720496 bases, 2111720526 kmers -read 10700000 sequences, 2450999850 bases, 2129999880 kmers -read 10800000 sequences, 2471991237 bases, 2147991267 kmers -read 10900000 sequences, 2492905716 bases, 2165905746 kmers -read 11000000 sequences, 2514209537 bases, 2184209567 kmers -read 11100000 sequences, 2535680432 bases, 2202680462 kmers -read 11200000 sequences, 2556527106 bases, 2220527136 kmers -read 11300000 sequences, 2577149683 bases, 2238149713 kmers -read 11400000 sequences, 2597185570 bases, 2255185600 kmers -read 11500000 sequences, 2617632290 bases, 2272632320 kmers -read 11600000 sequences, 2638223488 bases, 2290223518 kmers -read 11700000 sequences, 2658091095 bases, 2307091125 kmers -read 11800000 sequences, 2676727586 bases, 2322727616 kmers -read 11900000 sequences, 2695970855 bases, 2338970885 kmers -read 12000000 sequences, 2714887902 bases, 2354887932 kmers -read 12100000 sequences, 2733216523 bases, 2370216553 kmers -read 12200000 sequences, 2751654575 bases, 2385654605 kmers -read 12300000 sequences, 2769824681 bases, 2400824711 kmers -read 12400000 sequences, 2788136547 bases, 2416136577 kmers -read 12500000 sequences, 2806066941 bases, 2431066971 kmers -read 12600000 sequences, 2823691733 bases, 2445691763 kmers -read 12700000 sequences, 2841752082 bases, 2460752112 kmers -read 12800000 sequences, 2859305620 bases, 2475305650 kmers -read 12900000 sequences, 2876642001 bases, 2489642031 kmers -read 13000000 sequences, 2893631233 bases, 2503631263 kmers -=== step 1.1: 'encoding input' 11.4051 [sec] (4.55211 [ns/kmer]) -read 13014214 sequences, 2895872181 bases, 2505445761 kmers -num_kmers 2505445761 -cost: 2.0 + 0.311662 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 7.78984 [sec] (3.10917 [ns/kmer]) -=== step 1: 'parse file' 19.1951 [sec] (7.66134 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 21.5746 [sec] (8.61108 [ns/kmer]) -num_minimizers = 386617003 -num_minimizer_positions = 425284125 -num_super_kmers = 425284125 -building minimizers MPHF with 8 threads and 129 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 25.8223 [sec] (10.3065 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758534285979989852.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.4648 [sec] (6.97072 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 9.34746 [sec] (3.73086 [ns/kmer]) -num_bits_per_offset = ceil(log2(2895872213)) = 32 -max_bucket_size 34767 -log2_max_bucket_size 16 -num_buckets_larger_than_1_not_in_skew_index 11147152/386617003 (2.88325%) -num_buckets_in_skew_index 47919/386617003 (0.0123944%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 41920449/425284125 (9.85705%) -num_minimizer_positions_of_buckets_in_skew_index 7941744/425284125 (1.8674%) -computing minimizers offsets: 4.9896 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11994340 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8728433 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5803568 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3324419 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2008903 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1146661 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 501339 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 34767: 254893 -num_kmers_in_skew_index 33762556 (1.34757%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11994340 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[0] for 11994340 kmers; bits/key = 2.56071 - built positions[0] for 11994340 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8728433 - building MPHF with 8 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8728433 kmers; bits/key = 2.57731 - built positions[1] for 8728433 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5803568 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5803568 kmers; bits/key = 2.55844 - built positions[2] for 5803568 kmers; bits/key = 9.00006 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3324419 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3324419 kmers; bits/key = 3.25356 - built positions[3] for 3324419 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2008903 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2008903)... - built mphs[4] for 2008903 kmers; bits/key = 2.56016 - built positions[4] for 2008903 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1146661 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1146661)... - built mphs[5] for 1146661 kmers; bits/key = 2.56092 - built positions[5] for 1146661 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 501339 - building MPHF with 8 threads and 1 partitions (avg. partition size = 501339)... - built mphs[6] for 501339 kmers; bits/key = 2.56325 - built positions[6] for 501339 kmers; bits/key = 13.0007 - lower = 8192; upper = 34767; num_bits_per_pos = 16; num_kmers_in_partition = 254893 - building MPHF with 8 threads and 1 partitions (avg. partition size = 254893)... - built mphs[7] for 254893 kmers; bits/key = 2.42455 - built positions[7] for 254893 kmers; bits/key = 16.0014 -computing skew index took: 11.5687 [sec] -=== step 3: 'build sparse and skew index' 16.9099 [sec] (6.74927 [ns/kmer]) -=== total_time 110.314 [sec] (44.0297 [ns/kmer]) -total index size: 2754198061 [B] -- 2754.2 [MB] -SPACE BREAKDOWN: - minimizers: 0.436946 [bits/kmer] (2.8316 [bits/key]) -- 4.96853% - strings_endpoints: 0.167061 [bits/kmer] -- 1.89965% - offsets: 5.09225 [bits/kmer] -- 57.9042% - offsets2: 0.535416 [bits/kmer] -- 6.08823% - offsets3: 0.101433 [bits/kmer] -- 1.1534% - start_lists_of_size: 8.55736e-07 [bits/kmer] -- 9.7306e-06% - strings: 2.31166 [bits/kmer] -- 26.286% - skew_index: 0.149505 [bits/kmer] -- 1.70003% - weights: 5.8752e-07 [bits/kmer] -- 6.68071e-06% - -------------- - total: 8.79428 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1044% -buckets with 2 minimizer positions = 1.75374% -buckets with 3 minimizer positions = 0.449247% -buckets with 4 minimizer positions = 0.203979% -buckets with 5 minimizer positions = 0.116523% -buckets with 6 minimizer positions = 0.0751692% -buckets with 7 minimizer positions = 0.051812% -buckets with 8 minimizer positions = 0.0381574% -buckets with 9 minimizer positions = 0.0288166% -buckets with 10 minimizer positions = 0.0225926% -buckets with 11 minimizer positions = 0.0180313% -buckets with 12 minimizer positions = 0.0146659% -buckets with 13 minimizer positions = 0.0123083% -buckets with 14 minimizer positions = 0.0102678% -buckets with 15 minimizer positions = 0.00882372% -buckets with 16 minimizer positions = 0.00752295% -max_bucket_size 34767 -2025-09-22 11:46:36: saving data structure to disk... -2025-09-22 11:46:38: DONE diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log deleted file mode 100644 index cff7f52..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-22 11:52:13: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-22 11:52:21: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 132860997 (81.3664%) -num_negative_kmers = 30426363 (18.6336%) -num_invalid_kmers = 0 (0%) -num_searches = 7886675/132860997 (5.93603%) -num_extensions = 124974322/132860997 (94.064%) -elapsed = 7183.91 millisec / 7.18391 sec / 0.119732 min / 43.9955 ns/kmer -2025-09-22 11:52:21: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-22 11:53:12: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 525542891 (75.5375%) -num_negative_kmers = 170183654 (24.4609%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 13101335/525542891 (2.49291%) -num_extensions = 512441556/525542891 (97.5071%) -elapsed = 50824 millisec / 50.824 sec / 0.847066 min / 73.0505 ns/kmer -2025-09-22 11:53:13: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-22 11:56:39: DONE -==== query report: -num_kmers = 1569974986 -num_positive_kmers = 1437870528 (91.5856%) -num_negative_kmers = 131075447 (8.34889%) -num_invalid_kmers = 1029011 (0.0655431%) -num_searches = 110228289/1437870528 (7.66608%) -num_extensions = 1327642239/1437870528 (92.3339%) -elapsed = 206161 millisec / 206.161 sec / 3.43602 min / 131.315 ns/kmer diff --git a/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log deleted file mode 100644 index 66ac619..0000000 --- a/benchmarks/results-22-09-25/k31/22-09-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-22 11:57:32: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-22 11:59:00: DONE -==== query report: -num_kmers = 695737535 -num_positive_kmers = 4754204 (0.683333%) -num_negative_kmers = 690972341 (99.3151%) -num_invalid_kmers = 10990 (0.00157962%) -num_searches = 3613872/4754204 (76.0142%) -num_extensions = 1140332/4754204 (23.9858%) -elapsed = 87904.3 millisec / 87.9043 sec / 1.46507 min / 126.347 ns/kmer -2025-09-22 11:59:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-22 11:59:07: DONE -==== query report: -num_kmers = 163287360 -num_positive_kmers = 790414 (0.484063%) -num_negative_kmers = 162496946 (99.5159%) -num_invalid_kmers = 0 (0%) -num_searches = 499575/790414 (63.2042%) -num_extensions = 290839/790414 (36.7958%) -elapsed = 7198.34 millisec / 7.19834 sec / 0.119972 min / 44.0839 ns/kmer -2025-09-22 11:59:08: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-22 11:59:59: DONE -==== query report: -num_kmers = 395433242 -num_positive_kmers = 1134 (0.000286774%) -num_negative_kmers = 395408021 (99.9936%) -num_invalid_kmers = 24087 (0.00609129%) -num_searches = 895/1134 (78.9242%) -num_extensions = 239/1134 (21.0758%) -elapsed = 50901.6 millisec / 50.9016 sec / 0.848359 min / 128.724 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log deleted file mode 100644 index 22a4db8..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.canon.bench_log +++ /dev/null @@ -1,15 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 735.896 -lookup_uint: avg_nanosec_per_positive_lookup 639.714 -avg_nanosec_per_negative_lookup 492.637 -avg_nanosec_per_access 383.641 -iterator: avg_nanosec_per_kmer 21.4101 -lookup: avg_nanosec_per_positive_lookup 654.075 -lookup_uint: avg_nanosec_per_positive_lookup 563.22 -avg_nanosec_per_negative_lookup 517.91 -avg_nanosec_per_access 442.89 -iterator: avg_nanosec_per_kmer 21.3375 -lookup: avg_nanosec_per_positive_lookup 864.983 -lookup_uint: avg_nanosec_per_positive_lookup 760.047 -avg_nanosec_per_negative_lookup 545.579 -avg_nanosec_per_access 492.503 -iterator: avg_nanosec_per_kmer 21.3217 diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log deleted file mode 100644 index c864754..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.canon.build_log +++ /dev/null @@ -1,383 +0,0 @@ -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding input' 2.30271 [sec] (4.13721 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.50597 [sec] (2.70572 [ns/kmer]) -=== step 1: 'parse file' 3.80885 [sec] (6.84325 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 1.73063 [sec] (3.10936 [ns/kmer]) -num_minimizers = 28491340 -num_minimizer_positions = 34043772 -num_super_kmers = 35742796 -building minimizers MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.21848 [sec] (3.98588 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637342802774019.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.30838 [sec] (2.35072 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.396595 [sec] (0.71255 [ns/kmer]) -num_bits_per_offset = ceil(log2(621649142)) = 30 -max_bucket_size 890626 -log2_max_bucket_size 20 -num_buckets_larger_than_1_not_in_skew_index 1198106/28491340 (4.20516%) -num_buckets_in_skew_index 5680/28491340 (0.0199359%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 4772225/34043772 (14.0179%) -num_minimizer_positions_of_buckets_in_skew_index 1983993/34043772 (5.82777%) -computing minimizers offsets: 0.514023 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5364171 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3558842 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2165544 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1626075 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 914447 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1132014 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 713220 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 890626: 4875198 -num_kmers_in_skew_index 20349511 (3.65613%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 5364171 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 5364171 kmers; bits/key = 2.65405 - built positions[0] for 5364171 kmers; bits/key = 7.00007 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3558842 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3558842 kmers; bits/key = 3.06667 - built positions[1] for 3558842 kmers; bits/key = 8.0001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 2165544 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2165544)... - built mphs[2] for 2165544 kmers; bits/key = 2.56007 - built positions[2] for 2165544 kmers; bits/key = 9.00016 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1626075 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1626075)... - built mphs[3] for 1626075 kmers; bits/key = 2.56039 - built positions[3] for 1626075 kmers; bits/key = 10.0002 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 914447 - building MPHF with 8 threads and 1 partitions (avg. partition size = 914447)... - built mphs[4] for 914447 kmers; bits/key = 2.56134 - built positions[4] for 914447 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1132014 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1132014)... - built mphs[5] for 1132014 kmers; bits/key = 2.5609 - built positions[5] for 1132014 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 713220 - building MPHF with 8 threads and 1 partitions (avg. partition size = 713220)... - built mphs[6] for 713220 kmers; bits/key = 2.4192 - built positions[6] for 713220 kmers; bits/key = 13.0005 - lower = 8192; upper = 890626; num_bits_per_pos = 20; num_kmers_in_partition = 4875198 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 4875198 kmers; bits/key = 2.70263 - built positions[7] for 4875198 kmers; bits/key = 20.0001 -computing skew index took: 7.8054 [sec] -=== step 3: 'build sparse and skew index' 8.34865 [sec] (14.9998 [ns/kmer]) -=== total_time 17.8116 [sec] (32.0015 [ns/kmer]) -total index size: 345772245 [B] -- 345.772 [MB] -SPACE BREAKDOWN: - minimizers: 0.150699 [bits/kmer] (2.94394 [bits/key]) -- 3.03222% - strings_endpoints: 0.118377 [bits/kmer] -- 2.38188% - offsets: 1.58688 [bits/kmer] -- 31.9297% - offsets2: 0.257224 [bits/kmer] -- 5.17563% - offsets3: 0.106938 [bits/kmer] -- 2.15171% - start_lists_of_size: 3.85206e-06 [bits/kmer] -- 7.75077e-05% - strings: 2.2338 [bits/kmer] -- 44.9464% - skew_index: 0.51599 [bits/kmer] -- 10.3823% - weights: 2.6447e-06 [bits/kmer] -- 5.32142e-05% - -------------- - total: 4.96991 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.7749% -buckets with 2 minimizer positions = 2.30651% -buckets with 3 minimizer positions = 0.761358% -buckets with 4 minimizer positions = 0.355666% -buckets with 5 minimizer positions = 0.200977% -buckets with 6 minimizer positions = 0.12653% -buckets with 7 minimizer positions = 0.0847696% -buckets with 8 minimizer positions = 0.0617767% -buckets with 9 minimizer positions = 0.0458174% -buckets with 10 minimizer positions = 0.0352669% -buckets with 11 minimizer positions = 0.0280963% -buckets with 12 minimizer positions = 0.022821% -buckets with 13 minimizer positions = 0.0187285% -buckets with 14 minimizer positions = 0.0154047% -buckets with 15 minimizer positions = 0.0133093% -buckets with 16 minimizer positions = 0.0113754% -max_bucket_size 890626 -2025-09-23 16:22:40: saving data structure to disk... -2025-09-23 16:22:40: DONE -k = 63, m = 23, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding input' 4.36744 [sec] (3.78051 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 3.1119 [sec] (2.6937 [ns/kmer]) -=== step 1: 'parse file' 7.47946 [sec] (6.47432 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 3.44959 [sec] (2.98601 [ns/kmer]) -num_minimizers = 67109831 -num_minimizer_positions = 67978497 -num_super_kmers = 71741056 -building minimizers MPHF with 8 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 4.15503 [sec] (3.59665 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637360854503624.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.7257 [sec] (2.3594 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.739574 [sec] (0.640185 [ns/kmer]) -num_bits_per_offset = ceil(log2(1165088891)) = 31 -max_bucket_size 2836 -log2_max_bucket_size 12 -num_buckets_larger_than_1_not_in_skew_index 321047/67109831 (0.47839%) -num_buckets_in_skew_index 892/67109831 (0.00132916%) -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 1060983/67978497 (1.56076%) -num_minimizer_positions_of_buckets_in_skew_index 129622/67978497 (0.190681%) -computing minimizers offsets: 0.575935 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 936900 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 646176 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 458164 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 209599 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 20640 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 2836: 40401 -num_kmers_in_skew_index 2311880 (0.200119%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 936900 - building MPHF with 8 threads and 1 partitions (avg. partition size = 936900)... - built mphs[0] for 936900 kmers; bits/key = 2.41855 - built positions[0] for 936900 kmers; bits/key = 7.00038 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 646176 - building MPHF with 8 threads and 1 partitions (avg. partition size = 646176)... - built mphs[1] for 646176 kmers; bits/key = 2.41958 - built positions[1] for 646176 kmers; bits/key = 8.0005 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 458164 - building MPHF with 8 threads and 1 partitions (avg. partition size = 458164)... - built mphs[2] for 458164 kmers; bits/key = 2.42072 - built positions[2] for 458164 kmers; bits/key = 9.00079 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 209599 - building MPHF with 8 threads and 1 partitions (avg. partition size = 209599)... - built mphs[3] for 209599 kmers; bits/key = 2.42681 - built positions[3] for 209599 kmers; bits/key = 10.0016 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 20640 - building MPHF with 8 threads and 1 partitions (avg. partition size = 20640)... - built mphs[4] for 20640 kmers; bits/key = 2.51938 - built positions[4] for 20640 kmers; bits/key = 11.0171 - lower = 2048; upper = 2836; num_bits_per_pos = 12; num_kmers_in_partition = 40401 - building MPHF with 8 threads and 1 partitions (avg. partition size = 40401)... - built mphs[5] for 40401 kmers; bits/key = 2.46845 - built positions[5] for 40401 kmers; bits/key = 12.0092 -computing skew index took: 1.56144 [sec] -=== step 3: 'build sparse and skew index' 2.19377 [sec] (1.89896 [ns/kmer]) -=== total_time 20.7431 [sec] (17.9555 [ns/kmer]) -total index size: 605398091 [B] -- 605.398 [MB] -SPACE BREAKDOWN: - minimizers: 0.167559 [bits/kmer] (2.88442 [bits/key]) -- 3.99682% - strings_endpoints: 0.0958626 [bits/kmer] -- 2.28662% - offsets: 1.85892 [bits/kmer] -- 44.341% - offsets2: 0.0284707 [bits/kmer] -- 0.679115% - offsets3: 0.00347857 [bits/kmer] -- 0.0829748% - start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.42684e-05% - strings: 2.01703 [bits/kmer] -- 48.1125% - skew_index: 0.0209999 [bits/kmer] -- 0.500913% - weights: 1.27418e-06 [bits/kmer] -- 3.03932e-05% - -------------- - total: 4.19232 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5203% -buckets with 2 minimizer positions = 0.325268% -buckets with 3 minimizer positions = 0.0665655% -buckets with 4 minimizer positions = 0.028209% -buckets with 5 minimizer positions = 0.0153256% -buckets with 6 minimizer positions = 0.00941591% -buckets with 7 minimizer positions = 0.00646701% -buckets with 8 minimizer positions = 0.00453585% -buckets with 9 minimizer positions = 0.00351811% -buckets with 10 minimizer positions = 0.00259873% -buckets with 11 minimizer positions = 0.002031% -buckets with 12 minimizer positions = 0.00171659% -buckets with 13 minimizer positions = 0.00146476% -buckets with 14 minimizer positions = 0.00115482% -buckets with 15 minimizer positions = 0.000958131% -buckets with 16 minimizer positions = 0.000908958% -max_bucket_size 2836 -2025-09-23 16:23:01: saving data structure to disk... -2025-09-23 16:23:01: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding input' 11.1348 [sec] (4.01861 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 7.65458 [sec] (2.76258 [ns/kmer]) -=== step 1: 'parse file' 18.7895 [sec] (6.78123 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 8.38571 [sec] (3.02645 [ns/kmer]) -num_minimizers = 143944326 -num_minimizer_positions = 168540022 -num_super_kmers = 177417418 -building minimizers MPHF with 8 threads and 48 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 9.11584 [sec] (3.28996 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637381989979120.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.93647 [sec] (2.50341 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.11908 [sec] (0.764788 [ns/kmer]) -num_bits_per_offset = ceil(log2(2961741363)) = 32 -max_bucket_size 95788 -log2_max_bucket_size 17 -num_buckets_larger_than_1_not_in_skew_index 4117627/143944326 (2.86057%) -num_buckets_in_skew_index 38186/143944326 (0.0265283%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 16761511/168540022 (9.94512%) -num_minimizer_positions_of_buckets_in_skew_index 11989998/168540022 (7.11404%) -computing minimizers offsets: 2.27826 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28814291 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26301059 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 23811843 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 20591065 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 19598470 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 18267389 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 13542165 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 95788: 27801549 -num_kmers_in_skew_index 178727831 (6.45039%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28814291 - building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28814291 kmers; bits/key = 2.54378 - built positions[0] for 28814291 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26301059 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26301059 kmers; bits/key = 2.55149 - built positions[1] for 26301059 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 23811843 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 23811843 kmers; bits/key = 2.55863 - built positions[2] for 23811843 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 20591065 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 20591065 kmers; bits/key = 2.53983 - built positions[3] for 20591065 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 19598470 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[4] for 19598470 kmers; bits/key = 2.58178 - built positions[4] for 19598470 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 18267389 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[5] for 18267389 kmers; bits/key = 2.5988 - built positions[5] for 18267389 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 13542165 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[6] for 13542165 kmers; bits/key = 2.63222 - built positions[6] for 13542165 kmers; bits/key = 13 - lower = 8192; upper = 95788; num_bits_per_pos = 17; num_kmers_in_partition = 27801549 - building MPHF with 8 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[7] for 27801549 kmers; bits/key = 2.57505 - built positions[7] for 27801549 kmers; bits/key = 17 -computing skew index took: 37.3858 [sec] -=== step 3: 'build sparse and skew index' 39.8074 [sec] (14.3667 [ns/kmer]) -=== total_time 85.154 [sec] (30.7325 [ns/kmer]) -total index size: 1836738632 [B] -- 1836.74 [MB] -SPACE BREAKDOWN: - minimizers: 0.146815 [bits/kmer] (2.82607 [bits/key]) -- 2.76847% - strings_endpoints: 0.115014 [bits/kmer] -- 2.1688% - offsets: 1.71436 [bits/kmer] -- 32.3274% - offsets2: 0.193578 [bits/kmer] -- 3.65028% - offsets3: 0.138472 [bits/kmer] -- 2.61115% - start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.45911e-05% - strings: 2.13782 [bits/kmer] -- 40.3125% - skew_index: 0.857054 [bits/kmer] -- 16.1613% - weights: 5.31253e-07 [bits/kmer] -- 1.00178e-05% - -------------- - total: 5.30311 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1129% -buckets with 2 minimizer positions = 1.66462% -buckets with 3 minimizer positions = 0.467231% -buckets with 4 minimizer positions = 0.212029% -buckets with 5 minimizer positions = 0.120713% -buckets with 6 minimizer positions = 0.0773542% -buckets with 7 minimizer positions = 0.0538271% -buckets with 8 minimizer positions = 0.039179% -buckets with 9 minimizer positions = 0.0302666% -buckets with 10 minimizer positions = 0.0237182% -buckets with 11 minimizer positions = 0.0193575% -buckets with 12 minimizer positions = 0.0158631% -buckets with 13 minimizer positions = 0.013326% -buckets with 14 minimizer positions = 0.0114822% -buckets with 15 minimizer positions = 0.00985728% -buckets with 16 minimizer positions = 0.00859013% -max_bucket_size 95788 -2025-09-23 16:24:27: saving data structure to disk... -2025-09-23 16:24:28: DONE diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log deleted file mode 100644 index 39a7d5e..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.canon.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-23 16:31:58: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-23 16:32:07: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 9090.23 millisec / 9.09023 sec / 0.151504 min / 92.7835 ns/kmer -2025-09-23 16:32:07: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-23 16:32:50: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 43002.5 millisec / 43.0025 sec / 0.716709 min / 93.2034 ns/kmer -2025-09-23 16:32:51: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-23 16:34:26: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 95445 millisec / 95.445 sec / 1.59075 min / 199.752 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log deleted file mode 100644 index 36d95ea..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.canon.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-23 16:35:31: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-23 16:36:00: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 29558.2 millisec / 29.5582 sec / 0.492637 min / 64.0643 ns/kmer -2025-09-23 16:36:00: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-23 16:36:04: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 4090.97 millisec / 4.09097 sec / 0.0681828 min / 41.7563 ns/kmer -2025-09-23 16:36:05: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-23 16:36:22: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 17016.8 millisec / 17.0168 sec / 0.283613 min / 52.833 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log deleted file mode 100644 index 20ef0a7..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.regular.bench_log +++ /dev/null @@ -1,15 +0,0 @@ -lookup: avg_nanosec_per_positive_lookup 825.592 -lookup_uint: avg_nanosec_per_positive_lookup 700.603 -avg_nanosec_per_negative_lookup 742.499 -avg_nanosec_per_access 380.348 -iterator: avg_nanosec_per_kmer 21.454 -lookup: avg_nanosec_per_positive_lookup 743.867 -lookup_uint: avg_nanosec_per_positive_lookup 626.492 -avg_nanosec_per_negative_lookup 794.711 -avg_nanosec_per_access 439.499 -iterator: avg_nanosec_per_kmer 21.3152 -lookup: avg_nanosec_per_positive_lookup 1000.88 -lookup_uint: avg_nanosec_per_positive_lookup 889.295 -avg_nanosec_per_negative_lookup 868.472 -avg_nanosec_per_access 493.09 -iterator: avg_nanosec_per_kmer 21.3136 diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log deleted file mode 100644 index adccf07..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.regular.build_log +++ /dev/null @@ -1,372 +0,0 @@ -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/cod.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 63806937 bases, 57606999 kmers -read 200000 sequences, 129066588 bases, 116666650 kmers -read 300000 sequences, 192862556 bases, 174262618 kmers -read 400000 sequences, 256212661 bases, 231412723 kmers -read 500000 sequences, 319282064 bases, 288282126 kmers -read 600000 sequences, 379117165 bases, 341917227 kmers -read 700000 sequences, 436654305 bases, 393254367 kmers -read 800000 sequences, 492876125 bases, 443276187 kmers -read 900000 sequences, 547344740 bases, 491544802 kmers -read 1000000 sequences, 598624540 bases, 536624602 kmers -=== step 1.1: 'encoding input' 2.3 [sec] (4.13234 [ns/kmer]) -read 1049410 sequences, 621649078 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.233795 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 0.856038 [sec] (1.53802 [ns/kmer]) -=== step 1: 'parse file' 3.15616 [sec] (5.67057 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 1.37876 [sec] (2.47718 [ns/kmer]) -num_minimizers = 24274432 -num_minimizer_positions = 28219881 -num_super_kmers = 28219881 -building minimizers MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.89722 [sec] (3.40868 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637242254479730.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.06945 [sec] (1.92144 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.431166 [sec] (0.774662 [ns/kmer]) -num_bits_per_offset = ceil(log2(621649142)) = 30 -max_bucket_size 410845 -log2_max_bucket_size 19 -num_buckets_larger_than_1_not_in_skew_index 993045/24274432 (4.09091%) -num_buckets_in_skew_index 3485/24274432 (0.0143567%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 3760523/28219881 (13.3258%) -num_minimizer_positions_of_buckets_in_skew_index 1181456/28219881 (4.18661%) -computing minimizers offsets: 0.389512 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3728511 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2195092 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1214814 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1162612 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 910692 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 980893 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 616111 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 410845: 3780697 -num_kmers_in_skew_index 14589422 (2.62124%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3728511 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3728511 kmers; bits/key = 2.94604 - built positions[0] for 3728511 kmers; bits/key = 7.00009 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2195092 - building MPHF with 8 threads and 1 partitions (avg. partition size = 2195092)... - built mphs[1] for 2195092 kmers; bits/key = 2.41717 - built positions[1] for 2195092 kmers; bits/key = 8.00016 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1214814 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1214814)... - built mphs[2] for 1214814 kmers; bits/key = 2.41794 - built positions[2] for 1214814 kmers; bits/key = 9.0003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1162612 - building MPHF with 8 threads and 1 partitions (avg. partition size = 1162612)... - built mphs[3] for 1162612 kmers; bits/key = 2.56091 - built positions[3] for 1162612 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 910692 - building MPHF with 8 threads and 1 partitions (avg. partition size = 910692)... - built mphs[4] for 910692 kmers; bits/key = 2.4185 - built positions[4] for 910692 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 980893 - building MPHF with 8 threads and 1 partitions (avg. partition size = 980893)... - built mphs[5] for 980893 kmers; bits/key = 2.56127 - built positions[5] for 980893 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 616111 - building MPHF with 8 threads and 1 partitions (avg. partition size = 616111)... - built mphs[6] for 616111 kmers; bits/key = 2.56247 - built positions[6] for 616111 kmers; bits/key = 13.0006 - lower = 8192; upper = 410845; num_bits_per_pos = 19; num_kmers_in_partition = 3780697 - building MPHF with 8 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 3780697 kmers; bits/key = 2.9111 - built positions[7] for 3780697 kmers; bits/key = 19.0001 -computing skew index took: 6.10412 [sec] -=== step 3: 'build sparse and skew index' 6.51701 [sec] (11.7089 [ns/kmer]) -=== total_time 14.4498 [sec] (25.9614 [ns/kmer]) -total index size: 311154419 [B] -- 311.154 [MB] -SPACE BREAKDOWN: - minimizers: 0.129216 [bits/kmer] (2.96278 [bits/key]) -- 2.88924% - strings_endpoints: 0.118377 [bits/kmer] -- 2.64688% - offsets: 1.35201 [bits/kmer] -- 30.2305% - offsets2: 0.202693 [bits/kmer] -- 4.53216% - offsets3: 0.0636812 [bits/kmer] -- 1.42389% - start_lists_of_size: 3.85206e-06 [bits/kmer] -- 8.61309e-05% - strings: 2.2338 [bits/kmer] -- 49.947% - skew_index: 0.372554 [bits/kmer] -- 8.3302% - weights: 2.6447e-06 [bits/kmer] -- 5.91346e-05% - -------------- - total: 4.47233 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.8947% -buckets with 2 minimizer positions = 2.3624% -buckets with 3 minimizer positions = 0.729043% -buckets with 4 minimizer positions = 0.320662% -buckets with 5 minimizer positions = 0.173973% -buckets with 6 minimizer positions = 0.108101% -buckets with 7 minimizer positions = 0.0744775% -buckets with 8 minimizer positions = 0.0531217% -buckets with 9 minimizer positions = 0.0397744% -buckets with 10 minimizer positions = 0.0304848% -buckets with 11 minimizer positions = 0.0243919% -buckets with 12 minimizer positions = 0.0200829% -buckets with 13 minimizer positions = 0.0170509% -buckets with 14 minimizer positions = 0.0139076% -buckets with 15 minimizer positions = 0.0119426% -buckets with 16 minimizer positions = 0.0105255% -max_bucket_size 410845 -2025-09-23 16:20:56: saving data structure to disk... -2025-09-23 16:20:56: DONE -k = 63, m = 24, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/kestrel.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 796964911 bases, 790764973 kmers -=== step 1.1: 'encoding input' 4.37008 [sec] (3.7828 [ns/kmer]) -read 158680 sequences, 1165088827 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0170321 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 1.78121 [sec] (1.54184 [ns/kmer]) -=== step 1: 'parse file' 6.15143 [sec] (5.32475 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 2.73686 [sec] (2.36906 [ns/kmer]) -num_minimizers = 55460750 -num_minimizer_positions = 56012507 -num_super_kmers = 56012507 -building minimizers MPHF with 8 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.80367 [sec] (3.2925 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637256924405969.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.11025 [sec] (1.82666 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.625056 [sec] (0.541057 [ns/kmer]) -num_bits_per_offset = ceil(log2(1165088891)) = 31 -max_bucket_size 762 -log2_max_bucket_size 10 -num_buckets_larger_than_1_not_in_skew_index 215802/55460750 (0.389108%) -num_buckets_in_skew_index 496/55460750 (0.000894326%) -skew index num_partitions 4 -num_minimizer_positions_of_buckets_larger_than_1 703872/56012507 (1.25663%) -num_minimizer_positions_of_buckets_in_skew_index 64183/56012507 (0.114587%) -computing minimizers offsets: 0.412738 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 616638 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 406716 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 230283 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 762: 53117 -num_kmers_in_skew_index 1306754 (0.113114%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 616638 - building MPHF with 8 threads and 1 partitions (avg. partition size = 616638)... - built mphs[0] for 616638 kmers; bits/key = 2.41968 - built positions[0] for 616638 kmers; bits/key = 7.00054 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 406716 - building MPHF with 8 threads and 1 partitions (avg. partition size = 406716)... - built mphs[1] for 406716 kmers; bits/key = 2.42142 - built positions[1] for 406716 kmers; bits/key = 8.00087 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 230283 - building MPHF with 8 threads and 1 partitions (avg. partition size = 230283)... - built mphs[2] for 230283 kmers; bits/key = 2.4254 - built positions[2] for 230283 kmers; bits/key = 9.00152 - lower = 512; upper = 762; num_bits_per_pos = 10; num_kmers_in_partition = 53117 - building MPHF with 8 threads and 1 partitions (avg. partition size = 53117)... - built mphs[3] for 53117 kmers; bits/key = 2.45616 - built positions[3] for 53117 kmers; bits/key = 10.0066 -computing skew index took: 0.860879 [sec] -=== step 3: 'build sparse and skew index' 1.32153 [sec] (1.14393 [ns/kmer]) -=== total_time 16.7488 [sec] (14.498 [ns/kmer]) -total index size: 551592569 [B] -- 551.593 [MB] -SPACE BREAKDOWN: - minimizers: 0.138427 [bits/kmer] (2.88344 [bits/key]) -- 3.624% - strings_endpoints: 0.0958626 [bits/kmer] -- 2.50967% - offsets: 1.53624 [bits/kmer] -- 40.2186% - offsets2: 0.018888 [bits/kmer] -- 0.494485% - offsets3: 0.00172258 [bits/kmer] -- 0.0450971% - start_lists_of_size: 1.85587e-06 [bits/kmer] -- 4.85866e-05% - strings: 2.01703 [bits/kmer] -- 52.8057% - skew_index: 0.0115484 [bits/kmer] -- 0.302336% - weights: 1.27418e-06 [bits/kmer] -- 3.3358e-05% - -------------- - total: 3.81973 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.61% -buckets with 2 minimizer positions = 0.265774% -buckets with 3 minimizer positions = 0.0543952% -buckets with 4 minimizer positions = 0.0225998% -buckets with 5 minimizer positions = 0.012288% -buckets with 6 minimizer positions = 0.00758735% -buckets with 7 minimizer positions = 0.00520188% -buckets with 8 minimizer positions = 0.00363681% -buckets with 9 minimizer positions = 0.00272986% -buckets with 10 minimizer positions = 0.00195634% -buckets with 11 minimizer positions = 0.00165342% -buckets with 12 minimizer positions = 0.00132887% -buckets with 13 minimizer positions = 0.00112332% -buckets with 14 minimizer positions = 0.000903342% -buckets with 15 minimizer positions = 0.000802369% -buckets with 16 minimizer positions = 0.000649108% -max_bucket_size 762 -2025-09-23 16:21:13: saving data structure to disk... -2025-09-23 16:21:14: DONE -k = 63, m = 25, seed = 1, num_threads = 8, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, tmp_dirname = 'tmp_dir' -reading file '/home/giulio/sshash_datasets/human.k63.unitigs.fa.ust.fa.gz'... -read 100000 sequences, 105696573 bases, 99496635 kmers -read 200000 sequences, 214697764 bases, 202297826 kmers -read 300000 sequences, 314555962 bases, 295956024 kmers -read 400000 sequences, 417096019 bases, 392296081 kmers -read 500000 sequences, 531577423 bases, 500577485 kmers -read 600000 sequences, 641881766 bases, 604681828 kmers -read 700000 sequences, 753533625 bases, 710133687 kmers -read 800000 sequences, 860572728 bases, 810972790 kmers -read 900000 sequences, 966201746 bases, 910401808 kmers -read 1000000 sequences, 1074799974 bases, 1012800036 kmers -read 1100000 sequences, 1177786303 bases, 1109586365 kmers -read 1200000 sequences, 1284445481 bases, 1210045543 kmers -read 1300000 sequences, 1387959208 bases, 1307359270 kmers -read 1400000 sequences, 1496344159 bases, 1409544221 kmers -read 1500000 sequences, 1601642232 bases, 1508642294 kmers -read 1600000 sequences, 1704579905 bases, 1605379967 kmers -read 1700000 sequences, 1809734567 bases, 1704334629 kmers -read 1800000 sequences, 1913668987 bases, 1802069049 kmers -read 1900000 sequences, 2015410398 bases, 1897610460 kmers -read 2000000 sequences, 2111050791 bases, 1987050853 kmers -read 2100000 sequences, 2208479896 bases, 2078279958 kmers -read 2200000 sequences, 2297838310 bases, 2161438372 kmers -read 2300000 sequences, 2384042166 bases, 2241442228 kmers -read 2400000 sequences, 2476010359 bases, 2327210421 kmers -read 2500000 sequences, 2554605267 bases, 2399605329 kmers -read 2600000 sequences, 2632827152 bases, 2471627214 kmers -read 2700000 sequences, 2705855836 bases, 2538455898 kmers -read 2800000 sequences, 2777866668 bases, 2604266730 kmers -read 2900000 sequences, 2846376916 bases, 2666576978 kmers -read 3000000 sequences, 2913930048 bases, 2727930110 kmers -=== step 1.1: 'encoding input' 11.1331 [sec] (4.01798 [ns/kmer]) -read 3079563 sequences, 2961741299 bases, 2770808393 kmers -num_kmers 2770808393 -cost: 2.0 + 0.137817 [bits/kmer] -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.7.bin'... -=== step 1.2: 'computing minimizers tuples' 4.38803 [sec] (1.58367 [ns/kmer]) -=== step 1: 'parse file' 15.5212 [sec] (5.60168 [ns/kmer]) - == files to merge = 8 -saving tuples to 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 6.71091 [sec] (2.422 [ns/kmer]) -num_minimizers = 122641952 -num_minimizer_positions = 141137536 -num_super_kmers = 141137536 -building minimizers MPHF with 8 threads and 41 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 8.38381 [sec] (3.02576 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1758637274047749860.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.50409 [sec] (1.98646 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.66107 [sec] (0.599488 [ns/kmer]) -num_bits_per_offset = ceil(log2(2961741363)) = 32 -max_bucket_size 150582 -log2_max_bucket_size 18 -num_buckets_larger_than_1_not_in_skew_index 3263958/122641952 (2.66137%) -num_buckets_in_skew_index 28699/122641952 (0.0234006%) -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 13121826/141137536 (9.29719%) -num_minimizer_positions_of_buckets_in_skew_index 8666415/141137536 (6.1404%) -computing minimizers offsets: 1.59879 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 24843684 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22063432 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19418162 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 17914507 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17076822 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 13955142 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 10150958 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 150582: 20601919 -num_kmers_in_skew_index 146024626 (5.27011%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 24843684 - building MPHF with 8 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 24843684 kmers; bits/key = 2.59049 - built positions[0] for 24843684 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 22063432 - building MPHF with 8 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 22063432 kmers; bits/key = 2.59243 - built positions[1] for 22063432 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19418162 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19418162 kmers; bits/key = 2.57982 - built positions[2] for 19418162 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 17914507 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[3] for 17914507 kmers; bits/key = 2.56993 - built positions[3] for 17914507 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17076822 - building MPHF with 8 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17076822 kmers; bits/key = 2.5501 - built positions[4] for 17076822 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 13955142 - building MPHF with 8 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 13955142 kmers; bits/key = 2.56664 - built positions[5] for 13955142 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 10150958 - building MPHF with 8 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[6] for 10150958 kmers; bits/key = 2.65462 - built positions[6] for 10150958 kmers; bits/key = 13 - lower = 8192; upper = 150582; num_bits_per_pos = 18; num_kmers_in_partition = 20601919 - building MPHF with 8 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[7] for 20601919 kmers; bits/key = 2.55951 - built positions[7] for 20601919 kmers; bits/key = 18 -computing skew index took: 28.2744 [sec] -=== step 3: 'build sparse and skew index' 29.9941 [sec] (10.825 [ns/kmer]) -=== total_time 67.7751 [sec] (24.4604 [ns/kmer]) -total index size: 1659007308 [B] -- 1659.01 [MB] -SPACE BREAKDOWN: - minimizers: 0.124989 [bits/kmer] (2.82382 [bits/key]) -- 2.60939% - strings_endpoints: 0.115014 [bits/kmer] -- 2.40115% - offsets: 1.46065 [bits/kmer] -- 30.494% - offsets2: 0.151544 [bits/kmer] -- 3.16378% - offsets3: 0.100088 [bits/kmer] -- 2.08954% - start_lists_of_size: 7.73781e-07 [bits/kmer] -- 1.61542e-05% - strings: 2.13782 [bits/kmer] -- 44.6312% - skew_index: 0.699854 [bits/kmer] -- 14.6109% - weights: 5.31253e-07 [bits/kmer] -- 1.1091e-05% - -------------- - total: 4.78996 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.3152% -buckets with 2 minimizer positions = 1.58636% -buckets with 3 minimizer positions = 0.422838% -buckets with 4 minimizer positions = 0.186829% -buckets with 5 minimizer positions = 0.106346% -buckets with 6 minimizer positions = 0.0683665% -buckets with 7 minimizer positions = 0.0477504% -buckets with 8 minimizer positions = 0.0356257% -buckets with 9 minimizer positions = 0.0273895% -buckets with 10 minimizer positions = 0.0219101% -buckets with 11 minimizer positions = 0.0175666% -buckets with 12 minimizer positions = 0.0144339% -buckets with 13 minimizer positions = 0.0124484% -buckets with 14 minimizer positions = 0.0107361% -buckets with 15 minimizer positions = 0.0090222% -buckets with 16 minimizer positions = 0.00797117% -max_bucket_size 150582 -2025-09-23 16:22:22: saving data structure to disk... -2025-09-23 16:22:22: DONE diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log deleted file mode 100644 index 6318ff2..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.regular.high-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-23 16:29:06: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-23 16:29:16: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 67275966 (68.6683%) -num_negative_kmers = 30696450 (31.3317%) -num_invalid_kmers = 0 (0%) -num_searches = 34555279/67275966 (51.3635%) -num_extensions = 32720687/67275966 (48.6365%) -elapsed = 9789.27 millisec / 9.78927 sec / 0.163155 min / 99.9186 ns/kmer -2025-09-23 16:29:16: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-23 16:30:04: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 293470517 (63.6066%) -num_negative_kmers = 167902332 (36.391%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 149842881/293470517 (51.0589%) -num_extensions = 143627636/293470517 (48.9411%) -elapsed = 47937.7 millisec / 47.9377 sec / 0.798961 min / 103.9 ns/kmer -2025-09-23 16:30:05: performing queries from file '/home/giulio/sshash_queries/SRR5833294.fastq.gz'... -2025-09-23 16:31:57: DONE -==== query report: -num_kmers = 477818474 -num_positive_kmers = 406484348 (85.0709%) -num_negative_kmers = 70660348 (14.7881%) -num_invalid_kmers = 673778 (0.141011%) -num_searches = 220326145/406484348 (54.2029%) -num_extensions = 186158203/406484348 (45.7971%) -elapsed = 112753 millisec / 112.753 sec / 1.87922 min / 235.975 ns/kmer diff --git a/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log b/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log deleted file mode 100644 index ee576da..0000000 --- a/benchmarks/results-22-09-25/k63/22-09-25.regular.low-hit.streaming_query_log +++ /dev/null @@ -1,30 +0,0 @@ -2025-09-23 16:34:26: performing queries from file '/home/giulio/sshash_queries/SRR11449743_1.fastq.gz'... -2025-09-23 16:35:03: DONE -==== query report: -num_kmers = 461383839 -num_positive_kmers = 756097 (0.163876%) -num_negative_kmers = 460616752 (99.8337%) -num_invalid_kmers = 10990 (0.00238196%) -num_searches = 631375/756097 (83.5045%) -num_extensions = 124722/756097 (16.4955%) -elapsed = 36566.9 millisec / 36.5669 sec / 0.609448 min / 79.2548 ns/kmer -2025-09-23 16:35:03: performing queries from file '/home/giulio/sshash_queries/SRR12858649.fastq.gz'... -2025-09-23 16:35:08: DONE -==== query report: -num_kmers = 97972416 -num_positive_kmers = 41066 (0.0419159%) -num_negative_kmers = 97931350 (99.9581%) -num_invalid_kmers = 0 (0%) -num_searches = 39909/41066 (97.1826%) -num_extensions = 1157/41066 (2.81742%) -elapsed = 4663.84 millisec / 4.66384 sec / 0.0777306 min / 47.6036 ns/kmer -2025-09-23 16:35:09: performing queries from file '/home/giulio/sshash_queries/SRR5901135_1.fastq.gz'... -2025-09-23 16:35:30: DONE -==== query report: -num_kmers = 322085785 -num_positive_kmers = 8 (2.48381e-06%) -num_negative_kmers = 322073557 (99.9962%) -num_invalid_kmers = 12220 (0.00379402%) -num_searches = 7/8 (87.5%) -num_extensions = 1/8 (12.5%) -elapsed = 21788.5 millisec / 21.7885 sec / 0.363142 min / 67.6483 ns/kmer diff --git a/benchmarks/results-22-09-25/results.png b/benchmarks/results-22-09-25/results.png deleted file mode 100644 index 14f10b52ec1256efdf06af720a4401a71ac92dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404609 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

      K*2{V}LjjRUr@?|j+mCgQ zW>i)$zbQSij2vCBX3a8wzq9E+m^Llnsi!U6rn0z<$KEnvdT15T?)A)KqccusWIoU% zHk(}adNt+m_u}Sb@FoVu`qic1(|I9s6#U|5k*zOePE2#LmVsHsu)>FXao8BmK%0xz z;WHeqhD~RX2OYVzL4EK(vHR28L<`ABvGzBf1KBgTlM6ao4hEQn>sN&XoBo4eS7}0u{bf;DjD)f#MwZR%yOy!p}t^C(9yz z1{bG}G}lWlf~R0)vgVf4CkQLW$bFokwd!mr19z&S-%qeMI7p4#WE!PvSuPw9*N>z{QPrP*hzVyl6weNJ;_kkNMkichZUoOO`{|LtPnu)hhDh<1BgC2A*_;^{YV{C@B_D;pQPX0URSj zjjwW?`U%qgtA`%mo`b!|+?Zl-U^^pL{{V$m&;xIBakf33(u@69oTWF0>|xx3r~$-N z*$~(d{{de$`%+O@p+2qCzPc!kzJYEBzra`&>r%VG=io9CQ8Qbs#n@?f{#^EN$k-e4 zev*gPGl=7xroIJ_tX~CP0;yNX?)78~+BN1K%V-JlXF~&JMq1LJWmiMu10s&SsI0P+ zq+fW?Mcz8Ui=CNQGiJ}0>}qJJLXB$cQiRTbK0eLRezFOaod}UU(KJ6gC32d!mr7k0 zRj!vxC_n#Iquo-BtVk5`xetvUrSCUmEMglLJ^aSz<>tefDX5NqZj8p9eOhGN_q~#4 z!{d>)CD>S(Rqjjs8{C zzn=azo`!O-J4x|KE;bP^ESk?bMc?QWjOj@HW z&aKGov;(B})ysiH1m=12V}?j4zx}mX#jvEwqG3<~88?g&DlgAD>D6bIR=*Rj@#S<_ zo!2~@LGr>US&^>GUmazY!U|7m_~gkK11VQJafJl^jvFBW;w`%X}bj zxpp3P3~bIYh}P=U5|*8Y_U8-nb48Nk4l|1pP(M)B(fo}(q^4bH3&JhvJS3nTVkG|< zF~*Rm@5snj#ttjQz$36*pM(W*fopa%H$D!OBVTcR*R)JP>$|l2yL^Hfg5?&smxM2I zbmt#|0^=RlAy3>*SDI}{2C0Fh4pcMhEja#WWys%3bxeNKAW37>#krpSiA=V^d$iFV zPae#ik|Ix%%y={$&_vlv7R=Q7%2t42{R>VrRQyPuznz}_8&0rO5o_(PUdLK;MX#gTf#p=U&rW^ z@)wwO@{jwLn7Mio>Be7CZ__~>m;Y{RGI&CD-JubJ&z&Gk^NEPE*wx|Qb<{@Sw>npp z#jYb2jJuJ<%%QjEa#EOT6`y$?sD&v^kcAX6py)}M%*sqgFkaET4P$TCu75YBAjp|> z#+mYxGw@xuRP9w}>oe#Lb+prXKO*J-Z1|c{qQCsY%`2!8@j%uq0h`@V1y|wc`IQ#4 z7ShC@|3;t>p~*?v#kZ7(#1m;&FpuO|XyS4&3iCDk{p3q;oGx~?((n*;Z^KFD?<2Ug zR3DCO_$+t8BfBq_dd%7=lK1EzLXik$c7xBJ0$BH6t7-*Qc;^fD?So^Yr%vsiG$epa zq9pGt3n#`m`MP|yS7kC{S>G+obhK2*VxVn4Gk0Cg4>sU+d=#(Vt`r&h`C(V1e9@YF zQL${}i!^io`m`v}@A?tS#Q69pUGdS>#S@kkZL^yF@pf#r5LyK;qofQ%+cwtRq>Fg- z#-#`MSSk=>+&P@n4CFyJQJXixudoPUDQRM!YS~C($f69iR;_D-cbB+tB<#^y^f`h$ zLl>;kT!gaeZDop&SSkT2zRW@+@y92Kdbr<%WdoxPaA9y~yoR<~nM;MbytXf4-u|^?#zVtN8kD+Ug3H=tBdM z_ps*vi*Kqlq`IR)os6ux6qLa&2kw!aZI|5o`_%FvpMB^M4xpMB^URo!l9?!gVv|KurR!FrR9afkWrkHU=gWLM5Xyhs#6J&l@AM( zb$^W|uE^HPkTQO)G%JqV3grcP-^-jC`GcT{zjRc7T;hpr({oKgnbI?~XXFM8iV%h9 zEb{rvHu<+{)f{HUC+^=Lc%rXe9nBVGSGsk7MrtFu^CoZiJK}gAD@0tiS?M6jPuD)* zKtX62o(4RP(5V_50=_=eSWTFjHFr~PC)uC89OiFNIkugS@~_Jc zg3$_|lUnfnqGb!nemHE!Hj1)`jKGpf`Yt+b!=++Bd`Q!&O9iIe5}gZHV=wyzTMr3y zMHM#p!hX42_KAHzyJ7g|Mjc_RJ<-U?bMLwpCQ!+w&&@mC z+%;>VhkSwKJ~Cx4)#_ZZk!wqF2ND zF$oUqnAsJd#f0`|uBI%W`l@QjuC)-?!Y}QoXf3bfU1g!H5)z%HLkH-?pAMnt$rwSI z%@()mNvxV*@gYX())b;~h4)8`<)bW8=+m8ay^*B$=Lu7B~lz6{d zNlDC0V00Kezpxw494HCAoit*(xAMF)8Ql@Vh+d3T-XX;wTomCoZsfvux8`<83Pe{d zF7b5bW;USdC#i4=4rP*s!j^>V{R*fSRTOg!zN)kLxYZ)Fvj=Q*Z@(ISELybK59!no z9+KW@cheH7U5q5e^-vAPY2G+Bush53#E|}!&9#HOn5f>zvHXCR5o(?&h#YDmCE_d+ znsUAx{7otPs=H!W6OytMt1}D>Eq^&H*dqM;?;VZZ=lfwNa;J1@JO)gg&nZfmA7Xb` z$<1kt7i#JsW*L5u*p@#_Mi%?|iqMlVH${HGMH2z{6AA42rx%JCPaEawq2OTO_Xp|! z#}?W+f~5RC>HuVJ?)+xnqq( zx#>Bb5`&6Ji@a5GIM<3mLl6;X2X%;;eA4PDJ5~Lk*Ktxm9%n-|nBAHa39|6Tq8z9U zN4OsQ_@9nC_3%G6R?sOeoxR+{X>*f^WCd=V?j7qTOPqfcZ9w@ghAh7unhk?ZWqpwo zOqOR&z3+{rwP5q8opy>$DY~qsZ@NFlmM>VcjVx>7opSqHyg>dH;nnD}a_HSNxIjoY z_oZQ55dTiNOvr!yq&wtAO+&a%&|8rU$T*MFC@CcMHb%N?-UJ{D!~jK#A?lQ6B|#u?w^0CuPkOBg!qqS9Oq)XynLD__&U#ozSVT=)(srP z?hGo&2HQ=3F}8!;J;5At+jO&t)eXx^jEyA7%bmq>%2-tJghEA*e^S>FTZjL;Y|*ln z2H{s}h4(6K;DW?gJCl4iSQvQg<`cs0w^Isc8QYwypMJFX`BPNdsom|J#M?ls{(91w zKF_i|I@r`-V&qBXg_J4IgxAFLoEUILTt>#Sa(+%|(_gFqYGh&Jfl+%u9@CjiV}9Fh z`7OwsgH{j49mXNIl==#2oh82ut=M$o>L+_T+U6%)VMJoPRuw+D2mtD=+6F{t`K;?f_@xNH(Xa zmG#W5eS_-dHA)_T;-^%)3+_n~<tdRW@D67UL$fNGp*=IVCx-jCc>%P)nZ~+oj7kN5scy+O@3r!a zG$??5DY_YNKRSJ;OWAJTMrKZt`o}N>EmDDL?~l*;1gwbp`jsA^EoM8tcwb~OJ-WPv z2;AJP;KO=cX&zIzEEcKJ@8yy|zcO?5GK;(*StVn^xOGR>ZoeEHcA&LLE=Ijr5QRE3 zTiQaSCG>Is98|3g)qZH@v|F8iEgq{{94@(R{)6;S!Gr8YTwwkEk$n>fnVFq+w@J0@ zR(M4;4gGLAQ)&K1Pu_+*avf$^I7sU3?s}#QOjtH2szHZ|=mbDbwdyeu0?tUp>MygPDfkEe^^|b;8o+loj;c!N%47 zUvb}oxhJ(lb>}739Q#?{qPD}2$_P)br&dzu|iJiIk zqaLURRH<@4?&po@FPhvvNw68lKDC$=G&CQ(U*hHZgG=>yrr2oe>UXn+8MnoYubr;P zR~W?s`^yJw(0A{%aEF4mb3ab??sAf^F8(n*ZzTY!Hyp&+}#~iRZjFwIcYX-hp1AlpN5751GM%vz6iBTkqsUOTqfQ zICOdnb5T#K3vjk5*TAdv`(>WVB)+6w{@~%3F*z_b=H6gA)XPmX0=My5_s{kN$`~36 z&2rJYUkURIB@~@RBd#Sm2IaGhWPIwG%k~Bj25vFre^a{SWX{a@FKyaHZf*k;w1ii6 zMmtcTGf+3)p7$b)&N3~HXq*3V=UY_F`uOfKarSGa@QZ%+Ws;Tl2~wObKD;tBR7UN$ z=*CATNo@vJrp_qFxoDp^u#dUfh1SUJt>V#8|40@WHuwxLxo{gCEnN^NHe{(W|bXz1eZ|mIHWpzb81J z3qN0K@KAWk*?OZ}o4`kjvy^mxAN+}6-F#r`i&@XIpW_Cqx(r^13xZU8spUf4<1$aA z=(-r&wS96Y`OWB3#4#6^ifJJ80^={w(FGFt@^~<=spCiKofof4z=2W<{EIzEJXn6`N-jBG?-m6xnNO zN8AUXPN)|6kP-CoQ=3+28gH80qoW>A!tXhrPaC*fm&Z;c}Hh`X5@yl6`919ruVpoG_Z+S8XhJ zRwz{lAJ|J~@U8I|;ryZpkwGf9fuXXBXMawx9NLHQtCb$w5-il)EKl!0gt!Um*iRCF zd9f*TROa8}xy>EK%PJsWC^YMKP1lyb^56wx6LcB!xd?qM#3;S>ISm*lnf%}C3sohp z&h@Tr`jhA#1X{+6QWOWY>xyhjkw0IvwN_ewVzl}_hwGRLO>|GFGrYR}{FHsO+<@ycN{%kRf z$jHC=<3hEL4e6;{7f}D*UgLRLGM&umCfLv6?z#laH_4(A*I7iOO~un&l}H!(n)Hor zE*Usd6q)bGin!a;*kiI%MPDtUhe86ry?E3062<+EnUz#CokB8l(UOQ%tE3-yN7V8g zWNR)R>eq>*n!NECOQws1Bok#A=2nP``xPyyp(hh=?m} zQB_Y@m1$3CzH*!P{5pJ`tx7w|S`8xfFeFR3y{9xo>;f+B%U^@F+r7cgskx}PItj!W zT}yreSj^lR3`R=vQ;_xF@{{hzc=_jBEwd%n6qMXldCOfpmOIdgZ_#O;G8tIil&_+XME`ezAD8uuVc zF^o+L?v}F?;M#`!^It^kn2ZqP{WBI3>R#H|$!(BY(4ysxBL&=KJKMqq8Ic%kVS3qcP0C;LWS^2@3l(*@InAp z#ols4(WV;B@;K-EjTs-Qt9mIeH7#&_)a$gvtJzCh-xAVx1tqOyxiB8S`%&JlM2G1=x6~ zp3p_Nl=!)Q$7-xr1yMk~teYl2-Dpo&dG67aGdmz{P=l~f+J8cre-oc6wa`W1@G*?j zwK$)kaJqLSOweNf&BzxnC&Was;Z7JLp$>I=MEyTsnKFJ;G4 zto)sv{`i?yYN~2(2Jw7c@ytG7%ar}44j7ZelT4>fKLA(9f@ZnOY`_M-;>>i>)1!$u z@!t4>$5(%a?=VT|t(xyxO$KmC;D09v73R#Tm`h)Km0pM`WNaFH z!=`V@Y@tr5mg(Q}xQ85cj~lHr{f$-kJ5KtGb#qwUd;D;##l_2>`^+W%QX(Sj2_u|z z2OZfI$G6WuQb#V)(ySgZO5fpNL~3n7SoJH}N7+eYUOrazd+r}>Kr?cNBHyL|teZFZ zb}bn)5iWd1K@2^c!zz+X%waX7^FV^BblsG+eYryxwR{%Si?4XKbmSYy(=~g}q)Lx$p)y)^46bEjC4vn!0mX-5oQO zApL*Nv~&>(gF21}zvSW{$Jzv`3>75)zo|sZ4L>-KKTVcb|2yX~cWN}Vd_RkiXyF+3 zF0`@S$$-}8v_$W-oEzUer+^hy{KKbL!;LsL!&(F+4#FY66?yM%cHdWu++A`kv}{C@ zeL&KWyVzqj>?GZpVGn1b`I=e@g{qJcfIJaY7&}9mZ8IuuWkdEnkC`%fzR!PO*E$0P zqcFW{tR10pXjt}C0Q%s)tID(-Fsr7=XlQ-}a}!IU(BwNi9k^%rbv8^!;{4*j1St0t z1f{-lz17ZvD$Re^d3$3*gj=@VuqUMMC_Xx&vT`@o z)YI*5^1$eoz1?en0Tp|kS&R?pTKO=I#GP0qkUk)`7{wZ#cq6$t)4T%#rIMbM(dsP8 z;eF#P^>0D>Sy70P`VmMg5Lld43ep%Pnf}Tj1JyMArM{?v*WZA=Jjf@czC+l3DrT`e zrH3H^i`DSBFn@h}^<~)0h2G#JHt2_EVH@u}IAA9an%3pPT%SxoS+EC)IbVlYuVjF3 zxQ@_T;~JH-h1DoHTOtA7>buZeIV@KdL?qFcb=>=}k?>%{LT(Uj7|pFS^C$$G2&Q$f zKnFFyQ!T(hAKWU_asodfc~gdD`OEQ`D>oEm!?AuzEmM8`oS|t*U1D`wquC|&M*}J` znb=(yam!OaX#O>^Z&~KoUQ%M2Y1ItWaruHKYOzL^q}cZz%XI3NIrX zu11fljQENU7Z~;!aTQ2iiGWMx>@~j$;4np;c_!3#xW!L{;HJ_8AUxTM4GUp{7sYhj zN*)F#_`*hOoe*F~K#vR+gFiy;briD!rC7D2E;zu3AMbhPq?9hm0U)nC(Bvca-?3ID z3mjxfI4IvETXqCv0!Xf_;kJR@4BD!e)*>9aLz8N6YA_QHjagX3f$w@+`kqRBKxA8u*2V#j4G}ts;E)RsFA@=M%ty-|2%UIDMdJ^>*k0aWHR8EKP*~?mT}h&ouxOdBvhm z0U%-SUkCGCHb{_4Z5dgT$uw0iHHYKMn?yi%%%b!ND+9pg%t{+j8S^-TL+r^ z=H0O9l?<4{Bl{x`&@MC&rv2;yBewN_a|Df zss^4#h|$0tg;7{zvB`jed<&P3Z|NFCasdk6VA7e3k>KsI;`|1Oop@e4#r(r?5@z!^nWezzCr}G2DnX4(_R@h< zy*ksxL@MDT>+kQg_^hHxjfyH&zzhY*wtVbPW79r5-_@J_^QYMRaM74I)^Rxn$ugNy zLIR>)rV;6rE7hyhJv{v4=kdRhOnDry$!Jh-l_ci=((PzjHl`5oCK;*iwG58Cpv$7M z0qf+^;|R~BcqtFkq_IGg~+Cz0c@TW z<&Px@|Bd|rkDrib5`vdEBEb*e6ve>&NeKukE@pIIXrZqdSXeObn+G@J!D(57FhkPf zv8j<4n~{;>_NPe}t0W3(rq(3BDr%KO1FOfWe^54q(}0yRdimQ+Y7LFh*rydZqsu(KMq*{nXER1DSm~YQ6b6isDio~UO%%C|`=Kj@ctsIblw!{Cc z;umldm=e(aaDU6^ePHalKTo2ep+PyVIPgD{p|*Sdd#c;Xy2{@Cm-vj=D{Y_8CZ&$u z*~z$#yIVar-@GM}JTtS;<}}s#2Xc!Ogj+Q=y|Ax%aenk15tMp(c(^)VgYVbeDhn>< zaon@Avbtwy$^Rpp@hce|H)0-B$n$v8L}alRYudRYGpra{C`c0B)7y)*xVU&@BVkY_ zfZDHG74z%YpV`^TpX_3%VGqwZO<#Wsetg)PsiWnpDGEMV%Ntnzr_+Dv@l+#ES+&Y_ zTzo-5`5Vq)qs_=G8x@>`b13Hv4tO&yZEdB)jG?`+f< zEGMHDhWua+=E78+I*|h$<+Gw_>JL%)Dv=kBWICQY1%!H%#<+)UOOcCv-9ruy}za{>ZDT1Rj5DB@VN~#huOY zWYBZC5K|_ZFRKJK$}6)-ft5r)e)ZMVe;{2oL3xoaVw!9P;A@drA*%=aE+fG{>x%UI2@dU`8^#IealI zWNc?n| z@S<`Mv64o3pE)T=;O)s;e1yUuiz(B!;DQ=%vX6rcu@v^Em%5;arY;{>0Z4^LI`HZL zmRHLkL3!6nHVJ+ZaZMwt9bOBDBGgAG?GoNSf3jT@bRdbvGckwF{}a76-Wl*fs?ia6 zAk`aqj1kT0J(4^4K>rjYaHmhutz2u&5#{(*WH#bpQ571$T{~8{0!bz2t2}sqW`qjQe`@bbt_89>3aiPWyz9{L- zRsN^FME8Qp^MAAMlj7xssp4aU`a~2yh&s( z!ODWmDOMc7&&dKX;{P>&a zj=b#I!`H<$48&JQlwtQ`7);HZWe^4>vDNpeF%V`eb=o*s3baKRkwK}drLXUaXfFme zF9v}qX&agXG_rRR3kien2mz5{2sxQ5lg?cbFIYe<#R|EP5lI|L0ZL6!S4TwW{*5LS zjT=u(?r zww??_Xi-Wi?@(eO;&i5FPi5A9B$059K_%nvGgg0u1JL zjI=Oa%9=;Y7yB&O5B7sIi&)5Zj4COeds@P?Kvp;bUIPNutm5ITu46EIcGJnM>u*tl zaln%2z@Q81Mh1}aWt@$}U_V6e#2~DA;P-2na}9DhjeXuL%HU(Lpb0LKa$3Qi|QKa(~1^ zsK{vuXTfOhh4=*KgPxva2)cp>+z^M#-U8rnt%Y!q6!2!2@c>HH_7{1eXkJP~kOC;8 zFfh*v-f}kdKgL30U8xfhkT5uv0dRBHNJ9p9Vk`k(tQ1CsiRlwCbpIG17D5!D6VInB zE#Oo87nmR=jNAqxFfIP+v%(la3?mXc_og^;3C#q7Kv^0vD|`^#*PbXq2UlDapSnAm`zV+zfda^@=U$*6GmMknsGt%m`BbrN|7bqGG|+)}YOR%NA?E4&U{EMKb^bIO~SMx#0-#F|Qmt zAT>0y77+|QZ&Mhcri2Wb*9hx_%rTI}zNG|>_1W&Dm~JQ-DD?i_UC@s@rH`T5pc1x- zlsW*Y#`xI+kf{aD8}$D`^Ydl`80>_Eb4E~vk$u`0AZHuP{P1#JIb!z>5C`V6-~*~W z+wUhS#hO{6S}_nrpXLl823Tp2H_@2f1GpPs;}U_Xoi7C@1-09EQ2c#EDgJXnfQ3px z0NsTZz{eI5c;qM#Z0>gm2ndgluED-<{wM#%-v7neTZYBa1?!@?ySux)1lPeWSa1#Q z?!ny&65L4$8r&U%1PK=0-QBr8-#%yG=l;9@LSUw+d)BIYrK(o0hxkWBf}wnMPcJWj zrp3jWn5c?O3ceV#X0y=Mswh$lJhPDSn3xzWPp>bCDKl~Baj1(!UpQ?q*Tfd%vCn9#mi#>L0?F6-Q$0(?`q&J0#bS=rRVq3Xz0?fE|{tL6*4 zH<1mGkB<+i8s-ldn+oejwkBsxCMG5j{QUd|t*)>g0ZW=6gFjDv+ng>2UEJQnI_2|$ zNsW4e`{4`%3d%sfSWwS$c|6XD9juwTd0}ZOEGjDM#hnc`?2ddeyKz^6@9j~AUL%wD zb3-!JC-olSyt1~oHtT=&v>hEC^%^+4T9mK`hKAFXI_w05gu%_K#Eca2P?2b)eHH4( zCXS8?q44Mmso^t#2*gzDd8&6YA=s=@z$S($GS#p`wliu`whdIk=&0R#a7 z0gEvbtVnURPX`@izWEnL z;Q^gzAS2+1g#Tqm$Y8pIOjYTO3vjpE>+o*?8%`oR&OtCP2@N ztC|7R|0r^TV3;Q89)kt2+DI%xZe(T3Bx>X>b?s6xW-9fn>*EC^xp22E1u#xiXcZbJ zR-^zWDE>^t1(;TvH;%ESt z5e+atg;xT<3(sYrbqA)v4-^<`h=YmT08C-OFmTlbVK8e46W9`JG{eyb;2#!xT%-SS zzqVi&;1N*9+NRO70$@o_k?;dMSj4CKF1gQD3EXm)77P4er`0xGzxy*8U`+$7H#d}5 zefmENp9FPP0D-=PfPm05l1$C%|KRKch;nLFu-+8#8DrsJzv2Q*;(Hm?)6-Kls&TU; zska)u1DLZGiO;;lqgU)pkOE86rwVwF17L9%5dtFAn4McipoX|KB-x0mscEuz!c%z^ zk2^&ulyH*y+sor@zQvTv*IyUn2@~1;)W%)@(Q1)Qb`lO5M!*YPc1AEYziYq(r>CWf zQkT-e(lGQu3$CoJOm+CU{kJ1#K7N6B6%KqMh=_>TIQ=V&G*Sdy{Ne4@Z%ZVS|4;tc z_|%@JahzJ)IVKi^7L1{xp^ekZr}-LVu@1j`l{w3TyZ;#Q|EOsHf8{x*8u4bwRp;BI zIhI2})K1@l9*QT9Z1*~+OE0Rd%pRO!5c;3D`qII?vAg@#-YkR7Fy-DR5@!Sr7Lf0f z4Nz`tEEqK%>A#Z$!c-2GYemle_g+HAq?`A`;$k4JaACz(@5exOM3In@kwtq<{}R%n zDOcbsgkYx{jzlM~2>L9^t?;c0{0G28oz0&~kE)haqd06QKF1QFr$vx1r(qI*l`Ud% z*N}y+5c|!L6Z5(Ft*9tra_=+!Ewz!fm!ID=%U8hC0zSMqWq{64UC56gKLQi_V)ZmU z|AX*25|C>%Ol)jy(dZ_6dNP>8Wx9M<=^r=4{W@HCkpMYNw|Y$5&S&hqu%h=;=*OO+kP|op>G&@E>!PI;sX}nc(1* zgbQ9@=d?}ftoo7gle?@=;)<0Oj$%noyB)ile2yzox5o>AXP9PUWDhkMd-U}NdwVJM_mY4O zLF=@q0>lWxPKN)XVKHDCEapt&u?bK_9`95gKY=Jfj*QB;3`M}cVklZjTmB4aD9hb3 zYaf8XwHkV53DkIA?V`)n0i$wcF4O$~0lt*~qttX2aJ$nYneBH#>07%mvz-GF?~(y2 zB#HX}igG(4z+3Kwj4&AhGuD|-{0qwfX@>^xGzH2GylLqWNcX_f&JNfMatFc#ko68U z%D`diZ;Cn`Sg4vswE&CmpEQewZGgB1(i@%fkq5t49`{2A*f<;cX(pJNC!RoplM(Zu z86=Jd_9)PDi=+XbSt$KyT=FCES0UbMT8H3Y90K)#sDK-^X;7vCZr9K_`*S%2Ou*g7 zVzvZV50vV=b*KX$sbzpk3kX$AyJsx?>Ea12igK`EGL}^A2t-ek|24bt!JismT6>cT zV27sr$h?4MLdj{JfrA0o5IH3dI3~fjGYPl~C16T<7$ud#RR#PbD?N_uKiScdA{KZA zBSl2J@`^y*n$d{(qX>4pWn=~(0ORVn?RcPNXqZ;} zI}-4r8NIAp>wvZVNs>{f+7-0$hhJVpx@CF?ImBp z`6UWbGSUaUpnSm6BUpu#1Cg|)*?_;828*;{;0@tDpg(~lKi(XJsvbC70Vix4r2wy$ z(+K}#sSVsRSEVjm8PHY>KUiAyAEp5M0)QtiRn7pmycm+Xe@)>4DTIQ|Qp*?kg_J#-Cx4UKfgy6dm%5k|G^t|pn+#o=?t*>4W(nHO>Ry_V zH~RM>4P#On)O4Uuo#QL)OU%9p9WQVW66UqiQF&G#8?eqVd%e$GNSizIHkWJE1}gBS z|1sSbR4$N`HjYV3Az@=ty=)v`lbMd!9EJZVD0XyUbX89|(GdS6kCmR21U% z_PEf5E+^$SuzxUdzj^bS5hbKX70Y(NKsR3dV5$OTrxPB)BE11wA8->v@K&b(S}6$F z8~Q8Kvkv1KaR=c#2CCr6F@Gz!>s+3hI^4Re8T8%XbUW2-4n!+n_`KpusM|6ab@A!B zpM^>Uc&ICUgAa^hY@i3*oWh(f2;RF9*eW_3&qL^ioZlGKgGK0t2zpCY?b4N z?jNw69P>g_k4Zb;u%Za!sTholDL)XQhPkvKO(`g(Pg|88jaP6yb_1B}K_86ykPLCcFyip<3Q6cL z!A;3hHtwt2Kop{SSaNgkTzS$ZDX-1N7e0m6&pwU@Q^-~<&1(^MPEh|Y+82j@C;A!= z_4y{l5@pE0=f6(g?j8tj!$|5YLA&R9(CgX4zsH zbUGWx8MzVY(>12snu&^TAhgYqz}|B}c4P)~UoF&1?+mXpesAe*sq^3(TFU96*Nzyu zVFaO;9-$8G75i~?*wm#7D>RfdP{8xQ&=Q*vgood)MXO~+Aq(hL%-L|ApjAsYAEgv( zCEuJ-jJ?89F8=FAq|1L~S+bI5(g4Lqv$fdSF}!Yc$i1xy0g*CRZ@9B>1ueIBO_9{? zPxs(bo{R<4)TF7vQG##^ijE>vm=}8ctt-C!HL`M!+k214AVJ)x-H`lgGgbeD52O5q z!MPx>0^@++-LN!sQu`V>Y92|{lzZGH`-y{br2H5d)brg0Er#`P5cc)!@yV=;B~j@u z;6-&vw0w-`ZI2AaHN3tf0#T)jHK47b}C#3}^SpW8tKFi(W-4#Ue zAzmn>f7T#@Zh;*Y|PNxhQ+lLIn!Yz%Nwm zVj=Vz1vII+_d=epamaVQOVfM0E_bj+17|iHIA2uOX$2ab=)R>Zy?Y7PK-nBC{Uv~H z2UbvsppwcsAQ-BU6qQr7jO1q4nOqYFlel z#Y+?~CN2s(qImkgs_?{%C!Aa*-Rv?Dk6a!PNxC02;+<2qG8ipG6c67>#S#r--X6oU z37!nw4uIY3XIFHf|v((p+WbgCSm{6d!o05g>u`+WjtsL4{dj^M96EOh?YA5O) zN}pRw$t^G*CZ6lSfqRXeE3Z&?%(*%H(>yA6-MFSi2w)FVlWG@{@9RqZA(h>Q|(*OZof z1QWTrm2}!X7k|{oOZFOAzsObft97G}R7bWz?b7ANKR%2n?n$l<4eU96^oT)@fLTVu z$i(|x)8>7wuDV)3nd8LaQa_<7?U?sOC0=7#tV+HS%$Vz6D5mxQusKm`>@BPll3$mA z>gv1CYrl>KI`(1m-l8SCM#}_FJzzwbO8oQF9(~B~;VR?W%HB@cbEiCI@hU`Z#|hdpnrl7_RbZ4IIzJBkLJcMG-M4 zYe#B@wEbSBzt1af?A8(R@}$r)TP}z`{gp>KvV~mOpj&jmgeq%b%hT1}sU$s^wT0{G zpPO<_;byZxh20eVBbH}pI_t*iAA(gNbO_~m#vu*)Zz5?dCkDdxAwM_jGhO?IP$7$~ zy;uJl;*z9O`_NYSHjF#D2gaMrw}Z}6WUKwdTCag$U8QqQ-n7H;0(}K{3@e()p^C;T zJq2=}vzZ>*maM_z3FD0T&+G({-LDr<$?$*3{>6vx=TXHqlf>w01CQ69*D->SjWW~u z1lt}y8pNMuPkn#xlX;N2*${+sbiW+TJUmordj+t1e_?)7L->DNZgF_e?=6#WVnkMB z?~xXEY1coQfP>bI@1>0WpoIGbtc9it*_NgAQ+pHn3-!xeFAzUU)!?oPG>bdGPxM`{ zt@{WQp)ZAsr$r7{AJ-CJlc#VhoUsce@P|BhMQ-3(qY9m8*V#O9|oUWsmK9rKe9F^w2ZhjB6Nz|`neQVaEt1Ke}liP%P%f_ zpR~?x{Zoe(`zvj&arhx{z)V8_lmPL2H-Nllx`=nWP60sKwKu9u4VEjk{s$2&Fo6Ls zt$bb%!j*1pS85^!M;^SLvs&FL%Zb%yc_od?NiFZ6059_s7@>~X4G@PK`zrA>Teaj^ z2;zg!J_Mh@<5u%Kd`I9tDW*J3WC1Ps8j4?mNkdU>D8IfzJEw%_^BG+eSncs)WUK9L z<*thJN9 z@j+Qtj9I`9)#qE){kAOriQ6D>JF0qc;O|ag{>UGqU2=d_d^LSImaj)mR4h0?)FyEW|)~uR2%Bs^V z7EylcE))~)8NCKCmEC!Jn(0yzumIT_=NXQFxMiDMt^O-2*^2zCv3U?_WL=XW8@#h= z!wNAz-Vd@IK)L2VuNV8w$H z$|J+vrT8O3^CRUqAW<^Z)Q6C820l-P%QUw=tDeAf*?BBcfKUv|o5L^XBP;A%P}kT} zKL&ty;qoImV^a=^lDv*#0hvwD*X)bCnSTO49&(%nzo={B6v>RilWm&X-G` z6z;k-?Tead3g|mY9wZS%|57Y~hbfQvlqL%Vz!LT784EB{CS**DU2r1>l3wt#RrU5S zlRlkFC2WHGDbrw&k4<5jsx7`pXn}*5>lc&8rKn0m3#N!I54R6U)uOMdErG(IVy+L_ z?y`qHAc24r9!IgaFFgooF*f#jJvk1ZPv+S((eZ}Al#Z2sb0fzKBD4RyJo`4FPvhc-iL@2AC7O{ZU1>fS#6 zgev$Vm-Fl-tgKCDzV|b~8)>Bd`>T-goma0BMc+{*<9toizH8#Q8TuCG2lLJNBMQ8+ z`y1ry3I$wT`eAJG#1{G%-yMhzpeQ4E1|RQQy)=XV2{|?j-GG*fIuN1RME&ymPrXcE zp5_#a8(q+6S-%yLF6wkIj2p3w;rXUJkTk)B zAvQ`j#8(1`T_3XXh#$0{CokH)ccWOSxF#4oFPG#JPLOKCRL5- zgRbit2AuZa9>3x51hr3}U188%sDTPq9h&{bugE(sF_a!pn=QsHO8>-nFBw@B;xfaG z(NSbcW4EK&O+%Oi>8BbCypifq4oO|1o&8fNBhCY3_O?|v>#I0p=-mh)7gs77Kes*= z+nyVGyRKmk(xl<;bwaT&EpIsZTk0AI1eY3?=yMxNs=N9qoB>3%Jag^`GM@;F%suV> zrtRN2Sa$q%Gncs^)N%9cph8(U=krZH9wj4BN#QD-;ln#(qd>N`bFwgi%@yBWV0*iJ z7pR3{Fpg&Q(*QK6kMU=az&J^S;abSKLdQ=;O7G)mBuE#_zn}ENW1YMbwj1u*=R;@J zRfACC8a{TZ55Eb+ynaY;(V2pA%uf(k{o!YfVz3CKo?q3)uw(&w=2s;yf*9~VR#^Dp zbfYef%hi`Pi9c1Yc@@urjjFR+!i4JDq9U^@DuhunjhS%1%2DF#YL6ljiC~s&L1g{} z8#GIL5@iLNz&ejaRIe8~$1XZI``Ltf*Bu-7wk6ckp`_C%B8IX2%s1TNX8iBkk3TPu zJhq5wUIYlw{hNfM-7?p(zSUohnk^p|Orcj)8;9DoSL;3^0VwJ${8O%9|J_G(k}G%F ztN=LsPb^MADbp1b^9bhiJ`^3gUgZ8XMd36k-5 zAVL}E?3)ji3CVr(7J>{WC)+%&A+RoQY={BiRxr;Wx(8JNZ*4juwk|;c3cr?PX;mB; zYB@NDk|0jsb1YaRvAxBpXcl_^{qFq18nJLUu@|)yLGksmh27hu+kfA(rKwX)kvuU{ zh?T>(96d;*rGPB`ryYV-cBePqNF+o`=`M~$dGvB!#iKv`Pjt@DaPdu(L; z#$2RRGs#rnm2T(tMwl`5mTfN_avIFBOz+HYf4}k7hJ^6EJ@o7F6}|Ypk0hADK%;7H zxc-bkvK8AzIYFdp2)PIug+|iEzwGZ#q`6I7#0A1{p0{oj*6L9$+4Ri+?s`FSX@`be zdGwZ|4Ai_r7$bUSmg zyn|uU@0%x2<`;@#PFMXFr>KiJJ2u#%ihOjnu5UdH62+Y9c|uW;b7AXU$dTJ=qPnMV zu}-Plphe%sB5Y{O8F;~#hs{=UWQV(6MKiyLK^LB}Uh5?|7EUK7-9GVIx{3OLx&VD{ zl4iZwY-89q>!zM>iqBJ({-ao^STL#1O!!X~VR~+Nnlw3|Z+mB${pF-OHQ7(v>xo#e zkzdzq*E~JGGkzBA#D4fhtoVmysD}vn&VM>tFdG70LACt-UMTjVHddm=F`IZR?HsTy zL>{9<)#rpWkk~36QeVlIH$6->el*W(U|BT`4`y(GoSJvXf72$4i0y)({^Whd^+uiU zZWCMD3_WFWVk5k0&f>x)diM|Ubb;$2W{unewf&XA+CrmF18cy z8Qg$Kxk18$d;)V^HXTTBkJXabp0Ss7U1amCK2d^IVf{_?+2TSr3klOOfwpFutJsT)mA&vhmi}wQZ%v?PJ#*({V+kc- zc)XC(gJNNH8{MvQHx#PX_FA!rH4UT*){@o6!kKz--?HKB8 z!0{#!%?YH#{p$v^ryr0+JTwv+Wjfa)JSVKSOf?C|1)qtIeHA6gQY)n+Jj!UaVnhJZ zzAwIY4e0Z5HFPblP!p6uldq1B=$9kSTBay-NZ6Db%3r@_nL{HG8J8fI=mgWZE=xe#XM4|4I_j6 zDrK!ZN{qs&T|0vI%~GvNjwA3@ne-$!Uj7lb~+rxRL*5bBe_P zHa>d+Bp)yL&>a|;@wWNfM7FT4*kxw`W!4lrfJz+ps?b6n73TFdBS(9YZ7t9xS6<+= z7^OP)rCpXF-uH}0nQ|MO4&MhOhK^5IBkGvl=jUH`8v?xFRprAR=vZbJr@FnN>;42i1OH|0na@dD9?*c-~>u*H!$f|*U3`pp4 zs@U0Cn+QEi9?Z9ERx*)ix~QZ+rJ0KOe|N*C)&1Gl7_fpo3Ov%qDfyQVp%^PEh7_Qt zd-c4o)=rteZHUkmBN-a)pIX(>bgKM#!8I87WWZsq#8VNy0-O?o z4>!!a?{JsK&faHc1`p%xiBzsTO=6IxP=cBMh3L&aJtk~qFuPLAm}9lRYt9XoI#9`C zWSavKt(m`W;re14`pTGfIAnD0yzE1(g-v+$Bnx-wAOV**IL&Q|G{g>i69X>rtoecI;WQ z#7J&qk)_;cbd&gP0O9}J*(V@CdN-Ow5UIBIoPjDi3mb&y$-5HRDLGHtN#KuQM+;he zoyYatAYO?wlsNg$VD}oP`{D9U8nO@J?&Ez~{^%XW@z8|MU7HTEDLU zF{Ap$N|SJBgH^=E$|2~+z!?)Wyphv!(080<9+o$DaI^B<=Vul#e7netde^C$L6)Oe0S zK{;dg17M5+wLN45FKzL#p%G@+tU+lG=BQp?#Iu0)$9rlI7}!;)hLo@=VAlvh{Nr(e zPHZ8|$~Q=1^B)tC0p=8bLRv}&S0$EUM5kDQtsX*!G(SY(=nF0zqXb|YEn0%CAVFMi z{Im#>&Xwg(7y7UQCj)$m zX_K0&yklk|5GG|aeoWmD|KUD(1N(QX-9dQ=`5oncJG<7bTya!jTTu`8X~ex>Yx2McXTTkjn`;j72BhqLC=NZ-98*qkI_Fi{Vby@r}N8yEG1iYP!S_BsB$Q}v2gJk{z% zdWf`BrkRXHh#)(8h0L>ZU1_vDn}7d6f4>W{E#kvF7+#8SGAVpO3}nZ*ij*J^gevIs`v!h6nD95ALArg%8PA ze=}jhmPdh?;akJ!M)rmu`Ws7sMXWPytC-mG98S?!3HJ%C%kmHqAGqYiv-k$#1tneP z+Qgo!S`y?YWOaj{A@yTuEn8#89~Hg@_J-Cq6UO1?>y#S8rCNoM@ zIfd@K`G#;8tdf^lq^v0Gz~Dfk^W(P)bvAOzu7IA5?&N5eYT3&&UH2W~pMKhV>*VIb zrr*t@I-RKge)5gF{TEbjqG`jx7Wu<;eDi!!s6%?5=%-n$7V(bBpU|TcX+810JrbfI4(ay7@KbH;~6OFuFi_V%;y0=vi;q&x*=KE#lAb6CYId_wS zijJK925>kc#wNKr6mDNsazR;t0E75U`7m$&#el_i_>u5Hz?uH)z9GCll~(LS4i10- z&J{VF#1P6QZ#NEnVq~~?;=xTAXQ)8U2`;7x+SN*|Ok@WJ)&*JK+5H8h0OZ_~a-Y#~ z;}m|JW%M3~2*B($(LYeZ(tr(9a4C%}*w{>#>|6Lt6j|ufMDrEUi8Mk)OTpf?jb;%K zA=tZ?McUo+7z9qqnzo+uBr#Y~ueE@~@b@BpQgIg-r%LKc3gZ$n_44Fh!oil#hzf|X zgeLrXNtsjQ`i8dX@)yrHe69!ey6>(Objg{nN`o^;7&nMl6~5MI3GwAtTsQY^1YU;c z$aL+pm_R!pH3pfzs!xGU%?&0&U_zpEC%TKHiI0(aa+h0-9U5KMz7wXB4XeDZ^bB(A zHY9xPjHegxn4S+b+JKGk^r|BEb{oXI}1@9^!Z8&o>|DQPf=)6PF`7C(lbI;E3W^ z{N0}IHjA_+7W#d$%a5^5jx&={{&De~1;-!Th~XiGp!1$Gc1Ycj3g_y6$bjdti)?-C zy7>6yTA)*wTqZnyAnL&zr!054j~DaDN6dTujEjF^O+uwX!m(LZPJB6XU0Np+9A$%3OQ0tw($OF_@vzqI@yvv z#a1awAk^sVgfk}sLF+j&+NU(-HtBo~hJqss&{S%F=D@~SYGNSOB|UNM)o?6tS`xuw zqD&m4CTc*rQ!iS!D2CCgdis9A#jT*VbqnVDoO|8=KZm#~X2PO(H-DTTXo6uC{t*J( z=P_NhyDxOiGGb#&SimvXb18R^6Jxl~+brWtXrYQ}q6zC>lHIl;0>@7D*nO6U&(EZJFx@?_cJjW^gO*yQ{ zF?v_=1CUUGL`wrZ11^heXe?y50lGXvOG^mGzpcS3_rVshx>xM1#i+qG3v!fgZ1LdQ zgklZ0Qg!R3(2rPq%WP(z`#1ztPs^N{_lEISA-_+qa_ybx=cO6A#0e6V&SH7(O@v(j z+Qv^T+!yFa-@qNWJm6ozs*14pcy2=qqhYY@Cew`+!ktpKZ`2mB`iXJbY;T2b^V}Gp zvPEGeqeCyg&8$g^OKZ$1`NxEkgxdnA9{jeS-IO7aUup>!5cmy4ED}hc_uIIXozJmZ zT&u2hI#jsH?4-@ke=*cX$n{ue+~ytY+E2MJ{M_Fp1inHb?^|eF-|nw_@oqt2Xy$}v z?}o$~OI6CO@a1Gnl(@gY5BVRV=8cL4bWwqR;bcCbu?r6mzSc>Wn=&XmgXy%6U?kZt zAdQtEb&LWuvK+fuYXSX7t!smfKIe&-a@4#bP>1fj29hxp|?`2ea_GSd(eE z-#kmSjinVa{>Xge%^qE^9Ct86InR-}B9YK)J+x9ArE21{>D^*pg+3M1`B`r7Jg;X9 z{t`r+mT~{J4a_%H_u%HLLQQQ31u7X>!4Tuzp%)kK+WS8`d+k_L`Ay`Y`CF+^bylS} zfk|EK(gAI8%I!5<&9df7-^8FiG;V7!TE>rp1G7aiYvxFVI?hdsJc(*^Zs7K;6@Zcx zIw#LBB!99!xBu{?EhXkgLN0xGDaq%@FG}6i>xfqeC6?a1xVU_TbM^jDwHXjk$YTz0 z2@GzsNZQWljve8I$@mvzyZ8L+?ChTPlUH}pwUP_q9Je%Zo&0VdMY}Y_?<#;5tOYDj^YA`?CkX)a*3XYI_Vag-lL-ISVtQsI+?EoJ<{AY zt%D}iJr+%+_m6{rts73!udYX6#i|{o0`6YB>eD{|R(G$XGry7`X-r+@naMs!q2>Jy ztl;964qEZF%?)PSSu;9+LRPW=)jg2+!a94G%cDrPVxq`E0e(^K=aRt{5FNLjaL=8f zi;ZQm3S5T>t^Jz5A0HW~QOp3U3oiXB`2qv3)S*Di9R>G7a-|_?!~-^peo+ztYgh6a zWMY85RAMdRR}XHjK3TH#Qvno=#w&u(LC8I28uYMmKgaMx;r*RmMOS+p+*^grhI1CW z29~6siYH$5aVMPy7+=4zUQXGG$)o>mI#wX&9p&VZR{Gl-@osD ze@Ptp@)W;uk-78xXlHZ=Mv!O96 zq9{}M56Ah$0rwt6Abpp1h93n;Qi+1B-FWEMugm-Kj{2qRz3;q$gQhEu-OLGKTW3=x7H=hK_{l z@QJ4D2fXBlJT&-0J7UwdqsN0=V>oqX09P!~wz{Zii6?AiUr!I1uyzgLOXTl53UrBQ z48mZonO#~>BDiOJLj|vd5Oi!KlF-w2UNYpcoxX+z@tdwK65NqfP1{rpRoB?C>-NdJ z=CyR^)$$Q1+;&7)lmuZ)Xxvhva=NXv;Vj$5$Sgn=@K2JSRW8f3$w^Ey5sf5cY)4)b zS8>=iVvB|iQU|rpXEs`*<7M$;9V=$J$$frSmMsN@+z>KU7H1Ixj@2h3`m)&(2E{xh zpuWrQ%8GC&sm%9|?;*XbisQOZC+)nC3eOqXD|&;Aw2@9#dO6@*q9-E%fZA2f%RINqObn9Py|kko}g zZ*8Gl5zs}{$hZA?$p;qfgD$Xp^x2%w)$maNBI3f6eR-b7ESj#LffOtfC6PV9+ukT# zBQ7T+kzvQfWVEDCqLx8^BMSyLPe~BT^)(kuJF1ESR*Up?_{EJuMBCxZ8gTakB8NaUqBlvpoXo#gBmYyWCbHo3<6@dCf&!8ga@8D9wMml%8YcQPjnQ&!^w5I?)VXyyh zg%GxG7M!3YTRnN+wToB?I(pi92g*Xzy%o_2hx}T0Fi9oga++NptuT%29mdsQ%5%cO z%((HW*DFYA{(XuYJ`a6VCj;){!=&?&cB~#1#V|XZtNWySk`$MCA8{If!VgMAs~Pc1 z7qmsIOJwZ!KM^1TaxunIA>#7;tl~6|!ak&(V3GjBkxNCuvO-Dt_+-}Tr;(PHP@q)o5Hwm)LK_a z%t*{1UeqoLZKQA-W4@f!MDL?(#cqj4>GSxZC{r%3;8!NL9a=PYLxknZ^AxFOSDw*= zzX;6Z*(On=uq6m#c1%84awRm57-Tt1iTzfN8~=vIqUKqG+a}u0 zZ+7YqG)__Jc)5H2;J=%+ow8;p)v%>#O{3!=?jQtt!Eu9BdV`xM z9bq>SasLTZee9O6`2luS+K~AkBMMfP_*ec_WEdR@cgs?M<_(gVDd3-tPU}jT+gLio z{cp=CUvBa4w4PD%+z-CYm?G!Xjm- z#XT)8{W1zTmFS#};i64q$TF#Q<(sX;x>Owamlmw<`s_Wi2Ys2&H`t!vaFZW>CVg57 z9llKtr7n)vc0EBU(z4n89_+srnI1jj68K6`aC1hnqHn4RePA7&63~^C$e$J)J*xH3FV(ay}FCfoO z5eGw7jmF4uSxmEuBy2r&k~1u<;Pl^CN+=h@!F~EvB(KgGXjjT3V{-?5iyh3}q@>}p z{pggMq4@D5)Dzay9Vviw-_eyObqlT@z4gx{Wd-^y>SMSP`ztO4h*jl*`lfsO56s{m zewt%RD{k-@kF3AUppW~!BkD?4Tq;Y6pwcv6IgICL9$8}6-eLw(rDS~y(9J$JfkP9L zYTqM7wC}X_ zBlDs85>BWlM}#$KyTBrs&syu0`sZ`paF!EhbO!I(?I7gBuJt!#Z;a^Jd;5Qx!S>$? zM9-3qq!a#=Ot4L@Lr`5$$(=$b?x7y&tmPqH2Z9FK6x~j|dyLuOa;U7A>;#km!_;(D zuR^bof$F>pbdGq3AQz@M11(5oe%KmHpazUrm=>k*#UXxxI4&O_tSg87y`j{rkjr5n z&I{MbLJ!3ny@w+NFjS?a6){aRAXW~ud^1}N)?rxofhKF6z(P`F{b@&ohHe+9o^Y;K zJw_+&kxltDRN_3N`TXuYD~aEa-XXmytIeYEmxxDhKfX!xA8k(5>vj~G2cb8XHXJfr zSFZx}?l%Z6oFwXlLQ=T9ELg8@1{_OlX2sJcbF=27BFrk92i3NZ|JI!_?xD0DZfnIXOC``Vd_Y-FD!g#On44ZbG#T4?$H z5XEf~i}-(ZVx-91ndlb-e4dT0;K(K>23X8HMM@n8N;g| z^?aXE{(RRK28HtmR1V9trM*4oVt5di@jh+Os=i^B$kUeGf6BWTxjBL{XtWN&j9f2C zc*xS;^UvLQSVNU!vLfYCu0-+?RRzR+FRHw=;g;}n%#t-6D&-K^uYe7v_V0)iK)d zN66_rXg)znzpbRWiBQ7%GfDm>9KUPCK^iTZ0=~~>X%vPJzngZcO1pvB(`YT~PG+#r zmI80HcQa~}?n`l5!b^B;;TKs3m2r+4(glOk_$!UL2^VQg4uz^YwYTGL z&I*lvnTWCs>@bXUrEh1#Xz_5TGIEsEIe|fB0i#jtv8ftNd*xJLNL+$y%-r=qlK2oO z*!o_(ytJU|ef_$@LTH%uJ+S{3wH^4U0K%%VTtFDMP~QI;Ok&{gP5}Q3n^CCVPx8lctbp}KL};+ynS^K_1rNoQc`gt) z&~Mx-W6Nc%jr%6UPrP_fU?tErGM(yzjh!FA>o{)8_Y9XNji+}|b=WlNNXSxwwIM?f z@++)hO8$3sj@rwCLD~sgwpHxseT23JGSqtx)VL29u<+xtzu!6%{o=CPo)%vi1Wp;a zFVE|AYe=n`LQ4W}?h$mtZyyBWQ@1FF7#Or}^nUNmtJkC-rgMo}dzr`oxhaW+k>jM7i|4on=DgLT_UVp#-0mYs zDMlS&b^*;{QX1mm1`|1qa1~3iP+o-f`vaQPw!J?opb(s@x~Fx4=|>H^;a70qf5~4) z9gSUJ9v@)LL?jFp;#0odeb?#BBn5GHN-@5<}ap+0<4ll_Eji9Wgq-}8MezFx7Y{RdR8iUd@-l<{tx^3FKwT0WjrE!mWs3@ zoZuq=kFT90;8g?pn*#pgdK3#K(+!C-`Vgt$Z%OB(Kw-3+z&1gLa4SMOGaFrcsdfo8 zU+y|u0AKIJ>!?QNxC`EnoAH^u&v z3fQiy%hkxO=<;IyP3*$yI7|~vqGmfFYpM~Bo~(Ph4HnQt&Ehkk7T=Oa;HLB$YcJIT zW(4=Fc+=*6hTEC4k4JTEH_`pjiKxW(V&Gu%0jSr3jf;}~ewW#9OVtot$_Y6!Etz%X zp{6p!g%4OG_vsx=>SRfwv8wR@3YrGhrEPf!@g{{bmw0yba!Z_UGNeuddCAU#4G7qL zAast)G(btw-d&gudU|#5m3;(u?__=vU*(y!x2#609;fDwk>CAK>)tPUGZ*k;Z?NBC zk9|D{I+)khsuondbBXh#4=AuI)7n$7&|L?%&s?G1n_NI|zUeLQR`5$-70$^reWJM+ zoXng973^-7FA2hll=@j~l&!xVt^FRX43L`kU2zHfZfE{CfL+On&SyjPdVWs{4UhxM z?B>PM@Hn?4aEUzDd#FCo_Ky;yb99TG3uPVPUC)upPO!SR$*bo)L9e9 zdr$LW{iv;wNc=QgfK^1eZDi&Mk4L%}2*E^XKiIGMG3`v0ZfWC0OhYRPnDV;b^wyRc zc!sRNWBjGvE2B8@$N9WL#|k%r16_`ErYyJpeQTur(zj3EYoK4ueE4%S-DJ@Ms! zQ)N*H_X|BPpBMoh>A9Elfn7JK6JTff<7LihFtMgb!Rp+1+Vt$9=l) zkGSc_im{l(eGZPG8{PeQy8kI!$I56KE$}RDQv#Bi5OyDXU&ESs&J$*2!msK+ht9mP zH_TvW?WcprUTj3#r|mu=`WpsD-*rXCWMH`be8`>r|2Mf&{!BReuljcZm=d`8CjI<> zwD4&U8!)gV`s&K4Tpdah)kjOrtt;5A3dajHxqzOltJF(PXhcQYVxOI$Qi9>~P+Fl~ zD>jG29}h&{p?)PbyQrxzK*jETE0iC6L3n(^u=3=F*c=+hS>`$FIa+jydtfIofn*BI zZIry1!G|47wEmCyuSN3L{#nbhP)xlsS4_RY_kd*bGz>=8f2J}nVzqfsE?XN|sUtVB z6U6ge>wXNci=w_2x)aaX<5g#%Bsll4?ms>Ad%=dFoRB^1%M+}6EC8+GljPV&D>uKU z2GBXG2d9+wAR7#)7Rbm*HVn{tS!bE3IlrTKU&5ulim4< z-~UvAcpOUpa5^p5*`RQuN}qYJmp~t~8=xkR?%CW_EY%yg7BVW7M19weEqiYqZzazc zD_22)PR>_@zZ0AH~rz;-fK@TK%TniPus@*Lx`o494p=9Ud@>K7BcG zBkceUw0=#X8H%nWExd|m{_FIi?+m;2!_vmvo9TChi`NRlBNU-Hg!r=PRQXhonS5c@ zsJ2KK<@nlj4*^?GW5|7Tx2cvelL_~xy!|o&%yw z1N{*1VQ{C@7Ki)3n?T&;N|>R_P4?9D*p!A7;o6XO!DCXD^NLNhuS{wl|K-C;6H+K# z%@-XLlB3)8*kyW9@y`PN-*!PjZ?j!qGTKg51Y8B|NG_i2}|Gc`QT1!O6Kc9%VTK2FoX zu^MlD`8e&{KuXe_AUtfpdZ|1*k7HYzL6A#c`zncNPHN9eETg%TuskR-nN34UMlnQaNpL4K6K^XZ=+z z@BED0-hh@kLmw_TU{{(pQaPKpkv%zF%SygIWj0L`Rz~p1`A9?(L!r0-Cg8hf=oT=K;NEdKpO&Q&%B(yPYJ?@X)uz9E+=-*HgriHee;++w?fJ>n8Zb*nRC(}j}19J zAbAG{m;o>_c)1CQz=}a}~aM#@&J~E?MK1*6u@X@ZI z3N1VC;%PK7j}mqSk}r9~j2j90PsjE?CS!6?k7<{NdDm7yr>!;5A{rX959RS!Y(VXl zXv$G|@FGn``Ml{FRj{u3ktvvDrXtPCCJjLMFq?lSBohmlFVn-Dw8xAgS#Lf_mfNaJ z!*>kl5_??;3gD4c9T9Y&b2XvYWRS#DkH?0Sob^be4bv2)6tcdsDdSwr3k#=v%4EO{X6a>Bryl*k%N7w~iuYP>b80rVID~IW#D>jIpu-~j1zX(f!K~o*xmo&Rr0~4>1<1r8(r`iT8vJ&k;pP8{9 z7kV8i-ntIt&&gWFmTFot@9BaYowbQ&J3T5=oAvT;Z{L1YZR#kNm5E#OLG>Gc%Xkr? zgyv_OvjiqGou%#i8Gl#>EF<@U-z&6$Np&0Z?1%gp1->rBJ&-aum3%JyurMIimH`7l zY60D`|9Zmd&QA&zSO3#y+_Azz8FqZA4i|t(pJp%_DgJjJ0r=P&obY-+Fh~`q1y;+U zYC}dH08%Y}VwR5R0=tN7o?$^_=fAc1cGM@!Vssw15M-{gH2OR8s4Bvwuu;@;f*}88 zC=l2#!cuRdV&Rst&09n56qw>)ia%jZ#1EO+kD+IppR(whNn#sX7*VezOwU>NdZz)2aIZu=bWwafQu-Zh#OZNFcbo6WrZ{yIXK~cSwSV#@*fB z9fG^NL!-gnxts6InR{pE{v6ioAHCOVpljEzxAdtm&Ginfiq#H;quQNtvDc*`GULX) z#Doz$MkxjduZe^DW~jCTE1Cf@SiFgnNztv=urG+arG0$jn~y2QK3i4uf;A?OUh`-|}MiqlbdFuC$1{AkTW@saJU0Z+o@GBB}lY zfj_7her`x8ng*ZAWXzS0ASd0s60=m}5E*FtYu1?Gcf(l&*5a`K9(uL_?70;N<})nM z{#dsbjGH$mHiAJXN7$TrWp#MAx0(J=|8?*n6M^( z@YWc4@#TM|>69M7o|wGj)v&EZshQvFuz%Qw>(QqD@wiN6gnJoyeePk;UVfoesv@w} zYiC=W#8|iRM{?L=@$+4D$GUZXNzMw~HYv?kWU*19PPi7=kXss<@6lxk@^l?0R-nrM zCE0cs9W606>FvMI7vL>r?-%sH6nvVvw6nkEX2gp$$ZkF=F5WfXUsJ{iYz|TT58oVR z#Vs0}ZmQy9jXC!VWC&UAGTGjF$XJkel!=o)X9)DhHon4!&xsaWB2JZv>7vQ%noy+l ziJdo^o%>#6Ky2xN8Pqnd@jwf7fgl90iZ*SN8w&_P(+ZjZrx-V?xL~u;}QI2e|TG>X3 zy!l=mwPrCeI967axaP6cesKcj?%v)jkD*)oBQ(r>vV<>XA!eJ0<4Nv$@72b={r=~s zIoqvI^*1dS>);j>X02z2)|D)s-D2LsXt11Xr`N6vCbIrh^*$Ml*vP!-m8;EE*3Wyp zkURv*%o>5S9btj3b$a=>N1PDO8aPJL?d05?*hm8X7Jv`2x=|7f zdxs>1opiR<=(zxh7!?gMpilx2jM9X^$iS5V=}ovaDi~QHfIv!%G8WeRi6_ZENvR*O zD6qg}7J^>!5+ad$AyH-JnA;YtwU~N3aRS4Q&C|{Qu2i9S>IX_Xb%j7)_t3Yamr1S1kSjr{$wDn*CA0xyQf z+ZBR0BwYZ0KSaURP;qSl%P4NOTZtVoP1J!o#x%u%8qplOHruiSgM23h@f;ukiE#$G zMB`rqtZbfoZSq-$!{p1@WYN}2RxYADI&c;wtbH|CY!>8R?(f-HfR@|0+Z=i#gpC}D zWLEu`YjX#2P^piMP5(1Nt{dJ%at^5HaV*Wq0>ugf{9?2Y$V*5^dy$Qu?V+#sUgxN< z0g97!T1Yo3N7y*749))5`(AZ*XspLNSf`;_!!p zf;9!%<%i)Ww?!@&hzg0iz^iO*8lTVaTD1!BeZ7J98zW4eXC)ln)_UQ>dx96Wp9=f?cO0p`Hg&`q4ruI0Bnl*d;2wl!>CbeB;N#nbMU~4(Zwb=ce zJR(yJ@Q2@_P+V?NKT{=uF?Als)KQ?+nfg1=Fir{3ow(_8_%$kkBD3rxWykx@CfU}p z$pZG`0@E6GJ&TI-P4~A9O(bW=4q1wMNObcA-34&;%0k$y=ZRJ6-0+`I+EFkVVo)~C zv(*ZRs(6~<*Gl$BR5x}_OiG{}6*`B;eSt!nYl)=EE+5dA%W>y|#qJ2r+wt=2U?u=+ zY@0i&W(}n@m`$|69_f^@sRHX4Q>o55iNNi;Jt0u`(ccl5qACCTvU0f{m};y zeXc%WTo*&%AlOo(Ot5D~obtBOa3L_g1~Y#zUrl_+;k*IqX^C-#FUmPTJ2p>v1fE|o zp&}sr6e}!cXUjC`dQ!7~vPO=QLC3w5P~+D7JeCE4S!xyE=3-zIM6&}lHc2oLOA!al zDLMd{e1!`nqWv)dL_Ln5_hYXZeh}rj7H$o3znhj3iQLkyr-+FTQsRaL_F?-M3k>qk z^1sgSlSRKJk=&}s%Cv@mD?ei{reGVUTv@rcBXB2a{w+&o59@pDCv7z1+`Rq}Pz^`5 zZqEE|ZT;swxeBRsd5J&XtX<7r5FqK>qvE6dT{a-5aKvnJO9|qEsHRd7!X%{&&hGKc zN4Xfo9XP(--Wy=FzntsKxpJ$T&H58}8Wud!5HOkPfkCVzt76B8h0$}ZSZIvLzwQ>a zmLYwQk?fyyGq5w=j&DwTJsQ16p!pBH9p7Vq5YaGjcJF;J??)z%c$k*Rct?qufGPur)u?tc9s@I7G?AwA-r^|Pk(d8aWUxNg>An3kPV_Fq?#P&tBI%voKwcpj5Dit*` z1NSK6q5aYD*MJ+ik`0N2U?n@AXtn8WDb(Dw=5y!QVZ&Zmj^lKoC}8SBr^hKLc&7-n zMOYZRUfO2wnt`MOv8woL8f9xiyOR1Gu+f8 zPJORUuvg>19FAqNhU;`cO=y2sR3_aCxmxYqH^?yxnt5d^+OUJEz{3qL8Iq2*zqnX+ zcE&djpJ38DPIk)VbHe$Y!Bw+DYLyO$;%2baMtR#FDmXF)vR^a$$t;ZAl@*-&W6|YX zn=t1A?-|9aTK(8eVumW>QZP+D>&B+lsQ*WuiJWQdkgegGVQBjIR#%iMme(=VaGibt%;}XP zy+@9S!p8+dT+fDpITL}nvl^7h%5lM^KZbFICAt@KMUaC+FBDHtEQ1=o~#5HkxVYMD}URs3q%$@-+xbVpPxCvAO6;9 z85TCe^mCw&0L3KjSax9f?ANe=%Uw?uE+j-T=w8O^M93reh@x*K3iczs=cJP zzYWi_OtIW9Nr&Cmep9L!hWisVuekx@zu#iTxEZ@8rt{N2zHk{xdfX0wvcK?5q)w4@ z7I*HDd#iPuhfriS!1JYQ)fQ;grb9T!K&$?u%~;h6{Ae>NqVQCqtMs1Qiiv$8i?nNo zI`xM_iE3FA_+jhjYI=Lu(b(E}b^KKGGDOY&acN?I&GSeSMgN=EeK1S(2d*zf5}cJG z1L#0KLgGSfK^P+2UxA1K4Yyx}ZNE&KV?}+y@9p zGS1i#h+--tfbGR3%G3{U4mo(?*v{4Gb<)pKkHXG?Y?LCl8^84f+9wUmdNPW<(NC#) z0|hUU<5MROLa9<@pqwphhIa&MEKQL|>SAInsg(ii8BVcuA{Z@Iep}~tQou?rWLSruAf?6myW&d zN3Phdy^C<=InZq9qD9v%$^BBTl*)7 zca7QsGOy_JFsg#1NlZ!zDgPo;k?_dwxN!-)Y}hH|H(ms6Eq}j9Nhd)hzi)CC67AHO z-?bfhLF$D{8WDuelI*nlZa55(QjBNQvO&01-ivqt3?3U(NBHbCL-?L`^&PLaBaejMUwYP1j& zPk$B!wS2yJcP;wpxN7P+LU8PLC|^57nY<>hi{xQ$ODqCb|WP(0c60`PZ}x30)i(@qf>H9aTQ67 zmy6!4i97YXnzLn?nBCHFG1`}NqZ_~BUT(Hz-$Pmxy1T8aY?FI#n&7v}a2#mIQI^8D zgka+$t_;%BQOR8KRYJ-jrB!z(eP^2LMJ1W&StmkQ`XI2J94m7&9bd>88$%>S>P-<8`s z0-N0HOd?_F&rW3-X%aBtkd#uNQQM%nKZxUwA;ez-(V%O?;W;cIntF~lOg9d+U@6~FYKC9YXxL2(%%{OSnGe6m_TS%%8wezd$ z*1)~p{JVZ88@*yjx?TVeVk(zdU!@aCu?SjJn ztR!ywEwl8RX63g_q@P60_-9DoTZ3zT2~exWjL`_pyo=n|mkZI>iSvc24-^0BaN47v zD)c?T_5{I&87bs%sVu;ZMIUjyT%4hlx1V! zz^{w=<8@2h-di$`P|(tO@|&x=aq+z3zmOSntpEy9}STp&^Bk)Ya9woeu=} z$J5_z%yL{Jl(Q^m3NDQZn2lir6oNHal>>eV0NaT^y}$VlDGZDrc5g)5tTYVeI#D%- z#3&H?qQQRTl97=CrxWtH()oTO_C$vl%@QOUoN9Hmdr;fTLKh+-{D1oqscZ&*$iyXg)k0DCKT_cZ8kMV5GF z4js~ay~a$3!;_(AKs6zzr3cC0T#t0Rq%`g0f(7It@iWCOKF4|EIY1sBiYA3gWfyzJ z4}Vz~3zw7y{_xIfvs0b<)K7rz+rPE-U|-~iu2pVNpLUC|WtjDS7w@E030wf5K&yV4xT!_!rwfBv%R;cwbJ#`Or*QsFnUcZ!|Em%%!9 z%A(ELZX)11O{K3s{#`K7dup0gJ`m#?hdHGipSDEy45cF4uSwV+FJSxe^8VbITWh>$ zs4sH#@mDnuPbLjE>3}t$p3X9Wrq_quDFKNMkH>3^wn!0#|GH1G(C>2pk2(G?)&F1K zK3hS@&Jhu=WmO&U6h4cUUwFvb>>QpH8;v>4454-EblU1YmiIlP6M_!-Qr@< zTed+uc)eV9y9%OfeRHEQnxkHA;tY7U6he}pucH>re5o8bbT8`W9s+&g3q}pH#}ntfW)2rKzy!{#^%_T{XY(BS zIb3-=pz)rtQ6j}+ZHbT9hdq7an7cqVnf1@zMF_gMI{2r)jZ?J8#;9lUVB zqQYix=+{fry1F`1QPAQS*60S5V;Id^Q*;0{RE*eH^_Kpw@nPt+VIg>La;8(4`cz-A zqIZs$YA^YE+qd*#DNFi8Ap=mj2>3k7o>}B(NioauaTb~7YTuJCa_3QGxPczYA#@+Ho%PIcnp!wmf=c&su17%!H!^Sa$pirtnV zXtyO??Bz?MRJcy-Wn&Ws8;fjlR38oE^SBxVkL)FT--~LQRB3bs^jpwq8W#(Iq;)6? zV4#$k?={bWvKWc%>o(vPyQ!PKJ{v}jtwG>_2K_AOaPren9IQm=2VK)|B&j0vnsaW! z4-}{g;}cRnb;Jfev^w6ZGnX}Vnz;neP7%u2J&k7Vx%ZS^zKvD{P&jMuhUnK^(z!GV zzd2sG)z9ig^&}QjCNMgm(}DP7PVcU3rm7}{)y9tnyJwG{+5h0@M*=>BB?&-;#<^SJu2D-`e_f8u@m^hu>c2U|j7Ac-{|_BQ@v>EVMF$Flw5 zty71`K}@-VhfK?DVYs5ux5yH)ndXH-Ejwbu2?RJ7-p&kyALa`X)@`>0$#UWdJRqa) zvH&db^HpkDHjWetA?qh_)Qa@ItabAVz&x+6s>%ZXZIXH^>(G+!laB>zaNZd_j^OW* zBMyy&_Gxn;d#Vd3>3{SE!ju-J36K45dUK+fFCMRx{ucMIgK*%cfGpfP>NOHuyOyH1 z!ne?|lT=4*UBkwwl2V#!mM|>VO-+26-vs1Pau7+m>{AeW{9U-=!EZw%d^?@%a!#MX zq*pGC8C5@=;wK)2-oz4j353R1T;Lh5MfBa3xy zx`1)l@5(V|Y4~2Ogd^MbcZ&Lm)SAl8*+})D<8`fvEPrhMD%b3=u*G?F>I0J_h3T~68;;dmr!V*{ty^24Tx2>jFqe#1UkZPCf zO}D4aKITygJ~_}PbL22_#TEyEUVoqgCL0>{|C)0GA^U*~vhB3mq}x~T(IhWJjL>o) zG4jWtj*W%#bQ)BqbJgPc?+6U8-RVakflw0{mIi?bu?}vd#d<4L)tbY8m0QuyP6~g# zzjlTjvd{oeCdJY*`~uF=eKk#zya$f=a-^p>_AW_@!TUFS<$yFJoq$YOT6BW%{Dh`$ z!XfhB<^FST3u}@q%Gyt*yvU~`5}&~)u7!}2T)8h%#q<*Tr#Xt;HaP+r=C{d5-$Y7h z&7xy*Z~8O#!GA0*XSz0>VgurFYK|*-*n%^+{S=3%u_{)NPTW-)raCPZw_>w z*BV{78QbLMdhq%!Vt@?D??uTUPl|rKoeW^mas>Pj=Oje=-5oA;w9+vH++ohxQobL6 zI~*@oh6X=~4*1XZzke41I)<7e*6XhFexU>>2TvKA6%u^jAw0n>yL3L9IDeJC$WrH? z6t&HKT5c^}|H|%OU^Sfa6m0&YPjtLBv1<`g#50tE*5~PPJne|U@;QWbav%5&UwpsL z%t$xA00NXlttR;d-%B}&vPmwsLWPcH(-Rw}gjV<&c&TKA`Z8%}aFxBbv7eRa1|FxF zmUoemQG%Am9?yZOM3I|uSzM5ypTNabJois_={?^Ml`-zo*1f-e5eb{l)*m$Ue-JTY z%U?fU|L|&*a$dVkV$J{L^!f;StsFG)u|q%Od;BAd`(7$&eTA^L#HV3$;A?OukkmMD z$jh%{IYZMjX7Vj!CV9{fC5m%X+`M4>{*g^X&`KN`}#l5yZ}yBAUbxSY3z5Q z0Jb2pG%rJ80Ha2ly;9l!I)DoeEAid@J;uw{6#XNi3S1~EAs%K@75plQbiQ{mnUX}; z0g`L@M8{_=TS=q&lY-6IyNxxIy_~|nPfXmT6e>-7PKKWtbJGW%_NAcA>sVqS{%&!e z$L|k?u%Tt?@4Ek1$Q|H@{M$@*o#&A(Rh3%)CBqcHI)Z2YXwvydm4w54_ML6#m+AN9C*n9qUP2N&{H3*-A z@x6HQo73*>HBw!&BLYXwkNO*oQtmyZmTzKyyi+GvsV`VG9LXcn8^$Wt8ozF)$I-sy zBRCD-I~wsNoCG^uC&LuO-+|-e09&+tPHirX^h$`y3IjghTAajT)p!1-Bb(rO_1%x_ z`0G~>K+G!g{}S)N*o|yjxnKp)yu=mvg71h>0k8!$({#F{eT2EvP}yQAyPI>Zh8e(QW6V*bXbo1{m<|4lDmJ zo=wz55?OKt498d-c4Sua{C|}(zL2CR$Y~AZAR8Wrh0ZDg3^5aVWcXye&BPkZLH@1J zT4?6Y(J<_5fG+E$iMERa8K7i95vmLG&Ed9j!LW4!6TvJpha7SF!Dp8v`n!hN@jppi zJQ>{{WMrfZ5KSrug+N^;%z7DV5}iUcCM)sQ3~%#G~sH|X}sVMTrmZ@Z?{Ds z2QM1KLLXD|0E@~xv>dvl0X-Pad7M|Ai$)Y&p!K?e*9dTI;h{~Mc-_F$^O0oZ{knAt0e`ZV1?!H_Yq3r2Z?}yd`@~Zw$Q)B5(OKoFn4s?ga6L8 zw!Q5|=sn`amFdLNkk`WGYrzTJQk6$HU)?W5!j{3FrIHjWFYBL@wAJ1#PCole;Lg!%y_9U2Dq7i#%FCP@65rHI!RLv3&BylT3Uwjs-M~v{c~CZn=8l zmaZ|=2b`!6U$aLqchg^PF_)FZ>*nFCg?R2gR?OGR<-1F8*6||FpsNO-SS(lDP+puy zN%dweiulxQzh=t-GqJk41fx!kV1fakST36ivYDK~ezE&5x@Ix#IR?$;?Xl$^^pxq7 zYie1pf>y4UYM3mdZ*5{b!AbLQO&ts~-6LY5M5F5(7GEhs>!dtv8rjS6(&0GgN+>bD z2JVwkH>PHZ?)(iQZZle>O7^;u5|%>sR*>+4i)320KlUXStM=wwbE?b_gUm1#y`J{Y z)$J^2LeH&vj3w&q zF*uT5vEl)EzVez}_H<^vrL}%nQ35!(Pq8!8K08ddyq=_)-v^^|8RL%{veJto4CK;L z8gCMP#8(xz7jry_B(|%hg$eWbfI9OUNvM%`3X)?l7+beYX9G1jRn#L64h9@@870=| zt^yq97gWBeM_T@PaDz#T5L}SnwoFsAVNiCw=%fqdVwo;5hw9|<%cKt$0>3Dr${mn_ zMG^5wW2g8pLth`U)0Tbuq_VpNR0Tc1Gj)n^unXK%pHX-aIN1{5zR9;fEAMm?+GObl z_q9bi_DMz_Qq4H9%^Q`xSa3wFeRJ~bZAgyQbO94|{vAuOivFgL|0s_m@Ad20fJ#Fk zBU7)x$zr9M5~argbIncM#Eo;4mDs5txTayac;c5>Ajt%_NO zen)b_Qa&e59XUgpG!!K#q0r!Sr}l2V5nCAncS43a_mBWftNgsOLu2+zLa7HCKewyx zr(MXe+-_!D#b)0RnMCNdxDSgBs*~tPT9k;y4kYpOzC`RNTo?Si2O3Whyc}mpM7H)u zmufOH=4yku8Uv3=y1l;u%-Lk&+kX(WpR^cl|GBL8$Q@gd=PI1MmMyaaG4tCVJo&Dr zi$fCHZ2E6X*P3{Hk?$xr8$mShtV%NV&a+GGL3Q$xYT?BlivCKY$(!_Oq`W5p98 zh+fI_B~k9FS7$QxmF3Mu0~{D^GiC?TZi>pXlnh_xR?RG5ScPs(+Uhf<3oB-t@8?PX z$iqCEXnvww=`NGY{~O>gaB7=xw~un%entLAKzbw4n2QOgE{%;vD@K}Ow3*A2RQ9?a z$T6+|)?;WeP|C$D3%mYJn+G2?}ZsB@>k8sBsly^&p4&rgKS8^0! zKW?AZqz6IMS0$cm=hoy=O@?nU%!}q*#+2m(0IU7A2Nf2qu^yT9bB|6gL$BcuM`KT9 z&(XS_Shu7nar#5IFkeiyQysaH?W4@4Vs^Y;epNTAUK5~TV7Sw_GYPoZk=vBp6>J#b zkRg^9jkXSQ!v#ei=l}Bc{|Ev`U6kmL#)~@Opzc(H9~S`--Uk|5;2XK?7vpF_l%a69GB#$rZ>#6 zGj({ZlkqXd*9n3)bdu&$_I4t-FrvbyBU-2Hc9dfuoh@gaRY^Z7`9Wwcrz%&MrI zG`pVJ4DUaUtk5d$ZxA2`HsNG0mHr-^gxTuVVazvhocSbrI6K==>Ud(~IOS4}ufQF7 z(szzvxYml3T-A=E$Lgca?FKqQQ0L^z8yhe(&1n8c3h7*{G}DH;hd2_o{`R?1PP5jb z5^95thDzk{6|c1_sRVmY0n@VO%C|jro{gUC@|NQeezvE^3>N|3wCidI|G2?+yXuPa zxxQw`sK;d9l@<;D%cX~#Kggw}=Iwz&=~X>qd~K{qkC(?+-`1$s6@P%h`4oy^+xg029*MS$qk>yT8OUlgO}9kf zn(t$n3n6qpU2;rA>D)WoK{q8XXkMwwC9d)y$&Enp63z5b z$>(}$lfL~cACS#PZvgJuMIz&R$}c1bV@0EQCnr%-8P9)!r{7;Neb&D;hQoZ?YehYs zBKHy4(($C-qS!frMBS2uTk&Dk4L5I-pHQj1?hAEslYUHAv!b!PceQY61UWI$|;bv8>0DU8nZyn z2g>p21^l{uwd#3Cn^zs@F_u46=@2JbF4kptn4JXF@T9&fU5e4to8&9pAl}qoUTs<2 z;yWZz*r59d%k2fx0eRbH&9_tf=P1xuA!6zPyiUSzg|6|$I&b+A2AwZ>deaDVX7T!! z78eK9kHn)t)TjhTv%pjgwBTTYr^BAR4&4GAdp)XRm~UXSTl6 z+-n#uWezeI9_=RU>CXqhJ4HnBjhcATXs**H6sZFaSK5JzgMTMSOXjkd4i0{V4Oko2x?rF1f!xMi+1xLiR2is8?*-HxWq=|Mn zpf1)G)H1!ebq=@>8@PfhQR37FbPz^Pm)m-k5w^zG zKdMw@5K0KGb^R-)U7@p_w7K$u3$hySuYEeu5Pk^q^q-)e*JLfMyx}vZE~$A8x?IHz zoT5mkfds=^NfB0z*~#Wk?MpJG^9Z!LOY|~V@8prtxzTjLW`rscztLmy)(-WN1^6}3 z4>vu56K5HYJ3sNY)onNLMKF!0CzRU13nDGKX)hik){HT~FE0jn=CS$7a__3hG zdz$WZ6sg7XjXr+-2d>xnnv}T;AVU?^4g^#Fe~5!}qTjPDmZr$(ZNpeI5Q{$NF=tt^ z9W=@fbUk%d+r%9k@@9LQh(89}3Bx|sGtbx*sY;OFzhsX!5mu zD&A#lZ)&zB0vNl|>v70B*F`+;9MYa>sveu<8&SruWcX1%nO9%`P5)RH8?+5tgR;Ug zgMTV$LEfiii#yWsx8B3^Yy0(h*fS4jrG?#yk)mL8ujm|p-Tk`fNE19{13KobO~qoo zoy9Cc<_moJ$vq7BR5e!Y?b=L|FK*5qI)J@W^ERxOQX*4Uq9Q%p_Z!*q-rm^WMJ9n$ z^5HbmajimNNtg&f@S0g2S0>DLGer8sNdkX&iyuGwBq_;NQ+0=rSeYvyrEt*g-MIUs#wre-9J2nLieiIt7oiX)})@NIK)MdH`tR)D#|f*uh!}cUFfpg zHX@0az*T-OPPBvUW8$qiz<{Z0H`P{)KznKlP+CPCaxO*^>n}?3A9}NFG~tj&c9Kf8 zLvv>0p^lsN++u9{1ZJ3|)NCdH0nwgSmAeJl^FJFTlK1ggZ>!gEAG`a;+zO$Dw`G*& zx%LU^+zn6U#V#bPa2$iP(S%GraIawq1S^Zs@V9PBu0<%K{(?lk)e3>&dA1m}=@he& zBH57pgjbB)c55~PiFlto`5%N#xXb3bI(GjIUKM^J;U2$iO55sk#3jax{X%)KRH5|s zw|JdlEtil4v9anGczRR)0aN2c#;1UZ6+YW*|v^h<$nGAxy_`_Q?`eFCF?@gRIU-F~-Ul5}0z<3#SWAO(fgIOZRXeERV=4hN=QpuHA^_g;zD--6kJ_@|1o_RL z;tvA&zN(dnoZGsWPt!zAuk-uaw83=6P)Ajc4cn*XHnLycWEJ{q>#^dE6ZTLty|jRD z77~FODFXbXykVIkt@FH5q^1)GhK@ecy|$>k*}#J`tP~m+0|{hXZNK2YKN##PfAZP4 z@xbSAgMmQuU1N6=DR3 zvTvJxPwk|^&{& zSwAD6y8x`m7007X`izdJVFp5*Y147BYR4c}o2lP5T=910fv0C243(LC_nI&Sygoe( znFRNP&fnAdX`4S|3}iK+$Xa43d8{b)mzD-MozLp7|8Xt(%WA2a9(PtzMh=uwXXM{gFI8%V8;gBYY@=ton#X zT5clHn~vFo;x;n2NlhzXDzctj+C0jtxEPCb}zfv z7MC}+Zx-|q3SJ_agT@XfJ38WmgfC6r&Zd9w*;>o3ZSG>aIYYhFJG*GrvE>_PEZ!~H z=e!vN246X9xoP+CJOGn|@N0Rj&^?HGxys)Nkt4Gol6t5Vkadp`)+a6rxVSh=5Wj-j z6!VNE^+K0|7iMHkAa!qNGKlGe9Qykt)-?*kL>61Kd6rah)m>u`q$Od%_6CZzmk2zU z8Es?gPAd(VTN7BDzCPUXmNMI+ezp`DZ4+^x79@??Z?pxomHly78|JKi0i<6?N<)2# zc2-7Od7qBOYRUqq7~;5A$t)J-ygM_pyvkjz{W9X2U>KO!s0Ik{;8w&9@6$Ggkd}B% z+1Y=rT41KgIrZ9lFAfR*cd5JcJm-Oq@=&(_{HvdV4a%mEW(p^VVb9D4Ym$BFjxyrx z{TN3=vYPQ^Hb=}v#TLj$ep>R59XX*shN2HSx}oN}>SZ|3{zC}sSjdS#O`XoEOo8Q0 zUL*TJVCFG0PnP>D;Gk3Cbe$pfl*}4s$Kpm%>hBEZ!COA}|L;v|L%C*y?p_v{>I-rpnEaoCJ@FMoSU2*XoJzg9FhW=s2}U9WX9=ab~x*F>1psE|$T%lt5jQq(&cv zP`Z+a&M;E_aO7K4VJ8aIWas>WmZdbENKfT&Q4QPfc$ISbRVi2bsm{6#|JC^Rz4)gs zGcT2DRLuY*dGhDhN4D&%6dskj<$()y3ggLhCu<-Z=iNzA;Mdx`dZkvdc;V(VG!{%a zHH@ujiB5P-M%3IFlbSa}IKnn?h^D;bR>|R(_j^~aO$pawbIw4^SdCNh`VnC#H}p9d zIPseyb}a4z$BuIAt4CuB%zyGYqZM|ctExGy-atSrNufyn{k`y_9)kE@<-(=u2YwNv zB!!n;_{@#D*OrVyRvBSKw|Fjvj#??;DAN=NttI^M zc#gc7y1bGeaC82mfCau={^~_G2DOXuNyiA5{tL=ZFn#}4tf8g4rbMds6 zZ2*GtMzua)vIXwRLrxZRTx(IB61b?lD9|ZCD&Y`p<(H8ec;S!V^y&4}!no8vb&tae z6Yh$H09xz-&C^jHeNPp-)u9q``S5ZQ`WgYD@#O(@n(w2CXA+_BlvHx!o)0BUK`DfV zD#6DG-`4ROhu9_G!+KU(w5c440Ie5I#)X)i%f@LRPWEDY(mR1f!c@Hm3>oZk=pcch=V9NNRk1Eiyp?DT(RXG{6QDU^fmE~hD$%S(lU8d z*f7_rI<#rR4hm>THpyuZ)VOkomzx-TdAKvgNs(!COwCPl{>9|}0e}`~t`7(Az#%xTL@$ca$DZnOMn3tp-&;jN;WOR!_m$h0{ zK=xD}X&T7mI7-jJa-5E>O^P8%v83K`Qxw^^2NPGn`0FJ|%`*EdTaTo3DJuWq)?bf* zx|}}Iigg{({U$y7;q3(UeO22EX>B#k+nc0&?CQa=f$R}yiRG+xv%jtgiVqr}&_`B+ zA`HK1=syHW4J-9DJ6e6qzkzi3b76R@@FCLdXwj&fP82E1*1G#Y`yR7hL*9@9_0BXTAjvJ52M-YqzL+Y%p&QJgUUs6HPy)`q{Iu^ zDi`Nz3%&g|DnZ9}9ejb_`~#Cmimj91glWaDFY?Xl{b3@5y zP;#8U3^(6g#PSopnph6tY5fh~dFlhnsgC8Np(kURI;DG1loTW9o8$f)r8cO?>_o8P zx-i8=oGyCKg0mg}-@8HE(h{bp9q|cWN~+ICEpbYcQIOBMrT4cfj@?gwy|*hx(0^Uc z>3;^?m#X45F6JD#atywLwJ>Sx2AbYv#d?xYTzkngej_5xvv?EHs(VEufqrRNQVu(P z-c!ZBmiyrv@vvX{h?}e){IDyL5wcpAEIZy7LUTDd6gkWx`Bm5upQ2QRkX%fkeXEe6 zSIYWXynv*_b*iDz75pF0#|)A^o+g_$y%WCdfw5#2*0e68H^b3*y%cOka^7c*)i=T? zgo-55SHO!3#bO2_1MPkebnd8!ayx>cB;MR7n1x2NZE@mYVnNUsYEfeNclQdOB$USQ zJ$LLEM|Dag`WZYqESUbSy*OIJ#FbAJcj&)a0Jq_o>Ci5U6yFQT?rS_%vT!DZ& zBXsbjoOH`9K~r<72&SMk1MSju%jH9B zkVj6?d%$9q!)FH5|MIQ2Huv(~3%Jtd_xNa48ZI;uQHG0lUtn$?B|g!Sr^;Ex3>*GDpb-POUifuOfF+u<=Eoz-Fz3z;sqv(^tApD z(C(7ze5kzhI>QI)H%qDws%!FoB=~fxkV2svAZNYA6NXB|l?gP+6o5T_aGh>fg-)54 zm&}*lzT8|E2Ql34&zEF4Yi||#E7na<8N4#}&)R3n_eASBD&K2?mSZ{Va%>c|;y0_G z94)nYf=+yMCIuVGzTVmu>Jrc0{`yDp`X&kV6!|1fBdQqpUPPk(tAg6c-?Jn%_FUKh zUN1%3w39D8hGN#t*l3z3?%c`rYdGkuN6t#fOC|EmeIu0ig57>zj|l(kHL1&9+rff) zkQg$HRB;!Uw|w{kiwsJw$0FkC+T`ai5&L3G@2 z8P;+lt?Dw>-SQeNr8;2Nr&@jISA%WpjV{-e1dR8h6~D>3@vR^42`v|Fu1t>Y#(oFpBhYJ%149 zww944HLR!6m^Ib&Q|iU1FfWlzZG>VH+20$tc_Yh-)ECGq@$GAmmo{=|{j56Z9Isw>Ly%)20(| zol+WKy517dJ>(GnO(db>y~!aFJl|~`P1@q&Wq*31RU&@rCAH_7V*9B)|G;LbN@Ksv zbL8hXFYOQ=Fr}b>)jAPk>5}BvgWmIfn&;7XS?1+0U-LZ=sfbNRH89Q$O%|UZ90q)a zXkoP9kSOoz2iSZRToOgW9bi7u>!Q^lxAl7PR`0J9{r;Q!Wn~3c1jM41O#X7&;P{mCp7GgFqxmDwz`TXRbrynCrEw7`; z>IpS`<0w0{>8>fw+%*#a$yQQFICh{XjyAN}m;0F~iOB@9v4fhTx_)Nx?69y)FuUAd`w>E&t?j%<&}y43dIi~cayk4)3t%u%Fzb%13cRS?&OpFJL* z><~wj*&422lTPYf3EiN{k`L3V$6}lg(-H$hYY_csGrKK4M)TY&!WRy_Jh%Li=_@K3 z^1zv`zYXz=ol2ssa9U5ne%x`)1fr=@TN`0-J)ms%R=#Co2-z#)O`>#}2n`D!La2!s zXB++qp3A6uEi~rjiS^`&9^S>f{eF1qmdci5e?ezQ=>f0Ji2+>8kD>b_fcrsKbR2@F zwI~WtpGN2BCbyv(o^3fu+$?Flsyhw;i#RxMR$WPozykHUfE5mB>2l5XL!hksW=1`q zRpRqN41ahtDMSE`KBk2mJ>V+#UE}j$YcZ(jAumC-rDNGHCW*-j6!Y|F?64rjUgMsI zqJZxmT<~`|crIslvDHs1&!^e^y@Osf8jX+;f1W~+TqSqe*kTSSHoVg5zBWJ9AGAS3ST<>`ay_Xu|HCs zJ!jEy@ad3L(f}euNi;bIcyWNOngd|iF=&d3f33j3=-AQZ!#4}T- zfIrteP(yvAgmC;G3E6>{s~zEb>{QwVDt$6nCOUWX92ErpA1(hVLws4tx3M@=?#s|h z@zF%i1DbL3g8C|VHb6^Q7!AMrp=tx%KY}+98F{KR!(laY?i;t`s%$EOHh)!xQ|}ZT zP~*s{q=JVgQ2_h{6j)L^AoOS4Ktmc1zj8>Gcq7Kjl>@fH? z*wAVZ3(={m^X}$k3-Qf7N9dY#mbymQ+|a%*Oe?CLuqNNe$AA40Fr_RmWnmA3&hM7g z&Y_&=fr-(V_e?5@(SoKHmk=94EF;vS26x9D7xIb71Uu}Nk{E=`Q5el<#yP4;+YvQ$ z(e>6XPyoElJlQSN+9lo@DwR|HN=%+=bAi-WArv9zctZah3R*5$R1EMvZ8<3f*S3T- zy>Ow>RJP2(oJM5vZDYlk65j)MVzCVNvJD>KgCRQ8fVhu5_-9IA;lMCOTIey@a@YcpxPAfYJGa6w3T3s!`{ zIGz)9(N~A|kpG9hw+@Q)>DEPqI|O&h;KAM9-7UC7AjqJ>gS!L^L4r$yySohTB)DsE zch1ZA?Q`}y_ui^|{s%iGx!% zOpHrg5-K+F9@Q;VY3K}{61I!9PQ+Yo)Uyr;mp;4Ry=6#s=#rD4FG#H7wqqe1$kmiw zkF*qAo=P5CZrDs{Cu}+SGjY(7PaH$3`llBW+`72*MI3ML9eqErG}X!q;3Nj3^OOBf zKeMSfbX|=g%5&*;A^?U2D{Z3Vxd&pS6)lXAMN&@(gE; z$PWbtGFiw>dt4TrK?2&E#LYtIlYLLxfF8}@;?0kSL&D!ND^Z69GrsgC0*7zHcDO)Z ze>PQ8z9*SZtT%|kB%0J7-q#)p2eVP~tAT<*?1}+lX#Gu#3MB=XkOZYLmLE@apBTRk z8m6ni*FkO<>KJO*8lL}r#PqBl++Ke%ZYq?Y;p&b%y!tPz#X5^0x-0$hVhBcRqLKa1 zvxTWcC*Rh*gh>vJL$nz(1~oqs@f08uecs*=32Z=kc^T!eQP(~4m2=pfU23R_1Ogx4 z-4jsqUs_zv-lz|aRV&sA_5ATVm?DO2_~H6uCkT1hCe~b~@9TBs+64wQv#v}yu=~>Z zTc_J+>w~VfNfa*lBJ6)L`i~ENep+ZY$)Rm3x09FJmOFMuIF?iz>{3Z>LdfaqNUUzC zo&buW{001fFtA%+0Wj-*LJhgP0LOq`sPEg{yL%XW&Cg8fE!G;`ScL$^mo+dvP8^C0 zxROZ3(3#DW<4yq3@csDSbKlib9K5^*E&v@vQ1QllZ~^F;m?FZJMKl)H0wRe9mQ5gP zW)d1YZ5}#pSaB@dx8jd#IhWH%RLpZymCwsAT_3xCE*ufY$LRv;Y2jt+DfGya{eC_EL&k_(3!cQAe_to>eixI*V|_}&vl5ua!CtM4$2 zh-}NrXgR8Um^4r{mPEI#%2JdI3LISHEUy2qApFBZA(RBVump|NP02^$=yjnO`tOrb zMLOt}7T52~8-|3o9W$nGJ)qS9OW0CZ(gcg+w8-&1V-Y z?-dWwcDi*$+?L%*R=lz^%b__wsjyeO?}&WpygHPX=gI=StR(9l`9S@`8k{}8 zu(akmcV7tfI4>l5G?77ZyCL^Gaprybw)$bk$8WuN@{{_%_m z=}$ao?EpQUjpNH-3F3ZTxk*;$wuG@ygtn|UFpInOl4cCKO}7{4{hy7VzMA1Rw)U>~ zD$jiq7@(yO(7u-M;q&>3mt5feChdVN8tkzVoSu}T%0L+Edt=rzL!~(r^JYA3#NM*E z7rSC&4A9g00(!bwPcZv;80D!Jq<9Hiqd0w+Vs&4V8{e12sqae(Q{RhQzTcY&WFs@B z3M5t?01!)ts9zmL7_HqxQttS(&Xz-cC_Fnl9t~>x_tQrG zJmW>~;+lL5`TA4#fPL;OL8N|3IVI&U9|Kg|(2TG@1{mTeWVP7)jB4zMhcCkP%&|8< z=X+6{D!?B9`$v@eeYRKPcusl;!nH>M4r9qnycg4cvw0)st1aT!Hz!fLDV$a{uwa7m z#)zXo>>tPVp~xNz!bwPZnc)(T>eorr87ZGhSpX!rJ(mh6{1pV1%#YS32Y4Qc;J2gJ zt}h$+cxj)oHn{6FN;VB)k@l1>9LQda5e|0Y}Cug83ozK^G~*J$@?_J}nvVs`oajBV8R)Va&DdUlGI z%cJ>I1`)iMVwO9~JtAHZ;cPwdM#E|z0fwVa*V!4aPQ%;9B%dBTwjG7Yh1!ZtFHVk` z`aJi~+CZ|D;eOkCy|_oF59&f|T-LTmC=}nb`d>t`*xM;~W+3o$^;GONMz<)8dkD6$iLA%hhtxmD?v`c$3D znm^)yFiv}LlX!M@O;)I+J2a0!wPiPvo7qfp6gp}Vu4fyFiE5l0zxO`t)(Cg2VjL7XKi+e!wp!M?U7Xufn@Iaoi^_$xAlUm&8R?9!KP~5R<`Q!QN?uF@V1a`dvD;0GXWI% z{~mpHz}ed<$#1Lmg6-kTpDf0zjdEA_lTA0M+wjTR48_Sq3S8u6#R zW2I+`T1F(QH|*wcBqdU59yyas&aV{?V;!7EZ#h}n+m3%;P0j5ojv(4R=8ci(qP^&4 zfq`)svb0?+mMV|PdN1e50tJR$oJoXvLba`#N}DMNb=jUXkpCt0`yLGV_>SJ;i?4sw zB_S!4aZ+}-jF8iVC-;--noDo$s8DD;iP=r(7$M_NfYxcCF&b}}Xbr{1cl%y5Zb~~UE~WfH44C5-d6^+eAdGM9Q6iKzn_D zI-wXk`e&SYoRuO7XHHNfOMOe>8hO{c++VgVS7G_xgWgn|DqZ|0AgwrKwcE~2faIGo~*i*`RL_Ih*bA%&qN)p2ZSo`h^;tW7;uERU(Xe>c0$}y~A;=4`$)V)pPrc)us>{l8}FqZHe1#?sYoG+aF7Jo<@tVbY|;DB<^~6_Nxs4h#Tgz$isuJvSJ;%Fk{P}u|ud~x#e8@oJdwK zvMd>slmG+jI(qm|OT}mS!puu}D{&)$q;@lRcXjzjq6OV#v+f4s%5L_@nFPfOt(U^u z!qNG~S7b=Yud=_C-SvfmSJsNr(1MxwY&U_eMi3V`pMb@%79*FJ#So zjnfQQ+IVV`ENE!X`|0TiN0qW$p&>ZO;O2?9oJR}FqphjMLvZw(2?;$uu zkyJI6aWd8w+W|JhJ!B`4MELMTgRo}yhF-M@rRUx2e6RYBFa46HV!H3a=SD-4N;b7f z5WbIH_MHX7lY4$oz5&}LPslQ(n!P%Ezw!AS<5o{eR&F2Yng4Am#fAL7F#m` zRT$Gjeh;8rXQJuG)U1aofA0VEL%NRhpkr4Jh9e37YtwOGqX}(n%Yj+b88vZpiGt}) zPtLQJOj zsHoqhjL~h64;0W5xl zbmr`#xC%1r9FDzDwy`|#V>MmG&>h`f8DvtK;&40o^2~0x>gLZ5aYzGmP2fG3Oto9) z6b0|2190GML>#Cuq&aDd4jf}-7q3jLJz)49eMG-cQ5FCQHjJlPv1j$1H!pkE( zJRc}Q`iZ0YPe;2Hd$44aTmVVLl>HgE4S*!1U&{S72hOz=F8y4PFXL$aTqiv_6ucDk z{#N#NnWDDINE!`x7q+H#Ar;S&X$y@|d}|?BZ$FIk=E?fzCWoeIV6fI%DknF9p{E^d zt(MkJoN@{BJdW};&Ir2UCa)0)F}SY^o&psj5vixl@2wKi*?xUuPG(bRnmDP*Gu$m` zy+oSPh%{lF3AJ3Fs%&o{jH+mac>h+`kCLiaDEXl!Hv{`9JRVOY!ApuWNZ~FT`zFhQ zTy}AOH&A^fzuRI;%qp0W!w+!iQpJ#dtRQDtASEDyJ(uxKhKru@r~`nr6o#qb!I1V! z-(cMIjO2agE%@k56?WTmFvF%2Xl(JkK%W;! z<4|1qr~DUv`(QrMD~+4bE2&@r@6(M7Kk{XLmCY2AjVX{y&;Fs|3@EVmpv#+j5Zj12?^IA0;%~XK_l?Sz?kDPHgP@lg!Z3t`pl|hfEGKxbMIuAw%d-9Iv zR^z1Y=J?Cu88nSe$RE(2FOe3i=ge7T4Mwv5?PikJK~esLbMGl3e847BR3>&ubgsb0*rE?)hN+|M}eCMVM9UKJ(seW};sSO|RwwmVPNcKD z20^$64qSAZyWGb=^+ z)!C&SQ%fe3f?R4L3}88=njW(vK?HXtCprnPI8zi-qZ z_6V0KfVxw(ykR#3=oDDC6SX^l?N9VN+9h7%d-e|&r3pv$@7Xf)aZ~1Z%J9EON>%$# zgcifDEXLA!-eG8Lz;7Y0T^|^^>K$hXfNE=|?XFDWwRM!2U_Dn%a`lYSThBG4x#mD% z$gQiXkju>~1~fZ`;XJzHq0x4nqnTIRAF*<%}deFILojqW7l>h4`d-C{Bt+#*QAkYfBXq(a%6XJZ+Xn7#@nN3I=Sm z{^ZUgw4jXfoij}HPQTh`nhI5%0!xJKgk0u^UdAbzJOwZ0`>5saVIeHd=q<1hU*h?- z+7J=~R+}BSPc|?|{ERyxBrE^IrtOI}l)60w@#bmgUhkPzT$BBl%M3L4KtltfVlJP?1kRM_qku9}zxNKO>zSl6`1Gc(y)agh_|Y zu|8_kF-IBLJ9~I|(6u)*eaMi)^9bu(ZtL8b+c;J=z|&j8ze)MvrSelwc8X@7b8sY` zoHcDE;p9$vdVhpt*F?8$tJyGq)SEAYm*6|1*=bf&mFh0GyV2s>uRv+`VtL9Uq#bG$*@6>Ef@gsqdmET1< znh{-%$Hc@;yDvd?%j}Vk`6s%I<#Y>?MPIPD_JcO@3-hwGwzY-B2~FfR(*hozBPQIA z3>ocn9Q!ej$n-8qrDBVxFnaf$XVq+H)OrUe3B6TDCDJU`JIeAt45|#Y&CioI5ixbk z3}k%soIwd1eq{U#=PMFNR`AhuGG-jIV1fI*JVVo%)!=fEfWS&e!Bs;vAHf& z?F;wb08;I^2Es3LuRPh*Ox~(u?phfuim~X5FUXV_l&nU$kG|F{-%G3&5gQ}ESiU!3 z2vMP%_eHoKbCxnYs<4U~q4Usa0?AnL-3)YzZL8T0!QmY4eBnU(Xq(C5X`CMUwIFoO zN)!+EMlgbH)-Ba4qSWtfqHlDcPRl-yrdzL*m8&w+8Jw*H^TY3H7}Wrp9=i#KJ+1^JhnvJpUKft%?2t5320AH&W<8oK_Zg zXn7ny#wKa}<&IU*a9o?Oazf7vyVdfu`c@^ge^V`x3}q+W1R?mDoD}a6G-@dd5e;?G z`$;F2sblSL+^tO}1D0bqhK&>1!cIh6M= zz6`acFj$s!G52l?l%Fyj8{N9Gz1y-PLgdBGhEy#%=SJ*in`>*?hqP(kY7C;$ZWYwjS_t~&~{2M1|zVY-a9S~FOgdT*P;XItqZcFvf3e{l}Ms@5;4X^k?h2x{E8s?D3))hz<7$RmrKQa zlkkj{IsQ>7F4Z(fH|w>Qd< zNlmI0*6cpMo}@2=4_F}Q@SoVb?ma|oc8V!q^;^LCc7iejA z(F1cG2-%{4hy*t12Vt-mv*-7gZx7=!B?OsG#g(q6o8GaU{B=>QxHAwu!w|1N&vSD4 z{I@dh^y(ZZiAeMXiv8tDF zQRz664NP(I`4A`1Owy=QAdt)q7Uq^Wo+0vF_f!j%P2C#JQp?Zntm1ZPXZH^rwZ^5w zKfq$k&N6IypTpO%FQ2HEB4_&|7meeoZccQYJ~1Ec$`TkkcNQ^x+rJhFbpYJK7L5?p z?}GZZP?|7twmi^+hI9sMFB}tEO{^Oo(<6w|x~;0z*Y6^1ZRT8I$6C=v>q8ZsycA^e zc*47hx21WZB1tyVkEXR}2B)yRMPPIK_gwx6{j7YR2Vy|qt)EuDFXr3F(X4XG{?S59 z!#zgyz76H>?oyMpSOjZ#6@kKg6PLH9s_fQV262rxEXQP4&htPW*MD^-rZ8vNG+1Xi z#snIN4;2m8927==ea#Tn%)tUu8s%%OZ7I@Q4Pp7+AW=W}YyHRo(S;>TZ2a-w8ku88 zg8Hxsl9Rbjv8u4AQO&;-Ss;PE`!VdQWj9az&x!3UEeXjgR?NU*A3l{#Dwj@WJ+w%nTkFNU7*h2EXHTEfp&WZg?#McM0u%B1^zdrk$bww1dn@P$d)V(Oh zmk1X!lLmpicw#j@-7K&^TrUPRh$ZgfH&aBRgI=Is;PKPFz|D{7z9JTPwSog&-@-ex=BYq@qe?^ce9N}ggVH;HrB z>8g@c;wiu8vxE+9U%YD?=2;T(z@c?)!@FwEc1pKA)m?$NbtTWnXpDWPW-z}mz<^A7 zayi&LP~vr{_YYr7p`Qg@hi&c|))3+udB#wL@j`SPK|^>W0gX^6&byCD8Ep^JTfZ>@ zFPy#C%h;+0=G^Fco6-h?t1BJcAIA78^Hr_$A=*UA!xl1+8>=xw~{$(||efwtjc3-vm9=(K=G~=CRnKe4GlRwS z=N~n@m4aaDz~N05<&Pm71z{U0jy|r2H$c!3U+cwG2%?*#LaYT_{$ zqj!)^OZD@mb1@cA@3FPMs)jW;i-eHIlwTxC^E}>fFgm(SL8yk)O$#!!Ty?I`EIZ`e z9}E>{@`0*fEWJU3V-R|)-wPd03{!TaM8*2}q6wSUG)ofD%|LJWu+|@n->T+9Ob5C6 z-RAcmpYW1N=BL?k_zvmy=S~=;(Esj=q6=jMi&(EV6p~|veOEu=8vU)A&_mcp(D>vn zF`+_jFKd;<*;%_`)%Edj6LmIfa53?NlM70J?6(-o8{x?5u<%rg(tNs&1v$ax+cz-M z4t=R>80ILmBYtWF@?{|6qVjLYzb z$6($`1u2FDXv=@b!zOV4+PGczDbV{c3X!O#;a{;hQBDpj?h-oi*sfOZh_Em9OPh zj1lO4km3lNY$CmdM&YmT42&uqxy)e#7q?t&-pP%mbCMD(FAc<1(tinj*blsvBF-M4 z@GH)G+TGvH_=IQkY~1hcd82j*;ny+7VeO<%yv&8Wx31~p!w+Cv1)p1K&|28GldN`kG(;!6h!%!2IN9m9 z(1nv6c+J!_m3C!|44C!|hAnj5kYvOQ>f^eSbKwT*@BF6xjuf%?$bNamg_q9K9#DAk zcP)t^egF-m!oHx`M={m-eHOa-h2GgnyM_>1b4$H+osX` zlNc_74r}^*=W$&H!AYrQX0(cFJeX+Uuuo=*~cjDZPSERyIATr7Q4csP6@ ziGqxAv?vm>RgY}H{+-i_CxN*)Bw@E#l@A?9#Rb&hTQiBGZkxJCybX)LU$A+0a%KOZ zI>8^PZ8$`d+*dPOT*GKg=G|zLG(M1hHx7$+_LnLf!)Egqx3fU{v94rH`tE@aOkmZc zB1;kdMkv0tadI*PaCU~Sp8o!(S-mfF=D}y(03Mfp-V$l6wHlfEIY&tHK11zce zs7S~=Esvm9hNkE#tGj1u27;8zNybX4&%& zRERz=`4n}^eT0N_j*UIXW7EEIRmwiq;WsrNWQAWgm-_bbcfOs=zjRJdYCLX_PojJ2 zIY5p%KC(Z0omOGmg$HI)bWTs}-ddZ{O8<;*Qlm4bp^7fCyMQu2-Rs9)@;Zk%_6w&? zNGz1BhYsmW{Gry8{Y#1Beq|nAVR%65QY}G3>AjDaJ4|Z%N{`(;p+5O6p4+tG;6Rke=$2iTuD^2{KKJY47W?2l#SnE!yrf4n>a-}r=Z@}>L|W&kF5+80 zTFIfy+?8{wg!ft3XnxZllTRkELEvD^&XZ}F41v#3FM!Tpr07;Q?H##%GE+F`ncK*Z zN@%r5k+osU3_d@+h9B)R0UF|u-)rcGlEfiBnDIu1yNlUe4 z8Vux8I^C)z0jnmQ{rx^hZ6V~Huj}<};LBnU!33BBy$xBiq};Bm*xKl?0@HPfYD(L7 zW4z^uGNL4VDfD0JmYb%qhe}(Be|cWwjDX`~ZYr%^B0g|ZJs&C}$;|;GbTAI_zyrzA zGA>Xa#1!q|dX+{B{b4+Z3#8f#r1#hz5b0Uy%r!ba`` z0qYme$NN0I)W5>_{l~>;Ia7qB9EcOD@KfHdHC6_b4HJPx6MEhf9><}-Rv(o6^jj>U z=h+2XJ~J55d|C>863vqbUb2cqiMEfSK4ZW>S` z18u-4F*WeC=*awRKtT00(3|W3Zp}B~(S-5M==Q$_z7B;rbqE8`>{4xASOb_CtjXVk z2Q;?g-!lKAfx@DIBBlb$fKLSFF{^FGtFbd7hJeE0PIWb}f!0EV``qybgmRON#OVI*q18)1Hl;A1iGe3O|yOm%(vj-pK<}PvYqfiH!HjH zA;k(nBa;+S!~w|)C5V?S1Qb=RQnd^RNZe!f!eVrdEmh5CY79USZ-raV1C7=z)H=_m z1Ixzhs-Xc5)of-$2QvE*^}YabP)}$m6wohu_!eMse5nM^?zXlO})aY zgpmgR%L*Mvp7y#N1|hnlz#qFzP0)c3?x>m*{(GkPJlz97n~({4P<)-Inr2vJDhU$e zjiujVWdmUC<6kFFn2o5)#iaZ-aX(f8U_F-PG-x<16Cu8<03+9`%<(0z?G%Sd;lz%)}=fsH3J&Rm5SnZND@RG2{&W{ z+b=hB-TD~&u8iX&>57XofdS9a$W1Q0p(-3nx~?blM}NX z;HB2j9E~0%Ke)eB2^^#V**uObPJ;7lWA-_}Om`g)+E2Y9c-6%n_dAzeW34<@>21|M?96ZpiJ<4(hno`spx_stPf}$m z0&frD8Z^5`fWqvnheUIu0=)Q=Z%$S>j}{w%?Fr@m->Pt6Je-`Jztq%l%q;pO1TbL& zGlG!AN)mA9p0lzO1s%pC#6;FS2WRc=+p2U2QSg86Nh7nGzTvjzRG9jH>D_ z>Z~I4L4npngJaxYBb1dDzOJJ5Ym162cF{?A;}w2E=ql7ha)Ay4<$mLLd!MSEfLslI zpv6+QaePe1bQ2E<1YQ&112MkuUqW!~b$QnW&+B;ryRTk1)d8~-{CyW7wbRG9iuPOLNP&qOvrOwZSQ*E6|S2&jUfcUtATvEMBc0slcFuq#{_c# z2qNK;Cxf->Eyv>nu%Qqj@SOSfP_orbCkUwF6|fTVC!4Rf4Ei5{m7ve<+X98ueX;=g{Z#XRsZ*1k?&N?K5&un zI(6oHD&g@FaoPlA3V6Wtd}sn&MiHe-tOI~gaF`g`I$fjKYnj#5*>`Of&zTT>BuUyY zKpZ+)ouaI}Xb!L>t=_{=278ixl^Irvm{W3mIn3>lZ+1O6o?n*zs?cECX{uy4CY6a8oXJFqxI+>O}VHME)vjRRSw8 zMQ_%0_mPB$U7<9&d)>1d%TwS}%4VN3wzc^(Iv|?~LH$R1Gy181)Jx zA?7kru_G|fo*$D6mD0_&APGA=U$*}}5e|bp*Sdn%_xB^X?B<+oaRmm`gxoZk9RCx# zQi+J#Y5xfnw(8pCx{oClYhyKhaQNeYfvyfkGONQyeO-q7`ryXK#@2a$T3`|c#lu0> zK@!-^rHi*!uegn=Opt)ITC1ls4udwTk&#h~W?wZj2!ONx4PE_qI#Ux{=g{OpDo)k5 zU2PWvqT~$}XpLAv%rO5K>`KyPJp~H-U|X|Lot;!Nt-7*dUkP6L0TZ95I3-@@c5Vr(SST~k~ z^*Vrj12C88E6n8?XkY6MtYS_!?iHp;67DPtfxl!@=mHAgl3NrKdWMkV4;SXeRzsGeJ%YlF2^d@p-@uZbZWB?vv{t`?uhh^x{Ofcl@#bVKaF>rbLyF5l%I5lrYI_K5p5uwxkJbUef)=zT-_MJ(4>2A}GIO8^<~SNQ!X zQJ&fHmJ?@%K3)oPZyD)y<=zBG@eCJVp=4Wokg8B(RLIp(QzP=t%}8&CP@H%gb%|Dr!sl0PA;3VWAFGJ~#2)+DydNQX*P`v~1SH=g; z(Tw}0uw(D(5EN_Vi+e6aWNU{mn^6Kgw5x=e>GVu=1k?n9p@8&gH5tji}^6N)O&Fw9G*-ESG~g!!>>e?qubo5Rz9;k#{bCX ziem5{z57u_Ub-oRi3CvMwKB@Gk=1!&IbonY6GZl`6jZrs8JES?t`x6q9#ma;UJI$( zHOvu*c|weSLW93O1m$X_Rj&YwyUNK zogtgZSGrRYy+M#n{3=R@kSp9t5R1(oIq`Sz+0EWMu-~ZReM6oX8PO@8wa2HfWAoJ0 z(^=Z$4H~I_gTD2JM*1OZh5QbOkRz=m2%yi^^)xDm~Pc z1w;5xwC{QDlQSRuS0SGo0j;gRv^fnKpkD3Kb10(&*bG^AW`3To?g-r8Bm<*i6=#OH z7$r4ZQU%SUY7MSll20ESTcvTN&_8c$9M}NLP954IkIAW3%lSv|>EQ2g9&}{WkcPg=$a)rNE^8$NbBxks-#0mmhdruwdGr9^o6H4*t^kaH(4lvmBX_=Ei=Fmdc~tx5p=NcIwipV(1i|PF5!n*VzdWFLBwS zSAKM#*86u~oZYN>kzlu&&98T;3MwnU7(C;^d+0_4uuG!jIxsuNARBV8!AzOmwl5Os zaDD0P^%r!NX{*k3K1~*hbiL?IgR8534)GE)OXZxw4Kp@EeD>M06tObYPD^k#@sGk_*jDq<|FYwU=cl^FI!{iLs^A z@?mwL{e;$m|I1I9!Zq$-lcv$iHt2~w#wVSxU?BYI#l#+WxI-V!U9ymz&TtFy+&kJ$ zVrjx-1+(>H`tBJw4vK1Y9+6{?QF_s=V=p@3##4oJkMz>%>$=pHyCyM!F+vWPL^DN#=lE_E8HxQ6Fm>05cCYC z3pZAll6#E`M>z81Yu5_kAxJHbbS^<{CrnJBb#=Z}nu^jY3ZC-%guVexC2*2&m61SU zfp%;_(z;*&P}xj!r9-y2o{Tl`$>I}i#R{UM3NYf z$BK7FZk{r#IcPE`>nZ4>RQzUx`!2m`FSB0v-b`X1G=P72UqkbKM35nWz!RchL%P7t z7;_l`eYVkWT542{`Fr*L-F1ah)uWOM_<}7;JoZ8F#o9 zP8~omd%qPi#wD|{fniu8YmOM9^uq(g`K6DC3c~Z|N5xCQQ_fgRaYop^@Q1k7_l>3% zyw>4Q9Uz&rL)Fs;%2|MvebV1H>=x@eQSnUfq)TmjfPv_*qVKfw z)(Icm(9Wc{i#Fg}NsSo;4`L#6>q`y;r}5KMW)tRbgE;Z%h2KmK}!yNvHBeuH&ixO_Em#pR!SF+=%5 z91-9fdJa7q9|N1v2~%{57B)7^&r^}2-=1e&TAbk|e!M(om_IRuV|#5g&d%rYai%yZ zWw!F_BxK-FV|?~uTN0$HK&&ctICxme^cXv6A(bTO7mf{RVN+emD+!d&u`j-uc* z7E+&5c1zu0?D*zmQhd59^~GJ zxRcZSJ0SzX^$0GM6!X<14^@#rI1E?`n`e=DkXc*GDK58xI<&IRyZKy?Q+mCvQ}1RH ztqZrF!3uP`WnTut-I>YnhR4&hgvHvXZ<+nvBs0(OD_v}!*G`OQ2bOJ&Dhatop1#<- zS(&ZwWI;;LY8!8Qlx(!>VBCezr6Z@zosVx>Ex_p0+biboZQXl+?+BNl{etgCU9IoK zR~{G4Kgr|q<$h&Zl}Vo{m6thu)_lux?U}7JNCh7ybtHI+y|kDr)uQ#%$*09s%3BRr z29`pUKG3sEsjrAS_FoNtuPn#d?1`G`!r%dz+5+5}r>y#|*7d%*a=;M~(h4OmKQn)H zNGAB5_8%MVw*Kbwa+?Og_-~_#3ePBhw=oZbnd0>9hzuM*3nw$*%b17ImS99u4G8KtS^H-c%g#=Rbx6n-VbS^z2Y3b)37SsW`!(5ogsmEVAD)6i zVNW|_L_z@h0qx-24xsU&ZF7DE$xxIt9YtQ(%&I7dw33)TMHcp0n~LUTgy&(Z#NU|P zX9~(He!0SUl(-R~cIgAf4btJ>32qQ^=~V-aNLMd_oMlZTg+zWxK8*##y^4}1*7FYY zBbq@(#3yjDfr*-LUrCdH_RSPZ4tp3(HP^QA-4FeV? zF6tWspQA|Hd4=1V4P=ZZm+5QbEuv@5;lhmY>PE530CmQ!!SQLWDk!F)7gYV z&W=YUHGgp-d-&T1mRZkbr}W48HAPE#zvVM>I1D#n(pmeZz{c3{ugY zJ+AFZK5uNqu9$5OC5sYSTFm0U1nHPnTyzjLfDo4jS#W|9=1=aNA|9BeZy9_4dqa97 z=|c$HUMGXar)GE_?t1iR{fk*Eo-O-!RO8L0{;vu$lk`Q(e9k*Q)@m9!Sm1ESLuB2D z6R}!F{Cm>B9(b7-zk8=-=2>5+Y+Zjpjq!YCDDVNqo>QTg@wmCk75q16HaxE~fe<~V z>6gm~phvB({CJ=(~_^iAn%O>%Kc1&Xqdv*`4^M`e{xVYn4e zJ+)3k&(iAj&JP}+u4+7~3CkWBDke7MU6m&vzrQbDFbCUqVZJAtPNW`CWIeecj>X>r zfV?xlt4>}4F7U~Ue{@9Xz>gU$LBD&U%X5v-et!GBO$n}Z8fdy=%6Wj8#h++B>NUT& zGQ=CGeI~|VN{_sIO1j8}X-RPm(-XaJZ2andS2dZbL znm&_BdA}3cw(V#`HKeyKJ)t`GoMxBZj z_jcQnNYC|81x?o&GXD4x#I;E{MAD8KA-O3O_U%3lRN3}87`%Ow8LQXjUecm$5pMMN z;t|Bi>K_ezSs%ubp_0#nZ;A}Bj_K9xl*{0Zon5)~_s4GGcIc@ZzB#>5WHFAC6{RsLn#jFl?PmRO^%#D>+i3|6M|#R9n2YE}y?H#w z>lqYq?7K`c_ew{7F(bN6bc~o}? zZox4n5YQBGvJfjgO*V8P6yNdA-|oQ_=k^d{du@|Cg_WEXXL276akP64v8-F!7jrj0 zu$d9a18QZXivtCImk8}UJ<~Fqzv+0}AEUu2=RiRXb~ZjKlRYxz-*bZe_|VAv+Bm_3 zUImXLs1p@=(gpuG0~B+MAxib*&-2+HDWltA8A>HE=~g@V3sA5+^M0DYnYz@ZD$qJM zZYI|8(s#b-3t?ly%i z%xgz{)-cS$P&O)8=@^7eGL0fICl>DOxEf>fX`t zX@JAxXjWBNqYWsCrpx*PEB2q_Y%3rcgj@uoBO5A7OjNEK((#4sKsmdW}!)`fE;cP-^1w@bjn5vXC7DSCT~ zr~t-|=WWKDH$Rcu#>Q9gpnOT_LQc25>3#j>kuSfeBxKDu+<<-GuEG3uJDeb<*wnML z0EcG;vdTAj9G-$v5R6)*9{J)+cbIIdkS&EqjxU;El(ZJ={6`xFJy_GU>U5C`URDWE z{eIp+5P+ihz2dSLdkT*6!qs6;oTBKt!RZw(kK#n> zoCm#y$5_7l$0;GCvgu>?6uv~wlw+?`bVXICFmVJB<9{oNk~Ce5Ebv4(iTr*q{nEu# z_Qzx@n%3mcb9~ghjvty$nMW!oEbV=Cf3)9&Xb!JCmMo^HiR7ta1ASyKUk=~sbmcw+ z|E=mxTriAS3E4-9P_j=~Givo+SDZg$3hF8N^=FHj~mNq5Pez)77eFM_UMUj`EQ zbisa?L+j{f>B)X?xrt6FeQp-^+kP3O$de5g>$XpLOIIhZ* z+CISo;8u-~u>3364O9BKP>8yI?bcQ9-{L5O@+QYiHRyBAbr0d_~3yXUzs zmdAIGQW@bKh=sakuhl$%%pE5PO89EaSV{Is+=KzK?W^HOOzYE%>BkF?73Uvqhvz%RQc7+4Ebj$WqM>PoTXk=vQ?Jd6Uo}t}| zE>c2MF<2ayK$?%=VKhtDX|hgHXtsH2%p&00R247U-TJ0 ze3zU)@1!{~JflQtLN6_--Mb&;=hu|t2b7-!mB#amkpzuNs6NNY5-2fp63+5xLmgf; znz^V<&qe)4ac!w;vYX4D2p>$g(e3L4a>X^Hrso}ER+wCnIg+Z*>xILli(@kA*b*q# z&2+ysfHR4o*TX=MJo3AORo9m2*hygZZ0^klfKMP+}Z5D?P8R1IG;iN&u*vBxo>;qk3{L&TJSS@ z!U>sQPR@d{J$~;jL^*7?MCWusF4&(%+3ukFGbZ$r!vDpViCs;(w2>nu)+Y-~J*RN; z^?iHgY$x7U3g$N14k$z0Sq~s~rHBhJ*ojzX)^H&DuBTD&72M8jI{h6v&pDEuP3%>XQdipicD zyY={mWn$QI03Dp4hyA#-+%^BPvgGJQk5{zl2ca!kFnu5q`z?SaS4~2$?GfJmnXrHQ z7?XSfX7Nk#GyDae_PXQDA@=R6JMnCAkyH$%+zLj}>9n-fiYvoJmxoAJO<0Ycr&Gtd zq?&93c~D4n69Zn{41mZd`+qRBwC;%JQ>F59aW=j;;FS>j3g_~`x;jP&*FTl#?S7j+ z+AOc$$T()3(5Me7HcJp2TMSbTcne(-d+6p95p=~B!hF-wlsxDM_w=^LruqPZMJaX) zm(P$_Uv|^%vD39%7x%;ZJgbX$q!~CWY)bPhRYOq*Padl`3sikZxcw^}o18es_@peS z?}wu(_!7~DOR$B(4IQcG5Zq%Lnr|Ffn2t&JHG^zu@>s)<_q+Q5eni@w-jx5b7sF}% za&y}ZL9Dw8m4o$+peO~6Q z2|s0qpSIZ*8?&x7S`Efw=a{;%?o}fD@Vs_ix+Vx%Z{L~Q z@PD?k>r-1H`@V(_3me-17B5j?cRI~TH50JbmeUi!Z(s-Q9Q6a8yGSDHTmDZG z1UnHU`hLot*AV?>0>o0>9w=#fgQ5w2AL9n~^s7j^oofB9b-GhLiO+nKuKye!+jB}; zU|Nb$!AyL?5_g^)1^3mtkJ3u}@b-UkahqT%>ob9S99`vuFV)ctR&%jkh@T+=Fn3Ir z!OryLl9rf2n?)`&u6-!rfoW?gjqmXw9)j~-D;zU1K#cBi_^(_7Ih$zh<68c8Y45J7 zO|^0+dTBpM=|X2+xhuCbgY9!6ncs{i!Sk{3a3zcbq5c-Z7OeW(&*5}R%*@V??hdKT ztrD&%Li7UX%lRdqUxGjIwJk{U&F!txlp2Rgzl3LO3}FL9FhnkzKlB+MkG9~bS!2}# z>7YQ(Bn}-;S{;?d2-I=6QEUXK8SLmvbqiK{PbcAjf>BL3`)l*MY~HFHY?L|lebFas z^gnH3e}gJxBUk;i^!R!Pp6z=DpS+)yh|zo1(8f}GUlr=G5Y|N1g$#@m0NwRXE6*#N zuEF<@a(^mmry_N*6_fod{^3=6a^rHUO?zImhtp_w@?$US#*daf`G1!)%S1+<4Dd1y?Q}|TBo8WWw;X=qAZ&#+oRiJv zp%9%NIf)7#`Fyp3u78Tu*HU#-Yf=-BG+yI8%kqnQdhX8SE3biGArc6NmBhKU)7$tW z_0IE%*hHM-&n5&pZ}MFD2&#`1*I>6Dsu&cy@c_z3HPJ7ZNW?;&(T>tx`ELm82c};i z$b@p@p`{4#0$e3xd5-Z+mk*R_Qb{O?MFbC7>qQhj+u?9+9OYuUW}A$a8mddqAsoGR z@LhEQaFUFI&4CjDwTpjL=g;|!`G^p;mTsE8=o6EbV8`3%_9*x|&!40%#C@_7(9RnJ z>KiorwKzKU&P!rGEmZ9*O>O4t^zCF+BHD&NS-a&yU2g3M8Y6X^>6c#|`2sbeBtXdr zT4CwrK9%!h*Gk|)k#66Ol)5cX6D~6Q_X&67h+)#g9?bLd+?!{Qqv}@(`++aY%f8N#UuUrdI-Eet17 z?5v3dgaBcvOTywtDt;X48lY2Z&8!uI2oHDSMwJ|;ivcjj$X}x?Bj#llORo-Au%ged zsgtw3Vuizg9<@I6W7SU>-M7TF*W%t;{bX|XZEwUA;6)lNrvHGRyoF$;FL=ghHM5Xp zm6d!&vYN8QI*2KcQ%iXNb33FTH*G~}VblJ~1U7RTzt75tz&V?@G` z0lEDO0uEKO*V&t{AcfLq3eqc7RSf!c!KAI8_bKe5T9@(Y0CFky&F1X0B%K6`9o;+g z0GcrLye!y&SXfcYfGt62m7n;7SLs7y2hP+Ca@0iUCq=)#p=SLs)_P~>a}>HWVDMV_ zcU|X=tK%!My)qCXGhvkJNDR8;=m=Vd#utfwCtR`rqsQ^*w;wdy@C(79duDXh<{VonWGz=}AmMJs_Gubz>FhY+ z<-Ch#)M0Rxt5)FtTO=Hz_-@fNi3Npq5bcm**jY4qf>?oDmON%>mru~Cr2tF7GlCu_ zwqmfMqKIw$@Zx$fqE|?;MyV3>L&X-{|mc zK7BO#fqjj1!kW3!DrG+bqvDn}Znt4&a`xN}9ny==ss(Qn3jHH(vIa1sA*deSN!4JO zd@tQFUL2ml>D)EEo<&E5)}0v4@7Wh)Qc>Mw$yS8+r=w3Gzrw|8EDbeS?d-Ojr*#rj zHeIo)lR#lbZu5avJF3PS!Ds4A=vpOBdM2{C8Wm3<-)hwwEI=qWd=2l__t>86tu~ME zJxSdBXk>QI6c1Z#sF49oB0gjf4V+N3~F z*J~c40Lb=Df!?RL)0(+AoOkp@P!YolF%c|vUh3dwK~7{8JK;m))3p7#-`;sM=3+AE z)FIZ1C~Da6oeF^>})iEO~a9{sihLgY%={`uD;871IY*;^sn{*oy+mNL*xk zQdu;^wXSM>#G&ZkS25K77B4+DqGo)eM0(txUFw?`y?$njw>chAmk2?%WRlQ z0rQWmvf%`}mJEYsmMAo*TsSd*-}w190)|5KM8~_Xs&df3#(=^E$Ppw2(%3*h$igfD zNaJj)u14gCG=a;veS};i7neurpMS@H%lF$BFYI@REi_i{C&GUYEW{ljK zYAA8fK&GLa+D2BvOqXLF@fMd4A$V_`%&T{s)l~zQ~R*`&%tCvaUM;Mo|ht-9lq!f zM1p-4iw;-E8L7^?ZNVmFXkzTnJYUrNt!eEPd}oYqCgn z5i~nM8tQMTzP-ZuIhES6-?y<{%4HCb@`>6Xxk?d%jD_UiUxycTaU{DWn0aHMI}RVlmP^_Qo+l{`^`ot>$f8g{u0tpe`b}`s^`I`905oY9WN?iEhNb z{-3HTthwR@FSs-o_jAC|zele;pFBJ*&r`ng7@pt`)2PV0=p4gx)Kg_fQ(c0mgCHgw zLnGzUFBUe>EeKfxCb&qG;H3*@To*6Ad4r|1OWft96RhbDzzBtz_;YupxS?TS?q|Hl zcF$jp;mbyF!5Vs_^DfwFwyeRJn^LvBE7PC!&X2uyirRBIexFeyMvW#C1da@N5*DoB z{GQcz&tCiz<$rdp@A~}i2q-RrR211?{M$F270l8wPE=nd<0)l=Y(0%j zub}7c#3NqRJAZGS#Fx9i+w;Y3LJUM)8IPXKB6MZu#mOCIamA!Mi3Bn7MWBYp7esEs z{EGu6F6ggm<09x)S?Obwa#EvFcmV}}D<>EHzI`P!y+;+t`nG3+8>l4kg7`J(2Q+0v zI2?|v?19O(Q5E-AsLoDTK3QdYZxhy3`d;xkivRUJud!7Yk^8j)Tk_^?^q+jZ-p3^y zA2F|Y8!&Ex8S8=r7*r7k&a!5Q1|Vvx?H~7BKn7}S|94L*_Z+)gC)kdqU7TCS3u#49 z$t8rNyM?Z+wm;)7RTnUeQ9F3Q<1eDNFLeR%99-#E5)DT$z zuL*shy>uD+Lyak&%#Eq*GXhA}roKdFk9y?VD35Ei&Z(C<2CNfXaU7?bkxAwI3REw5 z;Lm)OPa(Cxim?k7;x4n42!Ey*iH+rHYGB?#EX(z7RwJQE5y?*7ko3s17!{BGa7PlC zXKj;SLc&0%CKzgdK0z!EY;MmbUtw;>nP?oUB|OrQ8($!9@=)l{L2ukCYf>;nsfp*% zCo*&NimrGNlBlhZ^yW&DH{nV-oBpeoa7-3PpG^3UIM4?T+s&Uqe$vAE@da~Zb16C@ z*mCC){hG()i2nW~GV-oJtUxTLa%zsbGc!A=b-mBR1)h($_M?CYQrc|(%B78*1p6Pr zr178BMzzVI6d!m0r9{#)aqc;v3!uFM3u$9V_p{XZoiKtxQ_T}Y|~_7 z)p|s1R{qF`m-LtuYei!b&D%nRKhZAwhfIFDxZG1lWo&BB*2ofLPRoMcOv$&e6@~KZ z<&W+cHAk8WuNWzm;4bcSdmP-e>T#gZ%Y(IE4xpyIgObuDsrunOKJ>9{^V^EO&s-wGfM~;QBGW$a()x@GK z3Z|?zm2lHtTy?J3Qf;`&QxY+1wS^M(t-d1xF=SSJtCCA}8VHwgw4`C{5|I_M?})CH z|A5Ej@F>Q?!$LaAJL6Xhkh1%_adr~H-^JL?H{_e@_RjB(JrfX2;yoee=VW^0Sbxe2 ztGV$^t}z2~#A5<8cwY{+KD!c5MCTAi7A85t$m4L;!iioKc{{}UVaWQoTL?#0d$Z*i zLQ2VkWJKW0R=ft>_=85it)AC-E3h$5`JLGR{3}1h#YCO^H{zw;#sr+$e(REwe#_|< zA-nx8bZLaGK>XL{be*alMF%S$G<|HJSlC}J4?}*XTo8H=j1LG9U%aVCQ4}yG!qqlO zjs0K7$z4qx<>RBV?^n;!RFSaw;eZ^Dou!@V$Da{bd&dwctUV9JL|xbZ);2>icOHs? z%Q}9RY8ew>L9WjY?^cilceeL5~(^upYLVP@Zn{-M8CQ>jVB zueS+{OicuzfE*7tUUD&Xr4!*64%2I6@6*iK$&fajP&h@r)LzT3ViQ3CewDsXl$C4% z52SIu?T~#waysfz!t=d$AHzPi0e|>4%4Zjn1D?MYFYYbdBiBRL*F$LBjg6_P=z_?+ z9#+ZYc2Q6YFYND8?L92r57I8#*Um3|57I=`#?hz}BY&y1C#XGHYZb5%En?5Cc?%dq ztk}wJFR1J#mNoRDu+Zkq-JW;vRQwLy7ypz{un@1$P@@q_Rk+;E7dq`bxJ>efmWMpN z{pL;G!8^8N(5=FP;Db1uuWNatNh{s++A_i*5yB&&5257_1I~a)?wqRPvt(fFbBKC) z>6mZjBpM)sf=kTAe3%okxOMjVlaHhd`Df^_t1NaZiZbR%LZ|BA2y|R=5-7#NJHSEh z3R6r~_1SMFLZo(4w$!p&AC9~N47Pi*EZAOk4N}&vcHa2{@zmpAG#|idKiq<1C3Nd< zI+z=V47P47zv5ZAhO!DDq5>S#fqe8jDHdCu+yH?YUP-W@689#j8KG0b%uM9~J)R{a z4DVP@1w9O_So(NY`Ht{{yd480Lau$HlV2m{{7}{)hl9|2yIvWS>J$i|Z6b*!q8yM6 zm}5|s3na*XI8bi+gG2PVZ@hv_O|<}UqFT)NmEh0~lRofD554|cdg@7Oj3TOY`Qm>! z`6FA(Dyaz>wsY93>5-NX<`90E`s2L+?EY7p>lx@Th1W5UKj=o1i{jLfdHE=A_x5=% z-Ib^=2=eL8)!MV<_z4%FbmDvDUiH?@KYf-eq+ykb6bFTw;F0J(8E%GoJCA4tg-Tr< zM&;mAX2h5;?auV;H$t zq1x5}YAnMiJTqZ~(AD#N%`%o2h}rsA`UiJ2*WDh17lP*Q5bt=%&g@k2#Do`!Rr{Ym zP+a013vbenoQz1aAqlJza))eq^(NBXvG}NOm=(XQXMm-cA0*@s|yJt zF|1-N^!d1Jze7gTgx|Yr=FKU7fS3Y1&Ij>cWYwwAB?>}VvIbId{LL4xa> z0^LsqmfZ;n)-aLDqtwPq5v6N(Om7ToA~Z=+19=;?xy&T6{>)1qp41av!GYA6n$meQ zaaCG-0A`=S>u57)6RWypj(GNO#vz0A+(1{<0GphtgMceJEw_8^5 z@?3WN-saI-CCLqyd8*>u$&GMx{s25BG!oX{Rj2snPR#OEZxl>om7}eUSHri0%SA>G zhN-9 z>~-F+6e*>EymZ=|)!}t!*0+~yL9x8#uY!0BTi*u2*HruQvD4Xe$<#+bZ@Nv$J+6HG zn!`Sw&&$r#qEZ@6=+WpAxz!@Q%(T7?+;?y zp4GlexDbv|0od@hM|2`sh7js3;}Vw=r$yLK+M?axgd9*<>krMC0^kXTxkjeKF=0QX z8s-Lv1*%vY2aIBUuMnCyXrw=f{?-$_M6iY&O*~NQ65`It?(?`}U4lteitoD&BbT+f z*m3&=XKbdC*~wl>TYO(+pp-BZ)<_aIc1|Fs`!?FbEC`NW!aSSPPywT&WZiMF$^5`x zImtnQd7cP!tSh%Z8LgpRg#FY0jCeIfTFMX>nFKF^D!|YC-dd!Lfy%c%AXNVJ{(7%u zCbtM}__I3*@5_%m%!)?EJm2*09_lKOFx(kCw3MRiUx681Bw@G@8uvx3Gd6+B{DoEw zewsuFIbZXb@AtF0)8_2KUJPM_AjD~b8I6kAi)0Wh+b&^o%j3w4a-OmZ0+S4(R`9Mbx-qqDz;RH&^BN;r#AChsd6yK!w4WQV4(gK+FH|GrCb;67gU z8VDL)f#1Sgz->F2oL-z$Uq{rY9u#x1ksCd3OpwAoa}{J5ImJ>(%1NCmkz5Q4Gq~uZ zW2hiex3D%a;~;37RI3;8L>zVX<9n==0xh{ zu}S&edzQVQVT-wx^q=KAJk};+^2Pg}d|Bwm##|P0bj4~4&6dUw&n@s$E=QLg*iK?S zw#IJ%7_;MaCxC$|9jFKai>Fq-y%SgHYIxosD%c`6_`|iW#LBV*3{*cWy@#L%kl5u@_kRbde8S-| zO-qsNL{K8www|^}v=n)}7q_fFC9D{UKdUTM>aeGh$rMZp*)tT&c5${}!+#fuMzbtx zRY#}8mWz5wk;(+QA{;sdl6;47wYs{bI&fnq;4mE}E^&iAYPqWA(ByPvS4hs_9miK? z(sb_Zas--b>3#nqz(^PJ%aDX!maN}ev1R!HT<2fD_8`1a&dC+qyK7iMHUKNRqp`Ni zk}8Nu0Ecw%AimeZz`a{9YAT>!#XY@r}m zWEy$=cyd}|)VQMKr9P-UcC(7P4EO>*B`RGs|IUu_cl9VOj|+3S@IY%3NxMyvru>K} zYa#rK9$hCy9T{q0aTM#~wFT1pOh3WBXInQ*$E8N-h`t7avj|T}5XR{0m(PaDh95)= zxo~l4)1I%!77gQQ#!SR1>$hJygWJ-{kV;#4m5Z?|g#@!|w++6-T4Mc&e285MAPR#z z**dQOZb6uQCHX8b>mZm`aoTD%Em02*TGO6yMB?%>NGN`V`fZpd2@Z*SGzT3ocHtM5 zr;b;>cY&&cecsbpFlzOao91f@lzMjdbOe`bob2^5+myo%p@!?k=f6S1s$B^m?%k~> zstZEy)bcg zkP7%c=AbyK{!r*c!=A1nG#NlR7b1;{$;=iH>C40Z8ztsIPcpd~>@DTO#Ne_vug>XB z(8=+uN9&~EfT9;wCAXfbI`%V>^JJ9wYWNxEX(=v2)4t>V{cGo?3>sV5@OKmVV{9o9^`3j<;0RV zUPQ`8&$SzTpwDHC;1vd6c0q%Um$AS4eB{`;Eg#0$IkAnuQA1z*uH_;0lUQB#9#;lYp%osY6x;1`;O@hyO=Vg-$o9gu4<<5Q*UDB*+%WTIc?EO`n$T zyN<5hh(R77`yq0%s3hih6;X(b^USd+&=6UuX!H-|-|K2v(Kh0eMU<3#g3MY%uAdsQ zH=)IG;0*mt{vJ$@Wneo%&hBFD#aCXxbiZ5orPf>;!`Y&3NJcPAtA{3xYEBi&9SO&g zZE}~K%i%Ray)4qndf-r&*j7x}D|ALlXAna*%ERv|JszI?5L~Kkr93ZNMN=*Gw)WR+ z>pA>pMY$44;4j3)R@?`t&LNr`83&uEemR#utA=K$I?Y>=u=aE^j&7$pHx$JDx zxoJ6`@;$BE?z~_8{wzK|t(B%gbp$b-_f1tOJ6rfX*~ROxZm4!TMCxLNLiU_sdyCy< zNE_44Wht#hI`hHa#rqx`a)&d=dAG>64Qy%xtb z>`jWP86M7L(}!wPNrB!;L{0Y=FwoEWsmr&cdnv;SY1uoD_~aAiZv^^4H_2~@1-PO} zg1z{6K7RvawcSPrS62}WGs)N=oMqaiLL+Zo*GtzBnmGY|h7iBTVQo#~?C5{N&XIGB zb)z9;@5K`^GWs;y8L@j;wZ^8bh3_rP7#ka8pV1c4_$gL7zt5oa7Y>bKJgt~`{E5YS zDl+$ZC1NX2$DlkOzCq>|3BW*=5>i&J){zwcZV>B9(o5;RPg*ga5fep|;jt&{ut z%UmR_z3e)nGlMy+t>1?G*!Rzm=w;`h$K%eS-+apVPi|@eUdD~PA>*(5Cvr7X$*q)9 zo98`jp0^~t6N_-pkGnh_f(=yC=(y472|UtdoOyjobR04=aSfB&3#1srDl(km`T!4N zE2#AWSp^hHQ~jYcZJkhXJJItq8oENc#GCYokKfkd(+&S4MaK>6xa8!%rIx8a$4+P2 z*W_3N08mL0Bz2Er02HGx;jyWvQzTNZ8xhiz@a}JT(?08j$9~bcAX!}_13}aXflcST zGiaiK>s}h`&x03&qplUUFdmZtDK_ELkRpi%upI+=M2E%!V*uf7G$$M@+!xT{Vs@I2 ze8%SnnPMms{6K2QMkTQ@!*M=?da5u#Qs@LzD|A_9H?-hRUXm#oB5n%DFqrxiL_ag( z4Y$B3^Z6EqsSsu$cI^h*2W#A7zsp0?@644zha#ShtV1iG;LF}6s!DZLpDl@2z?Vw2S+*^$~ zJ+|Vejm>EH4J^Ko#!KMBP`9v@)hN-Y%iVKk+TdN#Ry*Pjk+Qt2VDK?#ZXJ4Bzn$UnP%tcTgf zwF8J{M!F3ZSCI>)aNQR+=_4$>3UE>V&*5`d2mn4%LLZ0xyUmFxP(b)EM*A!`@g*e+;g?v`gDd2ok`=@5e3=�b87^Vqu_lk+8v_w98cKC4;S{J88hM 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�{Qa0*c-H18{n&S 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 QhXQ^SWK^VUBu&5mUpOd60ssI2 diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log b/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log deleted file mode 100644 index 2803d05..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k31/canon-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 508.44 -avg_nanosec_per_negative_lookup 448.659 -avg_nanosec_per_access 250.192 -iterator: avg_nanosec_per_kmer 2.52036 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 508.499 -avg_nanosec_per_negative_lookup 422.478 -avg_nanosec_per_access 254.124 -iterator: avg_nanosec_per_kmer 2.56415 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 469.837 -avg_nanosec_per_negative_lookup 454.816 -avg_nanosec_per_access 244.543 -iterator: avg_nanosec_per_kmer 2.51074 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 448.309 -avg_nanosec_per_negative_lookup 429.68 -avg_nanosec_per_access 226.668 -iterator: avg_nanosec_per_kmer 2.52138 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 460.602 -avg_nanosec_per_negative_lookup 421.453 -avg_nanosec_per_access 226.503 -iterator: avg_nanosec_per_kmer 2.69089 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 431.613 -avg_nanosec_per_negative_lookup 445.229 -avg_nanosec_per_access 220.367 -iterator: avg_nanosec_per_kmer 2.49984 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 621.268 -avg_nanosec_per_negative_lookup 558.222 -avg_nanosec_per_access 370.135 -iterator: avg_nanosec_per_kmer 2.65783 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 649.382 -avg_nanosec_per_negative_lookup 573.823 -avg_nanosec_per_access 348.086 -iterator: avg_nanosec_per_kmer 2.50731 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 616.481 -avg_nanosec_per_negative_lookup 559.69 -avg_nanosec_per_access 363.882 -iterator: avg_nanosec_per_kmer 2.59154 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 783.211 -avg_nanosec_per_negative_lookup 623.164 -avg_nanosec_per_access 575.025 -iterator: avg_nanosec_per_kmer 2.55037 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 783.327 -avg_nanosec_per_negative_lookup 616.317 -avg_nanosec_per_access 546.797 -iterator: avg_nanosec_per_kmer 2.57689 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 789.088 -avg_nanosec_per_negative_lookup 634.175 -avg_nanosec_per_access 562.361 -iterator: avg_nanosec_per_kmer 2.56575 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 768.33 -avg_nanosec_per_negative_lookup 543.863 -avg_nanosec_per_access 426.418 -iterator: avg_nanosec_per_kmer 2.49788 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 754.612 -avg_nanosec_per_negative_lookup 538.25 -avg_nanosec_per_access 450.752 -iterator: avg_nanosec_per_kmer 2.64603 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 767.805 -avg_nanosec_per_negative_lookup 552.96 -avg_nanosec_per_access 429.486 -iterator: avg_nanosec_per_kmer 2.53384 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 701.579 -avg_nanosec_per_negative_lookup 529.494 -avg_nanosec_per_access 415.591 -iterator: avg_nanosec_per_kmer 2.64494 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 712.05 -avg_nanosec_per_negative_lookup 523.281 -avg_nanosec_per_access 421.972 -iterator: avg_nanosec_per_kmer 2.54065 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 720.165 -avg_nanosec_per_negative_lookup 539.569 -avg_nanosec_per_access 402.468 -iterator: avg_nanosec_per_kmer 2.61372 diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log b/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log deleted file mode 100644 index 106badd..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k31/canon-build.log +++ /dev/null @@ -1,2284 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.53113 [sec] (3.04723 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.74125 [sec] (1.47523 [ns/kmer]) -=== step 1: 'parse file' 2.27247 [sec] (4.52263 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 7.19514 [sec] (14.3197 [ns/kmer]) -num_minimizers = 86163506 -num_minimizer_positions = 94463730 -num_super_kmers = 98209779 -building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.80006 [sec] (7.56283 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154132513297039.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.78004 [sec] (7.52299 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.87193 [sec] (3.7255 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 2988605/86163506 (3.46853%) -num_buckets_in_skew_index 5810/86163506 (0.00674299%) -max_bucket_size 68577 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 10013861/94463730 (10.6007%) -num_minimizer_positions_of_buckets_in_skew_index 1280778/94463730 (1.35584%) -computing minimizers offsets: 1.19738 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1643143 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1178275 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 956038 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 605533 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 425543 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 382297 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 254872 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 68577: 624986 -num_kmers_in_skew_index 6070687 (1.20818%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1643143 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1643143)... - built mphs[0] for 1643143 kmers; bits/key = 2.56038 - built positions[0] for 1643143 kmers; bits/key = 7.0002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1178275 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1178275)... - built mphs[1] for 1178275 kmers; bits/key = 2.41806 - built positions[1] for 1178275 kmers; bits/key = 8.00031 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 956038 - building MPHF with 64 threads and 1 partitions (avg. partition size = 956038)... - built mphs[2] for 956038 kmers; bits/key = 2.56129 - built positions[2] for 956038 kmers; bits/key = 9.00035 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 605533 - building MPHF with 64 threads and 1 partitions (avg. partition size = 605533)... - built mphs[3] for 605533 kmers; bits/key = 2.41961 - built positions[3] for 605533 kmers; bits/key = 10.0006 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 425543 - building MPHF with 64 threads and 1 partitions (avg. partition size = 425543)... - built mphs[4] for 425543 kmers; bits/key = 2.42126 - built positions[4] for 425543 kmers; bits/key = 11.0009 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 382297 - building MPHF with 64 threads and 1 partitions (avg. partition size = 382297)... - built mphs[5] for 382297 kmers; bits/key = 2.42153 - built positions[5] for 382297 kmers; bits/key = 12.0009 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 254872 - building MPHF with 64 threads and 1 partitions (avg. partition size = 254872)... - built mphs[6] for 254872 kmers; bits/key = 2.56712 - built positions[6] for 254872 kmers; bits/key = 13.0013 - lower = 8192; upper = 68577; num_bits_per_pos = 17; num_kmers_in_partition = 624986 - building MPHF with 64 threads and 1 partitions (avg. partition size = 624986)... - built mphs[7] for 624986 kmers; bits/key = 2.41943 - built positions[7] for 624986 kmers; bits/key = 17.0005 -computing skew index took: 3.4033 [sec] -=== step 3: 'build sparse and skew index' 4.75385 [sec] (9.46106 [ns/kmer]) -=== total_time 23.6735 [sec] (47.1147 [ns/kmer]) -total index size: 637918700 [B] -- 637.919 [MB] -SPACE BREAKDOWN: - mphf: 0.487029 [bits/kmer] (2.84013 [bits/key]) -- 4.79519% - strings_offsets: 0.12283 [bits/kmer] -- 1.20936% - control_codewords: 6.34482 [bits/kmer] -- 62.4698% - mid_load_buckets: 0.717461 [bits/kmer] -- 7.06397% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.20116e-05% - strings: 2.24566 [bits/kmer] -- 22.1103% - skew_index: 0.238819 [bits/kmer] -- 2.35136% - weights: 2.92956e-06 [bits/kmer] -- 2.88438e-05% - -------------- - total: 10.1566 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.5247% -buckets with 2 minimizer positions = 2.16597% -buckets with 3 minimizer positions = 0.599947% -buckets with 4 minimizer positions = 0.247865% -buckets with 5 minimizer positions = 0.129293% -buckets with 6 minimizer positions = 0.0768388% -buckets with 7 minimizer positions = 0.0512653% -buckets with 8 minimizer positions = 0.0353688% -buckets with 9 minimizer positions = 0.0260667% -buckets with 10 minimizer positions = 0.0199121% -buckets with 11 minimizer positions = 0.0157805% -buckets with 12 minimizer positions = 0.0127513% -buckets with 13 minimizer positions = 0.0102503% -buckets with 14 minimizer positions = 0.00880535% -buckets with 15 minimizer positions = 0.0074347% -buckets with 16 minimizer positions = 0.00615574% -max_bucket_size 68577 -2025-10-22 19:29:16: saving data structure to disk... -2025-10-22 19:29:16: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.77737 [sec] (2.41427 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.50369 [sec] (1.30711 [ns/kmer]) -=== step 1: 'parse file' 4.28119 [sec] (3.72148 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 16.0668 [sec] (13.9662 [ns/kmer]) -num_minimizers = 209937048 -num_minimizer_positions = 213990360 -num_super_kmers = 222970482 -building minimizers MPHF with 64 threads and 70 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 8.98166 [sec] (7.80743 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154157015993171.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.52983 [sec] (7.41467 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 7.67758 [sec] (6.67384 [ns/kmer]) -num_bits_per_offset = 37 -num_buckets_larger_than_1_not_in_skew_index 2035626/209937048 (0.969636%) -num_buckets_in_skew_index 2517/209937048 (0.00119893%) -max_bucket_size 5316 -log2_max_bucket_size 13 -skew index num_partitions 7 -num_minimizer_positions_of_buckets_larger_than_1 5736623/213990360 (2.68079%) -num_minimizer_positions_of_buckets_in_skew_index 354832/213990360 (0.165817%) -computing minimizers offsets: 1.87975 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 846431 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 463901 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 298968 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 116879 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 120430 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 42891 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 5316: 9813 -num_kmers_in_skew_index 1899313 (0.1651%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 846431 - building MPHF with 64 threads and 1 partitions (avg. partition size = 846431)... - built mphs[0] for 846431 kmers; bits/key = 2.41876 - built positions[0] for 846431 kmers; bits/key = 7.00042 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 463901 - building MPHF with 64 threads and 1 partitions (avg. partition size = 463901)... - built mphs[1] for 463901 kmers; bits/key = 2.42059 - built positions[1] for 463901 kmers; bits/key = 8.00074 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 298968 - building MPHF with 64 threads and 1 partitions (avg. partition size = 298968)... - built mphs[2] for 298968 kmers; bits/key = 2.42332 - built positions[2] for 298968 kmers; bits/key = 9.0012 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 116879 - building MPHF with 64 threads and 1 partitions (avg. partition size = 116879)... - built mphs[3] for 116879 kmers; bits/key = 2.57716 - built positions[3] for 116879 kmers; bits/key = 10.0031 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 120430 - building MPHF with 64 threads and 1 partitions (avg. partition size = 120430)... - built mphs[4] for 120430 kmers; bits/key = 2.43408 - built positions[4] for 120430 kmers; bits/key = 11.0027 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 42891 - building MPHF with 64 threads and 1 partitions (avg. partition size = 42891)... - built mphs[5] for 42891 kmers; bits/key = 2.46579 - built positions[5] for 42891 kmers; bits/key = 12.0089 - lower = 4096; upper = 5316; num_bits_per_pos = 13; num_kmers_in_partition = 9813 - building MPHF with 64 threads and 1 partitions (avg. partition size = 9813)... - built mphs[6] for 9813 kmers; bits/key = 2.48487 - built positions[6] for 9813 kmers; bits/key = 13.0374 -computing skew index took: 1.12068 [sec] -=== step 3: 'build sparse and skew index' 3.32891 [sec] (2.8937 [ns/kmer]) -=== total_time 48.8659 [sec] (42.4774 [ns/kmer]) -total index size: 1396053120 [B] -- 1396.05 [MB] -SPACE BREAKDOWN: - mphf: 0.514173 [bits/kmer] (2.81753 [bits/key]) -- 5.29622% - strings_offsets: 0.0157068 [bits/kmer] -- 0.161788% - control_codewords: 6.93464 [bits/kmer] -- 71.43% - mid_load_buckets: 0.184506 [bits/kmer] -- 1.9005% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 1.9197e-05% - strings: 2.0304 [bits/kmer] -- 20.9141% - skew_index: 0.0288715 [bits/kmer] -- 0.297389% - weights: 1.27956e-06 [bits/kmer] -- 1.318e-05% - -------------- - total: 9.7083 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.0292% -buckets with 2 minimizer positions = 0.755504% -buckets with 3 minimizer positions = 0.0986639% -buckets with 4 minimizer positions = 0.0387669% -buckets with 5 minimizer positions = 0.0208944% -buckets with 6 minimizer positions = 0.0129548% -buckets with 7 minimizer positions = 0.00864497% -buckets with 8 minimizer positions = 0.00604515% -buckets with 9 minimizer positions = 0.00458137% -buckets with 10 minimizer positions = 0.00347628% -buckets with 11 minimizer positions = 0.00277321% -buckets with 12 minimizer positions = 0.00222448% -buckets with 13 minimizer positions = 0.00183484% -buckets with 14 minimizer positions = 0.00150569% -buckets with 15 minimizer positions = 0.00123418% -buckets with 16 minimizer positions = 0.00103317% -max_bucket_size 5316 -2025-10-22 19:30:06: saving data structure to disk... -2025-10-22 19:30:07: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.42622 [sec] (2.96375 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.101.bin'... -=== step 1.2: 'computing minimizers tuples' 3.42168 [sec] (1.36557 [ns/kmer]) -=== step 1: 'parse file' 10.848 [sec] (4.32936 [ns/kmer]) - == files to merge = 102 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.1: 'merging minimizers tuples' 40.7928 [sec] (16.2801 [ns/kmer]) -num_minimizers = 462224926 -num_minimizer_positions = 511201278 -num_super_kmers = 531186741 -building minimizers MPHF with 64 threads and 155 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 20.6153 [sec] (8.22742 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 19.2297 [sec] (7.67443 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154207566399340.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.4: 'merging minimizers tuples ' 28.6909 [sec] (11.4504 [ns/kmer]) -num_bits_per_offset = 40 -num_buckets_larger_than_1_not_in_skew_index 14266506/462224926 (3.08649%) -num_buckets_in_skew_index 60557/462224926 (0.0131012%) -max_bucket_size 22085 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 53165974/511201278 (10.4002%) -num_minimizer_positions_of_buckets_in_skew_index 10137441/511201278 (1.98306%) -computing minimizers offsets: 6.34323 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 14957205 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 10906495 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 7473094 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4774535 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2638087 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1593261 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 729770 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22085: 506148 -num_kmers_in_skew_index 43578595 (1.73919%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 14957205 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[0] for 14957205 kmers; bits/key = 2.56583 - built positions[0] for 14957205 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10906495 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[1] for 10906495 kmers; bits/key = 2.61744 - built positions[1] for 10906495 kmers; bits/key = 8.00003 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 7473094 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 7473094 kmers; bits/key = 2.65359 - built positions[2] for 7473094 kmers; bits/key = 9.00004 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4774535 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 4774535 kmers; bits/key = 2.75085 - built positions[3] for 4774535 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2638087 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2638087)... - built mphs[4] for 2638087 kmers; bits/key = 2.55989 - built positions[4] for 2638087 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1593261 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1593261)... - built mphs[5] for 1593261 kmers; bits/key = 2.56041 - built positions[5] for 1593261 kmers; bits/key = 12.0002 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 729770 - building MPHF with 64 threads and 1 partitions (avg. partition size = 729770)... - built mphs[6] for 729770 kmers; bits/key = 2.56195 - built positions[6] for 729770 kmers; bits/key = 13.0005 - lower = 8192; upper = 22085; num_bits_per_pos = 15; num_kmers_in_partition = 506148 - building MPHF with 64 threads and 1 partitions (avg. partition size = 506148)... - built mphs[7] for 506148 kmers; bits/key = 2.42048 - built positions[7] for 506148 kmers; bits/key = 15.0007 -computing skew index took: 10.0155 [sec] -=== step 3: 'build sparse and skew index' 17.2786 [sec] (6.89576 [ns/kmer]) -=== total_time 137.455 [sec] (54.8575 [ns/kmer]) -total index size: 3654352132 [B] -- 3654.35 [MB] -SPACE BREAKDOWN: - mphf: 0.523236 [bits/kmer] (2.83641 [bits/key]) -- 4.48459% - strings_offsets: 0.130909 [bits/kmer] -- 1.122% - control_codewords: 7.56331 [bits/kmer] -- 64.8242% - mid_load_buckets: 0.848728 [bits/kmer] -- 7.27434% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 7.33372e-06% - strings: 2.24545 [bits/kmer] -- 19.2455% - skew_index: 0.355788 [bits/kmer] -- 3.04941% - weights: 5.87466e-07 [bits/kmer] -- 5.03509e-06% - -------------- - total: 11.6674 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.9004% -buckets with 2 minimizer positions = 1.89323% -buckets with 3 minimizer positions = 0.481205% -buckets with 4 minimizer positions = 0.215066% -buckets with 5 minimizer positions = 0.121924% -buckets with 6 minimizer positions = 0.0781816% -buckets with 7 minimizer positions = 0.0541282% -buckets with 8 minimizer positions = 0.0394014% -buckets with 9 minimizer positions = 0.0296871% -buckets with 10 minimizer positions = 0.0233579% -buckets with 11 minimizer positions = 0.0188211% -buckets with 12 minimizer positions = 0.0152856% -buckets with 13 minimizer positions = 0.0127754% -buckets with 14 minimizer positions = 0.0106204% -buckets with 15 minimizer positions = 0.00907826% -buckets with 16 minimizer positions = 0.0079457% -max_bucket_size 22085 -2025-10-22 19:32:26: saving data structure to disk... -2025-10-22 19:32:28: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.3008 [sec] (4.65311 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.113.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.114.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.115.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.116.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.117.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.118.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.119.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.120.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.121.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.122.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.123.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.124.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.125.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.126.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.127.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.128.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.129.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.130.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.131.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.132.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.133.bin'... -=== step 1.2: 'computing minimizers tuples' 9.92957 [sec] (2.67059 [ns/kmer]) -=== step 1: 'parse file' 27.2305 [sec] (7.32373 [ns/kmer]) - == files to merge = 134 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -num_super_kmers = 800000000 -=== step 2.1: 'merging minimizers tuples' 66.9095 [sec] (17.9955 [ns/kmer]) -num_minimizers = 619508590 -num_minimizer_positions = 790834640 -num_super_kmers = 819080133 -building minimizers MPHF with 64 threads and 207 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 25.609 [sec] (6.88763 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 28.8736 [sec] (7.76563 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154349064892826.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -num_super_kmers = 800000000 -=== step 2.4: 'merging minimizers tuples ' 43.8189 [sec] (11.7852 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 81104016/619508590 (13.0917%) -num_buckets_in_skew_index 149851/619508590 (0.0241887%) -max_bucket_size 71241 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 225181159/790834640 (28.4739%) -num_minimizer_positions_of_buckets_in_skew_index 27398758/790834640 (3.46454%) -computing minimizers offsets: 16.1527 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 35558914 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26726484 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19151665 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 12830346 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 8265693 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 5225188 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 3257832 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71241: 4228970 -num_kmers_in_skew_index 115245092 (3.09955%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 35558914 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[0] for 35558914 kmers; bits/key = 2.57422 - built positions[0] for 35558914 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26726484 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26726484 kmers; bits/key = 2.5656 - built positions[1] for 26726484 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19151665 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19151665 kmers; bits/key = 2.60993 - built positions[2] for 19151665 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 12830346 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[3] for 12830346 kmers; bits/key = 2.65495 - built positions[3] for 12830346 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8265693 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[4] for 8265693 kmers; bits/key = 2.59459 - built positions[4] for 8265693 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 5225188 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 5225188 kmers; bits/key = 2.63154 - built positions[5] for 5225188 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 3257832 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 3257832 kmers; bits/key = 3.31153 - built positions[6] for 3257832 kmers; bits/key = 13.0001 - lower = 8192; upper = 71241; num_bits_per_pos = 17; num_kmers_in_partition = 4228970 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 4228970 kmers; bits/key = 2.84935 - built positions[7] for 4228970 kmers; bits/key = 17.0001 -computing skew index took: 19.0177 [sec] -=== step 3: 'build sparse and skew index' 36.8019 [sec] (9.89797 [ns/kmer]) -=== total_time 229.243 [sec] (61.6557 [ns/kmer]) -total index size: 6504372204 [B] -- 6504.37 [MB] -SPACE BREAKDOWN: - mphf: 0.472233 [bits/kmer] (2.83421 [bits/key]) -- 3.3743% - strings_offsets: 0.489994 [bits/kmer] -- 3.50121% - control_codewords: 6.99799 [bits/kmer] -- 50.0036% - mid_load_buckets: 2.48309 [bits/kmer] -- 17.7427% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.12031e-06% - strings: 2.8909 [bits/kmer] -- 20.6567% - skew_index: 0.660765 [bits/kmer] -- 4.72145% - weights: 3.95899e-07 [bits/kmer] -- 2.82887e-06% - -------------- - total: 13.995 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 86.8841% -buckets with 2 minimizer positions = 10.1608% -buckets with 3 minimizer positions = 1.5937% -buckets with 4 minimizer positions = 0.465965% -buckets with 5 minimizer positions = 0.227622% -buckets with 6 minimizer positions = 0.138122% -buckets with 7 minimizer positions = 0.0932371% -buckets with 8 minimizer positions = 0.0672932% -buckets with 9 minimizer positions = 0.0507686% -buckets with 10 minimizer positions = 0.0394317% -buckets with 11 minimizer positions = 0.0314958% -buckets with 12 minimizer positions = 0.025655% -buckets with 13 minimizer positions = 0.0213997% -buckets with 14 minimizer positions = 0.017952% -buckets with 15 minimizer positions = 0.0152708% -buckets with 16 minimizer positions = 0.0132381% -max_bucket_size 71241 -2025-10-22 19:36:20: saving data structure to disk... -2025-10-22 19:36:24: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... -read 100000 sequences, 12802319 bases, 9802319 kmers -read 200000 sequences, 26155680 bases, 20155680 kmers -read 300000 sequences, 39727315 bases, 30727315 kmers -read 400000 sequences, 53567543 bases, 41567543 kmers -read 500000 sequences, 68009750 bases, 53009750 kmers -read 600000 sequences, 83050731 bases, 65050731 kmers -read 700000 sequences, 98819486 bases, 77819486 kmers -read 800000 sequences, 116043186 bases, 92043186 kmers -read 900000 sequences, 134201454 bases, 107201454 kmers -read 1000000 sequences, 153195620 bases, 123195620 kmers -read 1100000 sequences, 174787795 bases, 141787795 kmers -read 1200000 sequences, 183806919 bases, 147806919 kmers -read 1300000 sequences, 190658371 bases, 151658371 kmers -read 1400000 sequences, 197393762 bases, 155393762 kmers -read 1500000 sequences, 204308958 bases, 159308958 kmers -read 1600000 sequences, 211178004 bases, 163178004 kmers -read 1700000 sequences, 217938129 bases, 166938129 kmers -read 1800000 sequences, 224728931 bases, 170728931 kmers -read 1900000 sequences, 231435055 bases, 174435055 kmers -read 2000000 sequences, 238301856 bases, 178301856 kmers -read 2100000 sequences, 245162304 bases, 182162304 kmers -read 2200000 sequences, 251968534 bases, 185968534 kmers -read 2300000 sequences, 258797784 bases, 189797784 kmers -read 2400000 sequences, 265681419 bases, 193681419 kmers -read 2500000 sequences, 272480771 bases, 197480771 kmers -read 2600000 sequences, 279327274 bases, 201327274 kmers -read 2700000 sequences, 286169897 bases, 205169897 kmers -read 2800000 sequences, 293063897 bases, 209063897 kmers -read 2900000 sequences, 299941531 bases, 212941531 kmers -read 3000000 sequences, 306827724 bases, 216827724 kmers -read 3100000 sequences, 313725925 bases, 220725925 kmers -read 3200000 sequences, 320629887 bases, 224629887 kmers -read 3300000 sequences, 327545193 bases, 228545193 kmers -read 3400000 sequences, 334471610 bases, 232471610 kmers -read 3500000 sequences, 341603766 bases, 236603766 kmers -read 3600000 sequences, 348399690 bases, 240399690 kmers -read 3700000 sequences, 355270676 bases, 244270676 kmers -read 3800000 sequences, 362436143 bases, 248436143 kmers -read 3900000 sequences, 369341114 bases, 252341114 kmers -read 4000000 sequences, 376235441 bases, 256235441 kmers -read 4100000 sequences, 383163199 bases, 260163199 kmers -read 4200000 sequences, 390047987 bases, 264047987 kmers -read 4300000 sequences, 396880438 bases, 267880438 kmers -read 4400000 sequences, 403776565 bases, 271776565 kmers -read 4500000 sequences, 410576367 bases, 275576367 kmers -read 4600000 sequences, 417377049 bases, 279377049 kmers -read 4700000 sequences, 424274495 bases, 283274495 kmers -read 4800000 sequences, 431192311 bases, 287192311 kmers -read 4900000 sequences, 438257785 bases, 291257785 kmers -read 5000000 sequences, 445233170 bases, 295233170 kmers -read 5100000 sequences, 452307732 bases, 299307732 kmers -read 5200000 sequences, 459344438 bases, 303344438 kmers -read 5300000 sequences, 466255981 bases, 307255981 kmers -read 5400000 sequences, 473220156 bases, 311220156 kmers -read 5500000 sequences, 480178864 bases, 315178864 kmers -read 5600000 sequences, 487198091 bases, 319198091 kmers -read 5700000 sequences, 494051268 bases, 323051268 kmers -read 5800000 sequences, 501294774 bases, 327294774 kmers -read 5900000 sequences, 508386191 bases, 331386191 kmers -read 6000000 sequences, 515368260 bases, 335368260 kmers -read 6100000 sequences, 522265327 bases, 339265327 kmers -read 6200000 sequences, 529435219 bases, 343435219 kmers -read 6300000 sequences, 536513892 bases, 347513892 kmers -read 6400000 sequences, 543669227 bases, 351669227 kmers -read 6500000 sequences, 550654427 bases, 355654427 kmers -read 6600000 sequences, 557665979 bases, 359665979 kmers -read 6700000 sequences, 564815722 bases, 363815722 kmers -read 6800000 sequences, 571787007 bases, 367787007 kmers -read 6900000 sequences, 578923485 bases, 371923485 kmers -read 7000000 sequences, 586116050 bases, 376116050 kmers -read 7100000 sequences, 593247546 bases, 380247546 kmers -read 7200000 sequences, 600225954 bases, 384225954 kmers -read 7300000 sequences, 607331027 bases, 388331027 kmers -read 7400000 sequences, 614417238 bases, 392417238 kmers -read 7500000 sequences, 621494916 bases, 396494916 kmers -read 7600000 sequences, 628713296 bases, 400713296 kmers -read 7700000 sequences, 635875916 bases, 404875916 kmers -read 7800000 sequences, 643000132 bases, 409000132 kmers -read 7900000 sequences, 650054935 bases, 413054935 kmers -read 8000000 sequences, 657174193 bases, 417174193 kmers -read 8100000 sequences, 664392690 bases, 421392690 kmers -read 8200000 sequences, 671575430 bases, 425575430 kmers -read 8300000 sequences, 678822397 bases, 429822397 kmers -read 8400000 sequences, 685932522 bases, 433932522 kmers -read 8500000 sequences, 693003257 bases, 438003257 kmers -read 8600000 sequences, 700264806 bases, 442264806 kmers -read 8700000 sequences, 707441916 bases, 446441916 kmers -read 8800000 sequences, 714783716 bases, 450783716 kmers -read 8900000 sequences, 722048687 bases, 455048687 kmers -read 9000000 sequences, 729536721 bases, 459536721 kmers -read 9100000 sequences, 736820834 bases, 463820834 kmers -read 9200000 sequences, 744240551 bases, 468240551 kmers -read 9300000 sequences, 751532385 bases, 472532385 kmers -read 9400000 sequences, 758908308 bases, 476908308 kmers -read 9500000 sequences, 766152765 bases, 481152765 kmers -read 9600000 sequences, 773460104 bases, 485460104 kmers -read 9700000 sequences, 780744999 bases, 489744999 kmers -read 9800000 sequences, 788046688 bases, 494046688 kmers -read 9900000 sequences, 795444088 bases, 498444088 kmers -read 10000000 sequences, 802902838 bases, 502902838 kmers -read 10100000 sequences, 810379702 bases, 507379702 kmers -read 10200000 sequences, 817713311 bases, 511713311 kmers -read 10300000 sequences, 825011133 bases, 516011133 kmers -read 10400000 sequences, 832292513 bases, 520292513 kmers -read 10500000 sequences, 839612784 bases, 524612784 kmers -read 10600000 sequences, 847027439 bases, 529027439 kmers -read 10700000 sequences, 854363725 bases, 533363725 kmers -read 10800000 sequences, 861721984 bases, 537721984 kmers -read 10900000 sequences, 869045250 bases, 542045250 kmers -read 11000000 sequences, 876372447 bases, 546372447 kmers -read 11100000 sequences, 883866002 bases, 550866002 kmers -read 11200000 sequences, 891340279 bases, 555340279 kmers -read 11300000 sequences, 899036889 bases, 560036889 kmers -read 11400000 sequences, 906434241 bases, 564434241 kmers -read 11500000 sequences, 913824257 bases, 568824257 kmers -read 11600000 sequences, 921342281 bases, 573342281 kmers -read 11700000 sequences, 928719144 bases, 577719144 kmers -read 11800000 sequences, 936164765 bases, 582164765 kmers -read 11900000 sequences, 943653758 bases, 586653758 kmers -read 12000000 sequences, 951284053 bases, 591284053 kmers -read 12100000 sequences, 958744772 bases, 595744772 kmers -read 12200000 sequences, 966275858 bases, 600275858 kmers -read 12300000 sequences, 973962686 bases, 604962686 kmers -read 12400000 sequences, 981647965 bases, 609647965 kmers -read 12500000 sequences, 989234531 bases, 614234531 kmers -read 12600000 sequences, 996919849 bases, 618919849 kmers -read 12700000 sequences, 1004488446 bases, 623488446 kmers -read 12800000 sequences, 1012083435 bases, 628083435 kmers -read 12900000 sequences, 1019844583 bases, 632844583 kmers -read 13000000 sequences, 1027636701 bases, 637636701 kmers -read 13100000 sequences, 1035458430 bases, 642458430 kmers -read 13200000 sequences, 1043299596 bases, 647299596 kmers -read 13300000 sequences, 1051100294 bases, 652100294 kmers -read 13400000 sequences, 1058940054 bases, 656940054 kmers -read 13500000 sequences, 1066735225 bases, 661735225 kmers -read 13600000 sequences, 1074662997 bases, 666662997 kmers -read 13700000 sequences, 1082381283 bases, 671381283 kmers -read 13800000 sequences, 1090055507 bases, 676055507 kmers -read 13900000 sequences, 1097835965 bases, 680835965 kmers -read 14000000 sequences, 1105722693 bases, 685722693 kmers -read 14100000 sequences, 1113495622 bases, 690495622 kmers -read 14200000 sequences, 1121380038 bases, 695380038 kmers -read 14300000 sequences, 1129522879 bases, 700522879 kmers -read 14400000 sequences, 1137515487 bases, 705515487 kmers -read 14500000 sequences, 1145547633 bases, 710547633 kmers -read 14600000 sequences, 1153636718 bases, 715636718 kmers -read 14700000 sequences, 1161507672 bases, 720507672 kmers -read 14800000 sequences, 1169638977 bases, 725638977 kmers -read 14900000 sequences, 1177765602 bases, 730765602 kmers -read 15000000 sequences, 1185796892 bases, 735796892 kmers -read 15100000 sequences, 1193966066 bases, 740966066 kmers -read 15200000 sequences, 1201992531 bases, 745992531 kmers -read 15300000 sequences, 1210139564 bases, 751139564 kmers -read 15400000 sequences, 1218303770 bases, 756303770 kmers -read 15500000 sequences, 1226563924 bases, 761563924 kmers -read 15600000 sequences, 1234769102 bases, 766769102 kmers -read 15700000 sequences, 1243038710 bases, 772038710 kmers -read 15800000 sequences, 1251312331 bases, 777312331 kmers -read 15900000 sequences, 1259505857 bases, 782505857 kmers -read 16000000 sequences, 1267846293 bases, 787846293 kmers -read 16100000 sequences, 1276258510 bases, 793258510 kmers -read 16200000 sequences, 1284600618 bases, 798600618 kmers -read 16300000 sequences, 1292910529 bases, 803910529 kmers -read 16400000 sequences, 1301315569 bases, 809315569 kmers -read 16500000 sequences, 1309948482 bases, 814948482 kmers -read 16600000 sequences, 1318536932 bases, 820536932 kmers -read 16700000 sequences, 1326901868 bases, 825901868 kmers -read 16800000 sequences, 1335658656 bases, 831658656 kmers -read 16900000 sequences, 1344318999 bases, 837318999 kmers -read 17000000 sequences, 1352901026 bases, 842901026 kmers -read 17100000 sequences, 1361738649 bases, 848738649 kmers -read 17200000 sequences, 1370441463 bases, 854441463 kmers -read 17300000 sequences, 1379104762 bases, 860104762 kmers -read 17400000 sequences, 1387857799 bases, 865857799 kmers -read 17500000 sequences, 1396827318 bases, 871827318 kmers -read 17600000 sequences, 1405624638 bases, 877624638 kmers -read 17700000 sequences, 1414580410 bases, 883580410 kmers -read 17800000 sequences, 1423596393 bases, 889596393 kmers -read 17900000 sequences, 1432608671 bases, 895608671 kmers -read 18000000 sequences, 1442015880 bases, 902015880 kmers -read 18100000 sequences, 1451131708 bases, 908131708 kmers -read 18200000 sequences, 1460386801 bases, 914386801 kmers -read 18300000 sequences, 1469583369 bases, 920583369 kmers -read 18400000 sequences, 1478759459 bases, 926759459 kmers -read 18500000 sequences, 1488122391 bases, 933122391 kmers -read 18600000 sequences, 1497569745 bases, 939569745 kmers -read 18700000 sequences, 1507030485 bases, 946030485 kmers -read 18800000 sequences, 1516707149 bases, 952707149 kmers -read 18900000 sequences, 1526397934 bases, 959397934 kmers -read 19000000 sequences, 1536308350 bases, 966308350 kmers -read 19100000 sequences, 1546342668 bases, 973342668 kmers -read 19200000 sequences, 1556281669 bases, 980281669 kmers -read 19300000 sequences, 1566271275 bases, 987271275 kmers -read 19400000 sequences, 1576402796 bases, 994402796 kmers -read 19500000 sequences, 1586440957 bases, 1001440957 kmers -read 19600000 sequences, 1596689344 bases, 1008689344 kmers -read 19700000 sequences, 1607088748 bases, 1016088748 kmers -read 19800000 sequences, 1617543387 bases, 1023543387 kmers -read 19900000 sequences, 1628261415 bases, 1031261415 kmers -read 20000000 sequences, 1639158516 bases, 1039158516 kmers -read 20100000 sequences, 1650338356 bases, 1047338356 kmers -read 20200000 sequences, 1661398094 bases, 1055398094 kmers -read 20300000 sequences, 1672652108 bases, 1063652108 kmers -read 20400000 sequences, 1683961135 bases, 1071961135 kmers -read 20500000 sequences, 1695700838 bases, 1080700838 kmers -read 20600000 sequences, 1707448842 bases, 1089448842 kmers -read 20700000 sequences, 1719587691 bases, 1098587691 kmers -read 20800000 sequences, 1732024822 bases, 1108024822 kmers -=== step 1.1: 'encoding input' 5.94278 [sec] (5.34894 [ns/kmer]) -read 20822360 sequences, 1735689645 bases, 1111018845 kmers -num_kmers 1111018845 -cost: 2.0 + 1.1245 [bits/kmer] -max_len 176455 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.65.bin'... -=== step 1.2: 'computing minimizers tuples' 1.82301 [sec] (1.64085 [ns/kmer]) -=== step 1: 'parse file' 7.76591 [sec] (6.9899 [ns/kmer]) - == files to merge = 66 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 18.8093 [sec] (16.9298 [ns/kmer]) -num_minimizers = 174641353 -num_minimizer_positions = 240693690 -num_super_kmers = 249228267 -building minimizers MPHF with 64 threads and 59 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 7.61449 [sec] (6.85361 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154584727120621.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 9.08502 [sec] (8.1772 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 6.07792 [sec] (5.47058 [ns/kmer]) -num_bits_per_offset = 43 -num_buckets_larger_than_1_not_in_skew_index 20680302/174641353 (11.8416%) -num_buckets_in_skew_index 18464/174641353 (0.0105725%) -max_bucket_size 37043 -log2_max_bucket_size 16 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 82592303/240693690 (34.3143%) -num_minimizer_positions_of_buckets_in_skew_index 4158800/240693690 (1.72784%) -computing minimizers offsets: 5.19724 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4817539 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2376719 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1827153 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1520019 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1265567 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 951364 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1017584 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 37043: 1228646 -num_kmers_in_skew_index 15004591 (1.35053%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4817539 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4817539 kmers; bits/key = 2.73 - built positions[0] for 4817539 kmers; bits/key = 7.00008 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2376719 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2376719)... - built mphs[1] for 2376719 kmers; bits/key = 2.55999 - built positions[1] for 2376719 kmers; bits/key = 8.00014 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1827153 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1827153)... - built mphs[2] for 1827153 kmers; bits/key = 2.56021 - built positions[2] for 1827153 kmers; bits/key = 9.0002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1520019 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1520019)... - built mphs[3] for 1520019 kmers; bits/key = 2.56043 - built positions[3] for 1520019 kmers; bits/key = 10.0002 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1265567 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1265567)... - built mphs[4] for 1265567 kmers; bits/key = 2.56074 - built positions[4] for 1265567 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 951364 - building MPHF with 64 threads and 1 partitions (avg. partition size = 951364)... - built mphs[5] for 951364 kmers; bits/key = 2.56127 - built positions[5] for 951364 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1017584 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1017584)... - built mphs[6] for 1017584 kmers; bits/key = 2.41831 - built positions[6] for 1017584 kmers; bits/key = 13.0003 - lower = 8192; upper = 37043; num_bits_per_pos = 16; num_kmers_in_partition = 1228646 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1228646)... - built mphs[7] for 1228646 kmers; bits/key = 2.56083 - built positions[7] for 1228646 kmers; bits/key = 16.0003 -computing skew index took: 6.90364 [sec] -=== step 3: 'build sparse and skew index' 12.609 [sec] (11.3491 [ns/kmer]) -=== total_time 61.9617 [sec] (55.7701 [ns/kmer]) -total index size: 2026336026 [B] -- 2026.34 [MB] -SPACE BREAKDOWN: - mphf: 0.447872 [bits/kmer] (2.84923 [bits/key]) -- 3.06954% - strings_offsets: 0.580993 [bits/kmer] -- 3.9819% - control_codewords: 6.91637 [bits/kmer] -- 47.4022% - mid_load_buckets: 3.19659 [bits/kmer] -- 21.9082% - begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.32258e-05% - strings: 3.1245 [bits/kmer] -- 21.4141% - skew_index: 0.324502 [bits/kmer] -- 2.22401% - weights: 1.32491e-06 [bits/kmer] -- 9.08043e-06% - -------------- - total: 14.5908 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 88.1478% -buckets with 2 minimizer positions = 6.79213% -buckets with 3 minimizer positions = 1.92226% -buckets with 4 minimizer positions = 0.856078% -buckets with 5 minimizer positions = 0.493468% -buckets with 6 minimizer positions = 0.325915% -buckets with 7 minimizer positions = 0.234531% -buckets with 8 minimizer positions = 0.178296% -buckets with 9 minimizer positions = 0.141164% -buckets with 10 minimizer positions = 0.115104% -buckets with 11 minimizer positions = 0.0959486% -buckets with 12 minimizer positions = 0.0807615% -buckets with 13 minimizer positions = 0.0695379% -buckets with 14 minimizer positions = 0.060729% -buckets with 15 minimizer positions = 0.0531947% -buckets with 16 minimizer positions = 0.0472706% -max_bucket_size 37043 -2025-10-22 19:37:27: saving data structure to disk... -2025-10-22 19:37:28: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... -read 100000 sequences, 8718431 bases, 5718431 kmers -read 200000 sequences, 17474097 bases, 11474097 kmers -read 300000 sequences, 26299449 bases, 17299449 kmers -read 400000 sequences, 35167130 bases, 23167130 kmers -read 500000 sequences, 43967965 bases, 28967965 kmers -read 600000 sequences, 52886445 bases, 34886445 kmers -read 700000 sequences, 61937196 bases, 40937196 kmers -read 800000 sequences, 71070714 bases, 47070714 kmers -read 900000 sequences, 80176912 bases, 53176912 kmers -read 1000000 sequences, 89525906 bases, 59525906 kmers -read 1100000 sequences, 98984859 bases, 65984859 kmers -read 1200000 sequences, 108719881 bases, 72719881 kmers -read 1300000 sequences, 118280880 bases, 79280880 kmers -read 1400000 sequences, 127917770 bases, 85917770 kmers -read 1500000 sequences, 137591691 bases, 92591691 kmers -read 1600000 sequences, 147395215 bases, 99395215 kmers -read 1700000 sequences, 157335047 bases, 106335047 kmers -read 1800000 sequences, 167445213 bases, 113445213 kmers -read 1900000 sequences, 177725569 bases, 120725569 kmers -read 2000000 sequences, 188052064 bases, 128052064 kmers -read 2100000 sequences, 198499534 bases, 135499534 kmers -read 2200000 sequences, 209053278 bases, 143053278 kmers -read 2300000 sequences, 219848016 bases, 150848016 kmers -read 2400000 sequences, 230787167 bases, 158787167 kmers -read 2500000 sequences, 242014409 bases, 167014409 kmers -read 2600000 sequences, 253501985 bases, 175501985 kmers -read 2700000 sequences, 265108770 bases, 184108770 kmers -read 2800000 sequences, 277040197 bases, 193040197 kmers -read 2900000 sequences, 289406751 bases, 202406751 kmers -read 3000000 sequences, 302142183 bases, 212142183 kmers -read 3100000 sequences, 315168435 bases, 222168435 kmers -read 3200000 sequences, 329083083 bases, 233083083 kmers -read 3300000 sequences, 343508535 bases, 244508535 kmers -read 3400000 sequences, 358608045 bases, 256608045 kmers -read 3500000 sequences, 374790387 bases, 269790387 kmers -read 3600000 sequences, 392124136 bases, 284124136 kmers -read 3700000 sequences, 410698510 bases, 299698510 kmers -read 3800000 sequences, 431358064 bases, 317358064 kmers -read 3900000 sequences, 454179453 bases, 337179453 kmers -read 4000000 sequences, 461236524 bases, 341236524 kmers -read 4100000 sequences, 468031549 bases, 345031549 kmers -read 4200000 sequences, 474889571 bases, 348889571 kmers -read 4300000 sequences, 481729708 bases, 352729708 kmers -read 4400000 sequences, 488721954 bases, 356721954 kmers -read 4500000 sequences, 495625078 bases, 360625078 kmers -read 4600000 sequences, 502596576 bases, 364596576 kmers -read 4700000 sequences, 509600517 bases, 368600517 kmers -read 4800000 sequences, 516484470 bases, 372484470 kmers -read 4900000 sequences, 523427219 bases, 376427219 kmers -read 5000000 sequences, 530371783 bases, 380371783 kmers -read 5100000 sequences, 537329595 bases, 384329595 kmers -read 5200000 sequences, 544209359 bases, 388209359 kmers -read 5300000 sequences, 551189922 bases, 392189922 kmers -read 5400000 sequences, 558101939 bases, 396101939 kmers -read 5500000 sequences, 565120163 bases, 400120163 kmers -read 5600000 sequences, 572157570 bases, 404157570 kmers -read 5700000 sequences, 579064866 bases, 408064866 kmers -read 5800000 sequences, 586002711 bases, 412002711 kmers -read 5900000 sequences, 592940936 bases, 415940936 kmers -read 6000000 sequences, 600036489 bases, 420036489 kmers -read 6100000 sequences, 607035798 bases, 424035798 kmers -read 6200000 sequences, 614208718 bases, 428208718 kmers -read 6300000 sequences, 621168245 bases, 432168245 kmers -read 6400000 sequences, 628072498 bases, 436072498 kmers -read 6500000 sequences, 635102614 bases, 440102614 kmers -read 6600000 sequences, 642120732 bases, 444120732 kmers -read 6700000 sequences, 649088967 bases, 448088967 kmers -read 6800000 sequences, 656101755 bases, 452101755 kmers -read 6900000 sequences, 663148884 bases, 456148884 kmers -read 7000000 sequences, 670072473 bases, 460072473 kmers -read 7100000 sequences, 677027864 bases, 464027864 kmers -read 7200000 sequences, 684172202 bases, 468172202 kmers -read 7300000 sequences, 691211207 bases, 472211207 kmers -read 7400000 sequences, 698208790 bases, 476208790 kmers -read 7500000 sequences, 705328995 bases, 480328995 kmers -read 7600000 sequences, 712361023 bases, 484361023 kmers -read 7700000 sequences, 719471804 bases, 488471804 kmers -read 7800000 sequences, 726605138 bases, 492605138 kmers -read 7900000 sequences, 733774594 bases, 496774594 kmers -read 8000000 sequences, 740830673 bases, 500830673 kmers -read 8100000 sequences, 747950180 bases, 504950180 kmers -read 8200000 sequences, 755058730 bases, 509058730 kmers -read 8300000 sequences, 762216427 bases, 513216427 kmers -read 8400000 sequences, 769353851 bases, 517353851 kmers -read 8500000 sequences, 776583161 bases, 521583161 kmers -read 8600000 sequences, 783816261 bases, 525816261 kmers -read 8700000 sequences, 791077370 bases, 530077370 kmers -read 8800000 sequences, 798157781 bases, 534157781 kmers -read 8900000 sequences, 805241016 bases, 538241016 kmers -read 9000000 sequences, 812530455 bases, 542530455 kmers -read 9100000 sequences, 819617693 bases, 546617693 kmers -read 9200000 sequences, 826809772 bases, 550809772 kmers -read 9300000 sequences, 833919107 bases, 554919107 kmers -read 9400000 sequences, 841155666 bases, 559155666 kmers -read 9500000 sequences, 848401695 bases, 563401695 kmers -read 9600000 sequences, 855643716 bases, 567643716 kmers -read 9700000 sequences, 862872782 bases, 571872782 kmers -read 9800000 sequences, 870171741 bases, 576171741 kmers -read 9900000 sequences, 877460939 bases, 580460939 kmers -read 10000000 sequences, 884692153 bases, 584692153 kmers -read 10100000 sequences, 891988915 bases, 588988915 kmers -read 10200000 sequences, 899332167 bases, 593332167 kmers -read 10300000 sequences, 906596132 bases, 597596132 kmers -read 10400000 sequences, 913914222 bases, 601914222 kmers -read 10500000 sequences, 921197164 bases, 606197164 kmers -read 10600000 sequences, 928621352 bases, 610621352 kmers -read 10700000 sequences, 935962590 bases, 614962590 kmers -read 10800000 sequences, 943225398 bases, 619225398 kmers -read 10900000 sequences, 950606271 bases, 623606271 kmers -read 11000000 sequences, 958222271 bases, 628222271 kmers -read 11100000 sequences, 965609642 bases, 632609642 kmers -read 11200000 sequences, 972999574 bases, 636999574 kmers -read 11300000 sequences, 980385996 bases, 641385996 kmers -read 11400000 sequences, 987756692 bases, 645756692 kmers -read 11500000 sequences, 995228727 bases, 650228727 kmers -read 11600000 sequences, 1002716000 bases, 654716000 kmers -read 11700000 sequences, 1010163238 bases, 659163238 kmers -read 11800000 sequences, 1017604060 bases, 663604060 kmers -read 11900000 sequences, 1025150347 bases, 668150347 kmers -read 12000000 sequences, 1032736062 bases, 672736062 kmers -read 12100000 sequences, 1040213508 bases, 677213508 kmers -read 12200000 sequences, 1047864763 bases, 681864763 kmers -read 12300000 sequences, 1055370986 bases, 686370986 kmers -read 12400000 sequences, 1062882136 bases, 690882136 kmers -read 12500000 sequences, 1070457834 bases, 695457834 kmers -read 12600000 sequences, 1078056503 bases, 700056503 kmers -read 12700000 sequences, 1085619892 bases, 704619892 kmers -read 12800000 sequences, 1093220371 bases, 709220371 kmers -read 12900000 sequences, 1100938017 bases, 713938017 kmers -read 13000000 sequences, 1108501169 bases, 718501169 kmers -read 13100000 sequences, 1116117667 bases, 723117667 kmers -read 13200000 sequences, 1123791984 bases, 727791984 kmers -read 13300000 sequences, 1131456294 bases, 732456294 kmers -read 13400000 sequences, 1139167231 bases, 737167231 kmers -read 13500000 sequences, 1147084240 bases, 742084240 kmers -read 13600000 sequences, 1154903455 bases, 746903455 kmers -read 13700000 sequences, 1162719581 bases, 751719581 kmers -read 13800000 sequences, 1170515268 bases, 756515268 kmers -read 13900000 sequences, 1178310906 bases, 761310906 kmers -read 14000000 sequences, 1186158510 bases, 766158510 kmers -read 14100000 sequences, 1194143461 bases, 771143461 kmers -read 14200000 sequences, 1202037257 bases, 776037257 kmers -read 14300000 sequences, 1210016774 bases, 781016774 kmers -read 14400000 sequences, 1217929746 bases, 785929746 kmers -read 14500000 sequences, 1226009557 bases, 791009557 kmers -read 14600000 sequences, 1233936531 bases, 795936531 kmers -read 14700000 sequences, 1241953842 bases, 800953842 kmers -read 14800000 sequences, 1249971925 bases, 805971925 kmers -read 14900000 sequences, 1258012031 bases, 811012031 kmers -read 15000000 sequences, 1266102895 bases, 816102895 kmers -read 15100000 sequences, 1274149698 bases, 821149698 kmers -read 15200000 sequences, 1282474916 bases, 826474916 kmers -read 15300000 sequences, 1290768947 bases, 831768947 kmers -read 15400000 sequences, 1299121797 bases, 837121797 kmers -read 15500000 sequences, 1307304198 bases, 842304198 kmers -read 15600000 sequences, 1315661756 bases, 847661756 kmers -read 15700000 sequences, 1324089837 bases, 853089837 kmers -read 15800000 sequences, 1332318617 bases, 858318617 kmers -read 15900000 sequences, 1340760587 bases, 863760587 kmers -read 16000000 sequences, 1349263765 bases, 869263765 kmers -read 16100000 sequences, 1357811757 bases, 874811757 kmers -read 16200000 sequences, 1366358226 bases, 880358226 kmers -read 16300000 sequences, 1375027036 bases, 886027036 kmers -read 16400000 sequences, 1383710258 bases, 891710258 kmers -=== step 1.1: 'encoding input' 4.66664 [sec] (5.21815 [ns/kmer]) -read 16440873 sequences, 1387536274 bases, 894310084 kmers -num_kmers 894310084 -cost: 2.0 + 1.10303 [bits/kmer] -max_len 117016 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.49449 [sec] (1.67112 [ns/kmer]) -=== step 1: 'parse file' 6.16124 [sec] (6.88938 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 14.9847 [sec] (16.7556 [ns/kmer]) -num_minimizers = 143418843 -num_minimizer_positions = 193511241 -num_super_kmers = 200364919 -building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.30493 [sec] (7.05005 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154648841741299.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.40292 [sec] (8.27781 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.95714 [sec] (4.4248 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 18123968/143418843 (12.6371%) -num_buckets_in_skew_index 15172/143418843 (0.0105788%) -max_bucket_size 30655 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 65664193/193511241 (33.933%) -num_minimizer_positions_of_buckets_in_skew_index 2567345/193511241 (1.32672%) -computing minimizers offsets: 4.31495 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4240400 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1914946 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1106165 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 771672 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 562721 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 475654 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 388509 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 30655: 459571 -num_kmers_in_skew_index 9919638 (1.10919%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4240400 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4240400 kmers; bits/key = 2.84282 - built positions[0] for 4240400 kmers; bits/key = 7.00008 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1914946 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1914946)... - built mphs[1] for 1914946 kmers; bits/key = 2.56017 - built positions[1] for 1914946 kmers; bits/key = 8.00019 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1106165 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1106165)... - built mphs[2] for 1106165 kmers; bits/key = 2.56093 - built positions[2] for 1106165 kmers; bits/key = 9.00032 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 771672 - building MPHF with 64 threads and 1 partitions (avg. partition size = 771672)... - built mphs[3] for 771672 kmers; bits/key = 2.41893 - built positions[3] for 771672 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 562721 - building MPHF with 64 threads and 1 partitions (avg. partition size = 562721)... - built mphs[4] for 562721 kmers; bits/key = 2.56295 - built positions[4] for 562721 kmers; bits/key = 11.0006 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 475654 - building MPHF with 64 threads and 1 partitions (avg. partition size = 475654)... - built mphs[5] for 475654 kmers; bits/key = 2.56365 - built positions[5] for 475654 kmers; bits/key = 12.0008 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 388509 - building MPHF with 64 threads and 1 partitions (avg. partition size = 388509)... - built mphs[6] for 388509 kmers; bits/key = 2.42185 - built positions[6] for 388509 kmers; bits/key = 13.0008 - lower = 8192; upper = 30655; num_bits_per_pos = 15; num_kmers_in_partition = 459571 - building MPHF with 64 threads and 1 partitions (avg. partition size = 459571)... - built mphs[7] for 459571 kmers; bits/key = 2.4208 - built positions[7] for 459571 kmers; bits/key = 15.0007 -computing skew index took: 4.06247 [sec] -=== step 3: 'build sparse and skew index' 8.76323 [sec] (9.79887 [ns/kmer]) -=== total_time 47.5741 [sec] (53.1965 [ns/kmer]) -total index size: 1578012598 [B] -- 1578.01 [MB] -SPACE BREAKDOWN: - mphf: 0.453288 [bits/kmer] (2.82655 [bits/key]) -- 3.21116% - strings_offsets: 0.5699 [bits/kmer] -- 4.03726% - control_codewords: 6.73546 [bits/kmer] -- 47.715% - mid_load_buckets: 3.0104 [bits/kmer] -- 21.3261% - begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 1.69834e-05% - strings: 3.10303 [bits/kmer] -- 21.9823% - skew_index: 0.243934 [bits/kmer] -- 1.72807% - weights: 1.64596e-06 [bits/kmer] -- 1.16602e-05% - -------------- - total: 14.116 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 87.3523% -buckets with 2 minimizer positions = 7.4877% -buckets with 3 minimizer positions = 2.14684% -buckets with 4 minimizer positions = 0.927917% -buckets with 5 minimizer positions = 0.508829% -buckets with 6 minimizer positions = 0.320607% -buckets with 7 minimizer positions = 0.221914% -buckets with 8 minimizer positions = 0.16449% -buckets with 9 minimizer positions = 0.128547% -buckets with 10 minimizer positions = 0.104586% -buckets with 11 minimizer positions = 0.0865967% -buckets with 12 minimizer positions = 0.0732902% -buckets with 13 minimizer positions = 0.062991% -buckets with 14 minimizer positions = 0.0543541% -buckets with 15 minimizer positions = 0.0475495% -buckets with 16 minimizer positions = 0.0409653% -max_bucket_size 30655 -2025-10-22 19:38:17: saving data structure to disk... -2025-10-22 19:38:17: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log b/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log deleted file mode 100644 index 5d7185b..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k31/regular-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 637.172 -avg_nanosec_per_negative_lookup 808.384 -avg_nanosec_per_access 257.917 -iterator: avg_nanosec_per_kmer 2.63495 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 651.837 -avg_nanosec_per_negative_lookup 791.604 -avg_nanosec_per_access 247.392 -iterator: avg_nanosec_per_kmer 2.57436 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 674.085 -avg_nanosec_per_negative_lookup 818.888 -avg_nanosec_per_access 241.841 -iterator: avg_nanosec_per_kmer 2.52253 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 628.412 -avg_nanosec_per_negative_lookup 813.347 -avg_nanosec_per_access 225.477 -iterator: avg_nanosec_per_kmer 2.6821 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 612.56 -avg_nanosec_per_negative_lookup 799.281 -avg_nanosec_per_access 233.08 -iterator: avg_nanosec_per_kmer 2.51182 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 628.923 -avg_nanosec_per_negative_lookup 808.612 -avg_nanosec_per_access 223.195 -iterator: avg_nanosec_per_kmer 2.51995 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 883.91 -avg_nanosec_per_negative_lookup 1063.57 -avg_nanosec_per_access 345.899 -iterator: avg_nanosec_per_kmer 2.5201 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 878.852 -avg_nanosec_per_negative_lookup 1068.28 -avg_nanosec_per_access 374.985 -iterator: avg_nanosec_per_kmer 2.66045 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 879.735 -avg_nanosec_per_negative_lookup 1071.35 -avg_nanosec_per_access 360.997 -iterator: avg_nanosec_per_kmer 2.55874 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1024.87 -avg_nanosec_per_negative_lookup 1160.68 -avg_nanosec_per_access 566.086 -iterator: avg_nanosec_per_kmer 2.49651 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1019.8 -avg_nanosec_per_negative_lookup 1182.6 -avg_nanosec_per_access 536.878 -iterator: avg_nanosec_per_kmer 2.4974 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1041.95 -avg_nanosec_per_negative_lookup 1445.91 -avg_nanosec_per_access 701.872 -iterator: avg_nanosec_per_kmer 2.53857 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 1106.41 -avg_nanosec_per_negative_lookup 1180.46 -avg_nanosec_per_access 536.742 -iterator: avg_nanosec_per_kmer 2.5207 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 1008.41 -avg_nanosec_per_negative_lookup 1031.6 -avg_nanosec_per_access 428.146 -iterator: avg_nanosec_per_kmer 2.54727 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 964.208 -avg_nanosec_per_negative_lookup 1038.54 -avg_nanosec_per_access 458.887 -iterator: avg_nanosec_per_kmer 2.61802 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 931.219 -avg_nanosec_per_negative_lookup 1024.01 -avg_nanosec_per_access 435.612 -iterator: avg_nanosec_per_kmer 2.52558 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 922.35 -avg_nanosec_per_negative_lookup 1020.25 -avg_nanosec_per_access 419.456 -iterator: avg_nanosec_per_kmer 2.51027 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 925.126 -avg_nanosec_per_negative_lookup 1043.39 -avg_nanosec_per_access 408.153 -iterator: avg_nanosec_per_kmer 2.6008 diff --git a/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log b/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log deleted file mode 100644 index 9f4e60d..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k31/regular-build.log +++ /dev/null @@ -1,2206 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.5564 [sec] (3.09753 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.576843 [sec] (1.14803 [ns/kmer]) -=== step 1: 'parse file' 2.13334 [sec] (4.24574 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.76784 [sec] (11.4791 [ns/kmer]) -num_minimizers = 72381146 -num_minimizer_positions = 78455681 -num_super_kmers = 78455681 -building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.24653 [sec] (6.46121 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761153686483811118.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.95991 [sec] (5.89078 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.10475 [sec] (2.19865 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) -num_buckets_in_skew_index 4215/72381146 (0.00582334%) -max_bucket_size 70346 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) -num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) -computing minimizers offsets: 0.876075 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 -num_kmers_in_skew_index 4740893 (0.943527%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... - built mphs[0] for 1260546 kmers; bits/key = 2.56076 - built positions[0] for 1260546 kmers; bits/key = 7.00029 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 - building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... - built mphs[1] for 994175 kmers; bits/key = 2.41831 - built positions[1] for 994175 kmers; bits/key = 8.00033 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 - building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... - built mphs[2] for 665719 kmers; bits/key = 2.41938 - built positions[2] for 665719 kmers; bits/key = 9.00051 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 - building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... - built mphs[3] for 408608 kmers; bits/key = 2.42149 - built positions[3] for 408608 kmers; bits/key = 10.0008 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 - building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... - built mphs[4] for 423234 kmers; bits/key = 2.56407 - built positions[4] for 423234 kmers; bits/key = 11.0009 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 - building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... - built mphs[5] for 271419 kmers; bits/key = 2.42412 - built positions[5] for 271419 kmers; bits/key = 12.0014 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 - building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... - built mphs[6] for 288814 kmers; bits/key = 2.42387 - built positions[6] for 288814 kmers; bits/key = 13.0013 - lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 - building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... - built mphs[7] for 428378 kmers; bits/key = 2.56398 - built positions[7] for 428378 kmers; bits/key = 17.0008 -computing skew index took: 2.69504 [sec] -=== step 3: 'build sparse and skew index' 3.68623 [sec] (7.3363 [ns/kmer]) -=== total_time 18.8986 [sec] (37.6118 [ns/kmer]) -total index size: 554516156 [B] -- 554.516 [MB] -SPACE BREAKDOWN: - mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 4.73772% - strings_offsets: 0.12283 [bits/kmer] -- 1.39125% - control_codewords: 5.32993 [bits/kmer] -- 60.3703% - mid_load_buckets: 0.527143 [bits/kmer] -- 5.97077% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.83304e-05% - strings: 2.24566 [bits/kmer] -- 25.4358% - skew_index: 0.184883 [bits/kmer] -- 2.09411% - weights: 2.92956e-06 [bits/kmer] -- 3.31821e-05% - -------------- - total: 8.82873 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.8721% -buckets with 2 minimizer positions = 2.00417% -buckets with 3 minimizer positions = 0.51765% -buckets with 4 minimizer positions = 0.211311% -buckets with 5 minimizer positions = 0.109826% -buckets with 6 minimizer positions = 0.0661802% -buckets with 7 minimizer positions = 0.0437061% -buckets with 8 minimizer positions = 0.0308464% -buckets with 9 minimizer positions = 0.0235614% -buckets with 10 minimizer positions = 0.0177228% -buckets with 11 minimizer positions = 0.0139967% -buckets with 12 minimizer positions = 0.0112902% -buckets with 13 minimizer positions = 0.00931044% -buckets with 14 minimizer positions = 0.00771748% -buckets with 15 minimizer positions = 0.00632347% -buckets with 16 minimizer positions = 0.00528591% -max_bucket_size 70346 -2025-10-22 19:21:45: saving data structure to disk... -2025-10-22 19:21:45: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.75719 [sec] (2.39673 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.10745 [sec] (0.962663 [ns/kmer]) -=== step 1: 'parse file' 3.86477 [sec] (3.3595 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.7274 [sec] (11.0635 [ns/kmer]) -num_minimizers = 173258591 -num_minimizer_positions = 175959772 -num_super_kmers = 175959772 -building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 7.07968 [sec] (6.15411 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761153706038613705.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.53208 [sec] (5.6781 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.60795 [sec] (2.26699 [ns/kmer]) -num_bits_per_offset = 37 -num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) -num_buckets_in_skew_index 1541/173258591 (0.000889422%) -max_bucket_size 3747 -log2_max_bucket_size 12 -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) -num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) -computing minimizers offsets: 1.38139 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 -num_kmers_in_skew_index 1185367 (0.10304%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 - building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... - built mphs[0] for 559507 kmers; bits/key = 2.41999 - built positions[0] for 559507 kmers; bits/key = 7.00068 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 - building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... - built mphs[1] for 317132 kmers; bits/key = 2.42276 - built positions[1] for 317132 kmers; bits/key = 8.00111 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 - building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... - built mphs[2] for 144139 kmers; bits/key = 2.43099 - built positions[2] for 144139 kmers; bits/key = 9.00242 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 - building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... - built mphs[3] for 106543 kmers; bits/key = 2.43597 - built positions[3] for 106543 kmers; bits/key = 10.0034 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 - building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... - built mphs[4] for 21308 kmers; bits/key = 2.51323 - built positions[4] for 21308 kmers; bits/key = 11.0171 - lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 - building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... - built mphs[5] for 36738 kmers; bits/key = 2.4746 - built positions[5] for 36738 kmers; bits/key = 12.0098 -computing skew index took: 0.673315 [sec] -=== step 3: 'build sparse and skew index' 2.32917 [sec] (2.02466 [ns/kmer]) -=== total_time 35.1411 [sec] (30.5469 [ns/kmer]) -total index size: 1198623216 [B] -- 1198.62 [MB] -SPACE BREAKDOWN: - mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.11439% - strings_offsets: 0.0157068 [bits/kmer] -- 0.188436% - control_codewords: 5.72308 [bits/kmer] -- 68.6603% - mid_load_buckets: 0.12243 [bits/kmer] -- 1.46881% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.2359e-05% - strings: 2.0304 [bits/kmer] -- 24.3589% - skew_index: 0.0174324 [bits/kmer] -- 0.209139% - weights: 1.27956e-06 [bits/kmer] -- 1.53509e-05% - -------------- - total: 8.33535 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.2421% -buckets with 2 minimizer positions = 0.571193% -buckets with 3 minimizer positions = 0.0840564% -buckets with 4 minimizer positions = 0.0345576% -buckets with 5 minimizer positions = 0.0184735% -buckets with 6 minimizer positions = 0.011514% -buckets with 7 minimizer positions = 0.00772718% -buckets with 8 minimizer positions = 0.00537809% -buckets with 9 minimizer positions = 0.00392246% -buckets with 10 minimizer positions = 0.00304862% -buckets with 11 minimizer positions = 0.00236583% -buckets with 12 minimizer positions = 0.0019139% -buckets with 13 minimizer positions = 0.00156356% -buckets with 14 minimizer positions = 0.00127613% -buckets with 15 minimizer positions = 0.00105276% -buckets with 16 minimizer positions = 0.000939636% -max_bucket_size 3747 -2025-10-22 19:22:21: saving data structure to disk... -2025-10-22 19:22:22: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.3917 [sec] (2.94998 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.72.bin'... -=== step 1.2: 'computing minimizers tuples' 2.56915 [sec] (1.02533 [ns/kmer]) -=== step 1: 'parse file' 9.96098 [sec] (3.97536 [ns/kmer]) - == files to merge = 73 -saving tuples to 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 35.4864 [sec] (14.1624 [ns/kmer]) -num_minimizers = 386687326 -num_minimizer_positions = 423023926 -num_super_kmers = 423023926 -building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 16.8163 [sec] (6.71127 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761153742519477082.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 15.7663 [sec] (6.29222 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 7.98796 [sec] (3.18794 [ns/kmer]) -num_bits_per_offset = 40 -num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) -num_buckets_in_skew_index 42372/386687326 (0.0109577%) -max_bucket_size 22972 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) -num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) -computing minimizers offsets: 4.78595 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 -num_kmers_in_skew_index 32063746 (1.27964%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[0] for 11807213 kmers; bits/key = 2.55841 - built positions[0] for 11807213 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8389556 kmers; bits/key = 2.61352 - built positions[1] for 8389556 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5343660 kmers; bits/key = 2.66261 - built positions[2] for 5343660 kmers; bits/key = 9.00007 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3076413 kmers; bits/key = 3.34298 - built positions[3] for 3076413 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... - built mphs[4] for 1855446 kmers; bits/key = 2.56022 - built positions[4] for 1855446 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... - built mphs[5] for 1008178 kmers; bits/key = 2.41829 - built positions[5] for 1008178 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 - building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... - built mphs[6] for 375770 kmers; bits/key = 2.42182 - built positions[6] for 375770 kmers; bits/key = 13.001 - lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 - building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... - built mphs[7] for 207510 kmers; bits/key = 2.42618 - built positions[7] for 207510 kmers; bits/key = 15.0018 -computing skew index took: 7.73771 [sec] -=== step 3: 'build sparse and skew index' 13.2397 [sec] (5.28388 [ns/kmer]) -=== total_time 99.2577 [sec] (39.6131 [ns/kmer]) -total index size: 3142971190 [B] -- 3142.97 [MB] -SPACE BREAKDOWN: - mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 4.3469% - strings_offsets: 0.130909 [bits/kmer] -- 1.30456% - control_codewords: 6.3273 [bits/kmer] -- 63.0541% - mid_load_buckets: 0.645302 [bits/kmer] -- 6.4307% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.52696e-06% - strings: 2.24545 [bits/kmer] -- 22.3769% - skew_index: 0.24955 [bits/kmer] -- 2.48686% - weights: 5.87466e-07 [bits/kmer] -- 5.85433e-06% - -------------- - total: 10.0347 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1918% -buckets with 2 minimizer positions = 1.69205% -buckets with 3 minimizer positions = 0.442612% -buckets with 4 minimizer positions = 0.201662% -buckets with 5 minimizer positions = 0.114623% -buckets with 6 minimizer positions = 0.0734475% -buckets with 7 minimizer positions = 0.0506719% -buckets with 8 minimizer positions = 0.0368406% -buckets with 9 minimizer positions = 0.0280203% -buckets with 10 minimizer positions = 0.0218197% -buckets with 11 minimizer positions = 0.0175108% -buckets with 12 minimizer positions = 0.0142045% -buckets with 13 minimizer positions = 0.0116337% -buckets with 14 minimizer positions = 0.00980818% -buckets with 15 minimizer positions = 0.00832637% -buckets with 16 minimizer positions = 0.00717712% -max_bucket_size 22972 -2025-10-22 19:24:03: saving data structure to disk... -2025-10-22 19:24:04: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.3328 [sec] (4.6617 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.113.bin'... -=== step 1.2: 'computing minimizers tuples' 6.7409 [sec] (1.81299 [ns/kmer]) -=== step 1: 'parse file' 24.0738 [sec] (6.47472 [ns/kmer]) - == files to merge = 114 -saving tuples to 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.1: 'merging minimizers tuples' 53.8141 [sec] (14.4735 [ns/kmer]) -num_minimizers = 544808214 -num_minimizer_positions = 661139039 -num_super_kmers = 661139039 -building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 22.2734 [sec] (5.99051 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 23.6036 [sec] (6.34826 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761153845058893420.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.4: 'merging minimizers tuples ' 34.5282 [sec] (9.28647 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) -num_buckets_in_skew_index 108291/544808214 (0.0198769%) -max_bucket_size 81171 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) -num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) -computing minimizers offsets: 11.2575 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 -num_kmers_in_skew_index 88257432 (2.37371%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28872109 kmers; bits/key = 2.53953 - built positions[0] for 28872109 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21161002 kmers; bits/key = 2.665 - built positions[1] for 21161002 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 14619521 kmers; bits/key = 2.58618 - built positions[2] for 14619521 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 8967010 kmers; bits/key = 2.51981 - built positions[3] for 8967010 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 5825185 kmers; bits/key = 2.55049 - built positions[4] for 5825185 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3889571 kmers; bits/key = 2.9515 - built positions[5] for 3889571 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... - built mphs[6] for 2412718 kmers; bits/key = 2.41709 - built positions[6] for 2412718 kmers; bits/key = 13.0002 - lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... - built mphs[7] for 2510316 kmers; bits/key = 2.55991 - built positions[7] for 2510316 kmers; bits/key = 17.0001 -computing skew index took: 17.0783 [sec] -=== step 3: 'build sparse and skew index' 29.6542 [sec] (7.97558 [ns/kmer]) -=== total_time 187.947 [sec] (50.549 [ns/kmer]) -total index size: 5611961302 [B] -- 5611.96 [MB] -SPACE BREAKDOWN: - mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 3.4406% - strings_offsets: 0.489994 [bits/kmer] -- 4.05798% - control_codewords: 6.15417 [bits/kmer] -- 50.9669% - mid_load_buckets: 1.64366 [bits/kmer] -- 13.6123% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.77551e-06% - strings: 2.8909 [bits/kmer] -- 23.9415% - skew_index: 0.480662 [bits/kmer] -- 3.98069% - weights: 3.95899e-07 [bits/kmer] -- 3.27871e-06% - -------------- - total: 12.0748 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 90.4966% -buckets with 2 minimizer positions = 7.33042% -buckets with 3 minimizer positions = 1.04104% -buckets with 4 minimizer positions = 0.358078% -buckets with 5 minimizer positions = 0.190444% -buckets with 6 minimizer positions = 0.119606% -buckets with 7 minimizer positions = 0.0815559% -buckets with 8 minimizer positions = 0.059031% -buckets with 9 minimizer positions = 0.0448457% -buckets with 10 minimizer positions = 0.0349758% -buckets with 11 minimizer positions = 0.0279273% -buckets with 12 minimizer positions = 0.022929% -buckets with 13 minimizer positions = 0.0189582% -buckets with 14 minimizer positions = 0.0159649% -buckets with 15 minimizer positions = 0.0135407% -buckets with 16 minimizer positions = 0.0117506% -max_bucket_size 81171 -2025-10-22 19:27:15: saving data structure to disk... -2025-10-22 19:27:17: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... -read 100000 sequences, 12802319 bases, 9802319 kmers -read 200000 sequences, 26155680 bases, 20155680 kmers -read 300000 sequences, 39727315 bases, 30727315 kmers -read 400000 sequences, 53567543 bases, 41567543 kmers -read 500000 sequences, 68009750 bases, 53009750 kmers -read 600000 sequences, 83050731 bases, 65050731 kmers -read 700000 sequences, 98819486 bases, 77819486 kmers -read 800000 sequences, 116043186 bases, 92043186 kmers -read 900000 sequences, 134201454 bases, 107201454 kmers -read 1000000 sequences, 153195620 bases, 123195620 kmers -read 1100000 sequences, 174787795 bases, 141787795 kmers -read 1200000 sequences, 183806919 bases, 147806919 kmers -read 1300000 sequences, 190658371 bases, 151658371 kmers -read 1400000 sequences, 197393762 bases, 155393762 kmers -read 1500000 sequences, 204308958 bases, 159308958 kmers -read 1600000 sequences, 211178004 bases, 163178004 kmers -read 1700000 sequences, 217938129 bases, 166938129 kmers -read 1800000 sequences, 224728931 bases, 170728931 kmers -read 1900000 sequences, 231435055 bases, 174435055 kmers -read 2000000 sequences, 238301856 bases, 178301856 kmers -read 2100000 sequences, 245162304 bases, 182162304 kmers -read 2200000 sequences, 251968534 bases, 185968534 kmers -read 2300000 sequences, 258797784 bases, 189797784 kmers -read 2400000 sequences, 265681419 bases, 193681419 kmers -read 2500000 sequences, 272480771 bases, 197480771 kmers -read 2600000 sequences, 279327274 bases, 201327274 kmers -read 2700000 sequences, 286169897 bases, 205169897 kmers -read 2800000 sequences, 293063897 bases, 209063897 kmers -read 2900000 sequences, 299941531 bases, 212941531 kmers -read 3000000 sequences, 306827724 bases, 216827724 kmers -read 3100000 sequences, 313725925 bases, 220725925 kmers -read 3200000 sequences, 320629887 bases, 224629887 kmers -read 3300000 sequences, 327545193 bases, 228545193 kmers -read 3400000 sequences, 334471610 bases, 232471610 kmers -read 3500000 sequences, 341603766 bases, 236603766 kmers -read 3600000 sequences, 348399690 bases, 240399690 kmers -read 3700000 sequences, 355270676 bases, 244270676 kmers -read 3800000 sequences, 362436143 bases, 248436143 kmers -read 3900000 sequences, 369341114 bases, 252341114 kmers -read 4000000 sequences, 376235441 bases, 256235441 kmers -read 4100000 sequences, 383163199 bases, 260163199 kmers -read 4200000 sequences, 390047987 bases, 264047987 kmers -read 4300000 sequences, 396880438 bases, 267880438 kmers -read 4400000 sequences, 403776565 bases, 271776565 kmers -read 4500000 sequences, 410576367 bases, 275576367 kmers -read 4600000 sequences, 417377049 bases, 279377049 kmers -read 4700000 sequences, 424274495 bases, 283274495 kmers -read 4800000 sequences, 431192311 bases, 287192311 kmers -read 4900000 sequences, 438257785 bases, 291257785 kmers -read 5000000 sequences, 445233170 bases, 295233170 kmers -read 5100000 sequences, 452307732 bases, 299307732 kmers -read 5200000 sequences, 459344438 bases, 303344438 kmers -read 5300000 sequences, 466255981 bases, 307255981 kmers -read 5400000 sequences, 473220156 bases, 311220156 kmers -read 5500000 sequences, 480178864 bases, 315178864 kmers -read 5600000 sequences, 487198091 bases, 319198091 kmers -read 5700000 sequences, 494051268 bases, 323051268 kmers -read 5800000 sequences, 501294774 bases, 327294774 kmers -read 5900000 sequences, 508386191 bases, 331386191 kmers -read 6000000 sequences, 515368260 bases, 335368260 kmers -read 6100000 sequences, 522265327 bases, 339265327 kmers -read 6200000 sequences, 529435219 bases, 343435219 kmers -read 6300000 sequences, 536513892 bases, 347513892 kmers -read 6400000 sequences, 543669227 bases, 351669227 kmers -read 6500000 sequences, 550654427 bases, 355654427 kmers -read 6600000 sequences, 557665979 bases, 359665979 kmers -read 6700000 sequences, 564815722 bases, 363815722 kmers -read 6800000 sequences, 571787007 bases, 367787007 kmers -read 6900000 sequences, 578923485 bases, 371923485 kmers -read 7000000 sequences, 586116050 bases, 376116050 kmers -read 7100000 sequences, 593247546 bases, 380247546 kmers -read 7200000 sequences, 600225954 bases, 384225954 kmers -read 7300000 sequences, 607331027 bases, 388331027 kmers -read 7400000 sequences, 614417238 bases, 392417238 kmers -read 7500000 sequences, 621494916 bases, 396494916 kmers -read 7600000 sequences, 628713296 bases, 400713296 kmers -read 7700000 sequences, 635875916 bases, 404875916 kmers -read 7800000 sequences, 643000132 bases, 409000132 kmers -read 7900000 sequences, 650054935 bases, 413054935 kmers -read 8000000 sequences, 657174193 bases, 417174193 kmers -read 8100000 sequences, 664392690 bases, 421392690 kmers -read 8200000 sequences, 671575430 bases, 425575430 kmers -read 8300000 sequences, 678822397 bases, 429822397 kmers -read 8400000 sequences, 685932522 bases, 433932522 kmers -read 8500000 sequences, 693003257 bases, 438003257 kmers -read 8600000 sequences, 700264806 bases, 442264806 kmers -read 8700000 sequences, 707441916 bases, 446441916 kmers -read 8800000 sequences, 714783716 bases, 450783716 kmers -read 8900000 sequences, 722048687 bases, 455048687 kmers -read 9000000 sequences, 729536721 bases, 459536721 kmers -read 9100000 sequences, 736820834 bases, 463820834 kmers -read 9200000 sequences, 744240551 bases, 468240551 kmers -read 9300000 sequences, 751532385 bases, 472532385 kmers -read 9400000 sequences, 758908308 bases, 476908308 kmers -read 9500000 sequences, 766152765 bases, 481152765 kmers -read 9600000 sequences, 773460104 bases, 485460104 kmers -read 9700000 sequences, 780744999 bases, 489744999 kmers -read 9800000 sequences, 788046688 bases, 494046688 kmers -read 9900000 sequences, 795444088 bases, 498444088 kmers -read 10000000 sequences, 802902838 bases, 502902838 kmers -read 10100000 sequences, 810379702 bases, 507379702 kmers -read 10200000 sequences, 817713311 bases, 511713311 kmers -read 10300000 sequences, 825011133 bases, 516011133 kmers -read 10400000 sequences, 832292513 bases, 520292513 kmers -read 10500000 sequences, 839612784 bases, 524612784 kmers -read 10600000 sequences, 847027439 bases, 529027439 kmers -read 10700000 sequences, 854363725 bases, 533363725 kmers -read 10800000 sequences, 861721984 bases, 537721984 kmers -read 10900000 sequences, 869045250 bases, 542045250 kmers -read 11000000 sequences, 876372447 bases, 546372447 kmers -read 11100000 sequences, 883866002 bases, 550866002 kmers -read 11200000 sequences, 891340279 bases, 555340279 kmers -read 11300000 sequences, 899036889 bases, 560036889 kmers -read 11400000 sequences, 906434241 bases, 564434241 kmers -read 11500000 sequences, 913824257 bases, 568824257 kmers -read 11600000 sequences, 921342281 bases, 573342281 kmers -read 11700000 sequences, 928719144 bases, 577719144 kmers -read 11800000 sequences, 936164765 bases, 582164765 kmers -read 11900000 sequences, 943653758 bases, 586653758 kmers -read 12000000 sequences, 951284053 bases, 591284053 kmers -read 12100000 sequences, 958744772 bases, 595744772 kmers -read 12200000 sequences, 966275858 bases, 600275858 kmers -read 12300000 sequences, 973962686 bases, 604962686 kmers -read 12400000 sequences, 981647965 bases, 609647965 kmers -read 12500000 sequences, 989234531 bases, 614234531 kmers -read 12600000 sequences, 996919849 bases, 618919849 kmers -read 12700000 sequences, 1004488446 bases, 623488446 kmers -read 12800000 sequences, 1012083435 bases, 628083435 kmers -read 12900000 sequences, 1019844583 bases, 632844583 kmers -read 13000000 sequences, 1027636701 bases, 637636701 kmers -read 13100000 sequences, 1035458430 bases, 642458430 kmers -read 13200000 sequences, 1043299596 bases, 647299596 kmers -read 13300000 sequences, 1051100294 bases, 652100294 kmers -read 13400000 sequences, 1058940054 bases, 656940054 kmers -read 13500000 sequences, 1066735225 bases, 661735225 kmers -read 13600000 sequences, 1074662997 bases, 666662997 kmers -read 13700000 sequences, 1082381283 bases, 671381283 kmers -read 13800000 sequences, 1090055507 bases, 676055507 kmers -read 13900000 sequences, 1097835965 bases, 680835965 kmers -read 14000000 sequences, 1105722693 bases, 685722693 kmers -read 14100000 sequences, 1113495622 bases, 690495622 kmers -read 14200000 sequences, 1121380038 bases, 695380038 kmers -read 14300000 sequences, 1129522879 bases, 700522879 kmers -read 14400000 sequences, 1137515487 bases, 705515487 kmers -read 14500000 sequences, 1145547633 bases, 710547633 kmers -read 14600000 sequences, 1153636718 bases, 715636718 kmers -read 14700000 sequences, 1161507672 bases, 720507672 kmers -read 14800000 sequences, 1169638977 bases, 725638977 kmers -read 14900000 sequences, 1177765602 bases, 730765602 kmers -read 15000000 sequences, 1185796892 bases, 735796892 kmers -read 15100000 sequences, 1193966066 bases, 740966066 kmers -read 15200000 sequences, 1201992531 bases, 745992531 kmers -read 15300000 sequences, 1210139564 bases, 751139564 kmers -read 15400000 sequences, 1218303770 bases, 756303770 kmers -read 15500000 sequences, 1226563924 bases, 761563924 kmers -read 15600000 sequences, 1234769102 bases, 766769102 kmers -read 15700000 sequences, 1243038710 bases, 772038710 kmers -read 15800000 sequences, 1251312331 bases, 777312331 kmers -read 15900000 sequences, 1259505857 bases, 782505857 kmers -read 16000000 sequences, 1267846293 bases, 787846293 kmers -read 16100000 sequences, 1276258510 bases, 793258510 kmers -read 16200000 sequences, 1284600618 bases, 798600618 kmers -read 16300000 sequences, 1292910529 bases, 803910529 kmers -read 16400000 sequences, 1301315569 bases, 809315569 kmers -read 16500000 sequences, 1309948482 bases, 814948482 kmers -read 16600000 sequences, 1318536932 bases, 820536932 kmers -read 16700000 sequences, 1326901868 bases, 825901868 kmers -read 16800000 sequences, 1335658656 bases, 831658656 kmers -read 16900000 sequences, 1344318999 bases, 837318999 kmers -read 17000000 sequences, 1352901026 bases, 842901026 kmers -read 17100000 sequences, 1361738649 bases, 848738649 kmers -read 17200000 sequences, 1370441463 bases, 854441463 kmers -read 17300000 sequences, 1379104762 bases, 860104762 kmers -read 17400000 sequences, 1387857799 bases, 865857799 kmers -read 17500000 sequences, 1396827318 bases, 871827318 kmers -read 17600000 sequences, 1405624638 bases, 877624638 kmers -read 17700000 sequences, 1414580410 bases, 883580410 kmers -read 17800000 sequences, 1423596393 bases, 889596393 kmers -read 17900000 sequences, 1432608671 bases, 895608671 kmers -read 18000000 sequences, 1442015880 bases, 902015880 kmers -read 18100000 sequences, 1451131708 bases, 908131708 kmers -read 18200000 sequences, 1460386801 bases, 914386801 kmers -read 18300000 sequences, 1469583369 bases, 920583369 kmers -read 18400000 sequences, 1478759459 bases, 926759459 kmers -read 18500000 sequences, 1488122391 bases, 933122391 kmers -read 18600000 sequences, 1497569745 bases, 939569745 kmers -read 18700000 sequences, 1507030485 bases, 946030485 kmers -read 18800000 sequences, 1516707149 bases, 952707149 kmers -read 18900000 sequences, 1526397934 bases, 959397934 kmers -read 19000000 sequences, 1536308350 bases, 966308350 kmers -read 19100000 sequences, 1546342668 bases, 973342668 kmers -read 19200000 sequences, 1556281669 bases, 980281669 kmers -read 19300000 sequences, 1566271275 bases, 987271275 kmers -read 19400000 sequences, 1576402796 bases, 994402796 kmers -read 19500000 sequences, 1586440957 bases, 1001440957 kmers -read 19600000 sequences, 1596689344 bases, 1008689344 kmers -read 19700000 sequences, 1607088748 bases, 1016088748 kmers -read 19800000 sequences, 1617543387 bases, 1023543387 kmers -read 19900000 sequences, 1628261415 bases, 1031261415 kmers -read 20000000 sequences, 1639158516 bases, 1039158516 kmers -read 20100000 sequences, 1650338356 bases, 1047338356 kmers -read 20200000 sequences, 1661398094 bases, 1055398094 kmers -read 20300000 sequences, 1672652108 bases, 1063652108 kmers -read 20400000 sequences, 1683961135 bases, 1071961135 kmers -read 20500000 sequences, 1695700838 bases, 1080700838 kmers -read 20600000 sequences, 1707448842 bases, 1089448842 kmers -read 20700000 sequences, 1719587691 bases, 1098587691 kmers -read 20800000 sequences, 1732024822 bases, 1108024822 kmers -=== step 1.1: 'encoding input' 5.89154 [sec] (5.30282 [ns/kmer]) -read 20822360 sequences, 1735689645 bases, 1111018845 kmers -num_kmers 1111018845 -cost: 2.0 + 1.1245 [bits/kmer] -max_len 176455 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.35085 [sec] (1.21586 [ns/kmer]) -=== step 1: 'parse file' 7.2425 [sec] (6.51879 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 15.4965 [sec] (13.948 [ns/kmer]) -num_minimizers = 153003346 -num_minimizer_positions = 201447538 -num_super_kmers = 201447538 -building minimizers MPHF with 64 threads and 52 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.64158 [sec] (5.97792 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154038579516751.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.42931 [sec] (6.68693 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.34967 [sec] (3.01496 [ns/kmer]) -num_bits_per_offset = 43 -num_buckets_larger_than_1_not_in_skew_index 16447921/153003346 (10.75%) -num_buckets_in_skew_index 10727/153003346 (0.00701096%) -max_bucket_size 71743 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 61815481/201447538 (30.6856%) -num_minimizer_positions_of_buckets_in_skew_index 3087359/201447538 (1.53259%) -computing minimizers offsets: 4.08541 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2530324 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1770374 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1563484 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1214204 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1091924 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1055593 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 789627 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71743: 1030596 -num_kmers_in_skew_index 11046126 (0.994234%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2530324 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2530324)... - built mphs[0] for 2530324 kmers; bits/key = 2.5599 - built positions[0] for 2530324 kmers; bits/key = 7.00015 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1770374 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1770374)... - built mphs[1] for 1770374 kmers; bits/key = 2.56029 - built positions[1] for 1770374 kmers; bits/key = 8.00019 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1563484 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1563484)... - built mphs[2] for 1563484 kmers; bits/key = 2.56038 - built positions[2] for 1563484 kmers; bits/key = 9.00021 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1214204 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1214204)... - built mphs[3] for 1214204 kmers; bits/key = 2.56081 - built positions[3] for 1214204 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1091924 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1091924)... - built mphs[4] for 1091924 kmers; bits/key = 2.4182 - built positions[4] for 1091924 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1055593 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1055593)... - built mphs[5] for 1055593 kmers; bits/key = 2.56108 - built positions[5] for 1055593 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 789627 - building MPHF with 64 threads and 1 partitions (avg. partition size = 789627)... - built mphs[6] for 789627 kmers; bits/key = 2.41888 - built positions[6] for 789627 kmers; bits/key = 13.0004 - lower = 8192; upper = 71743; num_bits_per_pos = 17; num_kmers_in_partition = 1030596 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1030596)... - built mphs[7] for 1030596 kmers; bits/key = 2.4183 - built positions[7] for 1030596 kmers; bits/key = 17.0004 -computing skew index took: 6.40632 [sec] -=== step 3: 'build sparse and skew index' 10.8952 [sec] (9.80652 [ns/kmer]) -=== total_time 51.0548 [sec] (45.9531 [ns/kmer]) -total index size: 1777130884 [B] -- 1777.13 [MB] -SPACE BREAKDOWN: - mphf: 0.394931 [bits/kmer] (2.86775 [bits/key]) -- 3.08626% - strings_offsets: 0.580993 [bits/kmer] -- 4.54028% - control_codewords: 6.05944 [bits/kmer] -- 47.3526% - mid_load_buckets: 2.39246 [bits/kmer] -- 18.6963% - begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.50805e-05% - strings: 3.1245 [bits/kmer] -- 24.417% - skew_index: 0.244083 [bits/kmer] -- 1.90743% - weights: 1.32491e-06 [bits/kmer] -- 1.03538e-05% - -------------- - total: 12.7964 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 89.2429% -buckets with 2 minimizer positions = 6.05035% -buckets with 3 minimizer positions = 1.71539% -buckets with 4 minimizer positions = 0.818195% -buckets with 5 minimizer positions = 0.497438% -buckets with 6 minimizer positions = 0.343779% -buckets with 7 minimizer positions = 0.255749% -buckets with 8 minimizer positions = 0.199702% -buckets with 9 minimizer positions = 0.159387% -buckets with 10 minimizer positions = 0.13028% -buckets with 11 minimizer positions = 0.107217% -buckets with 12 minimizer positions = 0.0878229% -buckets with 13 minimizer positions = 0.0717429% -buckets with 14 minimizer positions = 0.0589601% -buckets with 15 minimizer positions = 0.0471898% -buckets with 16 minimizer positions = 0.0377861% -max_bucket_size 71743 -2025-10-22 19:28:10: saving data structure to disk... -2025-10-22 19:28:11: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... -read 100000 sequences, 8718431 bases, 5718431 kmers -read 200000 sequences, 17474097 bases, 11474097 kmers -read 300000 sequences, 26299449 bases, 17299449 kmers -read 400000 sequences, 35167130 bases, 23167130 kmers -read 500000 sequences, 43967965 bases, 28967965 kmers -read 600000 sequences, 52886445 bases, 34886445 kmers -read 700000 sequences, 61937196 bases, 40937196 kmers -read 800000 sequences, 71070714 bases, 47070714 kmers -read 900000 sequences, 80176912 bases, 53176912 kmers -read 1000000 sequences, 89525906 bases, 59525906 kmers -read 1100000 sequences, 98984859 bases, 65984859 kmers -read 1200000 sequences, 108719881 bases, 72719881 kmers -read 1300000 sequences, 118280880 bases, 79280880 kmers -read 1400000 sequences, 127917770 bases, 85917770 kmers -read 1500000 sequences, 137591691 bases, 92591691 kmers -read 1600000 sequences, 147395215 bases, 99395215 kmers -read 1700000 sequences, 157335047 bases, 106335047 kmers -read 1800000 sequences, 167445213 bases, 113445213 kmers -read 1900000 sequences, 177725569 bases, 120725569 kmers -read 2000000 sequences, 188052064 bases, 128052064 kmers -read 2100000 sequences, 198499534 bases, 135499534 kmers -read 2200000 sequences, 209053278 bases, 143053278 kmers -read 2300000 sequences, 219848016 bases, 150848016 kmers -read 2400000 sequences, 230787167 bases, 158787167 kmers -read 2500000 sequences, 242014409 bases, 167014409 kmers -read 2600000 sequences, 253501985 bases, 175501985 kmers -read 2700000 sequences, 265108770 bases, 184108770 kmers -read 2800000 sequences, 277040197 bases, 193040197 kmers -read 2900000 sequences, 289406751 bases, 202406751 kmers -read 3000000 sequences, 302142183 bases, 212142183 kmers -read 3100000 sequences, 315168435 bases, 222168435 kmers -read 3200000 sequences, 329083083 bases, 233083083 kmers -read 3300000 sequences, 343508535 bases, 244508535 kmers -read 3400000 sequences, 358608045 bases, 256608045 kmers -read 3500000 sequences, 374790387 bases, 269790387 kmers -read 3600000 sequences, 392124136 bases, 284124136 kmers -read 3700000 sequences, 410698510 bases, 299698510 kmers -read 3800000 sequences, 431358064 bases, 317358064 kmers -read 3900000 sequences, 454179453 bases, 337179453 kmers -read 4000000 sequences, 461236524 bases, 341236524 kmers -read 4100000 sequences, 468031549 bases, 345031549 kmers -read 4200000 sequences, 474889571 bases, 348889571 kmers -read 4300000 sequences, 481729708 bases, 352729708 kmers -read 4400000 sequences, 488721954 bases, 356721954 kmers -read 4500000 sequences, 495625078 bases, 360625078 kmers -read 4600000 sequences, 502596576 bases, 364596576 kmers -read 4700000 sequences, 509600517 bases, 368600517 kmers -read 4800000 sequences, 516484470 bases, 372484470 kmers -read 4900000 sequences, 523427219 bases, 376427219 kmers -read 5000000 sequences, 530371783 bases, 380371783 kmers -read 5100000 sequences, 537329595 bases, 384329595 kmers -read 5200000 sequences, 544209359 bases, 388209359 kmers -read 5300000 sequences, 551189922 bases, 392189922 kmers -read 5400000 sequences, 558101939 bases, 396101939 kmers -read 5500000 sequences, 565120163 bases, 400120163 kmers -read 5600000 sequences, 572157570 bases, 404157570 kmers -read 5700000 sequences, 579064866 bases, 408064866 kmers -read 5800000 sequences, 586002711 bases, 412002711 kmers -read 5900000 sequences, 592940936 bases, 415940936 kmers -read 6000000 sequences, 600036489 bases, 420036489 kmers -read 6100000 sequences, 607035798 bases, 424035798 kmers -read 6200000 sequences, 614208718 bases, 428208718 kmers -read 6300000 sequences, 621168245 bases, 432168245 kmers -read 6400000 sequences, 628072498 bases, 436072498 kmers -read 6500000 sequences, 635102614 bases, 440102614 kmers -read 6600000 sequences, 642120732 bases, 444120732 kmers -read 6700000 sequences, 649088967 bases, 448088967 kmers -read 6800000 sequences, 656101755 bases, 452101755 kmers -read 6900000 sequences, 663148884 bases, 456148884 kmers -read 7000000 sequences, 670072473 bases, 460072473 kmers -read 7100000 sequences, 677027864 bases, 464027864 kmers -read 7200000 sequences, 684172202 bases, 468172202 kmers -read 7300000 sequences, 691211207 bases, 472211207 kmers -read 7400000 sequences, 698208790 bases, 476208790 kmers -read 7500000 sequences, 705328995 bases, 480328995 kmers -read 7600000 sequences, 712361023 bases, 484361023 kmers -read 7700000 sequences, 719471804 bases, 488471804 kmers -read 7800000 sequences, 726605138 bases, 492605138 kmers -read 7900000 sequences, 733774594 bases, 496774594 kmers -read 8000000 sequences, 740830673 bases, 500830673 kmers -read 8100000 sequences, 747950180 bases, 504950180 kmers -read 8200000 sequences, 755058730 bases, 509058730 kmers -read 8300000 sequences, 762216427 bases, 513216427 kmers -read 8400000 sequences, 769353851 bases, 517353851 kmers -read 8500000 sequences, 776583161 bases, 521583161 kmers -read 8600000 sequences, 783816261 bases, 525816261 kmers -read 8700000 sequences, 791077370 bases, 530077370 kmers -read 8800000 sequences, 798157781 bases, 534157781 kmers -read 8900000 sequences, 805241016 bases, 538241016 kmers -read 9000000 sequences, 812530455 bases, 542530455 kmers -read 9100000 sequences, 819617693 bases, 546617693 kmers -read 9200000 sequences, 826809772 bases, 550809772 kmers -read 9300000 sequences, 833919107 bases, 554919107 kmers -read 9400000 sequences, 841155666 bases, 559155666 kmers -read 9500000 sequences, 848401695 bases, 563401695 kmers -read 9600000 sequences, 855643716 bases, 567643716 kmers -read 9700000 sequences, 862872782 bases, 571872782 kmers -read 9800000 sequences, 870171741 bases, 576171741 kmers -read 9900000 sequences, 877460939 bases, 580460939 kmers -read 10000000 sequences, 884692153 bases, 584692153 kmers -read 10100000 sequences, 891988915 bases, 588988915 kmers -read 10200000 sequences, 899332167 bases, 593332167 kmers -read 10300000 sequences, 906596132 bases, 597596132 kmers -read 10400000 sequences, 913914222 bases, 601914222 kmers -read 10500000 sequences, 921197164 bases, 606197164 kmers -read 10600000 sequences, 928621352 bases, 610621352 kmers -read 10700000 sequences, 935962590 bases, 614962590 kmers -read 10800000 sequences, 943225398 bases, 619225398 kmers -read 10900000 sequences, 950606271 bases, 623606271 kmers -read 11000000 sequences, 958222271 bases, 628222271 kmers -read 11100000 sequences, 965609642 bases, 632609642 kmers -read 11200000 sequences, 972999574 bases, 636999574 kmers -read 11300000 sequences, 980385996 bases, 641385996 kmers -read 11400000 sequences, 987756692 bases, 645756692 kmers -read 11500000 sequences, 995228727 bases, 650228727 kmers -read 11600000 sequences, 1002716000 bases, 654716000 kmers -read 11700000 sequences, 1010163238 bases, 659163238 kmers -read 11800000 sequences, 1017604060 bases, 663604060 kmers -read 11900000 sequences, 1025150347 bases, 668150347 kmers -read 12000000 sequences, 1032736062 bases, 672736062 kmers -read 12100000 sequences, 1040213508 bases, 677213508 kmers -read 12200000 sequences, 1047864763 bases, 681864763 kmers -read 12300000 sequences, 1055370986 bases, 686370986 kmers -read 12400000 sequences, 1062882136 bases, 690882136 kmers -read 12500000 sequences, 1070457834 bases, 695457834 kmers -read 12600000 sequences, 1078056503 bases, 700056503 kmers -read 12700000 sequences, 1085619892 bases, 704619892 kmers -read 12800000 sequences, 1093220371 bases, 709220371 kmers -read 12900000 sequences, 1100938017 bases, 713938017 kmers -read 13000000 sequences, 1108501169 bases, 718501169 kmers -read 13100000 sequences, 1116117667 bases, 723117667 kmers -read 13200000 sequences, 1123791984 bases, 727791984 kmers -read 13300000 sequences, 1131456294 bases, 732456294 kmers -read 13400000 sequences, 1139167231 bases, 737167231 kmers -read 13500000 sequences, 1147084240 bases, 742084240 kmers -read 13600000 sequences, 1154903455 bases, 746903455 kmers -read 13700000 sequences, 1162719581 bases, 751719581 kmers -read 13800000 sequences, 1170515268 bases, 756515268 kmers -read 13900000 sequences, 1178310906 bases, 761310906 kmers -read 14000000 sequences, 1186158510 bases, 766158510 kmers -read 14100000 sequences, 1194143461 bases, 771143461 kmers -read 14200000 sequences, 1202037257 bases, 776037257 kmers -read 14300000 sequences, 1210016774 bases, 781016774 kmers -read 14400000 sequences, 1217929746 bases, 785929746 kmers -read 14500000 sequences, 1226009557 bases, 791009557 kmers -read 14600000 sequences, 1233936531 bases, 795936531 kmers -read 14700000 sequences, 1241953842 bases, 800953842 kmers -read 14800000 sequences, 1249971925 bases, 805971925 kmers -read 14900000 sequences, 1258012031 bases, 811012031 kmers -read 15000000 sequences, 1266102895 bases, 816102895 kmers -read 15100000 sequences, 1274149698 bases, 821149698 kmers -read 15200000 sequences, 1282474916 bases, 826474916 kmers -read 15300000 sequences, 1290768947 bases, 831768947 kmers -read 15400000 sequences, 1299121797 bases, 837121797 kmers -read 15500000 sequences, 1307304198 bases, 842304198 kmers -read 15600000 sequences, 1315661756 bases, 847661756 kmers -read 15700000 sequences, 1324089837 bases, 853089837 kmers -read 15800000 sequences, 1332318617 bases, 858318617 kmers -read 15900000 sequences, 1340760587 bases, 863760587 kmers -read 16000000 sequences, 1349263765 bases, 869263765 kmers -read 16100000 sequences, 1357811757 bases, 874811757 kmers -read 16200000 sequences, 1366358226 bases, 880358226 kmers -read 16300000 sequences, 1375027036 bases, 886027036 kmers -read 16400000 sequences, 1383710258 bases, 891710258 kmers -=== step 1.1: 'encoding input' 4.65741 [sec] (5.20782 [ns/kmer]) -read 16440873 sequences, 1387536274 bases, 894310084 kmers -num_kmers 894310084 -cost: 2.0 + 1.10303 [bits/kmer] -max_len 117016 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.13306 [sec] (1.26697 [ns/kmer]) -=== step 1: 'parse file' 5.79059 [sec] (6.47492 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.2371 [sec] (13.6832 [ns/kmer]) -num_minimizers = 126246665 -num_minimizer_positions = 162006751 -num_super_kmers = 162006751 -building minimizers MPHF with 64 threads and 43 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.56026 [sec] (6.21738 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154091485833862.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.07689 [sec] (6.79506 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.54494 [sec] (2.8457 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 14059268/126246665 (11.1363%) -num_buckets_in_skew_index 8266/126246665 (0.0065475%) -max_bucket_size 36894 -log2_max_bucket_size 16 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 48164669/162006751 (29.73%) -num_minimizer_positions_of_buckets_in_skew_index 1662951/162006751 (1.02647%) -computing minimizers offsets: 3.24737 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2254325 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1183762 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 885561 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 591648 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 450833 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 373731 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 338406 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 36894: 388502 -num_kmers_in_skew_index 6466768 (0.723101%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2254325 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2254325)... - built mphs[0] for 2254325 kmers; bits/key = 2.56001 - built positions[0] for 2254325 kmers; bits/key = 7.00015 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1183762 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1183762)... - built mphs[1] for 1183762 kmers; bits/key = 2.56081 - built positions[1] for 1183762 kmers; bits/key = 8.00031 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 885561 - building MPHF with 64 threads and 1 partitions (avg. partition size = 885561)... - built mphs[2] for 885561 kmers; bits/key = 2.56147 - built positions[2] for 885561 kmers; bits/key = 9.00043 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 591648 - building MPHF with 64 threads and 1 partitions (avg. partition size = 591648)... - built mphs[3] for 591648 kmers; bits/key = 2.56263 - built positions[3] for 591648 kmers; bits/key = 10.0005 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 450833 - building MPHF with 64 threads and 1 partitions (avg. partition size = 450833)... - built mphs[4] for 450833 kmers; bits/key = 2.42098 - built positions[4] for 450833 kmers; bits/key = 11.0007 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 373731 - building MPHF with 64 threads and 1 partitions (avg. partition size = 373731)... - built mphs[5] for 373731 kmers; bits/key = 2.56484 - built positions[5] for 373731 kmers; bits/key = 12.0009 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 338406 - building MPHF with 64 threads and 1 partitions (avg. partition size = 338406)... - built mphs[6] for 338406 kmers; bits/key = 2.4226 - built positions[6] for 338406 kmers; bits/key = 13.001 - lower = 8192; upper = 36894; num_bits_per_pos = 16; num_kmers_in_partition = 388502 - building MPHF with 64 threads and 1 partitions (avg. partition size = 388502)... - built mphs[7] for 388502 kmers; bits/key = 2.56472 - built positions[7] for 388502 kmers; bits/key = 16.0009 -computing skew index took: 3.78562 [sec] -=== step 3: 'build sparse and skew index' 7.3585 [sec] (8.22813 [ns/kmer]) -=== total_time 39.5682 [sec] (44.2444 [ns/kmer]) -total index size: 1383564118 [B] -- 1383.56 [MB] -SPACE BREAKDOWN: - mphf: 0.405702 [bits/kmer] (2.87392 [bits/key]) -- 3.27798% - strings_offsets: 0.5699 [bits/kmer] -- 4.60466% - control_codewords: 5.929 [bits/kmer] -- 47.9049% - mid_load_buckets: 2.20813 [bits/kmer] -- 17.8412% - begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 1.93703e-05% - strings: 3.10303 [bits/kmer] -- 25.0718% - skew_index: 0.160832 [bits/kmer] -- 1.29948% - weights: 1.64596e-06 [bits/kmer] -- 1.3299e-05% - -------------- - total: 12.3766 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 88.8571% -buckets with 2 minimizer positions = 6.64024% -buckets with 3 minimizer positions = 1.83049% -buckets with 4 minimizer positions = 0.817717% -buckets with 5 minimizer positions = 0.475524% -buckets with 6 minimizer positions = 0.319677% -buckets with 7 minimizer positions = 0.233881% -buckets with 8 minimizer positions = 0.178737% -buckets with 9 minimizer positions = 0.138965% -buckets with 10 minimizer positions = 0.107245% -buckets with 11 minimizer positions = 0.0823246% -buckets with 12 minimizer positions = 0.0632579% -buckets with 13 minimizer positions = 0.0483173% -buckets with 14 minimizer positions = 0.0365673% -buckets with 15 minimizer positions = 0.027916% -buckets with 16 minimizer positions = 0.0218604% -max_bucket_size 36894 -2025-10-22 19:28:51: saving data structure to disk... -2025-10-22 19:28:52: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log b/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log deleted file mode 100644 index 191a50f..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k63/canon-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 579.768 -avg_nanosec_per_negative_lookup 506.333 -avg_nanosec_per_access 258.877 -iterator: avg_nanosec_per_kmer 3.01295 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 596.971 -avg_nanosec_per_negative_lookup 512.353 -avg_nanosec_per_access 258.206 -iterator: avg_nanosec_per_kmer 2.97432 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 597.496 -avg_nanosec_per_negative_lookup 509.627 -avg_nanosec_per_access 255.916 -iterator: avg_nanosec_per_kmer 2.9514 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 540.561 -avg_nanosec_per_negative_lookup 500.015 -avg_nanosec_per_access 234.012 -iterator: avg_nanosec_per_kmer 2.96457 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 534.006 -avg_nanosec_per_negative_lookup 492.577 -avg_nanosec_per_access 236.368 -iterator: avg_nanosec_per_kmer 3.03606 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 516.414 -avg_nanosec_per_negative_lookup 508.606 -avg_nanosec_per_access 224.229 -iterator: avg_nanosec_per_kmer 3.01148 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 704.324 -avg_nanosec_per_negative_lookup 577.388 -avg_nanosec_per_access 298.719 -iterator: avg_nanosec_per_kmer 2.96439 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 719.55 -avg_nanosec_per_negative_lookup 610.767 -avg_nanosec_per_access 283.708 -iterator: avg_nanosec_per_kmer 2.96453 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 708.24 -avg_nanosec_per_negative_lookup 614.214 -avg_nanosec_per_access 287.144 -iterator: avg_nanosec_per_kmer 3.1315 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1079.39 -avg_nanosec_per_negative_lookup 750.383 -avg_nanosec_per_access 621.495 -iterator: avg_nanosec_per_kmer 3.27382 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1080.52 -avg_nanosec_per_negative_lookup 755.266 -avg_nanosec_per_access 627.388 -iterator: avg_nanosec_per_kmer 3.25596 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1066.3 -avg_nanosec_per_negative_lookup 741.883 -avg_nanosec_per_access 632.038 -iterator: avg_nanosec_per_kmer 3.29883 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1224.96 -avg_nanosec_per_negative_lookup 631.554 -avg_nanosec_per_access 507.259 -iterator: avg_nanosec_per_kmer 3.07508 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1243.48 -avg_nanosec_per_negative_lookup 644.174 -avg_nanosec_per_access 480.913 -iterator: avg_nanosec_per_kmer 3.06122 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1231.49 -avg_nanosec_per_negative_lookup 641.143 -avg_nanosec_per_access 512.887 -iterator: avg_nanosec_per_kmer 3.0728 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1171.05 -avg_nanosec_per_negative_lookup 615.697 -avg_nanosec_per_access 463.638 -iterator: avg_nanosec_per_kmer 3.06504 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1181.86 -avg_nanosec_per_negative_lookup 621.847 -avg_nanosec_per_access 457.245 -iterator: avg_nanosec_per_kmer 3.00108 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1175.19 -avg_nanosec_per_negative_lookup 643.635 -avg_nanosec_per_access 430.929 -iterator: avg_nanosec_per_kmer 3.07084 diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log b/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log deleted file mode 100644 index a2aac75..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k63/canon-build.log +++ /dev/null @@ -1,2131 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.482 [sec] (2.66267 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.432565 [sec] (0.777176 [ns/kmer]) -=== step 1: 'parse file' 1.91466 [sec] (3.44002 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.6217 [sec] (4.71032 [ns/kmer]) -num_minimizers = 29275778 -num_minimizer_positions = 34590805 -num_super_kmers = 36307176 -building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.63405 [sec] (2.93585 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155074517745878.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.37919 [sec] (2.47795 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.731842 [sec] (1.31488 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 1189512/29275778 (4.06313%) -num_buckets_in_skew_index 5032/29275778 (0.0171883%) -max_bucket_size 815743 -log2_max_bucket_size 20 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 4643594/34590805 (13.4244%) -num_minimizer_positions_of_buckets_in_skew_index 1865977/34590805 (5.39443%) -computing minimizers offsets: 0.479114 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4850737 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3133092 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1886121 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1113398 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 945186 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1019479 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 681501 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 815743: 5508330 -num_kmers_in_skew_index 19137844 (3.43844%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4850737 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4850737 kmers; bits/key = 2.71418 - built positions[0] for 4850737 kmers; bits/key = 7.00007 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3133092 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3133092 kmers; bits/key = 3.15324 - built positions[1] for 3133092 kmers; bits/key = 8.00011 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1886121 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1886121)... - built mphs[2] for 1886121 kmers; bits/key = 2.5602 - built positions[2] for 1886121 kmers; bits/key = 9.00018 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1113398 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1113398)... - built mphs[3] for 1113398 kmers; bits/key = 2.56094 - built positions[3] for 1113398 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 945186 - building MPHF with 64 threads and 1 partitions (avg. partition size = 945186)... - built mphs[4] for 945186 kmers; bits/key = 2.56129 - built positions[4] for 945186 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1019479 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1019479)... - built mphs[5] for 1019479 kmers; bits/key = 2.56115 - built positions[5] for 1019479 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 681501 - building MPHF with 64 threads and 1 partitions (avg. partition size = 681501)... - built mphs[6] for 681501 kmers; bits/key = 2.41941 - built positions[6] for 681501 kmers; bits/key = 13.0005 - lower = 8192; upper = 815743; num_bits_per_pos = 20; num_kmers_in_partition = 5508330 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 5508330 kmers; bits/key = 2.59546 - built positions[7] for 5508330 kmers; bits/key = 20.0001 -computing skew index took: 5.89842 [sec] -=== step 3: 'build sparse and skew index' 6.42909 [sec] (11.5509 [ns/kmer]) -=== total_time 14.7105 [sec] (26.43 [ns/kmer]) -total index size: 367802718 [B] -- 367.803 [MB] -SPACE BREAKDOWN: - mphf: 0.151285 [bits/kmer] (2.87621 [bits/key]) -- 2.8617% - strings_offsets: 0.0514514 [bits/kmer] -- 0.97325% - control_codewords: 1.94616 [bits/kmer] -- 36.8134% - mid_load_buckets: 0.300349 [bits/kmer] -- 5.68137% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.28651e-05% - strings: 2.21266 [bits/kmer] -- 41.8545% - skew_index: 0.624643 [bits/kmer] -- 11.8157% - weights: 2.6447e-06 [bits/kmer] -- 5.00268e-05% - -------------- - total: 5.28656 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9197% -buckets with 2 minimizer positions = 2.25505% -buckets with 3 minimizer positions = 0.743143% -buckets with 4 minimizer positions = 0.33953% -buckets with 5 minimizer positions = 0.188914% -buckets with 6 minimizer positions = 0.116602% -buckets with 7 minimizer positions = 0.0799535% -buckets with 8 minimizer positions = 0.0565963% -buckets with 9 minimizer positions = 0.0427691% -buckets with 10 minimizer positions = 0.0324774% -buckets with 11 minimizer positions = 0.0259498% -buckets with 12 minimizer positions = 0.0206382% -buckets with 13 minimizer positions = 0.017038% -buckets with 14 minimizer positions = 0.0148143% -buckets with 15 minimizer positions = 0.0124232% -buckets with 16 minimizer positions = 0.0107973% -max_bucket_size 815743 -2025-10-22 19:44:49: saving data structure to disk... -2025-10-22 19:44:49: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.68923 [sec] (2.32783 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.698686 [sec] (0.604792 [ns/kmer]) -=== step 1: 'parse file' 3.38802 [sec] (2.93271 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.18951 [sec] (4.49211 [ns/kmer]) -num_minimizers = 68497878 -num_minimizer_positions = 69282395 -num_super_kmers = 73080845 -building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.0244 [sec] (2.61796 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155089599950950.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.7233 [sec] (2.35732 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.4648 [sec] (1.26795 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 296941/68497878 (0.433504%) -num_buckets_in_skew_index 787/68497878 (0.00114894%) -max_bucket_size 1509 -log2_max_bucket_size 11 -skew index num_partitions 5 -num_minimizer_positions_of_buckets_larger_than_1 973386/69282395 (1.40495%) -num_minimizer_positions_of_buckets_in_skew_index 108859/69282395 (0.157124%) -computing minimizers offsets: 0.596444 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 854803 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 508726 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 353088 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 143157 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1509: 45334 -num_kmers_in_skew_index 1905108 (0.164909%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 854803 - building MPHF with 64 threads and 1 partitions (avg. partition size = 854803)... - built mphs[0] for 854803 kmers; bits/key = 2.5616 - built positions[0] for 854803 kmers; bits/key = 7.00044 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 508726 - building MPHF with 64 threads and 1 partitions (avg. partition size = 508726)... - built mphs[1] for 508726 kmers; bits/key = 2.42032 - built positions[1] for 508726 kmers; bits/key = 8.00066 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 353088 - building MPHF with 64 threads and 1 partitions (avg. partition size = 353088)... - built mphs[2] for 353088 kmers; bits/key = 2.56521 - built positions[2] for 353088 kmers; bits/key = 9.00091 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 143157 - building MPHF with 64 threads and 1 partitions (avg. partition size = 143157)... - built mphs[3] for 143157 kmers; bits/key = 2.4309 - built positions[3] for 143157 kmers; bits/key = 10.0026 - lower = 1024; upper = 1509; num_bits_per_pos = 11; num_kmers_in_partition = 45334 - building MPHF with 64 threads and 1 partitions (avg. partition size = 45334)... - built mphs[4] for 45334 kmers; bits/key = 2.46173 - built positions[4] for 45334 kmers; bits/key = 11.0074 -computing skew index took: 1.09443 [sec] -=== step 3: 'build sparse and skew index' 1.78937 [sec] (1.54891 [ns/kmer]) -=== total_time 17.5794 [sec] (15.217 [ns/kmer]) -total index size: 640267074 [B] -- 640.267 [MB] -SPACE BREAKDOWN: - mphf: 0.16806 [bits/kmer] (2.83441 [bits/key]) -- 3.79043% - strings_offsets: 0.0041807 [bits/kmer] -- 0.0942919% - control_codewords: 2.19383 [bits/kmer] -- 49.4798% - mid_load_buckets: 0.030333 [bits/kmer] -- 0.684133% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.18575e-05% - strings: 2.01672 [bits/kmer] -- 45.4853% - skew_index: 0.0206612 [bits/kmer] -- 0.465995% - weights: 1.27418e-06 [bits/kmer] -- 2.8738e-05% - -------------- - total: 4.43379 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5653% -buckets with 2 minimizer positions = 0.296122% -buckets with 3 minimizer positions = 0.0602092% -buckets with 4 minimizer positions = 0.0251672% -buckets with 5 minimizer positions = 0.0136895% -buckets with 6 minimizer positions = 0.00842362% -buckets with 7 minimizer positions = 0.00572864% -buckets with 8 minimizer positions = 0.00416071% -buckets with 9 minimizer positions = 0.00301323% -buckets with 10 minimizer positions = 0.00248183% -buckets with 11 minimizer positions = 0.00184093% -buckets with 12 minimizer positions = 0.00158691% -buckets with 13 minimizer positions = 0.00117084% -buckets with 14 minimizer positions = 0.00105697% -buckets with 15 minimizer positions = 0.000887619% -buckets with 16 minimizer positions = 0.000756228% -max_bucket_size 1509 -2025-10-22 19:45:07: saving data structure to disk... -2025-10-22 19:45:07: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 7.10615 [sec] (2.56418 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.56413 [sec] (0.564399 [ns/kmer]) -=== step 1: 'parse file' 8.67042 [sec] (3.12863 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.7316 [sec] (4.59406 [ns/kmer]) -num_minimizers = 149769567 -num_minimizer_positions = 173272792 -num_super_kmers = 182565576 -building minimizers MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.11577 [sec] (2.20681 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155107884059635.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.41367 [sec] (2.31431 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.7812 [sec] (1.36441 [ns/kmer]) -num_bits_per_offset = 39 -num_buckets_larger_than_1_not_in_skew_index 4082749/149769567 (2.72602%) -num_buckets_in_skew_index 35781/149769567 (0.0238907%) -max_bucket_size 284250 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 16495406/173272792 (9.51991%) -num_minimizer_positions_of_buckets_in_skew_index 11126349/173272792 (6.42129%) -computing minimizers offsets: 2.10428 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 26742724 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 24475836 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 21113117 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19260150 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17989259 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15443443 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 12315344 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 284250: 28690575 -num_kmers_in_skew_index 166030448 (5.99103%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26742724 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 26742724 kmers; bits/key = 2.56429 - built positions[0] for 26742724 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 24475836 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 24475836 kmers; bits/key = 2.62316 - built positions[1] for 24475836 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 21113117 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 21113117 kmers; bits/key = 2.6904 - built positions[2] for 21113117 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 19260150 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 19260150 kmers; bits/key = 2.59757 - built positions[3] for 19260150 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17989259 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17989259 kmers; bits/key = 2.53715 - built positions[4] for 17989259 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 15443443 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[5] for 15443443 kmers; bits/key = 2.69254 - built positions[5] for 15443443 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 12315344 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[6] for 12315344 kmers; bits/key = 2.67895 - built positions[6] for 12315344 kmers; bits/key = 13 - lower = 8192; upper = 284250; num_bits_per_pos = 19; num_kmers_in_partition = 28690575 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[7] for 28690575 kmers; bits/key = 2.55295 - built positions[7] for 28690575 kmers; bits/key = 19 -computing skew index took: 22.4196 [sec] -=== step 3: 'build sparse and skew index' 24.8074 [sec] (8.95149 [ns/kmer]) -=== total_time 62.5201 [sec] (22.5597 [ns/kmer]) -total index size: 1966639402 [B] -- 1966.64 [MB] -SPACE BREAKDOWN: - mphf: 0.152644 [bits/kmer] (2.82451 [bits/key]) -- 2.68876% - strings_offsets: 0.0305175 [bits/kmer] -- 0.537553% - control_codewords: 2.16171 [bits/kmer] -- 38.0775% - mid_load_buckets: 0.232136 [bits/kmer] -- 4.08896% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.36273e-05% - strings: 2.11826 [bits/kmer] -- 37.3121% - skew_index: 0.981863 [bits/kmer] -- 17.2951% - weights: 5.31156e-07 [bits/kmer] -- 9.35606e-06% - -------------- - total: 5.67713 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.2501% -buckets with 2 minimizer positions = 1.59767% -buckets with 3 minimizer positions = 0.444706% -buckets with 4 minimizer positions = 0.198987% -buckets with 5 minimizer positions = 0.113029% -buckets with 6 minimizer positions = 0.07244% -buckets with 7 minimizer positions = 0.0504562% -buckets with 8 minimizer positions = 0.0370322% -buckets with 9 minimizer positions = 0.0281472% -buckets with 10 minimizer positions = 0.0224598% -buckets with 11 minimizer positions = 0.0182414% -buckets with 12 minimizer positions = 0.0149463% -buckets with 13 minimizer positions = 0.0124745% -buckets with 14 minimizer positions = 0.0107405% -buckets with 15 minimizer positions = 0.00923686% -buckets with 16 minimizer positions = 0.00803234% -max_bucket_size 284250 -2025-10-22 19:46:10: saving data structure to disk... -2025-10-22 19:46:11: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.5065 [sec] (4.64104 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.90.bin'... -=== step 1.2: 'computing minimizers tuples' 11.2511 [sec] (1.89835 [ns/kmer]) -=== step 1: 'parse file' 38.7577 [sec] (6.53941 [ns/kmer]) - == files to merge = 91 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.1: 'merging minimizers tuples' 39.3406 [sec] (6.63776 [ns/kmer]) -num_minimizers = 295344565 -num_minimizer_positions = 485764487 -num_super_kmers = 507036670 -building minimizers MPHF with 64 threads and 99 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 12.6573 [sec] (2.13561 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.697 [sec] (2.98593 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155172265996674.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.4: 'merging minimizers tuples ' 22.5965 [sec] (3.8126 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 76095635/295344565 (25.765%) -num_buckets_in_skew_index 164193/295344565 (0.0555937%) -max_bucket_size 265182 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 218504008/485764487 (44.9815%) -num_minimizer_positions_of_buckets_in_skew_index 48175742/485764487 (9.91751%) -computing minimizers offsets: 13.4054 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 91237805 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 81089595 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 71244043 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 64999827 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 55340829 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 44026748 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 33883659 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 265182: 85368523 -num_kmers_in_skew_index 527191029 (8.89506%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 91237805 - building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... - built mphs[0] for 91237805 kmers; bits/key = 2.54472 - built positions[0] for 91237805 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 81089595 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[1] for 81089595 kmers; bits/key = 2.56263 - built positions[1] for 81089595 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 71244043 - building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... - built mphs[2] for 71244043 kmers; bits/key = 2.56439 - built positions[2] for 71244043 kmers; bits/key = 9 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 64999827 - building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... - built mphs[3] for 64999827 kmers; bits/key = 2.54652 - built positions[3] for 64999827 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 55340829 - building MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... - built mphs[4] for 55340829 kmers; bits/key = 2.53877 - built positions[4] for 55340829 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 44026748 - building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... - built mphs[5] for 44026748 kmers; bits/key = 2.53894 - built positions[5] for 44026748 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 33883659 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[6] for 33883659 kmers; bits/key = 2.5671 - built positions[6] for 33883659 kmers; bits/key = 13 - lower = 8192; upper = 265182; num_bits_per_pos = 19; num_kmers_in_partition = 85368523 - building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... - built mphs[7] for 85368523 kmers; bits/key = 2.56049 - built positions[7] for 85368523 kmers; bits/key = 19 -computing skew index took: 78.3486 [sec] -=== step 3: 'build sparse and skew index' 92.7098 [sec] (15.6425 [ns/kmer]) -=== total_time 223.759 [sec] (37.7538 [ns/kmer]) -total index size: 6570787528 [B] -- 6570.79 [MB] -SPACE BREAKDOWN: - mphf: 0.141443 [bits/kmer] (2.83839 [bits/key]) -- 1.59475% - strings_offsets: 0.341727 [bits/kmer] -- 3.85293% - control_codewords: 2.09295 [bits/kmer] -- 23.5978% - mid_load_buckets: 1.51156 [bits/kmer] -- 17.0426% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.07866e-06% - strings: 3.2463 [bits/kmer] -- 36.6016% - skew_index: 1.5353 [bits/kmer] -- 17.3103% - weights: 2.48364e-07 [bits/kmer] -- 2.80027e-06% - -------------- - total: 8.86928 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 74.1794% -buckets with 2 minimizer positions = 17.5493% -buckets with 3 minimizer positions = 4.9171% -buckets with 4 minimizer positions = 1.47166% -buckets with 5 minimizer positions = 0.573611% -buckets with 6 minimizer positions = 0.301038% -buckets with 7 minimizer positions = 0.190827% -buckets with 8 minimizer positions = 0.133018% -buckets with 9 minimizer positions = 0.0984907% -buckets with 10 minimizer positions = 0.0753777% -buckets with 11 minimizer positions = 0.0590937% -buckets with 12 minimizer positions = 0.0475793% -buckets with 13 minimizer positions = 0.0389636% -buckets with 14 minimizer positions = 0.0324661% -buckets with 15 minimizer positions = 0.0273305% -buckets with 16 minimizer positions = 0.0232809% -max_bucket_size 265182 -2025-10-22 19:49:57: saving data structure to disk... -2025-10-22 19:50:01: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... -read 100000 sequences, 14595280 bases, 8395280 kmers -read 200000 sequences, 29023453 bases, 16623453 kmers -read 300000 sequences, 43790922 bases, 25190922 kmers -read 400000 sequences, 58362099 bases, 33562099 kmers -read 500000 sequences, 72908170 bases, 41908170 kmers -read 600000 sequences, 87446702 bases, 50246702 kmers -read 700000 sequences, 102099804 bases, 58699804 kmers -read 800000 sequences, 117134400 bases, 67534400 kmers -read 900000 sequences, 131713463 bases, 75913463 kmers -read 1000000 sequences, 146366718 bases, 84366718 kmers -read 1100000 sequences, 161101660 bases, 92901660 kmers -read 1200000 sequences, 175910768 bases, 101510768 kmers -read 1300000 sequences, 190897904 bases, 110297904 kmers -read 1400000 sequences, 205802973 bases, 119002973 kmers -read 1500000 sequences, 221158148 bases, 128158148 kmers -read 1600000 sequences, 236346274 bases, 137146274 kmers -read 1700000 sequences, 251304432 bases, 145904432 kmers -read 1800000 sequences, 266473950 bases, 154873950 kmers -read 1900000 sequences, 281471604 bases, 163671604 kmers -read 2000000 sequences, 296791327 bases, 172791327 kmers -read 2100000 sequences, 312420706 bases, 182220706 kmers -read 2200000 sequences, 327946210 bases, 191546210 kmers -read 2300000 sequences, 343525540 bases, 200925540 kmers -read 2400000 sequences, 358949847 bases, 210149847 kmers -read 2500000 sequences, 374380009 bases, 219380009 kmers -read 2600000 sequences, 390142304 bases, 228942304 kmers -read 2700000 sequences, 405642535 bases, 238242535 kmers -read 2800000 sequences, 421259989 bases, 247659989 kmers -read 2900000 sequences, 436893769 bases, 257093769 kmers -read 3000000 sequences, 452465563 bases, 266465563 kmers -read 3100000 sequences, 468090902 bases, 275890902 kmers -read 3200000 sequences, 483923930 bases, 285523930 kmers -read 3300000 sequences, 499749509 bases, 295149509 kmers -read 3400000 sequences, 515726709 bases, 304926709 kmers -read 3500000 sequences, 532169207 bases, 315169207 kmers -read 3600000 sequences, 548394020 bases, 325194020 kmers -read 3700000 sequences, 564809686 bases, 335409686 kmers -read 3800000 sequences, 581403559 bases, 345803559 kmers -read 3900000 sequences, 597837340 bases, 356037340 kmers -read 4000000 sequences, 614198433 bases, 366198433 kmers -read 4100000 sequences, 630803806 bases, 376603806 kmers -read 4200000 sequences, 647222216 bases, 386822216 kmers -read 4300000 sequences, 663750824 bases, 397150824 kmers -read 4400000 sequences, 680423234 bases, 407623234 kmers -read 4500000 sequences, 696967173 bases, 417967173 kmers -read 4600000 sequences, 714107161 bases, 428907161 kmers -read 4700000 sequences, 731190344 bases, 439790344 kmers -read 4800000 sequences, 748610325 bases, 451010325 kmers -read 4900000 sequences, 765806425 bases, 462006425 kmers -read 5000000 sequences, 783034539 bases, 473034539 kmers -read 5100000 sequences, 800681271 bases, 484481271 kmers -read 5200000 sequences, 818515777 bases, 496115777 kmers -read 5300000 sequences, 836324012 bases, 507724012 kmers -read 5400000 sequences, 854771265 bases, 519971265 kmers -read 5500000 sequences, 873098069 bases, 532098069 kmers -read 5600000 sequences, 891182426 bases, 543982426 kmers -read 5700000 sequences, 910053448 bases, 556653448 kmers -read 5800000 sequences, 928444429 bases, 568844429 kmers -read 5900000 sequences, 947244294 bases, 581444294 kmers -read 6000000 sequences, 966455345 bases, 594455345 kmers -read 6100000 sequences, 985974168 bases, 607774168 kmers -read 6200000 sequences, 1005630833 bases, 621230833 kmers -read 6300000 sequences, 1026020245 bases, 635420245 kmers -read 6400000 sequences, 1046696751 bases, 649896751 kmers -read 6500000 sequences, 1067596462 bases, 664596462 kmers -read 6600000 sequences, 1088718265 bases, 679518265 kmers -read 6700000 sequences, 1110387368 bases, 694987368 kmers -read 6800000 sequences, 1132578732 bases, 710978732 kmers -read 6900000 sequences, 1155047095 bases, 727247095 kmers -read 7000000 sequences, 1177950483 bases, 743950483 kmers -read 7100000 sequences, 1201726249 bases, 761526249 kmers -read 7200000 sequences, 1226646751 bases, 780246751 kmers -read 7300000 sequences, 1252079351 bases, 799479351 kmers -read 7400000 sequences, 1279261003 bases, 820461003 kmers -read 7500000 sequences, 1307802702 bases, 842802702 kmers -read 7600000 sequences, 1338212409 bases, 867012409 kmers -read 7700000 sequences, 1370354710 bases, 892954710 kmers -read 7800000 sequences, 1383049738 bases, 899449738 kmers -read 7900000 sequences, 1395810952 bases, 906010952 kmers -read 8000000 sequences, 1408450282 bases, 912450282 kmers -read 8100000 sequences, 1421220952 bases, 919020952 kmers -read 8200000 sequences, 1433887434 bases, 925487434 kmers -read 8300000 sequences, 1446445917 bases, 931845917 kmers -read 8400000 sequences, 1459153909 bases, 938353909 kmers -read 8500000 sequences, 1471877671 bases, 944877671 kmers -read 8600000 sequences, 1484865624 bases, 951665624 kmers -read 8700000 sequences, 1497567228 bases, 958167228 kmers -read 8800000 sequences, 1510543060 bases, 964943060 kmers -read 8900000 sequences, 1523371874 bases, 971571874 kmers -read 9000000 sequences, 1536152549 bases, 978152549 kmers -read 9100000 sequences, 1548860619 bases, 984660619 kmers -read 9200000 sequences, 1561712707 bases, 991312707 kmers -read 9300000 sequences, 1574401520 bases, 997801520 kmers -read 9400000 sequences, 1586885001 bases, 1004085001 kmers -read 9500000 sequences, 1599621412 bases, 1010621412 kmers -read 9600000 sequences, 1612397675 bases, 1017197675 kmers -read 9700000 sequences, 1625388385 bases, 1023988385 kmers -read 9800000 sequences, 1638536946 bases, 1030936946 kmers -read 9900000 sequences, 1651980650 bases, 1038180650 kmers -read 10000000 sequences, 1664904910 bases, 1044904910 kmers -read 10100000 sequences, 1677570910 bases, 1051370910 kmers -read 10200000 sequences, 1690246890 bases, 1057846890 kmers -read 10300000 sequences, 1703230366 bases, 1064630366 kmers -read 10400000 sequences, 1716086552 bases, 1071286552 kmers -read 10500000 sequences, 1729082411 bases, 1078082411 kmers -read 10600000 sequences, 1741944091 bases, 1084744091 kmers -read 10700000 sequences, 1754780793 bases, 1091380793 kmers -read 10800000 sequences, 1767537304 bases, 1097937304 kmers -read 10900000 sequences, 1780512088 bases, 1104712088 kmers -read 11000000 sequences, 1794061925 bases, 1112061925 kmers -read 11100000 sequences, 1807103354 bases, 1118903354 kmers -read 11200000 sequences, 1819865542 bases, 1125465542 kmers -read 11300000 sequences, 1832952701 bases, 1132352701 kmers -read 11400000 sequences, 1846108191 bases, 1139308191 kmers -read 11500000 sequences, 1859202023 bases, 1146202023 kmers -read 11600000 sequences, 1872125111 bases, 1152925111 kmers -read 11700000 sequences, 1884949294 bases, 1159549294 kmers -read 11800000 sequences, 1897879213 bases, 1166279213 kmers -read 11900000 sequences, 1910688502 bases, 1172888502 kmers -read 12000000 sequences, 1923575230 bases, 1179575230 kmers -read 12100000 sequences, 1936528765 bases, 1186328765 kmers -read 12200000 sequences, 1949822939 bases, 1193422939 kmers -read 12300000 sequences, 1962607705 bases, 1200007705 kmers -read 12400000 sequences, 1975528951 bases, 1206728951 kmers -read 12500000 sequences, 1988356507 bases, 1213356507 kmers -read 12600000 sequences, 2001310116 bases, 1220110116 kmers -read 12700000 sequences, 2014316977 bases, 1226916977 kmers -read 12800000 sequences, 2027300676 bases, 1233700676 kmers -read 12900000 sequences, 2040283112 bases, 1240483112 kmers -read 13000000 sequences, 2053070210 bases, 1247070210 kmers -read 13100000 sequences, 2066357392 bases, 1254157392 kmers -read 13200000 sequences, 2079514117 bases, 1261114117 kmers -read 13300000 sequences, 2092587055 bases, 1267987055 kmers -read 13400000 sequences, 2105687861 bases, 1274887861 kmers -read 13500000 sequences, 2118896002 bases, 1281896002 kmers -read 13600000 sequences, 2131841724 bases, 1288641724 kmers -read 13700000 sequences, 2144909308 bases, 1295509308 kmers -read 13800000 sequences, 2157799174 bases, 1302199174 kmers -read 13900000 sequences, 2170824760 bases, 1309024760 kmers -read 14000000 sequences, 2183943636 bases, 1315943636 kmers -read 14100000 sequences, 2196888939 bases, 1322688939 kmers -read 14200000 sequences, 2209993052 bases, 1329593052 kmers -read 14300000 sequences, 2223177518 bases, 1336577518 kmers -read 14400000 sequences, 2236324767 bases, 1343524767 kmers -read 14500000 sequences, 2249926194 bases, 1350926194 kmers -read 14600000 sequences, 2263244067 bases, 1358044067 kmers -read 14700000 sequences, 2276666210 bases, 1365266210 kmers -read 14800000 sequences, 2289846389 bases, 1372246389 kmers -read 14900000 sequences, 2303142205 bases, 1379342205 kmers -read 15000000 sequences, 2316373175 bases, 1386373175 kmers -read 15100000 sequences, 2329658257 bases, 1393458257 kmers -read 15200000 sequences, 2342799874 bases, 1400399874 kmers -read 15300000 sequences, 2355936598 bases, 1407336598 kmers -read 15400000 sequences, 2369202825 bases, 1414402825 kmers -read 15500000 sequences, 2382453933 bases, 1421453933 kmers -read 15600000 sequences, 2395606868 bases, 1428406868 kmers -read 15700000 sequences, 2408903524 bases, 1435503524 kmers -read 15800000 sequences, 2422488600 bases, 1442888600 kmers -read 15900000 sequences, 2435763741 bases, 1449963741 kmers -read 16000000 sequences, 2449041041 bases, 1457041041 kmers -read 16100000 sequences, 2462152775 bases, 1463952775 kmers -read 16200000 sequences, 2475426803 bases, 1471026803 kmers -read 16300000 sequences, 2488985859 bases, 1478385859 kmers -read 16400000 sequences, 2502322646 bases, 1485522646 kmers -read 16500000 sequences, 2515682566 bases, 1492682566 kmers -read 16600000 sequences, 2529274259 bases, 1500074259 kmers -read 16700000 sequences, 2542622794 bases, 1507222794 kmers -read 16800000 sequences, 2556056912 bases, 1514456912 kmers -read 16900000 sequences, 2569267145 bases, 1521467145 kmers -read 17000000 sequences, 2582562981 bases, 1528562981 kmers -read 17100000 sequences, 2596061102 bases, 1535861102 kmers -read 17200000 sequences, 2609459388 bases, 1543059388 kmers -read 17300000 sequences, 2622881245 bases, 1550281245 kmers -read 17400000 sequences, 2636336794 bases, 1557536794 kmers -read 17500000 sequences, 2649678629 bases, 1564678629 kmers -read 17600000 sequences, 2663341782 bases, 1572141782 kmers -read 17700000 sequences, 2676693590 bases, 1579293590 kmers -read 17800000 sequences, 2690200716 bases, 1586600716 kmers -read 17900000 sequences, 2703543489 bases, 1593743489 kmers -read 18000000 sequences, 2717390529 bases, 1601390529 kmers -read 18100000 sequences, 2730783796 bases, 1608583796 kmers -read 18200000 sequences, 2744196467 bases, 1615796467 kmers -read 18300000 sequences, 2757894852 bases, 1623294852 kmers -read 18400000 sequences, 2771403521 bases, 1630603521 kmers -read 18500000 sequences, 2784930678 bases, 1637930678 kmers -read 18600000 sequences, 2798778608 bases, 1645578608 kmers -read 18700000 sequences, 2812434788 bases, 1653034788 kmers -read 18800000 sequences, 2826041925 bases, 1660441925 kmers -read 18900000 sequences, 2839594143 bases, 1667794143 kmers -read 19000000 sequences, 2853100531 bases, 1675100531 kmers -read 19100000 sequences, 2866645368 bases, 1682445368 kmers -read 19200000 sequences, 2880162017 bases, 1689762017 kmers -read 19300000 sequences, 2893733500 bases, 1697133500 kmers -read 19400000 sequences, 2907861888 bases, 1705061888 kmers -read 19500000 sequences, 2921431859 bases, 1712431859 kmers -read 19600000 sequences, 2934950257 bases, 1719750257 kmers -read 19700000 sequences, 2948908590 bases, 1727508590 kmers -read 19800000 sequences, 2962655324 bases, 1735055324 kmers -read 19900000 sequences, 2976658842 bases, 1742858842 kmers -read 20000000 sequences, 2990606476 bases, 1750606476 kmers -read 20100000 sequences, 3004463124 bases, 1758263124 kmers -read 20200000 sequences, 3018263669 bases, 1765863669 kmers -read 20300000 sequences, 3032235817 bases, 1773635817 kmers -read 20400000 sequences, 3045926851 bases, 1781126851 kmers -read 20500000 sequences, 3059718085 bases, 1788718085 kmers -read 20600000 sequences, 3073465760 bases, 1796265760 kmers -read 20700000 sequences, 3087374365 bases, 1803974365 kmers -read 20800000 sequences, 3101202279 bases, 1811602279 kmers -read 20900000 sequences, 3115301042 bases, 1819501042 kmers -read 21000000 sequences, 3129300415 bases, 1827300415 kmers -read 21100000 sequences, 3143428950 bases, 1835228950 kmers -read 21200000 sequences, 3157337269 bases, 1842937269 kmers -read 21300000 sequences, 3171218453 bases, 1850618453 kmers -read 21400000 sequences, 3185386330 bases, 1858586330 kmers -read 21500000 sequences, 3199499619 bases, 1866499619 kmers -read 21600000 sequences, 3213699144 bases, 1874499144 kmers -read 21700000 sequences, 3227725083 bases, 1882325083 kmers -read 21800000 sequences, 3241636024 bases, 1890036024 kmers -read 21900000 sequences, 3255686690 bases, 1897886690 kmers -read 22000000 sequences, 3269949888 bases, 1905949888 kmers -read 22100000 sequences, 3284189309 bases, 1913989309 kmers -read 22200000 sequences, 3298558467 bases, 1922158467 kmers -read 22300000 sequences, 3312627222 bases, 1930027222 kmers -read 22400000 sequences, 3326674715 bases, 1937874715 kmers -read 22500000 sequences, 3340769161 bases, 1945769161 kmers -read 22600000 sequences, 3355403951 bases, 1954203951 kmers -read 22700000 sequences, 3369592323 bases, 1962192323 kmers -read 22800000 sequences, 3383749832 bases, 1970149832 kmers -read 22900000 sequences, 3398280808 bases, 1978480808 kmers -read 23000000 sequences, 3412658016 bases, 1986658016 kmers -read 23100000 sequences, 3427105278 bases, 1994905278 kmers -read 23200000 sequences, 3441898165 bases, 2003498165 kmers -read 23300000 sequences, 3456307790 bases, 2011707790 kmers -read 23400000 sequences, 3470437552 bases, 2019637552 kmers -=== step 1.1: 'encoding input' 10.4056 [sec] (5.13183 [ns/kmer]) -read 23474327 sequences, 3483064285 bases, 2027656011 kmers -num_kmers 2027656011 -cost: 2.0 + 1.43556 [bits/kmer] -max_len 643923 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 20 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.49671 [sec] (0.738147 [ns/kmer]) -=== step 1: 'parse file' 11.9024 [sec] (5.87005 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 13.1335 [sec] (6.47717 [ns/kmer]) -num_minimizers = 86631941 -num_minimizer_positions = 169264838 -num_super_kmers = 176725324 -building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 4.09208 [sec] (2.01813 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155401603590690.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.84624 [sec] (2.88325 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.45465 [sec] (1.70376 [ns/kmer]) -num_bits_per_offset = 45 -num_buckets_larger_than_1_not_in_skew_index 14311872/86631941 (16.5203%) -num_buckets_in_skew_index 167883/86631941 (0.193789%) -max_bucket_size 475227 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 74713236/169264838 (44.1398%) -num_minimizer_positions_of_buckets_in_skew_index 22399416/169264838 (13.2334%) -computing minimizers offsets: 4.30549 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 164308993 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 48058096 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13657562 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6137831 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4414714 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 4433156 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 4082117 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 475227: 35954358 -num_kmers_in_skew_index 281046827 (13.8607%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 164308993 - building MPHF with 64 threads and 55 partitions (avg. partition size = 3000000)... - built mphs[0] for 164308993 kmers; bits/key = 2.56349 - built positions[0] for 164308993 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 48058096 - building MPHF with 64 threads and 17 partitions (avg. partition size = 3000000)... - built mphs[1] for 48058096 kmers; bits/key = 2.53932 - built positions[1] for 48058096 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13657562 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 13657562 kmers; bits/key = 2.61351 - built positions[2] for 13657562 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6137831 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 6137831 kmers; bits/key = 2.93085 - built positions[3] for 6137831 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4414714 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4414714 kmers; bits/key = 2.84407 - built positions[4] for 4414714 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 4433156 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 4433156 kmers; bits/key = 2.73731 - built positions[5] for 4433156 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 4082117 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 4082117 kmers; bits/key = 2.9369 - built positions[6] for 4082117 kmers; bits/key = 13.0001 - lower = 8192; upper = 475227; num_bits_per_pos = 19; num_kmers_in_partition = 35954358 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[7] for 35954358 kmers; bits/key = 2.55049 - built positions[7] for 35954358 kmers; bits/key = 19 -computing skew index took: 43.7682 [sec] -=== step 3: 'build sparse and skew index' 48.4027 [sec] (23.8713 [ns/kmer]) -=== total_time 86.8316 [sec] (42.8236 [ns/kmer]) -total index size: 2449943884 [B] -- 2449.94 [MB] -SPACE BREAKDOWN: - mphf: 0.120785 [bits/kmer] (2.82702 [bits/key]) -- 1.24957% - strings_offsets: 0.370467 [bits/kmer] -- 3.83263% - control_codewords: 1.96536 [bits/kmer] -- 20.3325% - mid_load_buckets: 1.65812 [bits/kmer] -- 17.1539% - begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.0939e-05% - strings: 3.43556 [bits/kmer] -- 35.5423% - skew_index: 2.11582 [bits/kmer] -- 21.8891% - weights: 7.25961e-07 [bits/kmer] -- 7.51038e-06% - -------------- - total: 9.66611 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 83.2859% -buckets with 2 minimizer positions = 8.38918% -buckets with 3 minimizer positions = 2.77772% -buckets with 4 minimizer positions = 1.31798% -buckets with 5 minimizer positions = 0.776307% -buckets with 6 minimizer positions = 0.518707% -buckets with 7 minimizer positions = 0.374551% -buckets with 8 minimizer positions = 0.285226% -buckets with 9 minimizer positions = 0.226981% -buckets with 10 minimizer positions = 0.183834% -buckets with 11 minimizer positions = 0.15397% -buckets with 12 minimizer positions = 0.131367% -buckets with 13 minimizer positions = 0.113066% -buckets with 14 minimizer positions = 0.0987326% -buckets with 15 minimizer positions = 0.0868144% -buckets with 16 minimizer positions = 0.0771828% -max_bucket_size 475227 -2025-10-22 19:51:29: saving data structure to disk... -2025-10-22 19:51:30: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... -read 100000 sequences, 29016680 bases, 22816680 kmers -read 200000 sequences, 59512851 bases, 47112851 kmers -read 300000 sequences, 93672898 bases, 75072898 kmers -read 400000 sequences, 116504758 bases, 91704758 kmers -read 500000 sequences, 129640784 bases, 98640784 kmers -read 600000 sequences, 142888339 bases, 105688339 kmers -read 700000 sequences, 156121559 bases, 112721559 kmers -read 800000 sequences, 169296181 bases, 119696181 kmers -read 900000 sequences, 182473664 bases, 126673664 kmers -read 1000000 sequences, 195596653 bases, 133596653 kmers -read 1100000 sequences, 208767883 bases, 140567883 kmers -read 1200000 sequences, 222206242 bases, 147806242 kmers -read 1300000 sequences, 235299002 bases, 154699002 kmers -read 1400000 sequences, 248482676 bases, 161682676 kmers -read 1500000 sequences, 261589002 bases, 168589002 kmers -read 1600000 sequences, 275055224 bases, 175855224 kmers -read 1700000 sequences, 288035899 bases, 182635899 kmers -read 1800000 sequences, 301349839 bases, 189749839 kmers -read 1900000 sequences, 314875402 bases, 197075402 kmers -read 2000000 sequences, 328155468 bases, 204155468 kmers -read 2100000 sequences, 341368638 bases, 211168638 kmers -read 2200000 sequences, 354712561 bases, 218312561 kmers -read 2300000 sequences, 368072063 bases, 225472063 kmers -read 2400000 sequences, 381369139 bases, 232569139 kmers -read 2500000 sequences, 395076735 bases, 240076735 kmers -read 2600000 sequences, 408571236 bases, 247371236 kmers -read 2700000 sequences, 421770941 bases, 254370941 kmers -read 2800000 sequences, 434931097 bases, 261331097 kmers -read 2900000 sequences, 448299063 bases, 268499063 kmers -read 3000000 sequences, 461539333 bases, 275539333 kmers -read 3100000 sequences, 474884907 bases, 282684907 kmers -read 3200000 sequences, 488437875 bases, 290037875 kmers -read 3300000 sequences, 501681623 bases, 297081623 kmers -read 3400000 sequences, 514981749 bases, 304181749 kmers -read 3500000 sequences, 528308911 bases, 311308911 kmers -read 3600000 sequences, 541636977 bases, 318436977 kmers -read 3700000 sequences, 555162428 bases, 325762428 kmers -read 3800000 sequences, 568696864 bases, 333096864 kmers -read 3900000 sequences, 581917367 bases, 340117367 kmers -read 4000000 sequences, 595230806 bases, 347230806 kmers -read 4100000 sequences, 608987326 bases, 354787326 kmers -read 4200000 sequences, 622285230 bases, 361885230 kmers -read 4300000 sequences, 635647937 bases, 369047937 kmers -read 4400000 sequences, 648992641 bases, 376192641 kmers -read 4500000 sequences, 662513085 bases, 383513085 kmers -read 4600000 sequences, 675930708 bases, 390730708 kmers -read 4700000 sequences, 689630997 bases, 398230997 kmers -read 4800000 sequences, 702998525 bases, 405398525 kmers -read 4900000 sequences, 716509106 bases, 412709106 kmers -read 5000000 sequences, 730213776 bases, 420213776 kmers -read 5100000 sequences, 743782200 bases, 427582200 kmers -read 5200000 sequences, 757644345 bases, 435244345 kmers -read 5300000 sequences, 771125199 bases, 442525199 kmers -read 5400000 sequences, 784691064 bases, 449891064 kmers -read 5500000 sequences, 798294855 bases, 457294855 kmers -read 5600000 sequences, 811868593 bases, 464668593 kmers -read 5700000 sequences, 825311254 bases, 471911254 kmers -read 5800000 sequences, 838965535 bases, 479365535 kmers -read 5900000 sequences, 852651369 bases, 486851369 kmers -read 6000000 sequences, 866286185 bases, 494286185 kmers -read 6100000 sequences, 879791139 bases, 501591139 kmers -read 6200000 sequences, 893568574 bases, 509168574 kmers -read 6300000 sequences, 907221132 bases, 516621132 kmers -read 6400000 sequences, 920850746 bases, 524050746 kmers -read 6500000 sequences, 934451496 bases, 531451496 kmers -read 6600000 sequences, 948058192 bases, 538858192 kmers -read 6700000 sequences, 961672076 bases, 546272076 kmers -read 6800000 sequences, 975396607 bases, 553796607 kmers -read 6900000 sequences, 989058970 bases, 561258970 kmers -read 7000000 sequences, 1002901529 bases, 568901529 kmers -read 7100000 sequences, 1016671875 bases, 576471875 kmers -read 7200000 sequences, 1030411659 bases, 584011659 kmers -read 7300000 sequences, 1044405182 bases, 591805182 kmers -read 7400000 sequences, 1058406016 bases, 599606016 kmers -read 7500000 sequences, 1072419258 bases, 607419258 kmers -read 7600000 sequences, 1086161571 bases, 614961571 kmers -read 7700000 sequences, 1100358439 bases, 622958439 kmers -read 7800000 sequences, 1114261097 bases, 630661097 kmers -read 7900000 sequences, 1128307808 bases, 638507808 kmers -read 8000000 sequences, 1142394085 bases, 646394085 kmers -read 8100000 sequences, 1156357087 bases, 654157087 kmers -read 8200000 sequences, 1170571919 bases, 662171919 kmers -read 8300000 sequences, 1184451177 bases, 669851177 kmers -read 8400000 sequences, 1198299415 bases, 677499415 kmers -read 8500000 sequences, 1212442446 bases, 685442446 kmers -read 8600000 sequences, 1226405386 bases, 693205386 kmers -read 8700000 sequences, 1240703127 bases, 701303127 kmers -read 8800000 sequences, 1254656983 bases, 709056983 kmers -read 8900000 sequences, 1268621397 bases, 716821397 kmers -read 9000000 sequences, 1282878983 bases, 724878983 kmers -read 9100000 sequences, 1297350868 bases, 733150868 kmers -read 9200000 sequences, 1311516008 bases, 741116008 kmers -read 9300000 sequences, 1325689722 bases, 749089722 kmers -read 9400000 sequences, 1339681966 bases, 756881966 kmers -read 9500000 sequences, 1353794378 bases, 764794378 kmers -read 9600000 sequences, 1368052593 bases, 772852593 kmers -read 9700000 sequences, 1382481060 bases, 781081060 kmers -read 9800000 sequences, 1397029165 bases, 789429165 kmers -read 9900000 sequences, 1411261935 bases, 797461935 kmers -read 10000000 sequences, 1425636398 bases, 805636398 kmers -read 10100000 sequences, 1439978158 bases, 813778158 kmers -read 10200000 sequences, 1454566042 bases, 822166042 kmers -read 10300000 sequences, 1469140008 bases, 830540008 kmers -read 10400000 sequences, 1483590209 bases, 838790209 kmers -read 10500000 sequences, 1497966729 bases, 846966729 kmers -read 10600000 sequences, 1512656712 bases, 855456712 kmers -read 10700000 sequences, 1527179954 bases, 863779954 kmers -read 10800000 sequences, 1541782827 bases, 872182827 kmers -read 10900000 sequences, 1556446263 bases, 880646263 kmers -read 11000000 sequences, 1571133044 bases, 889133044 kmers -read 11100000 sequences, 1585817113 bases, 897617113 kmers -read 11200000 sequences, 1600557391 bases, 906157391 kmers -read 11300000 sequences, 1615262703 bases, 914662703 kmers -read 11400000 sequences, 1629999627 bases, 923199627 kmers -read 11500000 sequences, 1644860568 bases, 931860568 kmers -read 11600000 sequences, 1659779614 bases, 940579614 kmers -read 11700000 sequences, 1674792374 bases, 949392374 kmers -read 11800000 sequences, 1689736749 bases, 958136749 kmers -read 11900000 sequences, 1704892610 bases, 967092610 kmers -read 12000000 sequences, 1720028668 bases, 976028668 kmers -read 12100000 sequences, 1735135576 bases, 984935576 kmers -read 12200000 sequences, 1750297083 bases, 993897083 kmers -read 12300000 sequences, 1765691330 bases, 1003091330 kmers -read 12400000 sequences, 1781168609 bases, 1012368609 kmers -read 12500000 sequences, 1796591819 bases, 1021591819 kmers -read 12600000 sequences, 1811901104 bases, 1030701104 kmers -read 12700000 sequences, 1827876510 bases, 1040476510 kmers -read 12800000 sequences, 1843393773 bases, 1049793773 kmers -read 12900000 sequences, 1858842782 bases, 1059042782 kmers -read 13000000 sequences, 1874571339 bases, 1068571339 kmers -read 13100000 sequences, 1890244268 bases, 1078044268 kmers -read 13200000 sequences, 1905959273 bases, 1087559273 kmers -read 13300000 sequences, 1922228338 bases, 1097628338 kmers -read 13400000 sequences, 1938520111 bases, 1107720111 kmers -read 13500000 sequences, 1954665049 bases, 1117665049 kmers -read 13600000 sequences, 1970696591 bases, 1127496591 kmers -read 13700000 sequences, 1987164795 bases, 1137764795 kmers -read 13800000 sequences, 2003371475 bases, 1147771475 kmers -read 13900000 sequences, 2019649864 bases, 1157849864 kmers -read 14000000 sequences, 2036208720 bases, 1168208720 kmers -read 14100000 sequences, 2052986091 bases, 1178786091 kmers -read 14200000 sequences, 2069712172 bases, 1189312172 kmers -read 14300000 sequences, 2086760589 bases, 1200160589 kmers -read 14400000 sequences, 2103719627 bases, 1210919627 kmers -read 14500000 sequences, 2120768565 bases, 1221768565 kmers -read 14600000 sequences, 2137973642 bases, 1232773642 kmers -read 14700000 sequences, 2155333528 bases, 1243933528 kmers -read 14800000 sequences, 2173029002 bases, 1255429002 kmers -read 14900000 sequences, 2190761957 bases, 1266961957 kmers -read 15000000 sequences, 2208992707 bases, 1278992707 kmers -read 15100000 sequences, 2226994114 bases, 1290794114 kmers -read 15200000 sequences, 2245240873 bases, 1302840873 kmers -read 15300000 sequences, 2264078057 bases, 1315478057 kmers -read 15400000 sequences, 2282789468 bases, 1327989468 kmers -read 15500000 sequences, 2301835717 bases, 1340835717 kmers -read 15600000 sequences, 2321337137 bases, 1354137137 kmers -read 15700000 sequences, 2341431175 bases, 1368031175 kmers -read 15800000 sequences, 2361547906 bases, 1381947906 kmers -read 15900000 sequences, 2382126087 bases, 1396326087 kmers -read 16000000 sequences, 2403498478 bases, 1411498478 kmers -read 16100000 sequences, 2424934550 bases, 1426734550 kmers -read 16200000 sequences, 2447209476 bases, 1442809476 kmers -read 16300000 sequences, 2470231832 bases, 1459631832 kmers -read 16400000 sequences, 2494281037 bases, 1477481037 kmers -read 16500000 sequences, 2519161670 bases, 1496161670 kmers -read 16600000 sequences, 2545406869 bases, 1516206869 kmers -=== step 1.1: 'encoding input' 7.40246 [sec] (4.85437 [ns/kmer]) -read 16636523 sequences, 2556368582 bases, 1524904156 kmers -num_kmers 1524904156 -cost: 2.0 + 1.35283 [bits/kmer] -max_len 499189 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 19 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.13368 [sec] (0.743445 [ns/kmer]) -=== step 1: 'parse file' 8.53626 [sec] (5.5979 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 9.94436 [sec] (6.5213 [ns/kmer]) -num_minimizers = 69577229 -num_minimizer_positions = 126350163 -num_super_kmers = 131966527 -building minimizers MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.2208 [sec] (2.11214 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155490682486772.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.37959 [sec] (2.87204 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.54732 [sec] (1.67048 [ns/kmer]) -num_bits_per_offset = 43 -num_buckets_larger_than_1_not_in_skew_index 12190335/69577229 (17.5206%) -num_buckets_in_skew_index 86973/69577229 (0.125002%) -max_bucket_size 245177 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 57511599/126350163 (45.5176%) -num_minimizer_positions_of_buckets_in_skew_index 11538643/126350163 (9.13227%) -computing minimizers offsets: 3.31397 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 77399356 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26776297 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13974034 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6504754 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3263868 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2527517 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2420664 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 245177: 10756294 -num_kmers_in_skew_index 143622784 (9.41848%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 77399356 - building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... - built mphs[0] for 77399356 kmers; bits/key = 2.54863 - built positions[0] for 77399356 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26776297 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26776297 kmers; bits/key = 2.54559 - built positions[1] for 26776297 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13974034 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 13974034 kmers; bits/key = 2.56375 - built positions[2] for 13974034 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6504754 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 6504754 kmers; bits/key = 2.78902 - built positions[3] for 6504754 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 3263868 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 3263868 kmers; bits/key = 3.30619 - built positions[4] for 3263868 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2527517 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2527517)... - built mphs[5] for 2527517 kmers; bits/key = 2.55992 - built positions[5] for 2527517 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2420664 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2420664)... - built mphs[6] for 2420664 kmers; bits/key = 2.55997 - built positions[6] for 2420664 kmers; bits/key = 13.0001 - lower = 8192; upper = 245177; num_bits_per_pos = 18; num_kmers_in_partition = 10756294 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[7] for 10756294 kmers; bits/key = 2.64819 - built positions[7] for 10756294 kmers; bits/key = 18 -computing skew index took: 23.4021 [sec] -=== step 3: 'build sparse and skew index' 26.9603 [sec] (17.68 [ns/kmer]) -=== total_time 55.5886 [sec] (36.4538 [ns/kmer]) -total index size: 1685868004 [B] -- 1685.87 [MB] -SPACE BREAKDOWN: - mphf: 0.132337 [bits/kmer] (2.9004 [bits/key]) -- 1.49628% - strings_offsets: 0.349116 [bits/kmer] -- 3.94729% - control_codewords: 2.0076 [bits/kmer] -- 22.699% - mid_load_buckets: 1.62174 [bits/kmer] -- 18.3362% - begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.58969e-05% - strings: 3.35283 [bits/kmer] -- 37.9088% - skew_index: 1.38083 [bits/kmer] -- 15.6124% - weights: 9.65307e-07 [bits/kmer] -- 1.09143e-05% - -------------- - total: 8.84445 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 82.3544% -buckets with 2 minimizer positions = 9.17598% -buckets with 3 minimizer positions = 3.08546% -buckets with 4 minimizer positions = 1.44294% -buckets with 5 minimizer positions = 0.830594% -buckets with 6 minimizer positions = 0.537643% -buckets with 7 minimizer positions = 0.377841% -buckets with 8 minimizer positions = 0.278926% -buckets with 9 minimizer positions = 0.215933% -buckets with 10 minimizer positions = 0.171191% -buckets with 11 minimizer positions = 0.139152% -buckets with 12 minimizer positions = 0.116435% -buckets with 13 minimizer positions = 0.0976368% -buckets with 14 minimizer positions = 0.0839542% -buckets with 15 minimizer positions = 0.0727882% -buckets with 16 minimizer positions = 0.064557% -max_bucket_size 245177 -2025-10-22 19:52:26: saving data structure to disk... -2025-10-22 19:52:27: DONE diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log b/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log deleted file mode 100644 index 1de5d75..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k63/regular-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 725.615 -avg_nanosec_per_negative_lookup 827.258 -avg_nanosec_per_access 269.507 -iterator: avg_nanosec_per_kmer 3.09292 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 734.653 -avg_nanosec_per_negative_lookup 814.742 -avg_nanosec_per_access 259.998 -iterator: avg_nanosec_per_kmer 2.98297 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 728.479 -avg_nanosec_per_negative_lookup 808.392 -avg_nanosec_per_access 254.699 -iterator: avg_nanosec_per_kmer 3.14332 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 649.815 -avg_nanosec_per_negative_lookup 839.658 -avg_nanosec_per_access 234.242 -iterator: avg_nanosec_per_kmer 2.97374 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 668.364 -avg_nanosec_per_negative_lookup 839.46 -avg_nanosec_per_access 225.036 -iterator: avg_nanosec_per_kmer 2.94503 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 666.555 -avg_nanosec_per_negative_lookup 838.066 -avg_nanosec_per_access 223.988 -iterator: avg_nanosec_per_kmer 3.09782 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 908.953 -avg_nanosec_per_negative_lookup 1041.12 -avg_nanosec_per_access 293.449 -iterator: avg_nanosec_per_kmer 3.11285 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 914.293 -avg_nanosec_per_negative_lookup 1026.73 -avg_nanosec_per_access 290.706 -iterator: avg_nanosec_per_kmer 3.08455 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 903.423 -avg_nanosec_per_negative_lookup 1020.04 -avg_nanosec_per_access 299.17 -iterator: avg_nanosec_per_kmer 2.94884 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1301.15 -avg_nanosec_per_negative_lookup 1324.08 -avg_nanosec_per_access 620.661 -iterator: avg_nanosec_per_kmer 3.23553 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1316.73 -avg_nanosec_per_negative_lookup 1315.07 -avg_nanosec_per_access 633.006 -iterator: avg_nanosec_per_kmer 3.25937 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1320.82 -avg_nanosec_per_negative_lookup 1295.76 -avg_nanosec_per_access 633.214 -iterator: avg_nanosec_per_kmer 3.18149 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 1608.94 -avg_nanosec_per_negative_lookup 1124.2 -avg_nanosec_per_access 508.115 -iterator: avg_nanosec_per_kmer 3.1276 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 1610.69 -avg_nanosec_per_negative_lookup 1125.24 -avg_nanosec_per_access 501.268 -iterator: avg_nanosec_per_kmer 3.10151 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 1601.6 -avg_nanosec_per_negative_lookup 1136.42 -avg_nanosec_per_access 482.985 -iterator: avg_nanosec_per_kmer 3.21048 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1421.01 -avg_nanosec_per_negative_lookup 1103.72 -avg_nanosec_per_access 433.92 -iterator: avg_nanosec_per_kmer 3.07458 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1422.2 -avg_nanosec_per_negative_lookup 1111.88 -avg_nanosec_per_access 434.816 -iterator: avg_nanosec_per_kmer 3.00043 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1425.87 -avg_nanosec_per_negative_lookup 1108.87 -avg_nanosec_per_access 433.94 -iterator: avg_nanosec_per_kmer 2.97986 diff --git a/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log b/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log deleted file mode 100644 index 0bab8fe..0000000 --- a/benchmarks/results-22-10-25-alt-indexes/k63/regular-build.log +++ /dev/null @@ -1,2101 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.52585 [sec] (2.74144 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.355252 [sec] (0.63827 [ns/kmer]) -=== step 1: 'parse file' 1.88118 [sec] (3.37986 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.04496 [sec] (3.67411 [ns/kmer]) -num_minimizers = 24306363 -num_minimizer_positions = 28148872 -num_super_kmers = 28148872 -building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.33686 [sec] (2.4019 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154710041833701.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.11553 [sec] (2.00423 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.571707 [sec] (1.02717 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) -num_buckets_in_skew_index 3271/24306363 (0.0134574%) -max_bucket_size 414759 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) -num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) -computing minimizers offsets: 0.359595 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 -num_kmers_in_skew_index 14306719 (2.57044%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3558021 kmers; bits/key = 3.06724 - built positions[0] for 3558021 kmers; bits/key = 7.0001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... - built mphs[1] for 2129998 kmers; bits/key = 2.56007 - built positions[1] for 2129998 kmers; bits/key = 8.00016 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... - built mphs[2] for 1247229 kmers; bits/key = 2.56071 - built positions[2] for 1247229 kmers; bits/key = 9.00028 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... - built mphs[3] for 1130328 kmers; bits/key = 2.56088 - built positions[3] for 1130328 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... - built mphs[4] for 1022110 kmers; bits/key = 2.41826 - built positions[4] for 1022110 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 - building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... - built mphs[5] for 790746 kmers; bits/key = 2.4189 - built positions[5] for 790746 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 - building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... - built mphs[6] for 666283 kmers; bits/key = 2.5622 - built positions[6] for 666283 kmers; bits/key = 13.0005 - lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 3762004 kmers; bits/key = 2.9235 - built positions[7] for 3762004 kmers; bits/key = 19.0001 -computing skew index took: 4.94707 [sec] -=== step 3: 'build sparse and skew index' 5.34705 [sec] (9.60688 [ns/kmer]) -=== total_time 12.2973 [sec] (22.0942 [ns/kmer]) -total index size: 326233848 [B] -- 326.234 [MB] -SPACE BREAKDOWN: - mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.77918% - strings_offsets: 0.0514514 [bits/kmer] -- 1.09726% - control_codewords: 1.61581 [bits/kmer] -- 34.459% - mid_load_buckets: 0.236288 [bits/kmer] -- 5.03912% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.21497e-05% - strings: 2.21266 [bits/kmer] -- 47.1876% - skew_index: 0.442537 [bits/kmer] -- 9.43763% - weights: 2.6447e-06 [bits/kmer] -- 5.64013e-05% - -------------- - total: 4.68907 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.0459% -buckets with 2 minimizer positions = 2.25565% -buckets with 3 minimizer positions = 0.699874% -buckets with 4 minimizer positions = 0.315284% -buckets with 5 minimizer positions = 0.173597% -buckets with 6 minimizer positions = 0.108305% -buckets with 7 minimizer positions = 0.0716932% -buckets with 8 minimizer positions = 0.0520522% -buckets with 9 minimizer positions = 0.0388458% -buckets with 10 minimizer positions = 0.0301485% -buckets with 11 minimizer positions = 0.0240019% -buckets with 12 minimizer positions = 0.0204144% -buckets with 13 minimizer positions = 0.0165265% -buckets with 14 minimizer positions = 0.013984% -buckets with 15 minimizer positions = 0.0120051% -buckets with 16 minimizer positions = 0.00972996% -max_bucket_size 414759 -2025-10-22 19:38:42: saving data structure to disk... -2025-10-22 19:38:42: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.70251 [sec] (2.33933 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.537199 [sec] (0.465006 [ns/kmer]) -=== step 1: 'parse file' 3.23984 [sec] (2.80445 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 4.17705 [sec] (3.61571 [ns/kmer]) -num_minimizers = 55464592 -num_minimizer_positions = 56006004 -num_super_kmers = 56006004 -building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.59216 [sec] (2.24381 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154722692434134.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.20356 [sec] (1.90743 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.10828 [sec] (0.959345 [ns/kmer]) -num_bits_per_offset = 36 -num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) -num_buckets_in_skew_index 490/55464592 (0.000883447%) -max_bucket_size 794 -log2_max_bucket_size 10 -skew index num_partitions 4 -num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) -num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) -computing minimizers offsets: 0.453547 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 -num_kmers_in_skew_index 1294137 (0.112022%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 - building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... - built mphs[0] for 604884 kmers; bits/key = 2.41964 - built positions[0] for 604884 kmers; bits/key = 7.00061 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 - building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... - built mphs[1] for 417805 kmers; bits/key = 2.42142 - built positions[1] for 417805 kmers; bits/key = 8.00082 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 - building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... - built mphs[2] for 221219 kmers; bits/key = 2.42569 - built positions[2] for 221219 kmers; bits/key = 9.00147 - lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... - built mphs[3] for 50229 kmers; bits/key = 2.45946 - built positions[3] for 50229 kmers; bits/key = 10.0073 -computing skew index took: 0.747187 [sec] -=== step 3: 'build sparse and skew index' 1.27939 [sec] (1.10746 [ns/kmer]) -=== total_time 14.6003 [sec] (12.6382 [ns/kmer]) -total index size: 573371308 [B] -- 573.371 [MB] -SPACE BREAKDOWN: - mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.48638% - strings_offsets: 0.0041807 [bits/kmer] -- 0.105293% - control_codewords: 1.7764 [bits/kmer] -- 44.7396% - mid_load_buckets: 0.0214122 [bits/kmer] -- 0.539276% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.67411e-05% - strings: 2.01672 [bits/kmer] -- 50.7921% - skew_index: 0.0133927 [bits/kmer] -- 0.337302% - weights: 1.27418e-06 [bits/kmer] -- 3.20909e-05% - -------------- - total: 3.97054 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.6239% -buckets with 2 minimizer positions = 0.253291% -buckets with 3 minimizer positions = 0.0530717% -buckets with 4 minimizer positions = 0.0227569% -buckets with 5 minimizer positions = 0.012325% -buckets with 6 minimizer positions = 0.00748405% -buckets with 7 minimizer positions = 0.00509695% -buckets with 8 minimizer positions = 0.00359148% -buckets with 9 minimizer positions = 0.00270803% -buckets with 10 minimizer positions = 0.0021383% -buckets with 11 minimizer positions = 0.00159201% -buckets with 12 minimizer positions = 0.00125666% -buckets with 13 minimizer positions = 0.00109619% -buckets with 14 minimizer positions = 0.000941141% -buckets with 15 minimizer positions = 0.000795102% -buckets with 16 minimizer positions = 0.000685122% -max_bucket_size 794 -2025-10-22 19:38:57: saving data structure to disk... -2025-10-22 19:38:57: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 7.01876 [sec] (2.53264 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.19082 [sec] (0.429694 [ns/kmer]) -=== step 1: 'parse file' 8.2097 [sec] (2.96238 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 10.1877 [sec] (3.67614 [ns/kmer]) -num_minimizers = 122838669 -num_minimizer_positions = 140756047 -num_super_kmers = 140756047 -building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.14116 [sec] (1.85513 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154737844522932.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.25586 [sec] (1.89652 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.82724 [sec] (1.02018 [ns/kmer]) -num_bits_per_offset = 39 -num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) -num_buckets_in_skew_index 28203/122838669 (0.0229594%) -max_bucket_size 147936 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) -num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) -computing minimizers offsets: 1.60838 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 -num_kmers_in_skew_index 145458128 (5.2487%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 25196923 kmers; bits/key = 2.56001 - built positions[0] for 25196923 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21919654 kmers; bits/key = 2.60671 - built positions[1] for 21919654 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19634878 kmers; bits/key = 2.55594 - built positions[2] for 19634878 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 18051454 kmers; bits/key = 2.60116 - built positions[3] for 18051454 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17018125 kmers; bits/key = 2.58264 - built positions[4] for 17018125 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 14085569 kmers; bits/key = 2.54674 - built positions[5] for 14085569 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[6] for 9296403 kmers; bits/key = 2.72206 - built positions[6] for 9296403 kmers; bits/key = 13 - lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[7] for 20255122 kmers; bits/key = 2.57505 - built positions[7] for 20255122 kmers; bits/key = 18 -computing skew index took: 18.6002 [sec] -=== step 3: 'build sparse and skew index' 20.439 [sec] (7.3752 [ns/kmer]) -=== total_time 52.0607 [sec] (18.7856 [ns/kmer]) -total index size: 1745357114 [B] -- 1745.36 [MB] -SPACE BREAKDOWN: - mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.48517% - strings_offsets: 0.0305175 [bits/kmer] -- 0.605705% - control_codewords: 1.773 [bits/kmer] -- 35.1901% - mid_load_buckets: 0.179068 [bits/kmer] -- 3.5541% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.5355e-05% - strings: 2.11826 [bits/kmer] -- 42.0426% - skew_index: 0.812294 [bits/kmer] -- 16.1222% - weights: 5.31156e-07 [bits/kmer] -- 1.05423e-05% - -------------- - total: 5.03835 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.4557% -buckets with 2 minimizer positions = 1.46862% -buckets with 3 minimizer positions = 0.405135% -buckets with 4 minimizer positions = 0.185188% -buckets with 5 minimizer positions = 0.10523% -buckets with 6 minimizer positions = 0.0680771% -buckets with 7 minimizer positions = 0.0480598% -buckets with 8 minimizer positions = 0.0352926% -buckets with 9 minimizer positions = 0.0271502% -buckets with 10 minimizer positions = 0.0217871% -buckets with 11 minimizer positions = 0.0176866% -buckets with 12 minimizer positions = 0.014607% -buckets with 13 minimizer positions = 0.0121411% -buckets with 14 minimizer positions = 0.0105985% -buckets with 15 minimizer positions = 0.00909811% -buckets with 16 minimizer positions = 0.00794457% -max_bucket_size 147936 -2025-10-22 19:39:50: saving data structure to disk... -2025-10-22 19:39:51: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.9859 [sec] (4.72193 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.82.bin'... -=== step 1.2: 'computing minimizers tuples' 6.66802 [sec] (1.12506 [ns/kmer]) -=== step 1: 'parse file' 34.654 [sec] (5.84701 [ns/kmer]) - == files to merge = 83 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 30.7528 [sec] (5.18879 [ns/kmer]) -num_minimizers = 274429863 -num_minimizer_positions = 406062800 -num_super_kmers = 406062800 -building minimizers MPHF with 64 threads and 92 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 11.5559 [sec] (1.94978 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154791581598107.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.4428 [sec] (2.43688 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 8.45177 [sec] (1.42603 [ns/kmer]) -num_bits_per_offset = 41 -num_buckets_larger_than_1_not_in_skew_index 51299487/274429863 (18.6931%) -num_buckets_in_skew_index 131946/274429863 (0.04808%) -max_bucket_size 176220 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 146053805/406062800 (35.9683%) -num_minimizer_positions_of_buckets_in_skew_index 37010565/406062800 (9.11449%) -computing minimizers offsets: 9.19898 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 83316513 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 74231522 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 67271777 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 57125353 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 46013184 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 37921473 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 28349062 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 176220: 62824185 -num_kmers_in_skew_index 457053069 (7.71165%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 83316513 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[0] for 83316513 kmers; bits/key = 2.55669 - built positions[0] for 83316513 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 74231522 - building MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... - built mphs[1] for 74231522 kmers; bits/key = 2.57033 - built positions[1] for 74231522 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 67271777 - building MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... - built mphs[2] for 67271777 kmers; bits/key = 2.54468 - built positions[2] for 67271777 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 57125353 - building MPHF with 64 threads and 20 partitions (avg. partition size = 3000000)... - built mphs[3] for 57125353 kmers; bits/key = 2.53252 - built positions[3] for 57125353 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46013184 - building MPHF with 64 threads and 16 partitions (avg. partition size = 3000000)... - built mphs[4] for 46013184 kmers; bits/key = 2.53117 - built positions[4] for 46013184 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 37921473 - building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... - built mphs[5] for 37921473 kmers; bits/key = 2.56414 - built positions[5] for 37921473 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 28349062 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[6] for 28349062 kmers; bits/key = 2.56358 - built positions[6] for 28349062 kmers; bits/key = 13 - lower = 8192; upper = 176220; num_bits_per_pos = 18; num_kmers_in_partition = 62824185 - building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... - built mphs[7] for 62824185 kmers; bits/key = 2.55204 - built positions[7] for 62824185 kmers; bits/key = 18 -computing skew index took: 64.578 [sec] -=== step 3: 'build sparse and skew index' 74.5844 [sec] (12.5843 [ns/kmer]) -=== total_time 174.442 [sec] (29.4328 [ns/kmer]) -total index size: 5881909658 [B] -- 5881.91 [MB] -SPACE BREAKDOWN: - mphf: 0.131165 [bits/kmer] (2.83273 [bits/key]) -- 1.65207% - strings_offsets: 0.341727 [bits/kmer] -- 4.30418% - control_codewords: 1.94474 [bits/kmer] -- 24.4947% - mid_load_buckets: 1.01036 [bits/kmer] -- 12.7259% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.55634e-06% - strings: 3.2463 [bits/kmer] -- 40.8883% - skew_index: 1.26513 [bits/kmer] -- 15.9348% - weights: 2.48364e-07 [bits/kmer] -- 3.12824e-06% - -------------- - total: 7.93943 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 81.2588% -buckets with 2 minimizer positions = 13.7158% -buckets with 3 minimizer positions = 2.82467% -buckets with 4 minimizer positions = 0.819903% -buckets with 5 minimizer positions = 0.371916% -buckets with 6 minimizer positions = 0.218785% -buckets with 7 minimizer positions = 0.143859% -buckets with 8 minimizer positions = 0.101665% -buckets with 9 minimizer positions = 0.0751737% -buckets with 10 minimizer positions = 0.0573965% -buckets with 11 minimizer positions = 0.0451926% -buckets with 12 minimizer positions = 0.0368258% -buckets with 13 minimizer positions = 0.0299698% -buckets with 14 minimizer positions = 0.025193% -buckets with 15 minimizer positions = 0.0214499% -buckets with 16 minimizer positions = 0.0183803% -max_bucket_size 176220 -2025-10-22 19:42:47: saving data structure to disk... -2025-10-22 19:42:50: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... -read 100000 sequences, 14595280 bases, 8395280 kmers -read 200000 sequences, 29023453 bases, 16623453 kmers -read 300000 sequences, 43790922 bases, 25190922 kmers -read 400000 sequences, 58362099 bases, 33562099 kmers -read 500000 sequences, 72908170 bases, 41908170 kmers -read 600000 sequences, 87446702 bases, 50246702 kmers -read 700000 sequences, 102099804 bases, 58699804 kmers -read 800000 sequences, 117134400 bases, 67534400 kmers -read 900000 sequences, 131713463 bases, 75913463 kmers -read 1000000 sequences, 146366718 bases, 84366718 kmers -read 1100000 sequences, 161101660 bases, 92901660 kmers -read 1200000 sequences, 175910768 bases, 101510768 kmers -read 1300000 sequences, 190897904 bases, 110297904 kmers -read 1400000 sequences, 205802973 bases, 119002973 kmers -read 1500000 sequences, 221158148 bases, 128158148 kmers -read 1600000 sequences, 236346274 bases, 137146274 kmers -read 1700000 sequences, 251304432 bases, 145904432 kmers -read 1800000 sequences, 266473950 bases, 154873950 kmers -read 1900000 sequences, 281471604 bases, 163671604 kmers -read 2000000 sequences, 296791327 bases, 172791327 kmers -read 2100000 sequences, 312420706 bases, 182220706 kmers -read 2200000 sequences, 327946210 bases, 191546210 kmers -read 2300000 sequences, 343525540 bases, 200925540 kmers -read 2400000 sequences, 358949847 bases, 210149847 kmers -read 2500000 sequences, 374380009 bases, 219380009 kmers -read 2600000 sequences, 390142304 bases, 228942304 kmers -read 2700000 sequences, 405642535 bases, 238242535 kmers -read 2800000 sequences, 421259989 bases, 247659989 kmers -read 2900000 sequences, 436893769 bases, 257093769 kmers -read 3000000 sequences, 452465563 bases, 266465563 kmers -read 3100000 sequences, 468090902 bases, 275890902 kmers -read 3200000 sequences, 483923930 bases, 285523930 kmers -read 3300000 sequences, 499749509 bases, 295149509 kmers -read 3400000 sequences, 515726709 bases, 304926709 kmers -read 3500000 sequences, 532169207 bases, 315169207 kmers -read 3600000 sequences, 548394020 bases, 325194020 kmers -read 3700000 sequences, 564809686 bases, 335409686 kmers -read 3800000 sequences, 581403559 bases, 345803559 kmers -read 3900000 sequences, 597837340 bases, 356037340 kmers -read 4000000 sequences, 614198433 bases, 366198433 kmers -read 4100000 sequences, 630803806 bases, 376603806 kmers -read 4200000 sequences, 647222216 bases, 386822216 kmers -read 4300000 sequences, 663750824 bases, 397150824 kmers -read 4400000 sequences, 680423234 bases, 407623234 kmers -read 4500000 sequences, 696967173 bases, 417967173 kmers -read 4600000 sequences, 714107161 bases, 428907161 kmers -read 4700000 sequences, 731190344 bases, 439790344 kmers -read 4800000 sequences, 748610325 bases, 451010325 kmers -read 4900000 sequences, 765806425 bases, 462006425 kmers -read 5000000 sequences, 783034539 bases, 473034539 kmers -read 5100000 sequences, 800681271 bases, 484481271 kmers -read 5200000 sequences, 818515777 bases, 496115777 kmers -read 5300000 sequences, 836324012 bases, 507724012 kmers -read 5400000 sequences, 854771265 bases, 519971265 kmers -read 5500000 sequences, 873098069 bases, 532098069 kmers -read 5600000 sequences, 891182426 bases, 543982426 kmers -read 5700000 sequences, 910053448 bases, 556653448 kmers -read 5800000 sequences, 928444429 bases, 568844429 kmers -read 5900000 sequences, 947244294 bases, 581444294 kmers -read 6000000 sequences, 966455345 bases, 594455345 kmers -read 6100000 sequences, 985974168 bases, 607774168 kmers -read 6200000 sequences, 1005630833 bases, 621230833 kmers -read 6300000 sequences, 1026020245 bases, 635420245 kmers -read 6400000 sequences, 1046696751 bases, 649896751 kmers -read 6500000 sequences, 1067596462 bases, 664596462 kmers -read 6600000 sequences, 1088718265 bases, 679518265 kmers -read 6700000 sequences, 1110387368 bases, 694987368 kmers -read 6800000 sequences, 1132578732 bases, 710978732 kmers -read 6900000 sequences, 1155047095 bases, 727247095 kmers -read 7000000 sequences, 1177950483 bases, 743950483 kmers -read 7100000 sequences, 1201726249 bases, 761526249 kmers -read 7200000 sequences, 1226646751 bases, 780246751 kmers -read 7300000 sequences, 1252079351 bases, 799479351 kmers -read 7400000 sequences, 1279261003 bases, 820461003 kmers -read 7500000 sequences, 1307802702 bases, 842802702 kmers -read 7600000 sequences, 1338212409 bases, 867012409 kmers -read 7700000 sequences, 1370354710 bases, 892954710 kmers -read 7800000 sequences, 1383049738 bases, 899449738 kmers -read 7900000 sequences, 1395810952 bases, 906010952 kmers -read 8000000 sequences, 1408450282 bases, 912450282 kmers -read 8100000 sequences, 1421220952 bases, 919020952 kmers -read 8200000 sequences, 1433887434 bases, 925487434 kmers -read 8300000 sequences, 1446445917 bases, 931845917 kmers -read 8400000 sequences, 1459153909 bases, 938353909 kmers -read 8500000 sequences, 1471877671 bases, 944877671 kmers -read 8600000 sequences, 1484865624 bases, 951665624 kmers -read 8700000 sequences, 1497567228 bases, 958167228 kmers -read 8800000 sequences, 1510543060 bases, 964943060 kmers -read 8900000 sequences, 1523371874 bases, 971571874 kmers -read 9000000 sequences, 1536152549 bases, 978152549 kmers -read 9100000 sequences, 1548860619 bases, 984660619 kmers -read 9200000 sequences, 1561712707 bases, 991312707 kmers -read 9300000 sequences, 1574401520 bases, 997801520 kmers -read 9400000 sequences, 1586885001 bases, 1004085001 kmers -read 9500000 sequences, 1599621412 bases, 1010621412 kmers -read 9600000 sequences, 1612397675 bases, 1017197675 kmers -read 9700000 sequences, 1625388385 bases, 1023988385 kmers -read 9800000 sequences, 1638536946 bases, 1030936946 kmers -read 9900000 sequences, 1651980650 bases, 1038180650 kmers -read 10000000 sequences, 1664904910 bases, 1044904910 kmers -read 10100000 sequences, 1677570910 bases, 1051370910 kmers -read 10200000 sequences, 1690246890 bases, 1057846890 kmers -read 10300000 sequences, 1703230366 bases, 1064630366 kmers -read 10400000 sequences, 1716086552 bases, 1071286552 kmers -read 10500000 sequences, 1729082411 bases, 1078082411 kmers -read 10600000 sequences, 1741944091 bases, 1084744091 kmers -read 10700000 sequences, 1754780793 bases, 1091380793 kmers -read 10800000 sequences, 1767537304 bases, 1097937304 kmers -read 10900000 sequences, 1780512088 bases, 1104712088 kmers -read 11000000 sequences, 1794061925 bases, 1112061925 kmers -read 11100000 sequences, 1807103354 bases, 1118903354 kmers -read 11200000 sequences, 1819865542 bases, 1125465542 kmers -read 11300000 sequences, 1832952701 bases, 1132352701 kmers -read 11400000 sequences, 1846108191 bases, 1139308191 kmers -read 11500000 sequences, 1859202023 bases, 1146202023 kmers -read 11600000 sequences, 1872125111 bases, 1152925111 kmers -read 11700000 sequences, 1884949294 bases, 1159549294 kmers -read 11800000 sequences, 1897879213 bases, 1166279213 kmers -read 11900000 sequences, 1910688502 bases, 1172888502 kmers -read 12000000 sequences, 1923575230 bases, 1179575230 kmers -read 12100000 sequences, 1936528765 bases, 1186328765 kmers -read 12200000 sequences, 1949822939 bases, 1193422939 kmers -read 12300000 sequences, 1962607705 bases, 1200007705 kmers -read 12400000 sequences, 1975528951 bases, 1206728951 kmers -read 12500000 sequences, 1988356507 bases, 1213356507 kmers -read 12600000 sequences, 2001310116 bases, 1220110116 kmers -read 12700000 sequences, 2014316977 bases, 1226916977 kmers -read 12800000 sequences, 2027300676 bases, 1233700676 kmers -read 12900000 sequences, 2040283112 bases, 1240483112 kmers -read 13000000 sequences, 2053070210 bases, 1247070210 kmers -read 13100000 sequences, 2066357392 bases, 1254157392 kmers -read 13200000 sequences, 2079514117 bases, 1261114117 kmers -read 13300000 sequences, 2092587055 bases, 1267987055 kmers -read 13400000 sequences, 2105687861 bases, 1274887861 kmers -read 13500000 sequences, 2118896002 bases, 1281896002 kmers -read 13600000 sequences, 2131841724 bases, 1288641724 kmers -read 13700000 sequences, 2144909308 bases, 1295509308 kmers -read 13800000 sequences, 2157799174 bases, 1302199174 kmers -read 13900000 sequences, 2170824760 bases, 1309024760 kmers -read 14000000 sequences, 2183943636 bases, 1315943636 kmers -read 14100000 sequences, 2196888939 bases, 1322688939 kmers -read 14200000 sequences, 2209993052 bases, 1329593052 kmers -read 14300000 sequences, 2223177518 bases, 1336577518 kmers -read 14400000 sequences, 2236324767 bases, 1343524767 kmers -read 14500000 sequences, 2249926194 bases, 1350926194 kmers -read 14600000 sequences, 2263244067 bases, 1358044067 kmers -read 14700000 sequences, 2276666210 bases, 1365266210 kmers -read 14800000 sequences, 2289846389 bases, 1372246389 kmers -read 14900000 sequences, 2303142205 bases, 1379342205 kmers -read 15000000 sequences, 2316373175 bases, 1386373175 kmers -read 15100000 sequences, 2329658257 bases, 1393458257 kmers -read 15200000 sequences, 2342799874 bases, 1400399874 kmers -read 15300000 sequences, 2355936598 bases, 1407336598 kmers -read 15400000 sequences, 2369202825 bases, 1414402825 kmers -read 15500000 sequences, 2382453933 bases, 1421453933 kmers -read 15600000 sequences, 2395606868 bases, 1428406868 kmers -read 15700000 sequences, 2408903524 bases, 1435503524 kmers -read 15800000 sequences, 2422488600 bases, 1442888600 kmers -read 15900000 sequences, 2435763741 bases, 1449963741 kmers -read 16000000 sequences, 2449041041 bases, 1457041041 kmers -read 16100000 sequences, 2462152775 bases, 1463952775 kmers -read 16200000 sequences, 2475426803 bases, 1471026803 kmers -read 16300000 sequences, 2488985859 bases, 1478385859 kmers -read 16400000 sequences, 2502322646 bases, 1485522646 kmers -read 16500000 sequences, 2515682566 bases, 1492682566 kmers -read 16600000 sequences, 2529274259 bases, 1500074259 kmers -read 16700000 sequences, 2542622794 bases, 1507222794 kmers -read 16800000 sequences, 2556056912 bases, 1514456912 kmers -read 16900000 sequences, 2569267145 bases, 1521467145 kmers -read 17000000 sequences, 2582562981 bases, 1528562981 kmers -read 17100000 sequences, 2596061102 bases, 1535861102 kmers -read 17200000 sequences, 2609459388 bases, 1543059388 kmers -read 17300000 sequences, 2622881245 bases, 1550281245 kmers -read 17400000 sequences, 2636336794 bases, 1557536794 kmers -read 17500000 sequences, 2649678629 bases, 1564678629 kmers -read 17600000 sequences, 2663341782 bases, 1572141782 kmers -read 17700000 sequences, 2676693590 bases, 1579293590 kmers -read 17800000 sequences, 2690200716 bases, 1586600716 kmers -read 17900000 sequences, 2703543489 bases, 1593743489 kmers -read 18000000 sequences, 2717390529 bases, 1601390529 kmers -read 18100000 sequences, 2730783796 bases, 1608583796 kmers -read 18200000 sequences, 2744196467 bases, 1615796467 kmers -read 18300000 sequences, 2757894852 bases, 1623294852 kmers -read 18400000 sequences, 2771403521 bases, 1630603521 kmers -read 18500000 sequences, 2784930678 bases, 1637930678 kmers -read 18600000 sequences, 2798778608 bases, 1645578608 kmers -read 18700000 sequences, 2812434788 bases, 1653034788 kmers -read 18800000 sequences, 2826041925 bases, 1660441925 kmers -read 18900000 sequences, 2839594143 bases, 1667794143 kmers -read 19000000 sequences, 2853100531 bases, 1675100531 kmers -read 19100000 sequences, 2866645368 bases, 1682445368 kmers -read 19200000 sequences, 2880162017 bases, 1689762017 kmers -read 19300000 sequences, 2893733500 bases, 1697133500 kmers -read 19400000 sequences, 2907861888 bases, 1705061888 kmers -read 19500000 sequences, 2921431859 bases, 1712431859 kmers -read 19600000 sequences, 2934950257 bases, 1719750257 kmers -read 19700000 sequences, 2948908590 bases, 1727508590 kmers -read 19800000 sequences, 2962655324 bases, 1735055324 kmers -read 19900000 sequences, 2976658842 bases, 1742858842 kmers -read 20000000 sequences, 2990606476 bases, 1750606476 kmers -read 20100000 sequences, 3004463124 bases, 1758263124 kmers -read 20200000 sequences, 3018263669 bases, 1765863669 kmers -read 20300000 sequences, 3032235817 bases, 1773635817 kmers -read 20400000 sequences, 3045926851 bases, 1781126851 kmers -read 20500000 sequences, 3059718085 bases, 1788718085 kmers -read 20600000 sequences, 3073465760 bases, 1796265760 kmers -read 20700000 sequences, 3087374365 bases, 1803974365 kmers -read 20800000 sequences, 3101202279 bases, 1811602279 kmers -read 20900000 sequences, 3115301042 bases, 1819501042 kmers -read 21000000 sequences, 3129300415 bases, 1827300415 kmers -read 21100000 sequences, 3143428950 bases, 1835228950 kmers -read 21200000 sequences, 3157337269 bases, 1842937269 kmers -read 21300000 sequences, 3171218453 bases, 1850618453 kmers -read 21400000 sequences, 3185386330 bases, 1858586330 kmers -read 21500000 sequences, 3199499619 bases, 1866499619 kmers -read 21600000 sequences, 3213699144 bases, 1874499144 kmers -read 21700000 sequences, 3227725083 bases, 1882325083 kmers -read 21800000 sequences, 3241636024 bases, 1890036024 kmers -read 21900000 sequences, 3255686690 bases, 1897886690 kmers -read 22000000 sequences, 3269949888 bases, 1905949888 kmers -read 22100000 sequences, 3284189309 bases, 1913989309 kmers -read 22200000 sequences, 3298558467 bases, 1922158467 kmers -read 22300000 sequences, 3312627222 bases, 1930027222 kmers -read 22400000 sequences, 3326674715 bases, 1937874715 kmers -read 22500000 sequences, 3340769161 bases, 1945769161 kmers -read 22600000 sequences, 3355403951 bases, 1954203951 kmers -read 22700000 sequences, 3369592323 bases, 1962192323 kmers -read 22800000 sequences, 3383749832 bases, 1970149832 kmers -read 22900000 sequences, 3398280808 bases, 1978480808 kmers -read 23000000 sequences, 3412658016 bases, 1986658016 kmers -read 23100000 sequences, 3427105278 bases, 1994905278 kmers -read 23200000 sequences, 3441898165 bases, 2003498165 kmers -read 23300000 sequences, 3456307790 bases, 2011707790 kmers -read 23400000 sequences, 3470437552 bases, 2019637552 kmers -=== step 1.1: 'encoding input' 10.2453 [sec] (5.05279 [ns/kmer]) -read 23474327 sequences, 3483064285 bases, 2027656011 kmers -num_kmers 2027656011 -cost: 2.0 + 1.43556 [bits/kmer] -max_len 643923 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 20 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.10721 [sec] (0.546055 [ns/kmer]) -=== step 1: 'parse file' 11.3527 [sec] (5.59891 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 10.7525 [sec] (5.30294 [ns/kmer]) -num_minimizers = 76630489 -num_minimizer_positions = 141268659 -num_super_kmers = 141268659 -building minimizers MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.46423 [sec] (1.70849 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761154970954541844.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.74393 [sec] (2.33961 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.03839 [sec] (1.49848 [ns/kmer]) -num_bits_per_offset = 45 -num_buckets_larger_than_1_not_in_skew_index 12031601/76630489 (15.7008%) -num_buckets_in_skew_index 62262/76630489 (0.0812496%) -max_bucket_size 281880 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 66085279/141268659 (46.7799%) -num_minimizer_positions_of_buckets_in_skew_index 10646754/141268659 (7.53653%) -computing minimizers offsets: 3.40426 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 65292887 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16768176 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 6866326 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4652668 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4307414 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3858894 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5911410 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 281880: 31685511 -num_kmers_in_skew_index 139343286 (6.87214%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 65292887 - building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... - built mphs[0] for 65292887 kmers; bits/key = 2.55008 - built positions[0] for 65292887 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16768176 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[1] for 16768176 kmers; bits/key = 2.56383 - built positions[1] for 16768176 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 6866326 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 6866326 kmers; bits/key = 2.72645 - built positions[2] for 6866326 kmers; bits/key = 9.00006 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4652668 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 4652668 kmers; bits/key = 2.812 - built positions[3] for 4652668 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4307414 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4307414 kmers; bits/key = 2.80506 - built positions[4] for 4307414 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3858894 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3858894 kmers; bits/key = 3.08272 - built positions[5] for 3858894 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5911410 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 5911410 kmers; bits/key = 2.51936 - built positions[6] for 5911410 kmers; bits/key = 13.0001 - lower = 8192; upper = 281880; num_bits_per_pos = 19; num_kmers_in_partition = 31685511 - building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... - built mphs[7] for 31685511 kmers; bits/key = 2.52689 - built positions[7] for 31685511 kmers; bits/key = 19 -computing skew index took: 21.1257 [sec] -=== step 3: 'build sparse and skew index' 24.8069 [sec] (12.2343 [ns/kmer]) -=== total_time 58.1587 [sec] (28.6827 [ns/kmer]) -total index size: 2093414430 [B] -- 2093.41 [MB] -SPACE BREAKDOWN: - mphf: 0.108372 [bits/kmer] (2.86754 [bits/key]) -- 1.3121% - strings_offsets: 0.370467 [bits/kmer] -- 4.48537% - control_codewords: 1.73846 [bits/kmer] -- 21.0482% - mid_load_buckets: 1.46664 [bits/kmer] -- 17.7571% - begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.28021e-05% - strings: 3.43556 [bits/kmer] -- 41.5955% - skew_index: 1.13995 [bits/kmer] -- 13.8017% - weights: 7.25961e-07 [bits/kmer] -- 8.78947e-06% - -------------- - total: 8.25945 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 84.2179% -buckets with 2 minimizer positions = 7.76108% -buckets with 3 minimizer positions = 2.50949% -buckets with 4 minimizer positions = 1.23307% -buckets with 5 minimizer positions = 0.750442% -buckets with 6 minimizer positions = 0.516927% -buckets with 7 minimizer positions = 0.38172% -buckets with 8 minimizer positions = 0.296813% -buckets with 9 minimizer positions = 0.239214% -buckets with 10 minimizer positions = 0.197673% -buckets with 11 minimizer positions = 0.166211% -buckets with 12 minimizer positions = 0.142668% -buckets with 13 minimizer positions = 0.124415% -buckets with 14 minimizer positions = 0.108818% -buckets with 15 minimizer positions = 0.0962646% -buckets with 16 minimizer positions = 0.0863325% -max_bucket_size 281880 -2025-10-22 19:43:49: saving data structure to disk... -2025-10-22 19:43:50: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... -read 100000 sequences, 29016680 bases, 22816680 kmers -read 200000 sequences, 59512851 bases, 47112851 kmers -read 300000 sequences, 93672898 bases, 75072898 kmers -read 400000 sequences, 116504758 bases, 91704758 kmers -read 500000 sequences, 129640784 bases, 98640784 kmers -read 600000 sequences, 142888339 bases, 105688339 kmers -read 700000 sequences, 156121559 bases, 112721559 kmers -read 800000 sequences, 169296181 bases, 119696181 kmers -read 900000 sequences, 182473664 bases, 126673664 kmers -read 1000000 sequences, 195596653 bases, 133596653 kmers -read 1100000 sequences, 208767883 bases, 140567883 kmers -read 1200000 sequences, 222206242 bases, 147806242 kmers -read 1300000 sequences, 235299002 bases, 154699002 kmers -read 1400000 sequences, 248482676 bases, 161682676 kmers -read 1500000 sequences, 261589002 bases, 168589002 kmers -read 1600000 sequences, 275055224 bases, 175855224 kmers -read 1700000 sequences, 288035899 bases, 182635899 kmers -read 1800000 sequences, 301349839 bases, 189749839 kmers -read 1900000 sequences, 314875402 bases, 197075402 kmers -read 2000000 sequences, 328155468 bases, 204155468 kmers -read 2100000 sequences, 341368638 bases, 211168638 kmers -read 2200000 sequences, 354712561 bases, 218312561 kmers -read 2300000 sequences, 368072063 bases, 225472063 kmers -read 2400000 sequences, 381369139 bases, 232569139 kmers -read 2500000 sequences, 395076735 bases, 240076735 kmers -read 2600000 sequences, 408571236 bases, 247371236 kmers -read 2700000 sequences, 421770941 bases, 254370941 kmers -read 2800000 sequences, 434931097 bases, 261331097 kmers -read 2900000 sequences, 448299063 bases, 268499063 kmers -read 3000000 sequences, 461539333 bases, 275539333 kmers -read 3100000 sequences, 474884907 bases, 282684907 kmers -read 3200000 sequences, 488437875 bases, 290037875 kmers -read 3300000 sequences, 501681623 bases, 297081623 kmers -read 3400000 sequences, 514981749 bases, 304181749 kmers -read 3500000 sequences, 528308911 bases, 311308911 kmers -read 3600000 sequences, 541636977 bases, 318436977 kmers -read 3700000 sequences, 555162428 bases, 325762428 kmers -read 3800000 sequences, 568696864 bases, 333096864 kmers -read 3900000 sequences, 581917367 bases, 340117367 kmers -read 4000000 sequences, 595230806 bases, 347230806 kmers -read 4100000 sequences, 608987326 bases, 354787326 kmers -read 4200000 sequences, 622285230 bases, 361885230 kmers -read 4300000 sequences, 635647937 bases, 369047937 kmers -read 4400000 sequences, 648992641 bases, 376192641 kmers -read 4500000 sequences, 662513085 bases, 383513085 kmers -read 4600000 sequences, 675930708 bases, 390730708 kmers -read 4700000 sequences, 689630997 bases, 398230997 kmers -read 4800000 sequences, 702998525 bases, 405398525 kmers -read 4900000 sequences, 716509106 bases, 412709106 kmers -read 5000000 sequences, 730213776 bases, 420213776 kmers -read 5100000 sequences, 743782200 bases, 427582200 kmers -read 5200000 sequences, 757644345 bases, 435244345 kmers -read 5300000 sequences, 771125199 bases, 442525199 kmers -read 5400000 sequences, 784691064 bases, 449891064 kmers -read 5500000 sequences, 798294855 bases, 457294855 kmers -read 5600000 sequences, 811868593 bases, 464668593 kmers -read 5700000 sequences, 825311254 bases, 471911254 kmers -read 5800000 sequences, 838965535 bases, 479365535 kmers -read 5900000 sequences, 852651369 bases, 486851369 kmers -read 6000000 sequences, 866286185 bases, 494286185 kmers -read 6100000 sequences, 879791139 bases, 501591139 kmers -read 6200000 sequences, 893568574 bases, 509168574 kmers -read 6300000 sequences, 907221132 bases, 516621132 kmers -read 6400000 sequences, 920850746 bases, 524050746 kmers -read 6500000 sequences, 934451496 bases, 531451496 kmers -read 6600000 sequences, 948058192 bases, 538858192 kmers -read 6700000 sequences, 961672076 bases, 546272076 kmers -read 6800000 sequences, 975396607 bases, 553796607 kmers -read 6900000 sequences, 989058970 bases, 561258970 kmers -read 7000000 sequences, 1002901529 bases, 568901529 kmers -read 7100000 sequences, 1016671875 bases, 576471875 kmers -read 7200000 sequences, 1030411659 bases, 584011659 kmers -read 7300000 sequences, 1044405182 bases, 591805182 kmers -read 7400000 sequences, 1058406016 bases, 599606016 kmers -read 7500000 sequences, 1072419258 bases, 607419258 kmers -read 7600000 sequences, 1086161571 bases, 614961571 kmers -read 7700000 sequences, 1100358439 bases, 622958439 kmers -read 7800000 sequences, 1114261097 bases, 630661097 kmers -read 7900000 sequences, 1128307808 bases, 638507808 kmers -read 8000000 sequences, 1142394085 bases, 646394085 kmers -read 8100000 sequences, 1156357087 bases, 654157087 kmers -read 8200000 sequences, 1170571919 bases, 662171919 kmers -read 8300000 sequences, 1184451177 bases, 669851177 kmers -read 8400000 sequences, 1198299415 bases, 677499415 kmers -read 8500000 sequences, 1212442446 bases, 685442446 kmers -read 8600000 sequences, 1226405386 bases, 693205386 kmers -read 8700000 sequences, 1240703127 bases, 701303127 kmers -read 8800000 sequences, 1254656983 bases, 709056983 kmers -read 8900000 sequences, 1268621397 bases, 716821397 kmers -read 9000000 sequences, 1282878983 bases, 724878983 kmers -read 9100000 sequences, 1297350868 bases, 733150868 kmers -read 9200000 sequences, 1311516008 bases, 741116008 kmers -read 9300000 sequences, 1325689722 bases, 749089722 kmers -read 9400000 sequences, 1339681966 bases, 756881966 kmers -read 9500000 sequences, 1353794378 bases, 764794378 kmers -read 9600000 sequences, 1368052593 bases, 772852593 kmers -read 9700000 sequences, 1382481060 bases, 781081060 kmers -read 9800000 sequences, 1397029165 bases, 789429165 kmers -read 9900000 sequences, 1411261935 bases, 797461935 kmers -read 10000000 sequences, 1425636398 bases, 805636398 kmers -read 10100000 sequences, 1439978158 bases, 813778158 kmers -read 10200000 sequences, 1454566042 bases, 822166042 kmers -read 10300000 sequences, 1469140008 bases, 830540008 kmers -read 10400000 sequences, 1483590209 bases, 838790209 kmers -read 10500000 sequences, 1497966729 bases, 846966729 kmers -read 10600000 sequences, 1512656712 bases, 855456712 kmers -read 10700000 sequences, 1527179954 bases, 863779954 kmers -read 10800000 sequences, 1541782827 bases, 872182827 kmers -read 10900000 sequences, 1556446263 bases, 880646263 kmers -read 11000000 sequences, 1571133044 bases, 889133044 kmers -read 11100000 sequences, 1585817113 bases, 897617113 kmers -read 11200000 sequences, 1600557391 bases, 906157391 kmers -read 11300000 sequences, 1615262703 bases, 914662703 kmers -read 11400000 sequences, 1629999627 bases, 923199627 kmers -read 11500000 sequences, 1644860568 bases, 931860568 kmers -read 11600000 sequences, 1659779614 bases, 940579614 kmers -read 11700000 sequences, 1674792374 bases, 949392374 kmers -read 11800000 sequences, 1689736749 bases, 958136749 kmers -read 11900000 sequences, 1704892610 bases, 967092610 kmers -read 12000000 sequences, 1720028668 bases, 976028668 kmers -read 12100000 sequences, 1735135576 bases, 984935576 kmers -read 12200000 sequences, 1750297083 bases, 993897083 kmers -read 12300000 sequences, 1765691330 bases, 1003091330 kmers -read 12400000 sequences, 1781168609 bases, 1012368609 kmers -read 12500000 sequences, 1796591819 bases, 1021591819 kmers -read 12600000 sequences, 1811901104 bases, 1030701104 kmers -read 12700000 sequences, 1827876510 bases, 1040476510 kmers -read 12800000 sequences, 1843393773 bases, 1049793773 kmers -read 12900000 sequences, 1858842782 bases, 1059042782 kmers -read 13000000 sequences, 1874571339 bases, 1068571339 kmers -read 13100000 sequences, 1890244268 bases, 1078044268 kmers -read 13200000 sequences, 1905959273 bases, 1087559273 kmers -read 13300000 sequences, 1922228338 bases, 1097628338 kmers -read 13400000 sequences, 1938520111 bases, 1107720111 kmers -read 13500000 sequences, 1954665049 bases, 1117665049 kmers -read 13600000 sequences, 1970696591 bases, 1127496591 kmers -read 13700000 sequences, 1987164795 bases, 1137764795 kmers -read 13800000 sequences, 2003371475 bases, 1147771475 kmers -read 13900000 sequences, 2019649864 bases, 1157849864 kmers -read 14000000 sequences, 2036208720 bases, 1168208720 kmers -read 14100000 sequences, 2052986091 bases, 1178786091 kmers -read 14200000 sequences, 2069712172 bases, 1189312172 kmers -read 14300000 sequences, 2086760589 bases, 1200160589 kmers -read 14400000 sequences, 2103719627 bases, 1210919627 kmers -read 14500000 sequences, 2120768565 bases, 1221768565 kmers -read 14600000 sequences, 2137973642 bases, 1232773642 kmers -read 14700000 sequences, 2155333528 bases, 1243933528 kmers -read 14800000 sequences, 2173029002 bases, 1255429002 kmers -read 14900000 sequences, 2190761957 bases, 1266961957 kmers -read 15000000 sequences, 2208992707 bases, 1278992707 kmers -read 15100000 sequences, 2226994114 bases, 1290794114 kmers -read 15200000 sequences, 2245240873 bases, 1302840873 kmers -read 15300000 sequences, 2264078057 bases, 1315478057 kmers -read 15400000 sequences, 2282789468 bases, 1327989468 kmers -read 15500000 sequences, 2301835717 bases, 1340835717 kmers -read 15600000 sequences, 2321337137 bases, 1354137137 kmers -read 15700000 sequences, 2341431175 bases, 1368031175 kmers -read 15800000 sequences, 2361547906 bases, 1381947906 kmers -read 15900000 sequences, 2382126087 bases, 1396326087 kmers -read 16000000 sequences, 2403498478 bases, 1411498478 kmers -read 16100000 sequences, 2424934550 bases, 1426734550 kmers -read 16200000 sequences, 2447209476 bases, 1442809476 kmers -read 16300000 sequences, 2470231832 bases, 1459631832 kmers -read 16400000 sequences, 2494281037 bases, 1477481037 kmers -read 16500000 sequences, 2519161670 bases, 1496161670 kmers -read 16600000 sequences, 2545406869 bases, 1516206869 kmers -=== step 1.1: 'encoding input' 7.41505 [sec] (4.86264 [ns/kmer]) -read 16636523 sequences, 2556368582 bases, 1524904156 kmers -num_kmers 1524904156 -cost: 2.0 + 1.35283 [bits/kmer] -max_len 499189 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 19 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.848832 [sec] (0.556646 [ns/kmer]) -=== step 1: 'parse file' 8.26403 [sec] (5.41937 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 8.0502 [sec] (5.27915 [ns/kmer]) -num_minimizers = 61951224 -num_minimizer_positions = 105337248 -num_super_kmers = 105337248 -building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.92058 [sec] (1.91525 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761155030994914191.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.56979 [sec] (2.34099 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.21697 [sec] (1.45384 [ns/kmer]) -num_bits_per_offset = 43 -num_buckets_larger_than_1_not_in_skew_index 9999764/61951224 (16.1414%) -num_buckets_in_skew_index 36489/61951224 (0.0588996%) -max_bucket_size 144478 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 47622255/105337248 (45.2093%) -num_minimizer_positions_of_buckets_in_skew_index 5800022/105337248 (5.50615%) -computing minimizers offsets: 2.54015 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 32078766 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16092632 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 8174536 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3454318 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2781070 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2981930 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2815305 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 144478: 7418130 -num_kmers_in_skew_index 75796687 (4.97059%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 32078766 - building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... - built mphs[0] for 32078766 kmers; bits/key = 2.51437 - built positions[0] for 32078766 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16092632 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[1] for 16092632 kmers; bits/key = 2.65398 - built positions[1] for 16092632 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8174536 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 8174536 kmers; bits/key = 2.61889 - built positions[2] for 8174536 kmers; bits/key = 9.00005 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3454318 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3454318 kmers; bits/key = 3.14686 - built positions[3] for 3454318 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2781070 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2781070)... - built mphs[4] for 2781070 kmers; bits/key = 2.55987 - built positions[4] for 2781070 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2981930 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2981930)... - built mphs[5] for 2981930 kmers; bits/key = 2.55978 - built positions[5] for 2981930 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2815305 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2815305)... - built mphs[6] for 2815305 kmers; bits/key = 2.55984 - built positions[6] for 2815305 kmers; bits/key = 13.0001 - lower = 8192; upper = 144478; num_bits_per_pos = 18; num_kmers_in_partition = 7418130 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[7] for 7418130 kmers; bits/key = 2.72795 - built positions[7] for 7418130 kmers; bits/key = 18.0001 -computing skew index took: 14.4216 [sec] -=== step 3: 'build sparse and skew index' 17.1651 [sec] (11.2565 [ns/kmer]) -=== total_time 42.1867 [sec] (27.6651 [ns/kmer]) -total index size: 1467612062 [B] -- 1467.61 [MB] -SPACE BREAKDOWN: - mphf: 0.116088 [bits/kmer] (2.85745 [bits/key]) -- 1.50774% - strings_offsets: 0.349116 [bits/kmer] -- 4.53431% - control_codewords: 1.78756 [bits/kmer] -- 23.2167% - mid_load_buckets: 1.34288 [bits/kmer] -- 17.4412% - begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.8261e-05% - strings: 3.35283 [bits/kmer] -- 43.5464% - skew_index: 0.750966 [bits/kmer] -- 9.75353% - weights: 9.65307e-07 [bits/kmer] -- 1.25374e-05% - -------------- - total: 7.69943 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 83.7998% -buckets with 2 minimizer positions = 8.4968% -buckets with 3 minimizer positions = 2.71676% -buckets with 4 minimizer positions = 1.2809% -buckets with 5 minimizer positions = 0.745569% -buckets with 6 minimizer positions = 0.487324% -buckets with 7 minimizer positions = 0.345178% -buckets with 8 minimizer positions = 0.259136% -buckets with 9 minimizer positions = 0.202319% -buckets with 10 minimizer positions = 0.163595% -buckets with 11 minimizer positions = 0.136582% -buckets with 12 minimizer positions = 0.116401% -buckets with 13 minimizer positions = 0.100962% -buckets with 14 minimizer positions = 0.0888166% -buckets with 15 minimizer positions = 0.0782793% -buckets with 16 minimizer positions = 0.0706992% -max_bucket_size 144478 -2025-10-22 19:44:33: saving data structure to disk... -2025-10-22 19:44:34: DONE diff --git a/benchmarks/results-22-10-25/k31/canon-bench.log b/benchmarks/results-22-10-25/k31/canon-bench.log deleted file mode 100644 index 2a9e45d..0000000 --- a/benchmarks/results-22-10-25/k31/canon-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 490.001 -avg_nanosec_per_negative_lookup 363.626 -avg_nanosec_per_access 296.576 -iterator: avg_nanosec_per_kmer 2.61326 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 467.735 -avg_nanosec_per_negative_lookup 387.336 -avg_nanosec_per_access 279.748 -iterator: avg_nanosec_per_kmer 2.58 -./sshash bench -i cod.k31.canon.sshash -avg_nanosec_per_positive_lookup 482.938 -avg_nanosec_per_negative_lookup 373.025 -avg_nanosec_per_access 285.938 -iterator: avg_nanosec_per_kmer 2.56108 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 471.123 -avg_nanosec_per_negative_lookup 395.101 -avg_nanosec_per_access 285.146 -iterator: avg_nanosec_per_kmer 2.79883 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 446.361 -avg_nanosec_per_negative_lookup 411.512 -avg_nanosec_per_access 278.263 -iterator: avg_nanosec_per_kmer 2.64528 -./sshash bench -i kestrel.k31.canon.sshash -avg_nanosec_per_positive_lookup 452.706 -avg_nanosec_per_negative_lookup 409.562 -avg_nanosec_per_access 283.325 -iterator: avg_nanosec_per_kmer 2.61142 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 650.548 -avg_nanosec_per_negative_lookup 451.696 -avg_nanosec_per_access 355.356 -iterator: avg_nanosec_per_kmer 2.60496 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 654.33 -avg_nanosec_per_negative_lookup 429.121 -avg_nanosec_per_access 369.249 -iterator: avg_nanosec_per_kmer 2.70813 -./sshash bench -i human.k31.canon.sshash -avg_nanosec_per_positive_lookup 655.352 -avg_nanosec_per_negative_lookup 437.184 -avg_nanosec_per_access 377.19 -iterator: avg_nanosec_per_kmer 2.67443 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 869.684 -avg_nanosec_per_negative_lookup 475.705 -avg_nanosec_per_access 565.996 -iterator: avg_nanosec_per_kmer 2.54627 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 865.621 -avg_nanosec_per_negative_lookup 499.274 -avg_nanosec_per_access 547.339 -iterator: avg_nanosec_per_kmer 2.71205 -./sshash bench -i hprc.k31.canon.sshash -avg_nanosec_per_positive_lookup 865.477 -avg_nanosec_per_negative_lookup 498.415 -avg_nanosec_per_access 575.876 -iterator: avg_nanosec_per_kmer 2.68009 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 887.109 -avg_nanosec_per_negative_lookup 432.255 -avg_nanosec_per_access 393.194 -iterator: avg_nanosec_per_kmer 2.58167 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 896.531 -avg_nanosec_per_negative_lookup 416.519 -avg_nanosec_per_access 419.574 -iterator: avg_nanosec_per_kmer 2.63357 -./sshash bench -i ec.k31.canon.sshash -avg_nanosec_per_positive_lookup 897.833 -avg_nanosec_per_negative_lookup 427.088 -avg_nanosec_per_access 387.424 -iterator: avg_nanosec_per_kmer 2.56043 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 776.793 -avg_nanosec_per_negative_lookup 417.866 -avg_nanosec_per_access 372.162 -iterator: avg_nanosec_per_kmer 2.50114 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 780.562 -avg_nanosec_per_negative_lookup 406.663 -avg_nanosec_per_access 391.707 -iterator: avg_nanosec_per_kmer 2.56239 -./sshash bench -i se.k31.canon.sshash -avg_nanosec_per_positive_lookup 786.172 -avg_nanosec_per_negative_lookup 429.785 -avg_nanosec_per_access 362.01 -iterator: avg_nanosec_per_kmer 2.50344 diff --git a/benchmarks/results-22-10-25/k31/canon-build.log b/benchmarks/results-22-10-25/k31/canon-build.log deleted file mode 100644 index c137418..0000000 --- a/benchmarks/results-22-10-25/k31/canon-build.log +++ /dev/null @@ -1,2285 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.50844 [sec] (3.00209 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.753351 [sec] (1.49931 [ns/kmer]) -=== step 1: 'parse file' 2.2619 [sec] (4.5016 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 7.2128 [sec] (14.3548 [ns/kmer]) -num_minimizers = 86163506 -num_minimizer_positions = 94463730 -num_super_kmers = 98209779 -building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.83684 [sec] (7.63602 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140319324005331.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.75822 [sec] (7.47957 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.20955 [sec] (4.39741 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 2988605/86163506 (3.46853%) -num_buckets_in_skew_index 5810/86163506 (0.00674299%) -max_bucket_size 68577 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 10013861/94463730 (10.6007%) -num_minimizer_positions_of_buckets_in_skew_index 1280778/94463730 (1.35584%) -computing minimizers offsets: 1.1862 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1643143 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1178275 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 956038 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 605533 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 425543 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 382297 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 254872 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 68577: 624986 -num_kmers_in_skew_index 6070687 (1.20818%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1643143 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1643143)... - built mphs[0] for 1643143 kmers; bits/key = 2.56038 - built positions[0] for 1643143 kmers; bits/key = 7.0002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1178275 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1178275)... - built mphs[1] for 1178275 kmers; bits/key = 2.41806 - built positions[1] for 1178275 kmers; bits/key = 8.00031 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 956038 - building MPHF with 64 threads and 1 partitions (avg. partition size = 956038)... - built mphs[2] for 956038 kmers; bits/key = 2.56129 - built positions[2] for 956038 kmers; bits/key = 9.00035 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 605533 - building MPHF with 64 threads and 1 partitions (avg. partition size = 605533)... - built mphs[3] for 605533 kmers; bits/key = 2.41961 - built positions[3] for 605533 kmers; bits/key = 10.0006 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 425543 - building MPHF with 64 threads and 1 partitions (avg. partition size = 425543)... - built mphs[4] for 425543 kmers; bits/key = 2.42126 - built positions[4] for 425543 kmers; bits/key = 11.0009 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 382297 - building MPHF with 64 threads and 1 partitions (avg. partition size = 382297)... - built mphs[5] for 382297 kmers; bits/key = 2.42153 - built positions[5] for 382297 kmers; bits/key = 12.0009 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 254872 - building MPHF with 64 threads and 1 partitions (avg. partition size = 254872)... - built mphs[6] for 254872 kmers; bits/key = 2.56712 - built positions[6] for 254872 kmers; bits/key = 13.0013 - lower = 8192; upper = 68577; num_bits_per_pos = 17; num_kmers_in_partition = 624986 - building MPHF with 64 threads and 1 partitions (avg. partition size = 624986)... - built mphs[7] for 624986 kmers; bits/key = 2.41943 - built positions[7] for 624986 kmers; bits/key = 17.0005 -computing skew index took: 3.31214 [sec] -=== step 3: 'build sparse and skew index' 4.6292 [sec] (9.21297 [ns/kmer]) -=== total_time 23.9085 [sec] (47.5824 [ns/kmer]) -total index size: 566181073 [B] -- 566.181 [MB] -SPACE BREAKDOWN: - mphf: 0.487029 [bits/kmer] (2.84013 [bits/key]) -- 5.40276% - strings_offsets: 0.144419 [bits/kmer] -- 1.60208% - control_codewords: 5.31593 [bits/kmer] -- 58.9712% - mid_load_buckets: 0.597885 [bits/kmer] -- 6.63251% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 4.73347e-05% - strings: 2.24566 [bits/kmer] -- 24.9118% - skew_index: 0.223525 [bits/kmer] -- 2.47963% - weights: 2.92956e-06 [bits/kmer] -- 3.24984e-05% - -------------- - total: 9.01445 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.5247% -buckets with 2 minimizer positions = 2.16597% -buckets with 3 minimizer positions = 0.599947% -buckets with 4 minimizer positions = 0.247865% -buckets with 5 minimizer positions = 0.129293% -buckets with 6 minimizer positions = 0.0768388% -buckets with 7 minimizer positions = 0.0512653% -buckets with 8 minimizer positions = 0.0353688% -buckets with 9 minimizer positions = 0.0260667% -buckets with 10 minimizer positions = 0.0199121% -buckets with 11 minimizer positions = 0.0157805% -buckets with 12 minimizer positions = 0.0127513% -buckets with 13 minimizer positions = 0.0102503% -buckets with 14 minimizer positions = 0.00880535% -buckets with 15 minimizer positions = 0.0074347% -buckets with 16 minimizer positions = 0.00615574% -max_bucket_size 68577 -2025-10-22 15:39:03: saving data structure to disk... -2025-10-22 15:39:03: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k31.canon.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.75159 [sec] (2.39186 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.50493 [sec] (1.30818 [ns/kmer]) -=== step 1: 'parse file' 4.25662 [sec] (3.70013 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 15.8878 [sec] (13.8107 [ns/kmer]) -num_minimizers = 209937048 -num_minimizer_positions = 213990360 -num_super_kmers = 222970482 -building minimizers MPHF with 64 threads and 70 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 9.19805 [sec] (7.99553 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140344038900575.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.85452 [sec] (7.69691 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 6.14877 [sec] (5.3449 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 2035626/209937048 (0.969636%) -num_buckets_in_skew_index 2517/209937048 (0.00119893%) -max_bucket_size 5316 -log2_max_bucket_size 13 -skew index num_partitions 7 -num_minimizer_positions_of_buckets_larger_than_1 5736623/213990360 (2.68079%) -num_minimizer_positions_of_buckets_in_skew_index 354832/213990360 (0.165817%) -computing minimizers offsets: 1.89353 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 846431 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 463901 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 298968 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 116879 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 120430 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 42891 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 5316: 9813 -num_kmers_in_skew_index 1899313 (0.1651%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 846431 - building MPHF with 64 threads and 1 partitions (avg. partition size = 846431)... - built mphs[0] for 846431 kmers; bits/key = 2.41876 - built positions[0] for 846431 kmers; bits/key = 7.00042 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 463901 - building MPHF with 64 threads and 1 partitions (avg. partition size = 463901)... - built mphs[1] for 463901 kmers; bits/key = 2.42059 - built positions[1] for 463901 kmers; bits/key = 8.00074 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 298968 - building MPHF with 64 threads and 1 partitions (avg. partition size = 298968)... - built mphs[2] for 298968 kmers; bits/key = 2.42332 - built positions[2] for 298968 kmers; bits/key = 9.0012 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 116879 - building MPHF with 64 threads and 1 partitions (avg. partition size = 116879)... - built mphs[3] for 116879 kmers; bits/key = 2.57716 - built positions[3] for 116879 kmers; bits/key = 10.0031 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 120430 - building MPHF with 64 threads and 1 partitions (avg. partition size = 120430)... - built mphs[4] for 120430 kmers; bits/key = 2.43408 - built positions[4] for 120430 kmers; bits/key = 11.0027 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 42891 - building MPHF with 64 threads and 1 partitions (avg. partition size = 42891)... - built mphs[5] for 42891 kmers; bits/key = 2.46579 - built positions[5] for 42891 kmers; bits/key = 12.0089 - lower = 4096; upper = 5316; num_bits_per_pos = 13; num_kmers_in_partition = 9813 - building MPHF with 64 threads and 1 partitions (avg. partition size = 9813)... - built mphs[6] for 9813 kmers; bits/key = 2.48487 - built positions[6] for 9813 kmers; bits/key = 13.0374 -computing skew index took: 1.07048 [sec] -=== step 3: 'build sparse and skew index' 3.24932 [sec] (2.82451 [ns/kmer]) -=== total_time 47.5951 [sec] (41.3726 [ns/kmer]) -total index size: 1246156067 [B] -- 1246.16 [MB] -SPACE BREAKDOWN: - mphf: 0.514173 [bits/kmer] (2.81753 [bits/key]) -- 5.93329% - strings_offsets: 0.100021 [bits/kmer] -- 1.15419% - control_codewords: 5.8397 [bits/kmer] -- 67.3871% - mid_load_buckets: 0.154586 [bits/kmer] -- 1.78384% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.15061e-05% - strings: 2.0304 [bits/kmer] -- 23.4298% - skew_index: 0.0270208 [bits/kmer] -- 0.311806% - weights: 1.27956e-06 [bits/kmer] -- 1.47654e-05% - -------------- - total: 8.6659 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.0292% -buckets with 2 minimizer positions = 0.755504% -buckets with 3 minimizer positions = 0.0986639% -buckets with 4 minimizer positions = 0.0387669% -buckets with 5 minimizer positions = 0.0208944% -buckets with 6 minimizer positions = 0.0129548% -buckets with 7 minimizer positions = 0.00864497% -buckets with 8 minimizer positions = 0.00604515% -buckets with 9 minimizer positions = 0.00458137% -buckets with 10 minimizer positions = 0.00347628% -buckets with 11 minimizer positions = 0.00277321% -buckets with 12 minimizer positions = 0.00222448% -buckets with 13 minimizer positions = 0.00183484% -buckets with 14 minimizer positions = 0.00150569% -buckets with 15 minimizer positions = 0.00123418% -buckets with 16 minimizer positions = 0.00103317% -max_bucket_size 5316 -2025-10-22 15:39:52: saving data structure to disk... -2025-10-22 15:39:53: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.46522 [sec] (2.97932 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.101.bin'... -=== step 1.2: 'computing minimizers tuples' 3.57549 [sec] (1.42695 [ns/kmer]) -=== step 1: 'parse file' 11.0408 [sec] (4.40632 [ns/kmer]) - == files to merge = 102 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.1: 'merging minimizers tuples' 40.4007 [sec] (16.1236 [ns/kmer]) -num_minimizers = 462224926 -num_minimizer_positions = 511201278 -num_super_kmers = 531186741 -building minimizers MPHF with 64 threads and 155 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 20.0466 [sec] (8.00046 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 19.9375 [sec] (7.95693 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140393255198221.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.4: 'merging minimizers tuples ' 25.5011 [sec] (10.1773 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 14266506/462224926 (3.08649%) -num_buckets_in_skew_index 60557/462224926 (0.0131012%) -max_bucket_size 22085 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 53165974/511201278 (10.4002%) -num_minimizer_positions_of_buckets_in_skew_index 10137441/511201278 (1.98306%) -computing minimizers offsets: 6.36281 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 14957205 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 10906495 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 7473094 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4774535 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2638087 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1593261 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 729770 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22085: 506148 -num_kmers_in_skew_index 43578595 (1.73919%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 14957205 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[0] for 14957205 kmers; bits/key = 2.56583 - built positions[0] for 14957205 kmers; bits/key = 7.00002 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 10906495 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[1] for 10906495 kmers; bits/key = 2.61744 - built positions[1] for 10906495 kmers; bits/key = 8.00003 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 7473094 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 7473094 kmers; bits/key = 2.65359 - built positions[2] for 7473094 kmers; bits/key = 9.00004 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4774535 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 4774535 kmers; bits/key = 2.75085 - built positions[3] for 4774535 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2638087 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2638087)... - built mphs[4] for 2638087 kmers; bits/key = 2.55989 - built positions[4] for 2638087 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1593261 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1593261)... - built mphs[5] for 1593261 kmers; bits/key = 2.56041 - built positions[5] for 1593261 kmers; bits/key = 12.0002 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 729770 - building MPHF with 64 threads and 1 partitions (avg. partition size = 729770)... - built mphs[6] for 729770 kmers; bits/key = 2.56195 - built positions[6] for 729770 kmers; bits/key = 13.0005 - lower = 8192; upper = 22085; num_bits_per_pos = 15; num_kmers_in_partition = 506148 - building MPHF with 64 threads and 1 partitions (avg. partition size = 506148)... - built mphs[7] for 506148 kmers; bits/key = 2.42048 - built positions[7] for 506148 kmers; bits/key = 15.0007 -computing skew index took: 9.23161 [sec] -=== step 3: 'build sparse and skew index' 16.3315 [sec] (6.51779 [ns/kmer]) -=== total_time 133.258 [sec] (53.1825 [ns/kmer]) -total index size: 3135788870 [B] -- 3135.79 [MB] -SPACE BREAKDOWN: - mphf: 0.523236 [bits/kmer] (2.83641 [bits/key]) -- 5.2262% - strings_offsets: 0.153147 [bits/kmer] -- 1.52966% - control_codewords: 6.08754 [bits/kmer] -- 60.8038% - mid_load_buckets: 0.678982 [bits/kmer] -- 6.78183% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 8.54649e-06% - strings: 2.24545 [bits/kmer] -- 22.4281% - skew_index: 0.323422 [bits/kmer] -- 3.23041% - weights: 5.87466e-07 [bits/kmer] -- 5.86774e-06% - -------------- - total: 10.0118 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.9004% -buckets with 2 minimizer positions = 1.89323% -buckets with 3 minimizer positions = 0.481205% -buckets with 4 minimizer positions = 0.215066% -buckets with 5 minimizer positions = 0.121924% -buckets with 6 minimizer positions = 0.0781816% -buckets with 7 minimizer positions = 0.0541282% -buckets with 8 minimizer positions = 0.0394014% -buckets with 9 minimizer positions = 0.0296871% -buckets with 10 minimizer positions = 0.0233579% -buckets with 11 minimizer positions = 0.0188211% -buckets with 12 minimizer positions = 0.0152856% -buckets with 13 minimizer positions = 0.0127754% -buckets with 14 minimizer positions = 0.0106204% -buckets with 15 minimizer positions = 0.00907826% -buckets with 16 minimizer positions = 0.0079457% -max_bucket_size 22085 -2025-10-22 15:42:08: saving data structure to disk... -2025-10-22 15:42:10: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.4034 [sec] (4.6807 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.113.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.114.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.115.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.116.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.117.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.118.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.119.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.120.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.121.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.122.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.123.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.124.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.125.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.126.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.127.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.128.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.129.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.130.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.131.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.132.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.133.bin'... -=== step 1.2: 'computing minimizers tuples' 9.78668 [sec] (2.63216 [ns/kmer]) -=== step 1: 'parse file' 27.1902 [sec] (7.31288 [ns/kmer]) - == files to merge = 134 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -num_super_kmers = 800000000 -=== step 2.1: 'merging minimizers tuples' 66.2394 [sec] (17.8153 [ns/kmer]) -num_minimizers = 619508590 -num_minimizer_positions = 790834640 -num_super_kmers = 819080133 -building minimizers MPHF with 64 threads and 207 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 25.8872 [sec] (6.96243 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 28.2671 [sec] (7.60251 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140530413399946.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -num_super_kmers = 700000000 -num_super_kmers = 750000000 -num_super_kmers = 800000000 -=== step 2.4: 'merging minimizers tuples ' 29.9639 [sec] (8.05888 [ns/kmer]) -num_bits_per_offset = 33 -num_buckets_larger_than_1_not_in_skew_index 81104016/619508590 (13.0917%) -num_buckets_in_skew_index 149851/619508590 (0.0241887%) -max_bucket_size 71241 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 225181159/790834640 (28.4739%) -num_minimizer_positions_of_buckets_in_skew_index 27398758/790834640 (3.46454%) -computing minimizers offsets: 16.0013 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 35558914 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26726484 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19151665 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 12830346 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 8265693 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 5225188 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 3257832 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71241: 4228970 -num_kmers_in_skew_index 115245092 (3.09955%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 35558914 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[0] for 35558914 kmers; bits/key = 2.57422 - built positions[0] for 35558914 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26726484 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26726484 kmers; bits/key = 2.5656 - built positions[1] for 26726484 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19151665 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19151665 kmers; bits/key = 2.60993 - built positions[2] for 19151665 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 12830346 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[3] for 12830346 kmers; bits/key = 2.65495 - built positions[3] for 12830346 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 8265693 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[4] for 8265693 kmers; bits/key = 2.59459 - built positions[4] for 8265693 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 5225188 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 5225188 kmers; bits/key = 2.63154 - built positions[5] for 5225188 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 3257832 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 3257832 kmers; bits/key = 3.31153 - built positions[6] for 3257832 kmers; bits/key = 13.0001 - lower = 8192; upper = 71241; num_bits_per_pos = 17; num_kmers_in_partition = 4228970 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 4228970 kmers; bits/key = 2.84935 - built positions[7] for 4228970 kmers; bits/key = 17.0001 -computing skew index took: 16.4974 [sec] -=== step 3: 'build sparse and skew index' 33.9205 [sec] (9.12301 [ns/kmer]) -=== total_time 211.468 [sec] (56.875 [ns/kmer]) -total index size: 5544019780 [B] -- 5544.02 [MB] -SPACE BREAKDOWN: - mphf: 0.472233 [bits/kmer] (2.83421 [bits/key]) -- 3.95881% - strings_offsets: 0.300083 [bits/kmer] -- 2.51565% - control_codewords: 5.66504 [bits/kmer] -- 47.491% - mid_load_buckets: 1.99858 [bits/kmer] -- 16.7545% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 4.83404e-06% - strings: 2.8909 [bits/kmer] -- 24.2349% - skew_index: 0.601813 [bits/kmer] -- 5.04511% - weights: 3.95899e-07 [bits/kmer] -- 3.31889e-06% - -------------- - total: 11.9286 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 86.8841% -buckets with 2 minimizer positions = 10.1608% -buckets with 3 minimizer positions = 1.5937% -buckets with 4 minimizer positions = 0.465965% -buckets with 5 minimizer positions = 0.227622% -buckets with 6 minimizer positions = 0.138122% -buckets with 7 minimizer positions = 0.0932371% -buckets with 8 minimizer positions = 0.0672932% -buckets with 9 minimizer positions = 0.0507686% -buckets with 10 minimizer positions = 0.0394317% -buckets with 11 minimizer positions = 0.0314958% -buckets with 12 minimizer positions = 0.025655% -buckets with 13 minimizer positions = 0.0213997% -buckets with 14 minimizer positions = 0.017952% -buckets with 15 minimizer positions = 0.0152708% -buckets with 16 minimizer positions = 0.0132381% -max_bucket_size 71241 -2025-10-22 15:45:44: saving data structure to disk... -2025-10-22 15:45:47: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... -read 100000 sequences, 12802319 bases, 9802319 kmers -read 200000 sequences, 26155680 bases, 20155680 kmers -read 300000 sequences, 39727315 bases, 30727315 kmers -read 400000 sequences, 53567543 bases, 41567543 kmers -read 500000 sequences, 68009750 bases, 53009750 kmers -read 600000 sequences, 83050731 bases, 65050731 kmers -read 700000 sequences, 98819486 bases, 77819486 kmers -read 800000 sequences, 116043186 bases, 92043186 kmers -read 900000 sequences, 134201454 bases, 107201454 kmers -read 1000000 sequences, 153195620 bases, 123195620 kmers -read 1100000 sequences, 174787795 bases, 141787795 kmers -read 1200000 sequences, 183806919 bases, 147806919 kmers -read 1300000 sequences, 190658371 bases, 151658371 kmers -read 1400000 sequences, 197393762 bases, 155393762 kmers -read 1500000 sequences, 204308958 bases, 159308958 kmers -read 1600000 sequences, 211178004 bases, 163178004 kmers -read 1700000 sequences, 217938129 bases, 166938129 kmers -read 1800000 sequences, 224728931 bases, 170728931 kmers -read 1900000 sequences, 231435055 bases, 174435055 kmers -read 2000000 sequences, 238301856 bases, 178301856 kmers -read 2100000 sequences, 245162304 bases, 182162304 kmers -read 2200000 sequences, 251968534 bases, 185968534 kmers -read 2300000 sequences, 258797784 bases, 189797784 kmers -read 2400000 sequences, 265681419 bases, 193681419 kmers -read 2500000 sequences, 272480771 bases, 197480771 kmers -read 2600000 sequences, 279327274 bases, 201327274 kmers -read 2700000 sequences, 286169897 bases, 205169897 kmers -read 2800000 sequences, 293063897 bases, 209063897 kmers -read 2900000 sequences, 299941531 bases, 212941531 kmers -read 3000000 sequences, 306827724 bases, 216827724 kmers -read 3100000 sequences, 313725925 bases, 220725925 kmers -read 3200000 sequences, 320629887 bases, 224629887 kmers -read 3300000 sequences, 327545193 bases, 228545193 kmers -read 3400000 sequences, 334471610 bases, 232471610 kmers -read 3500000 sequences, 341603766 bases, 236603766 kmers -read 3600000 sequences, 348399690 bases, 240399690 kmers -read 3700000 sequences, 355270676 bases, 244270676 kmers -read 3800000 sequences, 362436143 bases, 248436143 kmers -read 3900000 sequences, 369341114 bases, 252341114 kmers -read 4000000 sequences, 376235441 bases, 256235441 kmers -read 4100000 sequences, 383163199 bases, 260163199 kmers -read 4200000 sequences, 390047987 bases, 264047987 kmers -read 4300000 sequences, 396880438 bases, 267880438 kmers -read 4400000 sequences, 403776565 bases, 271776565 kmers -read 4500000 sequences, 410576367 bases, 275576367 kmers -read 4600000 sequences, 417377049 bases, 279377049 kmers -read 4700000 sequences, 424274495 bases, 283274495 kmers -read 4800000 sequences, 431192311 bases, 287192311 kmers -read 4900000 sequences, 438257785 bases, 291257785 kmers -read 5000000 sequences, 445233170 bases, 295233170 kmers -read 5100000 sequences, 452307732 bases, 299307732 kmers -read 5200000 sequences, 459344438 bases, 303344438 kmers -read 5300000 sequences, 466255981 bases, 307255981 kmers -read 5400000 sequences, 473220156 bases, 311220156 kmers -read 5500000 sequences, 480178864 bases, 315178864 kmers -read 5600000 sequences, 487198091 bases, 319198091 kmers -read 5700000 sequences, 494051268 bases, 323051268 kmers -read 5800000 sequences, 501294774 bases, 327294774 kmers -read 5900000 sequences, 508386191 bases, 331386191 kmers -read 6000000 sequences, 515368260 bases, 335368260 kmers -read 6100000 sequences, 522265327 bases, 339265327 kmers -read 6200000 sequences, 529435219 bases, 343435219 kmers -read 6300000 sequences, 536513892 bases, 347513892 kmers -read 6400000 sequences, 543669227 bases, 351669227 kmers -read 6500000 sequences, 550654427 bases, 355654427 kmers -read 6600000 sequences, 557665979 bases, 359665979 kmers -read 6700000 sequences, 564815722 bases, 363815722 kmers -read 6800000 sequences, 571787007 bases, 367787007 kmers -read 6900000 sequences, 578923485 bases, 371923485 kmers -read 7000000 sequences, 586116050 bases, 376116050 kmers -read 7100000 sequences, 593247546 bases, 380247546 kmers -read 7200000 sequences, 600225954 bases, 384225954 kmers -read 7300000 sequences, 607331027 bases, 388331027 kmers -read 7400000 sequences, 614417238 bases, 392417238 kmers -read 7500000 sequences, 621494916 bases, 396494916 kmers -read 7600000 sequences, 628713296 bases, 400713296 kmers -read 7700000 sequences, 635875916 bases, 404875916 kmers -read 7800000 sequences, 643000132 bases, 409000132 kmers -read 7900000 sequences, 650054935 bases, 413054935 kmers -read 8000000 sequences, 657174193 bases, 417174193 kmers -read 8100000 sequences, 664392690 bases, 421392690 kmers -read 8200000 sequences, 671575430 bases, 425575430 kmers -read 8300000 sequences, 678822397 bases, 429822397 kmers -read 8400000 sequences, 685932522 bases, 433932522 kmers -read 8500000 sequences, 693003257 bases, 438003257 kmers -read 8600000 sequences, 700264806 bases, 442264806 kmers -read 8700000 sequences, 707441916 bases, 446441916 kmers -read 8800000 sequences, 714783716 bases, 450783716 kmers -read 8900000 sequences, 722048687 bases, 455048687 kmers -read 9000000 sequences, 729536721 bases, 459536721 kmers -read 9100000 sequences, 736820834 bases, 463820834 kmers -read 9200000 sequences, 744240551 bases, 468240551 kmers -read 9300000 sequences, 751532385 bases, 472532385 kmers -read 9400000 sequences, 758908308 bases, 476908308 kmers -read 9500000 sequences, 766152765 bases, 481152765 kmers -read 9600000 sequences, 773460104 bases, 485460104 kmers -read 9700000 sequences, 780744999 bases, 489744999 kmers -read 9800000 sequences, 788046688 bases, 494046688 kmers -read 9900000 sequences, 795444088 bases, 498444088 kmers -read 10000000 sequences, 802902838 bases, 502902838 kmers -read 10100000 sequences, 810379702 bases, 507379702 kmers -read 10200000 sequences, 817713311 bases, 511713311 kmers -read 10300000 sequences, 825011133 bases, 516011133 kmers -read 10400000 sequences, 832292513 bases, 520292513 kmers -read 10500000 sequences, 839612784 bases, 524612784 kmers -read 10600000 sequences, 847027439 bases, 529027439 kmers -read 10700000 sequences, 854363725 bases, 533363725 kmers -read 10800000 sequences, 861721984 bases, 537721984 kmers -read 10900000 sequences, 869045250 bases, 542045250 kmers -read 11000000 sequences, 876372447 bases, 546372447 kmers -read 11100000 sequences, 883866002 bases, 550866002 kmers -read 11200000 sequences, 891340279 bases, 555340279 kmers -read 11300000 sequences, 899036889 bases, 560036889 kmers -read 11400000 sequences, 906434241 bases, 564434241 kmers -read 11500000 sequences, 913824257 bases, 568824257 kmers -read 11600000 sequences, 921342281 bases, 573342281 kmers -read 11700000 sequences, 928719144 bases, 577719144 kmers -read 11800000 sequences, 936164765 bases, 582164765 kmers -read 11900000 sequences, 943653758 bases, 586653758 kmers -read 12000000 sequences, 951284053 bases, 591284053 kmers -read 12100000 sequences, 958744772 bases, 595744772 kmers -read 12200000 sequences, 966275858 bases, 600275858 kmers -read 12300000 sequences, 973962686 bases, 604962686 kmers -read 12400000 sequences, 981647965 bases, 609647965 kmers -read 12500000 sequences, 989234531 bases, 614234531 kmers -read 12600000 sequences, 996919849 bases, 618919849 kmers -read 12700000 sequences, 1004488446 bases, 623488446 kmers -read 12800000 sequences, 1012083435 bases, 628083435 kmers -read 12900000 sequences, 1019844583 bases, 632844583 kmers -read 13000000 sequences, 1027636701 bases, 637636701 kmers -read 13100000 sequences, 1035458430 bases, 642458430 kmers -read 13200000 sequences, 1043299596 bases, 647299596 kmers -read 13300000 sequences, 1051100294 bases, 652100294 kmers -read 13400000 sequences, 1058940054 bases, 656940054 kmers -read 13500000 sequences, 1066735225 bases, 661735225 kmers -read 13600000 sequences, 1074662997 bases, 666662997 kmers -read 13700000 sequences, 1082381283 bases, 671381283 kmers -read 13800000 sequences, 1090055507 bases, 676055507 kmers -read 13900000 sequences, 1097835965 bases, 680835965 kmers -read 14000000 sequences, 1105722693 bases, 685722693 kmers -read 14100000 sequences, 1113495622 bases, 690495622 kmers -read 14200000 sequences, 1121380038 bases, 695380038 kmers -read 14300000 sequences, 1129522879 bases, 700522879 kmers -read 14400000 sequences, 1137515487 bases, 705515487 kmers -read 14500000 sequences, 1145547633 bases, 710547633 kmers -read 14600000 sequences, 1153636718 bases, 715636718 kmers -read 14700000 sequences, 1161507672 bases, 720507672 kmers -read 14800000 sequences, 1169638977 bases, 725638977 kmers -read 14900000 sequences, 1177765602 bases, 730765602 kmers -read 15000000 sequences, 1185796892 bases, 735796892 kmers -read 15100000 sequences, 1193966066 bases, 740966066 kmers -read 15200000 sequences, 1201992531 bases, 745992531 kmers -read 15300000 sequences, 1210139564 bases, 751139564 kmers -read 15400000 sequences, 1218303770 bases, 756303770 kmers -read 15500000 sequences, 1226563924 bases, 761563924 kmers -read 15600000 sequences, 1234769102 bases, 766769102 kmers -read 15700000 sequences, 1243038710 bases, 772038710 kmers -read 15800000 sequences, 1251312331 bases, 777312331 kmers -read 15900000 sequences, 1259505857 bases, 782505857 kmers -read 16000000 sequences, 1267846293 bases, 787846293 kmers -read 16100000 sequences, 1276258510 bases, 793258510 kmers -read 16200000 sequences, 1284600618 bases, 798600618 kmers -read 16300000 sequences, 1292910529 bases, 803910529 kmers -read 16400000 sequences, 1301315569 bases, 809315569 kmers -read 16500000 sequences, 1309948482 bases, 814948482 kmers -read 16600000 sequences, 1318536932 bases, 820536932 kmers -read 16700000 sequences, 1326901868 bases, 825901868 kmers -read 16800000 sequences, 1335658656 bases, 831658656 kmers -read 16900000 sequences, 1344318999 bases, 837318999 kmers -read 17000000 sequences, 1352901026 bases, 842901026 kmers -read 17100000 sequences, 1361738649 bases, 848738649 kmers -read 17200000 sequences, 1370441463 bases, 854441463 kmers -read 17300000 sequences, 1379104762 bases, 860104762 kmers -read 17400000 sequences, 1387857799 bases, 865857799 kmers -read 17500000 sequences, 1396827318 bases, 871827318 kmers -read 17600000 sequences, 1405624638 bases, 877624638 kmers -read 17700000 sequences, 1414580410 bases, 883580410 kmers -read 17800000 sequences, 1423596393 bases, 889596393 kmers -read 17900000 sequences, 1432608671 bases, 895608671 kmers -read 18000000 sequences, 1442015880 bases, 902015880 kmers -read 18100000 sequences, 1451131708 bases, 908131708 kmers -read 18200000 sequences, 1460386801 bases, 914386801 kmers -read 18300000 sequences, 1469583369 bases, 920583369 kmers -read 18400000 sequences, 1478759459 bases, 926759459 kmers -read 18500000 sequences, 1488122391 bases, 933122391 kmers -read 18600000 sequences, 1497569745 bases, 939569745 kmers -read 18700000 sequences, 1507030485 bases, 946030485 kmers -read 18800000 sequences, 1516707149 bases, 952707149 kmers -read 18900000 sequences, 1526397934 bases, 959397934 kmers -read 19000000 sequences, 1536308350 bases, 966308350 kmers -read 19100000 sequences, 1546342668 bases, 973342668 kmers -read 19200000 sequences, 1556281669 bases, 980281669 kmers -read 19300000 sequences, 1566271275 bases, 987271275 kmers -read 19400000 sequences, 1576402796 bases, 994402796 kmers -read 19500000 sequences, 1586440957 bases, 1001440957 kmers -read 19600000 sequences, 1596689344 bases, 1008689344 kmers -read 19700000 sequences, 1607088748 bases, 1016088748 kmers -read 19800000 sequences, 1617543387 bases, 1023543387 kmers -read 19900000 sequences, 1628261415 bases, 1031261415 kmers -read 20000000 sequences, 1639158516 bases, 1039158516 kmers -read 20100000 sequences, 1650338356 bases, 1047338356 kmers -read 20200000 sequences, 1661398094 bases, 1055398094 kmers -read 20300000 sequences, 1672652108 bases, 1063652108 kmers -read 20400000 sequences, 1683961135 bases, 1071961135 kmers -read 20500000 sequences, 1695700838 bases, 1080700838 kmers -read 20600000 sequences, 1707448842 bases, 1089448842 kmers -read 20700000 sequences, 1719587691 bases, 1098587691 kmers -read 20800000 sequences, 1732024822 bases, 1108024822 kmers -=== step 1.1: 'encoding input' 5.91576 [sec] (5.32463 [ns/kmer]) -read 20822360 sequences, 1735689645 bases, 1111018845 kmers -num_kmers 1111018845 -cost: 2.0 + 1.1245 [bits/kmer] -max_len 176455 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.65.bin'... -=== step 1.2: 'computing minimizers tuples' 1.77346 [sec] (1.59625 [ns/kmer]) -=== step 1: 'parse file' 7.68936 [sec] (6.921 [ns/kmer]) - == files to merge = 66 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 18.4003 [sec] (16.5616 [ns/kmer]) -num_minimizers = 174641353 -num_minimizer_positions = 240693690 -num_super_kmers = 249228267 -building minimizers MPHF with 64 threads and 59 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 7.58937 [sec] (6.831 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140747658713042.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 8.95839 [sec] (8.06322 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 4.60646 [sec] (4.14616 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 20680302/174641353 (11.8416%) -num_buckets_in_skew_index 18464/174641353 (0.0105725%) -max_bucket_size 37043 -log2_max_bucket_size 16 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 82592303/240693690 (34.3143%) -num_minimizer_positions_of_buckets_in_skew_index 4158800/240693690 (1.72784%) -computing minimizers offsets: 4.96345 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4817539 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2376719 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1827153 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1520019 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1265567 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 951364 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 1017584 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 37043: 1228646 -num_kmers_in_skew_index 15004591 (1.35053%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4817539 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4817539 kmers; bits/key = 2.73 - built positions[0] for 4817539 kmers; bits/key = 7.00008 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2376719 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2376719)... - built mphs[1] for 2376719 kmers; bits/key = 2.55999 - built positions[1] for 2376719 kmers; bits/key = 8.00014 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1827153 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1827153)... - built mphs[2] for 1827153 kmers; bits/key = 2.56021 - built positions[2] for 1827153 kmers; bits/key = 9.0002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1520019 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1520019)... - built mphs[3] for 1520019 kmers; bits/key = 2.56043 - built positions[3] for 1520019 kmers; bits/key = 10.0002 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1265567 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1265567)... - built mphs[4] for 1265567 kmers; bits/key = 2.56074 - built positions[4] for 1265567 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 951364 - building MPHF with 64 threads and 1 partitions (avg. partition size = 951364)... - built mphs[5] for 951364 kmers; bits/key = 2.56127 - built positions[5] for 951364 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 1017584 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1017584)... - built mphs[6] for 1017584 kmers; bits/key = 2.41831 - built positions[6] for 1017584 kmers; bits/key = 13.0003 - lower = 8192; upper = 37043; num_bits_per_pos = 16; num_kmers_in_partition = 1228646 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1228646)... - built mphs[7] for 1228646 kmers; bits/key = 2.56083 - built positions[7] for 1228646 kmers; bits/key = 16.0003 -computing skew index took: 6.59343 [sec] -=== step 3: 'build sparse and skew index' 11.9582 [sec] (10.7633 [ns/kmer]) -=== total_time 59.202 [sec] (53.2862 [ns/kmer]) -total index size: 1600485105 [B] -- 1600.49 [MB] -SPACE BREAKDOWN: - mphf: 0.447872 [bits/kmer] (2.84923 [bits/key]) -- 3.88627% - strings_offsets: 0.337884 [bits/kmer] -- 2.93189% - control_codewords: 5.03009 [bits/kmer] -- 43.6471% - mid_load_buckets: 2.30452 [bits/kmer] -- 19.9968% - begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.67449e-05% - strings: 3.1245 [bits/kmer] -- 27.1119% - skew_index: 0.279583 [bits/kmer] -- 2.426% - weights: 1.32491e-06 [bits/kmer] -- 1.14965e-05% - -------------- - total: 11.5244 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 88.1478% -buckets with 2 minimizer positions = 6.79213% -buckets with 3 minimizer positions = 1.92226% -buckets with 4 minimizer positions = 0.856078% -buckets with 5 minimizer positions = 0.493468% -buckets with 6 minimizer positions = 0.325915% -buckets with 7 minimizer positions = 0.234531% -buckets with 8 minimizer positions = 0.178296% -buckets with 9 minimizer positions = 0.141164% -buckets with 10 minimizer positions = 0.115104% -buckets with 11 minimizer positions = 0.0959486% -buckets with 12 minimizer positions = 0.0807615% -buckets with 13 minimizer positions = 0.0695379% -buckets with 14 minimizer positions = 0.060729% -buckets with 15 minimizer positions = 0.0531947% -buckets with 16 minimizer positions = 0.0472706% -max_bucket_size 37043 -2025-10-22 15:46:47: saving data structure to disk... -2025-10-22 15:46:48: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k31.canon.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... -read 100000 sequences, 8718431 bases, 5718431 kmers -read 200000 sequences, 17474097 bases, 11474097 kmers -read 300000 sequences, 26299449 bases, 17299449 kmers -read 400000 sequences, 35167130 bases, 23167130 kmers -read 500000 sequences, 43967965 bases, 28967965 kmers -read 600000 sequences, 52886445 bases, 34886445 kmers -read 700000 sequences, 61937196 bases, 40937196 kmers -read 800000 sequences, 71070714 bases, 47070714 kmers -read 900000 sequences, 80176912 bases, 53176912 kmers -read 1000000 sequences, 89525906 bases, 59525906 kmers -read 1100000 sequences, 98984859 bases, 65984859 kmers -read 1200000 sequences, 108719881 bases, 72719881 kmers -read 1300000 sequences, 118280880 bases, 79280880 kmers -read 1400000 sequences, 127917770 bases, 85917770 kmers -read 1500000 sequences, 137591691 bases, 92591691 kmers -read 1600000 sequences, 147395215 bases, 99395215 kmers -read 1700000 sequences, 157335047 bases, 106335047 kmers -read 1800000 sequences, 167445213 bases, 113445213 kmers -read 1900000 sequences, 177725569 bases, 120725569 kmers -read 2000000 sequences, 188052064 bases, 128052064 kmers -read 2100000 sequences, 198499534 bases, 135499534 kmers -read 2200000 sequences, 209053278 bases, 143053278 kmers -read 2300000 sequences, 219848016 bases, 150848016 kmers -read 2400000 sequences, 230787167 bases, 158787167 kmers -read 2500000 sequences, 242014409 bases, 167014409 kmers -read 2600000 sequences, 253501985 bases, 175501985 kmers -read 2700000 sequences, 265108770 bases, 184108770 kmers -read 2800000 sequences, 277040197 bases, 193040197 kmers -read 2900000 sequences, 289406751 bases, 202406751 kmers -read 3000000 sequences, 302142183 bases, 212142183 kmers -read 3100000 sequences, 315168435 bases, 222168435 kmers -read 3200000 sequences, 329083083 bases, 233083083 kmers -read 3300000 sequences, 343508535 bases, 244508535 kmers -read 3400000 sequences, 358608045 bases, 256608045 kmers -read 3500000 sequences, 374790387 bases, 269790387 kmers -read 3600000 sequences, 392124136 bases, 284124136 kmers -read 3700000 sequences, 410698510 bases, 299698510 kmers -read 3800000 sequences, 431358064 bases, 317358064 kmers -read 3900000 sequences, 454179453 bases, 337179453 kmers -read 4000000 sequences, 461236524 bases, 341236524 kmers -read 4100000 sequences, 468031549 bases, 345031549 kmers -read 4200000 sequences, 474889571 bases, 348889571 kmers -read 4300000 sequences, 481729708 bases, 352729708 kmers -read 4400000 sequences, 488721954 bases, 356721954 kmers -read 4500000 sequences, 495625078 bases, 360625078 kmers -read 4600000 sequences, 502596576 bases, 364596576 kmers -read 4700000 sequences, 509600517 bases, 368600517 kmers -read 4800000 sequences, 516484470 bases, 372484470 kmers -read 4900000 sequences, 523427219 bases, 376427219 kmers -read 5000000 sequences, 530371783 bases, 380371783 kmers -read 5100000 sequences, 537329595 bases, 384329595 kmers -read 5200000 sequences, 544209359 bases, 388209359 kmers -read 5300000 sequences, 551189922 bases, 392189922 kmers -read 5400000 sequences, 558101939 bases, 396101939 kmers -read 5500000 sequences, 565120163 bases, 400120163 kmers -read 5600000 sequences, 572157570 bases, 404157570 kmers -read 5700000 sequences, 579064866 bases, 408064866 kmers -read 5800000 sequences, 586002711 bases, 412002711 kmers -read 5900000 sequences, 592940936 bases, 415940936 kmers -read 6000000 sequences, 600036489 bases, 420036489 kmers -read 6100000 sequences, 607035798 bases, 424035798 kmers -read 6200000 sequences, 614208718 bases, 428208718 kmers -read 6300000 sequences, 621168245 bases, 432168245 kmers -read 6400000 sequences, 628072498 bases, 436072498 kmers -read 6500000 sequences, 635102614 bases, 440102614 kmers -read 6600000 sequences, 642120732 bases, 444120732 kmers -read 6700000 sequences, 649088967 bases, 448088967 kmers -read 6800000 sequences, 656101755 bases, 452101755 kmers -read 6900000 sequences, 663148884 bases, 456148884 kmers -read 7000000 sequences, 670072473 bases, 460072473 kmers -read 7100000 sequences, 677027864 bases, 464027864 kmers -read 7200000 sequences, 684172202 bases, 468172202 kmers -read 7300000 sequences, 691211207 bases, 472211207 kmers -read 7400000 sequences, 698208790 bases, 476208790 kmers -read 7500000 sequences, 705328995 bases, 480328995 kmers -read 7600000 sequences, 712361023 bases, 484361023 kmers -read 7700000 sequences, 719471804 bases, 488471804 kmers -read 7800000 sequences, 726605138 bases, 492605138 kmers -read 7900000 sequences, 733774594 bases, 496774594 kmers -read 8000000 sequences, 740830673 bases, 500830673 kmers -read 8100000 sequences, 747950180 bases, 504950180 kmers -read 8200000 sequences, 755058730 bases, 509058730 kmers -read 8300000 sequences, 762216427 bases, 513216427 kmers -read 8400000 sequences, 769353851 bases, 517353851 kmers -read 8500000 sequences, 776583161 bases, 521583161 kmers -read 8600000 sequences, 783816261 bases, 525816261 kmers -read 8700000 sequences, 791077370 bases, 530077370 kmers -read 8800000 sequences, 798157781 bases, 534157781 kmers -read 8900000 sequences, 805241016 bases, 538241016 kmers -read 9000000 sequences, 812530455 bases, 542530455 kmers -read 9100000 sequences, 819617693 bases, 546617693 kmers -read 9200000 sequences, 826809772 bases, 550809772 kmers -read 9300000 sequences, 833919107 bases, 554919107 kmers -read 9400000 sequences, 841155666 bases, 559155666 kmers -read 9500000 sequences, 848401695 bases, 563401695 kmers -read 9600000 sequences, 855643716 bases, 567643716 kmers -read 9700000 sequences, 862872782 bases, 571872782 kmers -read 9800000 sequences, 870171741 bases, 576171741 kmers -read 9900000 sequences, 877460939 bases, 580460939 kmers -read 10000000 sequences, 884692153 bases, 584692153 kmers -read 10100000 sequences, 891988915 bases, 588988915 kmers -read 10200000 sequences, 899332167 bases, 593332167 kmers -read 10300000 sequences, 906596132 bases, 597596132 kmers -read 10400000 sequences, 913914222 bases, 601914222 kmers -read 10500000 sequences, 921197164 bases, 606197164 kmers -read 10600000 sequences, 928621352 bases, 610621352 kmers -read 10700000 sequences, 935962590 bases, 614962590 kmers -read 10800000 sequences, 943225398 bases, 619225398 kmers -read 10900000 sequences, 950606271 bases, 623606271 kmers -read 11000000 sequences, 958222271 bases, 628222271 kmers -read 11100000 sequences, 965609642 bases, 632609642 kmers -read 11200000 sequences, 972999574 bases, 636999574 kmers -read 11300000 sequences, 980385996 bases, 641385996 kmers -read 11400000 sequences, 987756692 bases, 645756692 kmers -read 11500000 sequences, 995228727 bases, 650228727 kmers -read 11600000 sequences, 1002716000 bases, 654716000 kmers -read 11700000 sequences, 1010163238 bases, 659163238 kmers -read 11800000 sequences, 1017604060 bases, 663604060 kmers -read 11900000 sequences, 1025150347 bases, 668150347 kmers -read 12000000 sequences, 1032736062 bases, 672736062 kmers -read 12100000 sequences, 1040213508 bases, 677213508 kmers -read 12200000 sequences, 1047864763 bases, 681864763 kmers -read 12300000 sequences, 1055370986 bases, 686370986 kmers -read 12400000 sequences, 1062882136 bases, 690882136 kmers -read 12500000 sequences, 1070457834 bases, 695457834 kmers -read 12600000 sequences, 1078056503 bases, 700056503 kmers -read 12700000 sequences, 1085619892 bases, 704619892 kmers -read 12800000 sequences, 1093220371 bases, 709220371 kmers -read 12900000 sequences, 1100938017 bases, 713938017 kmers -read 13000000 sequences, 1108501169 bases, 718501169 kmers -read 13100000 sequences, 1116117667 bases, 723117667 kmers -read 13200000 sequences, 1123791984 bases, 727791984 kmers -read 13300000 sequences, 1131456294 bases, 732456294 kmers -read 13400000 sequences, 1139167231 bases, 737167231 kmers -read 13500000 sequences, 1147084240 bases, 742084240 kmers -read 13600000 sequences, 1154903455 bases, 746903455 kmers -read 13700000 sequences, 1162719581 bases, 751719581 kmers -read 13800000 sequences, 1170515268 bases, 756515268 kmers -read 13900000 sequences, 1178310906 bases, 761310906 kmers -read 14000000 sequences, 1186158510 bases, 766158510 kmers -read 14100000 sequences, 1194143461 bases, 771143461 kmers -read 14200000 sequences, 1202037257 bases, 776037257 kmers -read 14300000 sequences, 1210016774 bases, 781016774 kmers -read 14400000 sequences, 1217929746 bases, 785929746 kmers -read 14500000 sequences, 1226009557 bases, 791009557 kmers -read 14600000 sequences, 1233936531 bases, 795936531 kmers -read 14700000 sequences, 1241953842 bases, 800953842 kmers -read 14800000 sequences, 1249971925 bases, 805971925 kmers -read 14900000 sequences, 1258012031 bases, 811012031 kmers -read 15000000 sequences, 1266102895 bases, 816102895 kmers -read 15100000 sequences, 1274149698 bases, 821149698 kmers -read 15200000 sequences, 1282474916 bases, 826474916 kmers -read 15300000 sequences, 1290768947 bases, 831768947 kmers -read 15400000 sequences, 1299121797 bases, 837121797 kmers -read 15500000 sequences, 1307304198 bases, 842304198 kmers -read 15600000 sequences, 1315661756 bases, 847661756 kmers -read 15700000 sequences, 1324089837 bases, 853089837 kmers -read 15800000 sequences, 1332318617 bases, 858318617 kmers -read 15900000 sequences, 1340760587 bases, 863760587 kmers -read 16000000 sequences, 1349263765 bases, 869263765 kmers -read 16100000 sequences, 1357811757 bases, 874811757 kmers -read 16200000 sequences, 1366358226 bases, 880358226 kmers -read 16300000 sequences, 1375027036 bases, 886027036 kmers -read 16400000 sequences, 1383710258 bases, 891710258 kmers -=== step 1.1: 'encoding input' 4.68884 [sec] (5.24296 [ns/kmer]) -read 16440873 sequences, 1387536274 bases, 894310084 kmers -num_kmers 894310084 -cost: 2.0 + 1.10303 [bits/kmer] -max_len 117016 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.2899 [sec] (1.44234 [ns/kmer]) -=== step 1: 'parse file' 5.97888 [sec] (6.68547 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 14.7808 [sec] (16.5276 [ns/kmer]) -num_minimizers = 143418843 -num_minimizer_positions = 193511241 -num_super_kmers = 200364919 -building minimizers MPHF with 64 threads and 48 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.20897 [sec] (6.94274 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761151044181835280.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.03814 [sec] (7.86991 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.8231 [sec] (3.15673 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 18123968/143418843 (12.6371%) -num_buckets_in_skew_index 15172/143418843 (0.0105788%) -max_bucket_size 30655 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 65664193/193511241 (33.933%) -num_minimizer_positions_of_buckets_in_skew_index 2567345/193511241 (1.32672%) -computing minimizers offsets: 3.98591 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4240400 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1914946 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1106165 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 771672 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 562721 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 475654 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 388509 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 30655: 459571 -num_kmers_in_skew_index 9919638 (1.10919%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4240400 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4240400 kmers; bits/key = 2.84282 - built positions[0] for 4240400 kmers; bits/key = 7.00008 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1914946 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1914946)... - built mphs[1] for 1914946 kmers; bits/key = 2.56017 - built positions[1] for 1914946 kmers; bits/key = 8.00019 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1106165 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1106165)... - built mphs[2] for 1106165 kmers; bits/key = 2.56093 - built positions[2] for 1106165 kmers; bits/key = 9.00032 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 771672 - building MPHF with 64 threads and 1 partitions (avg. partition size = 771672)... - built mphs[3] for 771672 kmers; bits/key = 2.41893 - built positions[3] for 771672 kmers; bits/key = 10.0004 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 562721 - building MPHF with 64 threads and 1 partitions (avg. partition size = 562721)... - built mphs[4] for 562721 kmers; bits/key = 2.56295 - built positions[4] for 562721 kmers; bits/key = 11.0006 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 475654 - building MPHF with 64 threads and 1 partitions (avg. partition size = 475654)... - built mphs[5] for 475654 kmers; bits/key = 2.56365 - built positions[5] for 475654 kmers; bits/key = 12.0008 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 388509 - building MPHF with 64 threads and 1 partitions (avg. partition size = 388509)... - built mphs[6] for 388509 kmers; bits/key = 2.42185 - built positions[6] for 388509 kmers; bits/key = 13.0008 - lower = 8192; upper = 30655; num_bits_per_pos = 15; num_kmers_in_partition = 459571 - building MPHF with 64 threads and 1 partitions (avg. partition size = 459571)... - built mphs[7] for 459571 kmers; bits/key = 2.4208 - built positions[7] for 459571 kmers; bits/key = 15.0007 -computing skew index took: 3.84596 [sec] -=== step 3: 'build sparse and skew index' 8.13507 [sec] (9.09647 [ns/kmer]) -=== total_time 44.9649 [sec] (50.2789 [ns/kmer]) -total index size: 1287008492 [B] -- 1287.01 [MB] -SPACE BREAKDOWN: - mphf: 0.453288 [bits/kmer] (2.82655 [bits/key]) -- 3.93723% - strings_offsets: 0.333373 [bits/kmer] -- 2.89565% - control_codewords: 5.13178 [bits/kmer] -- 44.5743% - mid_load_buckets: 2.27616 [bits/kmer] -- 19.7706% - begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.08235e-05% - strings: 3.10303 [bits/kmer] -- 26.9527% - skew_index: 0.215227 [bits/kmer] -- 1.86944% - weights: 1.64596e-06 [bits/kmer] -- 1.42967e-05% - -------------- - total: 11.5129 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 87.3523% -buckets with 2 minimizer positions = 7.4877% -buckets with 3 minimizer positions = 2.14684% -buckets with 4 minimizer positions = 0.927917% -buckets with 5 minimizer positions = 0.508829% -buckets with 6 minimizer positions = 0.320607% -buckets with 7 minimizer positions = 0.221914% -buckets with 8 minimizer positions = 0.16449% -buckets with 9 minimizer positions = 0.128547% -buckets with 10 minimizer positions = 0.104586% -buckets with 11 minimizer positions = 0.0865967% -buckets with 12 minimizer positions = 0.0732902% -buckets with 13 minimizer positions = 0.062991% -buckets with 14 minimizer positions = 0.0543541% -buckets with 15 minimizer positions = 0.0475495% -buckets with 16 minimizer positions = 0.0409653% -max_bucket_size 30655 -2025-10-22 18:38:09: saving data structure to disk... -2025-10-22 18:38:11: DONE - diff --git a/benchmarks/results-22-10-25/k31/regular-bench.log b/benchmarks/results-22-10-25/k31/regular-bench.log deleted file mode 100644 index 1ba03dc..0000000 --- a/benchmarks/results-22-10-25/k31/regular-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 648.305 -avg_nanosec_per_negative_lookup 695.741 -avg_nanosec_per_access 279.6 -iterator: avg_nanosec_per_kmer 2.53235 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 653.268 -avg_nanosec_per_negative_lookup 695.842 -avg_nanosec_per_access 279.349 -iterator: avg_nanosec_per_kmer 2.61822 -./sshash bench -i cod.k31.sshash -avg_nanosec_per_positive_lookup 634.66 -avg_nanosec_per_negative_lookup 700.528 -avg_nanosec_per_access 290.753 -iterator: avg_nanosec_per_kmer 2.744 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 625.999 -avg_nanosec_per_negative_lookup 757.035 -avg_nanosec_per_access 287.668 -iterator: avg_nanosec_per_kmer 2.62408 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 628.17 -avg_nanosec_per_negative_lookup 751.121 -avg_nanosec_per_access 279.75 -iterator: avg_nanosec_per_kmer 2.65167 -./sshash bench -i kestrel.k31.sshash -avg_nanosec_per_positive_lookup 637.028 -avg_nanosec_per_negative_lookup 756.516 -avg_nanosec_per_access 279.722 -iterator: avg_nanosec_per_kmer 2.78434 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 883.449 -avg_nanosec_per_negative_lookup 830.867 -avg_nanosec_per_access 358.553 -iterator: avg_nanosec_per_kmer 2.71647 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 880.462 -avg_nanosec_per_negative_lookup 826.909 -avg_nanosec_per_access 356.664 -iterator: avg_nanosec_per_kmer 2.70977 -./sshash bench -i human.k31.sshash -avg_nanosec_per_positive_lookup 878.291 -avg_nanosec_per_negative_lookup 828.208 -avg_nanosec_per_access 361.108 -iterator: avg_nanosec_per_kmer 2.73747 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1142.35 -avg_nanosec_per_negative_lookup 903.169 -avg_nanosec_per_access 556.08 -iterator: avg_nanosec_per_kmer 2.5543 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1133.38 -avg_nanosec_per_negative_lookup 887.641 -avg_nanosec_per_access 560.262 -iterator: avg_nanosec_per_kmer 2.52931 -./sshash bench -i hprc.k31.sshash -avg_nanosec_per_positive_lookup 1128.25 -avg_nanosec_per_negative_lookup 897.297 -avg_nanosec_per_access 570.004 -iterator: avg_nanosec_per_kmer 2.58062 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 1075.35 -avg_nanosec_per_negative_lookup 788.298 -avg_nanosec_per_access 400.502 -iterator: avg_nanosec_per_kmer 2.62252 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 1057.65 -avg_nanosec_per_negative_lookup 785.094 -avg_nanosec_per_access 395.239 -iterator: avg_nanosec_per_kmer 2.56189 -./sshash bench -i ec.k31.sshash -avg_nanosec_per_positive_lookup 1060.7 -avg_nanosec_per_negative_lookup 786.358 -avg_nanosec_per_access 394.851 -iterator: avg_nanosec_per_kmer 2.76176 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 975.228 -avg_nanosec_per_negative_lookup 777.359 -avg_nanosec_per_access 364.022 -iterator: avg_nanosec_per_kmer 2.58587 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 974.828 -avg_nanosec_per_negative_lookup 767.215 -avg_nanosec_per_access 370.83 -iterator: avg_nanosec_per_kmer 2.48011 -./sshash bench -i se.k31.sshash -avg_nanosec_per_positive_lookup 979.848 -avg_nanosec_per_negative_lookup 758.218 -avg_nanosec_per_access 378.567 -iterator: avg_nanosec_per_kmer 2.50634 diff --git a/benchmarks/results-22-10-25/k31/regular-build.log b/benchmarks/results-22-10-25/k31/regular-build.log deleted file mode 100644 index 5483668..0000000 --- a/benchmarks/results-22-10-25/k31/regular-build.log +++ /dev/null @@ -1,2206 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o cod.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... -read 100000 sequences, 25039709 bases, 22039709 kmers -read 200000 sequences, 50140769 bases, 44140769 kmers -read 300000 sequences, 75429503 bases, 66429503 kmers -read 400000 sequences, 100861284 bases, 88861284 kmers -read 500000 sequences, 126668595 bases, 111668595 kmers -read 600000 sequences, 152842190 bases, 134842190 kmers -read 700000 sequences, 179047111 bases, 158047111 kmers -read 800000 sequences, 205700617 bases, 181700617 kmers -read 900000 sequences, 232874017 bases, 205874017 kmers -read 1000000 sequences, 260758668 bases, 230758668 kmers -read 1100000 sequences, 290089276 bases, 257089276 kmers -read 1200000 sequences, 322579696 bases, 286579696 kmers -read 1300000 sequences, 361073757 bases, 322073757 kmers -read 1400000 sequences, 398962877 bases, 356962877 kmers -read 1500000 sequences, 424322359 bases, 379322359 kmers -read 1600000 sequences, 449412328 bases, 401412328 kmers -read 1700000 sequences, 474428244 bases, 423428244 kmers -read 1800000 sequences, 499637157 bases, 445637157 kmers -read 1900000 sequences, 524718987 bases, 467718987 kmers -read 2000000 sequences, 549832064 bases, 489832064 kmers -=== step 1.1: 'encoding input' 1.60941 [sec] (3.20302 [ns/kmer]) -read 2057242 sequences, 564182460 bases, 502465200 kmers -num_kmers 502465200 -cost: 2.0 + 0.245658 [bits/kmer] -max_len 31415 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 15 -num. bits per_string_id 21 -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.627384 [sec] (1.24861 [ns/kmer]) -=== step 1: 'parse file' 2.2369 [sec] (4.45185 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.89184 [sec] (11.7259 [ns/kmer]) -num_minimizers = 72381146 -num_minimizer_positions = 78455681 -num_super_kmers = 78455681 -building minimizers MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.3287 [sec] (6.62473 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761139869576158246.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.1333 [sec] (6.23585 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.5676 [sec] (3.11981 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 2259768/72381146 (3.12204%) -num_buckets_in_skew_index 4215/72381146 (0.00582334%) -max_bucket_size 70346 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 7357522/78455681 (9.37793%) -num_minimizer_positions_of_buckets_in_skew_index 980996/78455681 (1.25038%) -computing minimizers offsets: 0.885346 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1260546 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 994175 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 665719 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 408608 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 423234 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 271419 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 288814 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 70346: 428378 -num_kmers_in_skew_index 4740893 (0.943527%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 1260546 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1260546)... - built mphs[0] for 1260546 kmers; bits/key = 2.56076 - built positions[0] for 1260546 kmers; bits/key = 7.00029 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 994175 - building MPHF with 64 threads and 1 partitions (avg. partition size = 994175)... - built mphs[1] for 994175 kmers; bits/key = 2.41831 - built positions[1] for 994175 kmers; bits/key = 8.00033 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 665719 - building MPHF with 64 threads and 1 partitions (avg. partition size = 665719)... - built mphs[2] for 665719 kmers; bits/key = 2.41938 - built positions[2] for 665719 kmers; bits/key = 9.00051 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 408608 - building MPHF with 64 threads and 1 partitions (avg. partition size = 408608)... - built mphs[3] for 408608 kmers; bits/key = 2.42149 - built positions[3] for 408608 kmers; bits/key = 10.0008 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 423234 - building MPHF with 64 threads and 1 partitions (avg. partition size = 423234)... - built mphs[4] for 423234 kmers; bits/key = 2.56407 - built positions[4] for 423234 kmers; bits/key = 11.0009 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 271419 - building MPHF with 64 threads and 1 partitions (avg. partition size = 271419)... - built mphs[5] for 271419 kmers; bits/key = 2.42412 - built positions[5] for 271419 kmers; bits/key = 12.0014 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 288814 - building MPHF with 64 threads and 1 partitions (avg. partition size = 288814)... - built mphs[6] for 288814 kmers; bits/key = 2.42387 - built positions[6] for 288814 kmers; bits/key = 13.0013 - lower = 8192; upper = 70346; num_bits_per_pos = 17; num_kmers_in_partition = 428378 - building MPHF with 64 threads and 1 partitions (avg. partition size = 428378)... - built mphs[7] for 428378 kmers; bits/key = 2.56398 - built positions[7] for 428378 kmers; bits/key = 17.0008 -computing skew index took: 2.63084 [sec] -=== step 3: 'build sparse and skew index' 3.62251 [sec] (7.20948 [ns/kmer]) -=== total_time 19.7808 [sec] (39.3676 [ns/kmer]) -total index size: 495332369 [B] -- 495.332 [MB] -SPACE BREAKDOWN: - mphf: 0.41828 [bits/kmer] (2.90367 [bits/key]) -- 5.30379% - strings_offsets: 0.144419 [bits/kmer] -- 1.83123% - control_codewords: 4.46561 [bits/kmer] -- 56.624% - mid_load_buckets: 0.439286 [bits/kmer] -- 5.57015% - begin_buckets_of_size: 4.26696e-06 [bits/kmer] -- 5.41051e-05% - strings: 2.24566 [bits/kmer] -- 28.4749% - skew_index: 0.173169 [bits/kmer] -- 2.19578% - weights: 2.92956e-06 [bits/kmer] -- 3.71468e-05% - -------------- - total: 7.88643 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.8721% -buckets with 2 minimizer positions = 2.00417% -buckets with 3 minimizer positions = 0.51765% -buckets with 4 minimizer positions = 0.211311% -buckets with 5 minimizer positions = 0.109826% -buckets with 6 minimizer positions = 0.0661802% -buckets with 7 minimizer positions = 0.0437061% -buckets with 8 minimizer positions = 0.0308464% -buckets with 9 minimizer positions = 0.0235614% -buckets with 10 minimizer positions = 0.0177228% -buckets with 11 minimizer positions = 0.0139967% -buckets with 12 minimizer positions = 0.0112902% -buckets with 13 minimizer positions = 0.00931044% -buckets with 14 minimizer positions = 0.00771748% -buckets with 15 minimizer positions = 0.00632347% -buckets with 16 minimizer positions = 0.00528591% -max_bucket_size 70346 -2025-10-22 15:31:29: saving data structure to disk... -2025-10-22 15:31:29: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k31.sshash -k = 31, m = 20, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... -read 100000 sequences, 213090663 bases, 210090663 kmers -read 200000 sequences, 390706054 bases, 384706054 kmers -read 300000 sequences, 575072969 bases, 566072969 kmers -read 400000 sequences, 764532516 bases, 752532516 kmers -read 500000 sequences, 971034211 bases, 956034211 kmers -=== step 1.1: 'encoding input' 2.82986 [sec] (2.4599 [ns/kmer]) -read 582860 sequences, 1167885005 bases, 1150399205 kmers -num_kmers 1150399205 -cost: 2.0 + 0.0303995 [bits/kmer] -max_len 111973 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.21188 [sec] (1.05344 [ns/kmer]) -=== step 1: 'parse file' 4.04186 [sec] (3.51344 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.9524 [sec] (11.2591 [ns/kmer]) -num_minimizers = 173258591 -num_minimizer_positions = 175959772 -num_super_kmers = 175959772 -building minimizers MPHF with 64 threads and 58 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 7.3914 [sec] (6.42507 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761139890039913034.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.04416 [sec] (6.12323 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.90168 [sec] (3.39159 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 1311512/173258591 (0.756968%) -num_buckets_in_skew_index 1541/173258591 (0.000889422%) -max_bucket_size 3747 -log2_max_bucket_size 12 -skew index num_partitions 6 -num_minimizer_positions_of_buckets_larger_than_1 3806575/175959772 (2.16332%) -num_minimizer_positions_of_buckets_in_skew_index 207659/175959772 (0.118015%) -computing minimizers offsets: 1.44785 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 559507 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 317132 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 144139 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 106543 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 21308 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3747: 36738 -num_kmers_in_skew_index 1185367 (0.10304%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 559507 - building MPHF with 64 threads and 1 partitions (avg. partition size = 559507)... - built mphs[0] for 559507 kmers; bits/key = 2.41999 - built positions[0] for 559507 kmers; bits/key = 7.00068 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 317132 - building MPHF with 64 threads and 1 partitions (avg. partition size = 317132)... - built mphs[1] for 317132 kmers; bits/key = 2.42276 - built positions[1] for 317132 kmers; bits/key = 8.00111 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 144139 - building MPHF with 64 threads and 1 partitions (avg. partition size = 144139)... - built mphs[2] for 144139 kmers; bits/key = 2.43099 - built positions[2] for 144139 kmers; bits/key = 9.00242 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 106543 - building MPHF with 64 threads and 1 partitions (avg. partition size = 106543)... - built mphs[3] for 106543 kmers; bits/key = 2.43597 - built positions[3] for 106543 kmers; bits/key = 10.0034 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 21308 - building MPHF with 64 threads and 1 partitions (avg. partition size = 21308)... - built mphs[4] for 21308 kmers; bits/key = 2.51323 - built positions[4] for 21308 kmers; bits/key = 11.0171 - lower = 2048; upper = 3747; num_bits_per_pos = 12; num_kmers_in_partition = 36738 - building MPHF with 64 threads and 1 partitions (avg. partition size = 36738)... - built mphs[5] for 36738 kmers; bits/key = 2.4746 - built positions[5] for 36738 kmers; bits/key = 12.0098 -computing skew index took: 0.683529 [sec] -=== step 3: 'build sparse and skew index' 2.37095 [sec] (2.06098 [ns/kmer]) -=== total_time 37.7025 [sec] (32.7734 [ns/kmer]) -total index size: 1077792931 [B] -- 1077.79 [MB] -SPACE BREAKDOWN: - mphf: 0.426302 [bits/kmer] (2.83055 [bits/key]) -- 5.68775% - strings_offsets: 0.100021 [bits/kmer] -- 1.33448% - control_codewords: 4.81944 [bits/kmer] -- 64.3013% - mid_load_buckets: 0.102577 [bits/kmer] -- 1.36859% - begin_buckets_of_size: 1.8637e-06 [bits/kmer] -- 2.48656e-05% - strings: 2.0304 [bits/kmer] -- 27.0897% - skew_index: 0.0163494 [bits/kmer] -- 0.218135% - weights: 1.27956e-06 [bits/kmer] -- 1.70719e-05% - -------------- - total: 7.49509 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.2421% -buckets with 2 minimizer positions = 0.571193% -buckets with 3 minimizer positions = 0.0840564% -buckets with 4 minimizer positions = 0.0345576% -buckets with 5 minimizer positions = 0.0184735% -buckets with 6 minimizer positions = 0.011514% -buckets with 7 minimizer positions = 0.00772718% -buckets with 8 minimizer positions = 0.00537809% -buckets with 9 minimizer positions = 0.00392246% -buckets with 10 minimizer positions = 0.00304862% -buckets with 11 minimizer positions = 0.00236583% -buckets with 12 minimizer positions = 0.0019139% -buckets with 13 minimizer positions = 0.00156356% -buckets with 14 minimizer positions = 0.00127613% -buckets with 15 minimizer positions = 0.00105276% -buckets with 16 minimizer positions = 0.000939636% -max_bucket_size 3747 -2025-10-22 15:32:08: saving data structure to disk... -2025-10-22 15:32:08: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o human.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... -read 100000 sequences, 24154227 bases, 21154227 kmers -read 200000 sequences, 48616745 bases, 42616745 kmers -read 300000 sequences, 73131168 bases, 64131168 kmers -read 400000 sequences, 97783784 bases, 85783784 kmers -read 500000 sequences, 122219552 bases, 107219552 kmers -read 600000 sequences, 146714901 bases, 128714901 kmers -read 700000 sequences, 171233804 bases, 150233804 kmers -read 800000 sequences, 195697027 bases, 171697027 kmers -read 900000 sequences, 220477681 bases, 193477681 kmers -read 1000000 sequences, 245137036 bases, 215137036 kmers -read 1100000 sequences, 269861607 bases, 236861607 kmers -read 1200000 sequences, 294553493 bases, 258553493 kmers -read 1300000 sequences, 319281545 bases, 280281545 kmers -read 1400000 sequences, 344259217 bases, 302259217 kmers -read 1500000 sequences, 368900918 bases, 323900918 kmers -read 1600000 sequences, 393910514 bases, 345910514 kmers -read 1700000 sequences, 418576877 bases, 367576877 kmers -read 1800000 sequences, 443411058 bases, 389411058 kmers -read 1900000 sequences, 468035760 bases, 411035760 kmers -read 2000000 sequences, 492922311 bases, 432922311 kmers -read 2100000 sequences, 517853084 bases, 454853084 kmers -read 2200000 sequences, 542402295 bases, 476402295 kmers -read 2300000 sequences, 567260929 bases, 498260929 kmers -read 2400000 sequences, 592478511 bases, 520478511 kmers -read 2500000 sequences, 617295104 bases, 542295104 kmers -read 2600000 sequences, 642488145 bases, 564488145 kmers -read 2700000 sequences, 667681578 bases, 586681578 kmers -read 2800000 sequences, 693019259 bases, 609019259 kmers -read 2900000 sequences, 718419143 bases, 631419143 kmers -read 3000000 sequences, 743136741 bases, 653136741 kmers -read 3100000 sequences, 768135640 bases, 675135640 kmers -read 3200000 sequences, 793535062 bases, 697535062 kmers -read 3300000 sequences, 819157829 bases, 720157829 kmers -read 3400000 sequences, 844256835 bases, 742256835 kmers -read 3500000 sequences, 869741969 bases, 764741969 kmers -read 3600000 sequences, 895152274 bases, 787152274 kmers -read 3700000 sequences, 920884378 bases, 809884378 kmers -read 3800000 sequences, 946277383 bases, 832277383 kmers -read 3900000 sequences, 972103118 bases, 855103118 kmers -read 4000000 sequences, 997901947 bases, 877901947 kmers -read 4100000 sequences, 1023962646 bases, 900962646 kmers -read 4200000 sequences, 1050002968 bases, 924002968 kmers -read 4300000 sequences, 1076025969 bases, 947025969 kmers -read 4400000 sequences, 1101901631 bases, 969901631 kmers -read 4500000 sequences, 1127998278 bases, 992998278 kmers -read 4600000 sequences, 1153713407 bases, 1015713407 kmers -read 4700000 sequences, 1179840926 bases, 1038840926 kmers -read 4800000 sequences, 1205900970 bases, 1061900970 kmers -read 4900000 sequences, 1232271178 bases, 1085271178 kmers -read 5000000 sequences, 1259012338 bases, 1109012338 kmers -read 5100000 sequences, 1285390459 bases, 1132390459 kmers -read 5200000 sequences, 1312574249 bases, 1156574249 kmers -read 5300000 sequences, 1339714478 bases, 1180714478 kmers -read 5400000 sequences, 1366712591 bases, 1204712591 kmers -read 5500000 sequences, 1394310534 bases, 1229310534 kmers -read 5600000 sequences, 1421870003 bases, 1253870003 kmers -read 5700000 sequences, 1449547648 bases, 1278547648 kmers -read 5800000 sequences, 1477687357 bases, 1303687357 kmers -read 5900000 sequences, 1505662954 bases, 1328662954 kmers -read 6000000 sequences, 1534166192 bases, 1354166192 kmers -read 6100000 sequences, 1562404881 bases, 1379404881 kmers -read 6200000 sequences, 1591527069 bases, 1405527069 kmers -read 6300000 sequences, 1620530804 bases, 1431530804 kmers -read 6400000 sequences, 1650356233 bases, 1458356233 kmers -read 6500000 sequences, 1680100821 bases, 1485100821 kmers -read 6600000 sequences, 1709838197 bases, 1511838197 kmers -read 6700000 sequences, 1739768925 bases, 1538768925 kmers -read 6800000 sequences, 1771033269 bases, 1567033269 kmers -read 6900000 sequences, 1802736428 bases, 1595736428 kmers -read 7000000 sequences, 1835088477 bases, 1625088477 kmers -read 7100000 sequences, 1868203051 bases, 1655203051 kmers -read 7200000 sequences, 1901851998 bases, 1685851998 kmers -read 7300000 sequences, 1936102668 bases, 1717102668 kmers -read 7400000 sequences, 1971764309 bases, 1749764309 kmers -read 7500000 sequences, 2008379679 bases, 1783379679 kmers -read 7600000 sequences, 2046720436 bases, 1818720436 kmers -read 7700000 sequences, 2086662475 bases, 1855662475 kmers -read 7800000 sequences, 2129062951 bases, 1895062951 kmers -read 7900000 sequences, 2174789182 bases, 1937789182 kmers -read 8000000 sequences, 2224822737 bases, 1984822737 kmers -read 8100000 sequences, 2283235936 bases, 2040235936 kmers -read 8200000 sequences, 2311905494 bases, 2065905494 kmers -read 8300000 sequences, 2336057351 bases, 2087057351 kmers -read 8400000 sequences, 2360509696 bases, 2108509696 kmers -read 8500000 sequences, 2384831354 bases, 2129831354 kmers -read 8600000 sequences, 2409417290 bases, 2151417290 kmers -read 8700000 sequences, 2433617061 bases, 2172617061 kmers -read 8800000 sequences, 2458186109 bases, 2194186109 kmers -read 8900000 sequences, 2482411693 bases, 2215411693 kmers -read 9000000 sequences, 2506972380 bases, 2236972380 kmers -read 9100000 sequences, 2531678312 bases, 2258678312 kmers -read 9200000 sequences, 2555989599 bases, 2279989599 kmers -read 9300000 sequences, 2580569607 bases, 2301569607 kmers -read 9400000 sequences, 2605362854 bases, 2323362854 kmers -read 9500000 sequences, 2629786955 bases, 2344786955 kmers -read 9600000 sequences, 2654330707 bases, 2366330707 kmers -read 9700000 sequences, 2679002962 bases, 2388002962 kmers -read 9800000 sequences, 2703472217 bases, 2409472217 kmers -read 9900000 sequences, 2727977441 bases, 2430977441 kmers -read 10000000 sequences, 2751909556 bases, 2451909556 kmers -read 10100000 sequences, 2776332680 bases, 2473332680 kmers -read 10200000 sequences, 2800726063 bases, 2494726063 kmers -=== step 1.1: 'encoding input' 7.47891 [sec] (2.98478 [ns/kmer]) -read 10250465 sequences, 2813192630 bases, 2505678680 kmers -num_kmers 2505678680 -cost: 2.0 + 0.245454 [bits/kmer] -max_len 35848 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 16 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.72.bin'... -=== step 1.2: 'computing minimizers tuples' 2.88374 [sec] (1.15088 [ns/kmer]) -=== step 1: 'parse file' 10.3628 [sec] (4.13572 [ns/kmer]) - == files to merge = 73 -saving tuples to 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 31.28 [sec] (12.4836 [ns/kmer]) -num_minimizers = 386687326 -num_minimizer_positions = 423023926 -num_super_kmers = 423023926 -building minimizers MPHF with 64 threads and 129 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 16.5285 [sec] (6.59642 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761139929103847781.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 16.6364 [sec] (6.63946 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 8.96654 [sec] (3.57849 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 10816752/386687326 (2.79729%) -num_buckets_in_skew_index 42372/386687326 (0.0109577%) -max_bucket_size 22972 -log2_max_bucket_size 15 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 40422973/423023926 (9.55572%) -num_minimizer_positions_of_buckets_in_skew_index 6772751/423023926 (1.60103%) -computing minimizers offsets: 4.75658 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11807213 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8389556 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5343660 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3076413 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1855446 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1008178 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 375770 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 22972: 207510 -num_kmers_in_skew_index 32063746 (1.27964%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 11807213 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[0] for 11807213 kmers; bits/key = 2.55841 - built positions[0] for 11807213 kmers; bits/key = 7.00003 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 8389556 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[1] for 8389556 kmers; bits/key = 2.61352 - built positions[1] for 8389556 kmers; bits/key = 8.00004 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 5343660 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[2] for 5343660 kmers; bits/key = 2.66261 - built positions[2] for 5343660 kmers; bits/key = 9.00007 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3076413 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3076413 kmers; bits/key = 3.34298 - built positions[3] for 3076413 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1855446 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1855446)... - built mphs[4] for 1855446 kmers; bits/key = 2.56022 - built positions[4] for 1855446 kmers; bits/key = 11.0002 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1008178 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1008178)... - built mphs[5] for 1008178 kmers; bits/key = 2.41829 - built positions[5] for 1008178 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 375770 - building MPHF with 64 threads and 1 partitions (avg. partition size = 375770)... - built mphs[6] for 375770 kmers; bits/key = 2.42182 - built positions[6] for 375770 kmers; bits/key = 13.001 - lower = 8192; upper = 22972; num_bits_per_pos = 15; num_kmers_in_partition = 207510 - building MPHF with 64 threads and 1 partitions (avg. partition size = 207510)... - built mphs[7] for 207510 kmers; bits/key = 2.42618 - built positions[7] for 207510 kmers; bits/key = 15.0018 -computing skew index took: 7.27877 [sec] -=== step 3: 'build sparse and skew index' 12.6394 [sec] (5.0443 [ns/kmer]) -=== total_time 96.4136 [sec] (38.478 [ns/kmer]) -total index size: 2716053216 [B] -- 2716.05 [MB] -SPACE BREAKDOWN: - mphf: 0.436199 [bits/kmer] (2.8265 [bits/key]) -- 5.03015% - strings_offsets: 0.153147 [bits/kmer] -- 1.76606% - control_codewords: 5.0927 [bits/kmer] -- 58.7281% - mid_load_buckets: 0.516242 [bits/kmer] -- 5.95319% - begin_buckets_of_size: 8.55656e-07 [bits/kmer] -- 9.86726e-06% - strings: 2.24545 [bits/kmer] -- 25.8941% - skew_index: 0.227926 [bits/kmer] -- 2.6284% - weights: 5.87466e-07 [bits/kmer] -- 6.77454e-06% - -------------- - total: 8.67167 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.1918% -buckets with 2 minimizer positions = 1.69205% -buckets with 3 minimizer positions = 0.442612% -buckets with 4 minimizer positions = 0.201662% -buckets with 5 minimizer positions = 0.114623% -buckets with 6 minimizer positions = 0.0734475% -buckets with 7 minimizer positions = 0.0506719% -buckets with 8 minimizer positions = 0.0368406% -buckets with 9 minimizer positions = 0.0280203% -buckets with 10 minimizer positions = 0.0218197% -buckets with 11 minimizer positions = 0.0175108% -buckets with 12 minimizer positions = 0.0142045% -buckets with 13 minimizer positions = 0.0116337% -buckets with 14 minimizer positions = 0.00980818% -buckets with 15 minimizer positions = 0.00832637% -buckets with 16 minimizer positions = 0.00717712% -max_bucket_size 22972 -2025-10-22 15:33:47: saving data structure to disk... -2025-10-22 15:33:48: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... -read 100000 sequences, 15142665 bases, 12142665 kmers -read 200000 sequences, 30293268 bases, 24293268 kmers -read 300000 sequences, 45689601 bases, 36689601 kmers -read 400000 sequences, 61242967 bases, 49242967 kmers -read 500000 sequences, 77204739 bases, 62204739 kmers -read 600000 sequences, 93322789 bases, 75322789 kmers -read 700000 sequences, 109580816 bases, 88580816 kmers -read 800000 sequences, 126019260 bases, 102019260 kmers -read 900000 sequences, 142771299 bases, 115771299 kmers -read 1000000 sequences, 159860354 bases, 129860354 kmers -read 1100000 sequences, 177221950 bases, 144221950 kmers -read 1200000 sequences, 194614684 bases, 158614684 kmers -read 1300000 sequences, 212431437 bases, 173431437 kmers -read 1400000 sequences, 230443393 bases, 188443393 kmers -read 1500000 sequences, 248830761 bases, 203830761 kmers -read 1600000 sequences, 267495983 bases, 219495983 kmers -read 1700000 sequences, 286467836 bases, 235467836 kmers -read 1800000 sequences, 305974817 bases, 251974817 kmers -read 1900000 sequences, 325573650 bases, 268573650 kmers -read 2000000 sequences, 345519042 bases, 285519042 kmers -read 2100000 sequences, 365932867 bases, 302932867 kmers -read 2200000 sequences, 386928615 bases, 320928615 kmers -read 2300000 sequences, 408196697 bases, 339196697 kmers -read 2400000 sequences, 429706087 bases, 357706087 kmers -read 2500000 sequences, 451663964 bases, 376663964 kmers -read 2600000 sequences, 474186092 bases, 396186092 kmers -read 2700000 sequences, 497212163 bases, 416212163 kmers -read 2800000 sequences, 520661958 bases, 436661958 kmers -read 2900000 sequences, 544614330 bases, 457614330 kmers -read 3000000 sequences, 569210425 bases, 479210425 kmers -read 3100000 sequences, 594100261 bases, 501100261 kmers -read 3200000 sequences, 619323817 bases, 523323817 kmers -read 3300000 sequences, 645628550 bases, 546628550 kmers -read 3400000 sequences, 672448968 bases, 570448968 kmers -read 3500000 sequences, 699905699 bases, 594905699 kmers -read 3600000 sequences, 728253489 bases, 620253489 kmers -read 3700000 sequences, 756996702 bases, 645996702 kmers -read 3800000 sequences, 786498197 bases, 672498197 kmers -read 3900000 sequences, 816910601 bases, 699910601 kmers -read 4000000 sequences, 848332212 bases, 728332212 kmers -read 4100000 sequences, 880941235 bases, 757941235 kmers -read 4200000 sequences, 914418284 bases, 788418284 kmers -read 4300000 sequences, 948701560 bases, 819701560 kmers -read 4400000 sequences, 984340143 bases, 852340143 kmers -read 4500000 sequences, 1021325821 bases, 886325821 kmers -read 4600000 sequences, 1059630845 bases, 921630845 kmers -read 4700000 sequences, 1098776441 bases, 957776441 kmers -read 4800000 sequences, 1139816109 bases, 995816109 kmers -read 4900000 sequences, 1182502603 bases, 1035502603 kmers -read 5000000 sequences, 1226889961 bases, 1076889961 kmers -read 5100000 sequences, 1272831022 bases, 1119831022 kmers -read 5200000 sequences, 1320724594 bases, 1164724594 kmers -read 5300000 sequences, 1371130743 bases, 1212130743 kmers -read 5400000 sequences, 1423474811 bases, 1261474811 kmers -read 5500000 sequences, 1478533032 bases, 1313533032 kmers -read 5600000 sequences, 1536511127 bases, 1368511127 kmers -read 5700000 sequences, 1597650635 bases, 1426650635 kmers -read 5800000 sequences, 1661332605 bases, 1487332605 kmers -read 5900000 sequences, 1728788521 bases, 1551788521 kmers -read 6000000 sequences, 1800462808 bases, 1620462808 kmers -read 6100000 sequences, 1855582769 bases, 1672582769 kmers -read 6200000 sequences, 1861290633 bases, 1675290633 kmers -read 6300000 sequences, 1866992020 bases, 1677992020 kmers -read 6400000 sequences, 1872712764 bases, 1680712764 kmers -read 6500000 sequences, 1878412792 bases, 1683412792 kmers -read 6600000 sequences, 1884126799 bases, 1686126799 kmers -read 6700000 sequences, 1889847798 bases, 1688847798 kmers -read 6800000 sequences, 1895565126 bases, 1691565126 kmers -read 6900000 sequences, 1901268639 bases, 1694268639 kmers -read 7000000 sequences, 1906975392 bases, 1696975392 kmers -read 7100000 sequences, 1912694987 bases, 1699694987 kmers -read 7200000 sequences, 1918405480 bases, 1702405480 kmers -read 7300000 sequences, 1924111745 bases, 1705111745 kmers -read 7400000 sequences, 1929830164 bases, 1707830164 kmers -read 7500000 sequences, 1935540033 bases, 1710540033 kmers -read 7600000 sequences, 1941266136 bases, 1713266136 kmers -read 7700000 sequences, 1946976124 bases, 1715976124 kmers -read 7800000 sequences, 1952688156 bases, 1718688156 kmers -read 7900000 sequences, 1958402003 bases, 1721402003 kmers -read 8000000 sequences, 1964117272 bases, 1724117272 kmers -read 8100000 sequences, 1969830383 bases, 1726830383 kmers -read 8200000 sequences, 1975558550 bases, 1729558550 kmers -read 8300000 sequences, 1981284034 bases, 1732284034 kmers -read 8400000 sequences, 1986995293 bases, 1734995293 kmers -read 8500000 sequences, 1992721438 bases, 1737721438 kmers -read 8600000 sequences, 1998449545 bases, 1740449545 kmers -read 8700000 sequences, 2004184386 bases, 1743184386 kmers -read 8800000 sequences, 2009910316 bases, 1745910316 kmers -read 8900000 sequences, 2015628093 bases, 1748628093 kmers -read 9000000 sequences, 2021346703 bases, 1751346703 kmers -read 9100000 sequences, 2027081578 bases, 1754081578 kmers -read 9200000 sequences, 2032818056 bases, 1756818056 kmers -read 9300000 sequences, 2038553042 bases, 1759553042 kmers -read 9400000 sequences, 2044303212 bases, 1762303212 kmers -read 9500000 sequences, 2050045516 bases, 1765045516 kmers -read 9600000 sequences, 2055782121 bases, 1767782121 kmers -read 9700000 sequences, 2061515493 bases, 1770515493 kmers -read 9800000 sequences, 2067264752 bases, 1773264752 kmers -read 9900000 sequences, 2073029647 bases, 1776029647 kmers -read 10000000 sequences, 2078777105 bases, 1778777105 kmers -read 10100000 sequences, 2084516749 bases, 1781516749 kmers -read 10200000 sequences, 2090254271 bases, 1784254271 kmers -read 10300000 sequences, 2096010949 bases, 1787010949 kmers -read 10400000 sequences, 2101750129 bases, 1789750129 kmers -read 10500000 sequences, 2107490529 bases, 1792490529 kmers -read 10600000 sequences, 2113226835 bases, 1795226835 kmers -read 10700000 sequences, 2118984102 bases, 1797984102 kmers -read 10800000 sequences, 2124753185 bases, 1800753185 kmers -read 10900000 sequences, 2130500348 bases, 1803500348 kmers -read 11000000 sequences, 2136245853 bases, 1806245853 kmers -read 11100000 sequences, 2141999029 bases, 1808999029 kmers -read 11200000 sequences, 2147751510 bases, 1811751510 kmers -read 11300000 sequences, 2153511666 bases, 1814511666 kmers -read 11400000 sequences, 2159254652 bases, 1817254652 kmers -read 11500000 sequences, 2165018881 bases, 1820018881 kmers -read 11600000 sequences, 2170788123 bases, 1822788123 kmers -read 11700000 sequences, 2176561496 bases, 1825561496 kmers -read 11800000 sequences, 2182327454 bases, 1828327454 kmers -read 11900000 sequences, 2188093430 bases, 1831093430 kmers -read 12000000 sequences, 2193864516 bases, 1833864516 kmers -read 12100000 sequences, 2199640006 bases, 1836640006 kmers -read 12200000 sequences, 2205409598 bases, 1839409598 kmers -read 12300000 sequences, 2211196063 bases, 1842196063 kmers -read 12400000 sequences, 2216980714 bases, 1844980714 kmers -read 12500000 sequences, 2222778714 bases, 1847778714 kmers -read 12600000 sequences, 2228548365 bases, 1850548365 kmers -read 12700000 sequences, 2234333747 bases, 1853333747 kmers -read 12800000 sequences, 2240119304 bases, 1856119304 kmers -read 12900000 sequences, 2245909893 bases, 1858909893 kmers -read 13000000 sequences, 2251713140 bases, 1861713140 kmers -read 13100000 sequences, 2257517214 bases, 1864517214 kmers -read 13200000 sequences, 2263299879 bases, 1867299879 kmers -read 13300000 sequences, 2269090399 bases, 1870090399 kmers -read 13400000 sequences, 2274889092 bases, 1872889092 kmers -read 13500000 sequences, 2280679397 bases, 1875679397 kmers -read 13600000 sequences, 2286496358 bases, 1878496358 kmers -read 13700000 sequences, 2292303473 bases, 1881303473 kmers -read 13800000 sequences, 2298095885 bases, 1884095885 kmers -read 13900000 sequences, 2303896281 bases, 1886896281 kmers -read 14000000 sequences, 2309685311 bases, 1889685311 kmers -read 14100000 sequences, 2315487847 bases, 1892487847 kmers -read 14200000 sequences, 2321299157 bases, 1895299157 kmers -read 14300000 sequences, 2327098753 bases, 1898098753 kmers -read 14400000 sequences, 2332930688 bases, 1900930688 kmers -read 14500000 sequences, 2338742297 bases, 1903742297 kmers -read 14600000 sequences, 2344551817 bases, 1906551817 kmers -read 14700000 sequences, 2350372555 bases, 1909372555 kmers -read 14800000 sequences, 2356184455 bases, 1912184455 kmers -read 14900000 sequences, 2362012488 bases, 1915012488 kmers -read 15000000 sequences, 2367830861 bases, 1917830861 kmers -read 15100000 sequences, 2373646143 bases, 1920646143 kmers -read 15200000 sequences, 2379487644 bases, 1923487644 kmers -read 15300000 sequences, 2385319610 bases, 1926319610 kmers -read 15400000 sequences, 2391160020 bases, 1929160020 kmers -read 15500000 sequences, 2396996732 bases, 1931996732 kmers -read 15600000 sequences, 2402827545 bases, 1934827545 kmers -read 15700000 sequences, 2408655256 bases, 1937655256 kmers -read 15800000 sequences, 2414491274 bases, 1940491274 kmers -read 15900000 sequences, 2420340396 bases, 1943340396 kmers -read 16000000 sequences, 2426185107 bases, 1946185107 kmers -read 16100000 sequences, 2432032145 bases, 1949032145 kmers -read 16200000 sequences, 2437865389 bases, 1951865389 kmers -read 16300000 sequences, 2443712476 bases, 1954712476 kmers -read 16400000 sequences, 2449571096 bases, 1957571096 kmers -read 16500000 sequences, 2455436828 bases, 1960436828 kmers -read 16600000 sequences, 2461294178 bases, 1963294178 kmers -read 16700000 sequences, 2467151105 bases, 1966151105 kmers -read 16800000 sequences, 2473014630 bases, 1969014630 kmers -read 16900000 sequences, 2478879186 bases, 1971879186 kmers -read 17000000 sequences, 2484756357 bases, 1974756357 kmers -read 17100000 sequences, 2490639960 bases, 1977639960 kmers -read 17200000 sequences, 2496505139 bases, 1980505139 kmers -read 17300000 sequences, 2502376271 bases, 1983376271 kmers -read 17400000 sequences, 2508235904 bases, 1986235904 kmers -read 17500000 sequences, 2514119057 bases, 1989119057 kmers -read 17600000 sequences, 2520003875 bases, 1992003875 kmers -read 17700000 sequences, 2525879611 bases, 1994879611 kmers -read 17800000 sequences, 2531769764 bases, 1997769764 kmers -read 17900000 sequences, 2537665494 bases, 2000665494 kmers -read 18000000 sequences, 2543560790 bases, 2003560790 kmers -read 18100000 sequences, 2549454349 bases, 2006454349 kmers -read 18200000 sequences, 2555337312 bases, 2009337312 kmers -read 18300000 sequences, 2561224835 bases, 2012224835 kmers -read 18400000 sequences, 2567143113 bases, 2015143113 kmers -read 18500000 sequences, 2573036170 bases, 2018036170 kmers -read 18600000 sequences, 2578924000 bases, 2020924000 kmers -read 18700000 sequences, 2584830744 bases, 2023830744 kmers -read 18800000 sequences, 2590732842 bases, 2026732842 kmers -read 18900000 sequences, 2596629182 bases, 2029629182 kmers -read 19000000 sequences, 2602544828 bases, 2032544828 kmers -read 19100000 sequences, 2608476670 bases, 2035476670 kmers -read 19200000 sequences, 2614389892 bases, 2038389892 kmers -read 19300000 sequences, 2620312339 bases, 2041312339 kmers -read 19400000 sequences, 2626244711 bases, 2044244711 kmers -read 19500000 sequences, 2632165901 bases, 2047165901 kmers -read 19600000 sequences, 2638096345 bases, 2050096345 kmers -read 19700000 sequences, 2644023009 bases, 2053023009 kmers -read 19800000 sequences, 2649949840 bases, 2055949840 kmers -read 19900000 sequences, 2655887687 bases, 2058887687 kmers -read 20000000 sequences, 2661829332 bases, 2061829332 kmers -read 20100000 sequences, 2667773946 bases, 2064773946 kmers -read 20200000 sequences, 2673731741 bases, 2067731741 kmers -read 20300000 sequences, 2679668693 bases, 2070668693 kmers -read 20400000 sequences, 2685621460 bases, 2073621460 kmers -read 20500000 sequences, 2691583341 bases, 2076583341 kmers -read 20600000 sequences, 2697548092 bases, 2079548092 kmers -read 20700000 sequences, 2703523059 bases, 2082523059 kmers -read 20800000 sequences, 2709482884 bases, 2085482884 kmers -read 20900000 sequences, 2715437392 bases, 2088437392 kmers -read 21000000 sequences, 2721408473 bases, 2091408473 kmers -read 21100000 sequences, 2727378334 bases, 2094378334 kmers -read 21200000 sequences, 2733356854 bases, 2097356854 kmers -read 21300000 sequences, 2739324076 bases, 2100324076 kmers -read 21400000 sequences, 2745311010 bases, 2103311010 kmers -read 21500000 sequences, 2751305570 bases, 2106305570 kmers -read 21600000 sequences, 2757280040 bases, 2109280040 kmers -read 21700000 sequences, 2763250403 bases, 2112250403 kmers -read 21800000 sequences, 2769246063 bases, 2115246063 kmers -read 21900000 sequences, 2775228429 bases, 2118228429 kmers -read 22000000 sequences, 2781228842 bases, 2121228842 kmers -read 22100000 sequences, 2787227975 bases, 2124227975 kmers -read 22200000 sequences, 2793232339 bases, 2127232339 kmers -read 22300000 sequences, 2799254537 bases, 2130254537 kmers -read 22400000 sequences, 2805268524 bases, 2133268524 kmers -read 22500000 sequences, 2811273840 bases, 2136273840 kmers -read 22600000 sequences, 2817297507 bases, 2139297507 kmers -read 22700000 sequences, 2823311900 bases, 2142311900 kmers -read 22800000 sequences, 2829348707 bases, 2145348707 kmers -read 22900000 sequences, 2835387583 bases, 2148387583 kmers -read 23000000 sequences, 2841415119 bases, 2151415119 kmers -read 23100000 sequences, 2847447392 bases, 2154447392 kmers -read 23200000 sequences, 2853464302 bases, 2157464302 kmers -read 23300000 sequences, 2859504386 bases, 2160504386 kmers -read 23400000 sequences, 2865558691 bases, 2163558691 kmers -read 23500000 sequences, 2871616658 bases, 2166616658 kmers -read 23600000 sequences, 2877666271 bases, 2169666271 kmers -read 23700000 sequences, 2883709058 bases, 2172709058 kmers -read 23800000 sequences, 2889780118 bases, 2175780118 kmers -read 23900000 sequences, 2895851803 bases, 2178851803 kmers -read 24000000 sequences, 2901936379 bases, 2181936379 kmers -read 24100000 sequences, 2908006062 bases, 2185006062 kmers -read 24200000 sequences, 2914097550 bases, 2188097550 kmers -read 24300000 sequences, 2920158586 bases, 2191158586 kmers -read 24400000 sequences, 2926232376 bases, 2194232376 kmers -read 24500000 sequences, 2932310420 bases, 2197310420 kmers -read 24600000 sequences, 2938383731 bases, 2200383731 kmers -read 24700000 sequences, 2944455608 bases, 2203455608 kmers -read 24800000 sequences, 2950553561 bases, 2206553561 kmers -read 24900000 sequences, 2956625219 bases, 2209625219 kmers -read 25000000 sequences, 2962750749 bases, 2212750749 kmers -read 25100000 sequences, 2968838477 bases, 2215838477 kmers -read 25200000 sequences, 2974964628 bases, 2218964628 kmers -read 25300000 sequences, 2981066401 bases, 2222066401 kmers -read 25400000 sequences, 2987174744 bases, 2225174744 kmers -read 25500000 sequences, 2993287478 bases, 2228287478 kmers -read 25600000 sequences, 2999404216 bases, 2231404216 kmers -read 25700000 sequences, 3005525981 bases, 2234525981 kmers -read 25800000 sequences, 3011641856 bases, 2237641856 kmers -read 25900000 sequences, 3017762733 bases, 2240762733 kmers -read 26000000 sequences, 3023914429 bases, 2243914429 kmers -read 26100000 sequences, 3030074528 bases, 2247074528 kmers -read 26200000 sequences, 3036215414 bases, 2250215414 kmers -read 26300000 sequences, 3042374233 bases, 2253374233 kmers -read 26400000 sequences, 3048520232 bases, 2256520232 kmers -read 26500000 sequences, 3054682852 bases, 2259682852 kmers -read 26600000 sequences, 3060872402 bases, 2262872402 kmers -read 26700000 sequences, 3067031401 bases, 2266031401 kmers -read 26800000 sequences, 3073202281 bases, 2269202281 kmers -read 26900000 sequences, 3079363143 bases, 2272363143 kmers -read 27000000 sequences, 3085556058 bases, 2275556058 kmers -read 27100000 sequences, 3091751576 bases, 2278751576 kmers -read 27200000 sequences, 3097952633 bases, 2281952633 kmers -read 27300000 sequences, 3104145587 bases, 2285145587 kmers -read 27400000 sequences, 3110358955 bases, 2288358955 kmers -read 27500000 sequences, 3116537007 bases, 2291537007 kmers -read 27600000 sequences, 3122708736 bases, 2294708736 kmers -read 27700000 sequences, 3128900428 bases, 2297900428 kmers -read 27800000 sequences, 3135111582 bases, 2301111582 kmers -read 27900000 sequences, 3141317272 bases, 2304317272 kmers -read 28000000 sequences, 3147523815 bases, 2307523815 kmers -read 28100000 sequences, 3153730468 bases, 2310730468 kmers -read 28200000 sequences, 3159957719 bases, 2313957719 kmers -read 28300000 sequences, 3166181248 bases, 2317181248 kmers -read 28400000 sequences, 3172412163 bases, 2320412163 kmers -read 28500000 sequences, 3178654889 bases, 2323654889 kmers -read 28600000 sequences, 3184886557 bases, 2326886557 kmers -read 28700000 sequences, 3191117113 bases, 2330117113 kmers -read 28800000 sequences, 3197379587 bases, 2333379587 kmers -read 28900000 sequences, 3203639497 bases, 2336639497 kmers -read 29000000 sequences, 3209891758 bases, 2339891758 kmers -read 29100000 sequences, 3216141276 bases, 2343141276 kmers -read 29200000 sequences, 3222413348 bases, 2346413348 kmers -read 29300000 sequences, 3228708388 bases, 2349708388 kmers -read 29400000 sequences, 3234965821 bases, 2352965821 kmers -read 29500000 sequences, 3241275247 bases, 2356275247 kmers -read 29600000 sequences, 3247560749 bases, 2359560749 kmers -read 29700000 sequences, 3253851490 bases, 2362851490 kmers -read 29800000 sequences, 3260147874 bases, 2366147874 kmers -read 29900000 sequences, 3266443233 bases, 2369443233 kmers -read 30000000 sequences, 3272761181 bases, 2372761181 kmers -read 30100000 sequences, 3279084906 bases, 2376084906 kmers -read 30200000 sequences, 3285396341 bases, 2379396341 kmers -read 30300000 sequences, 3291706676 bases, 2382706676 kmers -read 30400000 sequences, 3298020786 bases, 2386020786 kmers -read 30500000 sequences, 3304365070 bases, 2389365070 kmers -read 30600000 sequences, 3310727452 bases, 2392727452 kmers -read 30700000 sequences, 3317071667 bases, 2396071667 kmers -read 30800000 sequences, 3323415773 bases, 2399415773 kmers -read 30900000 sequences, 3329791034 bases, 2402791034 kmers -read 31000000 sequences, 3336150965 bases, 2406150965 kmers -read 31100000 sequences, 3342541655 bases, 2409541655 kmers -read 31200000 sequences, 3348907418 bases, 2412907418 kmers -read 31300000 sequences, 3355301313 bases, 2416301313 kmers -read 31400000 sequences, 3361677962 bases, 2419677962 kmers -read 31500000 sequences, 3368088646 bases, 2423088646 kmers -read 31600000 sequences, 3374497442 bases, 2426497442 kmers -read 31700000 sequences, 3380955023 bases, 2429955023 kmers -read 31800000 sequences, 3387385518 bases, 2433385518 kmers -read 31900000 sequences, 3393821602 bases, 2436821602 kmers -read 32000000 sequences, 3400254734 bases, 2440254734 kmers -read 32100000 sequences, 3406661510 bases, 2443661510 kmers -read 32200000 sequences, 3413131182 bases, 2447131182 kmers -read 32300000 sequences, 3419570417 bases, 2450570417 kmers -read 32400000 sequences, 3426014473 bases, 2454014473 kmers -read 32500000 sequences, 3432484492 bases, 2457484492 kmers -read 32600000 sequences, 3438957077 bases, 2460957077 kmers -read 32700000 sequences, 3445449751 bases, 2464449751 kmers -read 32800000 sequences, 3451918312 bases, 2467918312 kmers -read 32900000 sequences, 3458402343 bases, 2471402343 kmers -read 33000000 sequences, 3464886783 bases, 2474886783 kmers -read 33100000 sequences, 3471383138 bases, 2478383138 kmers -read 33200000 sequences, 3477878876 bases, 2481878876 kmers -read 33300000 sequences, 3484417237 bases, 2485417237 kmers -read 33400000 sequences, 3490941906 bases, 2488941906 kmers -read 33500000 sequences, 3497445866 bases, 2492445866 kmers -read 33600000 sequences, 3503981454 bases, 2495981454 kmers -read 33700000 sequences, 3510547347 bases, 2499547347 kmers -read 33800000 sequences, 3517100206 bases, 2503100206 kmers -read 33900000 sequences, 3523655303 bases, 2506655303 kmers -read 34000000 sequences, 3530247184 bases, 2510247184 kmers -read 34100000 sequences, 3536826243 bases, 2513826243 kmers -read 34200000 sequences, 3543370780 bases, 2517370780 kmers -read 34300000 sequences, 3549941979 bases, 2520941979 kmers -read 34400000 sequences, 3556525137 bases, 2524525137 kmers -read 34500000 sequences, 3563130115 bases, 2528130115 kmers -read 34600000 sequences, 3569739837 bases, 2531739837 kmers -read 34700000 sequences, 3576369361 bases, 2535369361 kmers -read 34800000 sequences, 3582984639 bases, 2538984639 kmers -read 34900000 sequences, 3589639399 bases, 2542639399 kmers -read 35000000 sequences, 3596273843 bases, 2546273843 kmers -read 35100000 sequences, 3602915662 bases, 2549915662 kmers -read 35200000 sequences, 3609531526 bases, 2553531526 kmers -read 35300000 sequences, 3616196959 bases, 2557196959 kmers -read 35400000 sequences, 3622877546 bases, 2560877546 kmers -read 35500000 sequences, 3629567025 bases, 2564567025 kmers -read 35600000 sequences, 3636241351 bases, 2568241351 kmers -read 35700000 sequences, 3642915002 bases, 2571915002 kmers -read 35800000 sequences, 3649603384 bases, 2575603384 kmers -read 35900000 sequences, 3656318502 bases, 2579318502 kmers -read 36000000 sequences, 3663044813 bases, 2583044813 kmers -read 36100000 sequences, 3669778307 bases, 2586778307 kmers -read 36200000 sequences, 3676509859 bases, 2590509859 kmers -read 36300000 sequences, 3683277516 bases, 2594277516 kmers -read 36400000 sequences, 3690023320 bases, 2598023320 kmers -read 36500000 sequences, 3696780854 bases, 2601780854 kmers -read 36600000 sequences, 3703553953 bases, 2605553953 kmers -read 36700000 sequences, 3710337625 bases, 2609337625 kmers -read 36800000 sequences, 3717123059 bases, 2613123059 kmers -read 36900000 sequences, 3723910303 bases, 2616910303 kmers -read 37000000 sequences, 3730743513 bases, 2620743513 kmers -read 37100000 sequences, 3737567921 bases, 2624567921 kmers -read 37200000 sequences, 3744378334 bases, 2628378334 kmers -read 37300000 sequences, 3751211150 bases, 2632211150 kmers -read 37400000 sequences, 3758073195 bases, 2636073195 kmers -read 37500000 sequences, 3764943165 bases, 2639943165 kmers -read 37600000 sequences, 3771815781 bases, 2643815781 kmers -read 37700000 sequences, 3778662258 bases, 2647662258 kmers -read 37800000 sequences, 3785547755 bases, 2651547755 kmers -read 37900000 sequences, 3792403207 bases, 2655403207 kmers -read 38000000 sequences, 3799297920 bases, 2659297920 kmers -read 38100000 sequences, 3806240239 bases, 2663240239 kmers -read 38200000 sequences, 3813157631 bases, 2667157631 kmers -read 38300000 sequences, 3820098452 bases, 2671098452 kmers -read 38400000 sequences, 3827045725 bases, 2675045725 kmers -read 38500000 sequences, 3834035833 bases, 2679035833 kmers -read 38600000 sequences, 3841003380 bases, 2683003380 kmers -read 38700000 sequences, 3848003738 bases, 2687003738 kmers -read 38800000 sequences, 3854998346 bases, 2690998346 kmers -read 38900000 sequences, 3861999405 bases, 2694999405 kmers -read 39000000 sequences, 3869022100 bases, 2699022100 kmers -read 39100000 sequences, 3876075315 bases, 2703075315 kmers -read 39200000 sequences, 3883150369 bases, 2707150369 kmers -read 39300000 sequences, 3890222678 bases, 2711222678 kmers -read 39400000 sequences, 3897268602 bases, 2715268602 kmers -read 39500000 sequences, 3904370166 bases, 2719370166 kmers -read 39600000 sequences, 3911448081 bases, 2723448081 kmers -read 39700000 sequences, 3918568391 bases, 2727568391 kmers -read 39800000 sequences, 3925645479 bases, 2731645479 kmers -read 39900000 sequences, 3932749450 bases, 2735749450 kmers -read 40000000 sequences, 3939899906 bases, 2739899906 kmers -read 40100000 sequences, 3947016376 bases, 2744016376 kmers -read 40200000 sequences, 3954176429 bases, 2748176429 kmers -read 40300000 sequences, 3961389436 bases, 2752389436 kmers -read 40400000 sequences, 3968552140 bases, 2756552140 kmers -read 40500000 sequences, 3975752284 bases, 2760752284 kmers -read 40600000 sequences, 3982970774 bases, 2764970774 kmers -read 40700000 sequences, 3990152770 bases, 2769152770 kmers -read 40800000 sequences, 3997405392 bases, 2773405392 kmers -read 40900000 sequences, 4004672449 bases, 2777672449 kmers -read 41000000 sequences, 4011944353 bases, 2781944353 kmers -read 41100000 sequences, 4019238458 bases, 2786238458 kmers -read 41200000 sequences, 4026519204 bases, 2790519204 kmers -read 41300000 sequences, 4033822627 bases, 2794822627 kmers -read 41400000 sequences, 4041178312 bases, 2799178312 kmers -read 41500000 sequences, 4048493890 bases, 2803493890 kmers -read 41600000 sequences, 4055829069 bases, 2807829069 kmers -read 41700000 sequences, 4063212651 bases, 2812212651 kmers -read 41800000 sequences, 4070629970 bases, 2816629970 kmers -read 41900000 sequences, 4078028124 bases, 2821028124 kmers -read 42000000 sequences, 4085447760 bases, 2825447760 kmers -read 42100000 sequences, 4092898033 bases, 2829898033 kmers -read 42200000 sequences, 4100371919 bases, 2834371919 kmers -read 42300000 sequences, 4107845273 bases, 2838845273 kmers -read 42400000 sequences, 4115310575 bases, 2843310575 kmers -read 42500000 sequences, 4122794242 bases, 2847794242 kmers -read 42600000 sequences, 4130336855 bases, 2852336855 kmers -read 42700000 sequences, 4137838944 bases, 2856838944 kmers -read 42800000 sequences, 4145439563 bases, 2861439563 kmers -read 42900000 sequences, 4153050309 bases, 2866050309 kmers -read 43000000 sequences, 4160667187 bases, 2870667187 kmers -read 43100000 sequences, 4168281242 bases, 2875281242 kmers -read 43200000 sequences, 4175884442 bases, 2879884442 kmers -read 43300000 sequences, 4183511133 bases, 2884511133 kmers -read 43400000 sequences, 4191154040 bases, 2889154040 kmers -read 43500000 sequences, 4198863024 bases, 2893863024 kmers -read 43600000 sequences, 4206635969 bases, 2898635969 kmers -read 43700000 sequences, 4214404705 bases, 2903404705 kmers -read 43800000 sequences, 4222136141 bases, 2908136141 kmers -read 43900000 sequences, 4229915550 bases, 2912915550 kmers -read 44000000 sequences, 4237696486 bases, 2917696486 kmers -read 44100000 sequences, 4245541378 bases, 2922541378 kmers -read 44200000 sequences, 4253343647 bases, 2927343647 kmers -read 44300000 sequences, 4261209191 bases, 2932209191 kmers -read 44400000 sequences, 4269076563 bases, 2937076563 kmers -read 44500000 sequences, 4276951559 bases, 2941951559 kmers -read 44600000 sequences, 4284863538 bases, 2946863538 kmers -read 44700000 sequences, 4292779456 bases, 2951779456 kmers -read 44800000 sequences, 4300761539 bases, 2956761539 kmers -read 44900000 sequences, 4308749182 bases, 2961749182 kmers -read 45000000 sequences, 4316730755 bases, 2966730755 kmers -read 45100000 sequences, 4324743959 bases, 2971743959 kmers -read 45200000 sequences, 4332706382 bases, 2976706382 kmers -read 45300000 sequences, 4340799763 bases, 2981799763 kmers -read 45400000 sequences, 4348938081 bases, 2986938081 kmers -read 45500000 sequences, 4357089457 bases, 2992089457 kmers -read 45600000 sequences, 4365213164 bases, 2997213164 kmers -read 45700000 sequences, 4373409316 bases, 3002409316 kmers -read 45800000 sequences, 4381556002 bases, 3007556002 kmers -read 45900000 sequences, 4389760164 bases, 3012760164 kmers -read 46000000 sequences, 4398064724 bases, 3018064724 kmers -read 46100000 sequences, 4406387109 bases, 3023387109 kmers -read 46200000 sequences, 4414694594 bases, 3028694594 kmers -read 46300000 sequences, 4423058706 bases, 3034058706 kmers -read 46400000 sequences, 4431425517 bases, 3039425517 kmers -read 46500000 sequences, 4439833456 bases, 3044833456 kmers -read 46600000 sequences, 4448259129 bases, 3050259129 kmers -read 46700000 sequences, 4456675047 bases, 3055675047 kmers -read 46800000 sequences, 4465159540 bases, 3061159540 kmers -read 46900000 sequences, 4473635471 bases, 3066635471 kmers -read 47000000 sequences, 4482251464 bases, 3072251464 kmers -read 47100000 sequences, 4490782806 bases, 3077782806 kmers -read 47200000 sequences, 4499401969 bases, 3083401969 kmers -read 47300000 sequences, 4508109189 bases, 3089109189 kmers -read 47400000 sequences, 4516742353 bases, 3094742353 kmers -read 47500000 sequences, 4525469627 bases, 3100469627 kmers -read 47600000 sequences, 4534242740 bases, 3106242740 kmers -read 47700000 sequences, 4542982939 bases, 3111982939 kmers -read 47800000 sequences, 4551866526 bases, 3117866526 kmers -read 47900000 sequences, 4560699455 bases, 3123699455 kmers -read 48000000 sequences, 4569570617 bases, 3129570617 kmers -read 48100000 sequences, 4578501178 bases, 3135501178 kmers -read 48200000 sequences, 4587457081 bases, 3141457081 kmers -read 48300000 sequences, 4596477808 bases, 3147477808 kmers -read 48400000 sequences, 4605472928 bases, 3153472928 kmers -read 48500000 sequences, 4614570375 bases, 3159570375 kmers -read 48600000 sequences, 4623645856 bases, 3165645856 kmers -read 48700000 sequences, 4632844357 bases, 3171844357 kmers -read 48800000 sequences, 4642092291 bases, 3178092291 kmers -read 48900000 sequences, 4651346132 bases, 3184346132 kmers -read 49000000 sequences, 4660631625 bases, 3190631625 kmers -read 49100000 sequences, 4670019495 bases, 3197019495 kmers -read 49200000 sequences, 4679397192 bases, 3203397192 kmers -read 49300000 sequences, 4688892187 bases, 3209892187 kmers -read 49400000 sequences, 4698398513 bases, 3216398513 kmers -read 49500000 sequences, 4707888109 bases, 3222888109 kmers -read 49600000 sequences, 4717466158 bases, 3229466158 kmers -read 49700000 sequences, 4727070115 bases, 3236070115 kmers -read 49800000 sequences, 4736756166 bases, 3242756166 kmers -read 49900000 sequences, 4746452288 bases, 3249452288 kmers -read 50000000 sequences, 4756246344 bases, 3256246344 kmers -read 50100000 sequences, 4766057260 bases, 3263057260 kmers -read 50200000 sequences, 4775878546 bases, 3269878546 kmers -read 50300000 sequences, 4785728039 bases, 3276728039 kmers -read 50400000 sequences, 4795653898 bases, 3283653898 kmers -read 50500000 sequences, 4805712637 bases, 3290712637 kmers -read 50600000 sequences, 4815738547 bases, 3297738547 kmers -read 50700000 sequences, 4825926096 bases, 3304926096 kmers -read 50800000 sequences, 4836224453 bases, 3312224453 kmers -read 50900000 sequences, 4846451602 bases, 3319451602 kmers -read 51000000 sequences, 4856753463 bases, 3326753463 kmers -read 51100000 sequences, 4867266416 bases, 3334266416 kmers -read 51200000 sequences, 4877861881 bases, 3341861881 kmers -read 51300000 sequences, 4888414860 bases, 3349414860 kmers -read 51400000 sequences, 4899113807 bases, 3357113807 kmers -read 51500000 sequences, 4909857607 bases, 3364857607 kmers -read 51600000 sequences, 4920671079 bases, 3372671079 kmers -read 51700000 sequences, 4931457242 bases, 3380457242 kmers -read 51800000 sequences, 4942313207 bases, 3388313207 kmers -read 51900000 sequences, 4953292425 bases, 3396292425 kmers -read 52000000 sequences, 4964398717 bases, 3404398717 kmers -read 52100000 sequences, 4975538491 bases, 3412538491 kmers -read 52200000 sequences, 4986760200 bases, 3420760200 kmers -read 52300000 sequences, 4998126907 bases, 3429126907 kmers -read 52400000 sequences, 5009563138 bases, 3437563138 kmers -read 52500000 sequences, 5021023021 bases, 3446023021 kmers -read 52600000 sequences, 5032535974 bases, 3454535974 kmers -read 52700000 sequences, 5044218691 bases, 3463218691 kmers -read 52800000 sequences, 5055973659 bases, 3471973659 kmers -read 52900000 sequences, 5067872847 bases, 3480872847 kmers -read 53000000 sequences, 5079791551 bases, 3489791551 kmers -read 53100000 sequences, 5091783862 bases, 3498783862 kmers -read 53200000 sequences, 5103925623 bases, 3507925623 kmers -read 53300000 sequences, 5116241038 bases, 3517241038 kmers -read 53400000 sequences, 5128584984 bases, 3526584984 kmers -read 53500000 sequences, 5140962968 bases, 3535962968 kmers -read 53600000 sequences, 5153500539 bases, 3545500539 kmers -read 53700000 sequences, 5166148926 bases, 3555148926 kmers -read 53800000 sequences, 5178959440 bases, 3564959440 kmers -read 53900000 sequences, 5191971464 bases, 3574971464 kmers -read 54000000 sequences, 5205070836 bases, 3585070836 kmers -read 54100000 sequences, 5218297450 bases, 3595297450 kmers -read 54200000 sequences, 5231683154 bases, 3605683154 kmers -read 54300000 sequences, 5245150446 bases, 3616150446 kmers -read 54400000 sequences, 5258739234 bases, 3626739234 kmers -read 54500000 sequences, 5272405108 bases, 3637405108 kmers -read 54600000 sequences, 5286362318 bases, 3648362318 kmers -read 54700000 sequences, 5300436762 bases, 3659436762 kmers -read 54800000 sequences, 5314343088 bases, 3670343088 kmers -read 54900000 sequences, 5328793236 bases, 3681793236 kmers -read 55000000 sequences, 5343495625 bases, 3693495625 kmers -read 55100000 sequences, 5358294857 bases, 3705294857 kmers -read 55200000 sequences, 5373205019 bases, 3717205019 kmers -=== step 1.1: 'encoding input' 17.285 [sec] (4.64885 [ns/kmer]) -read 55207753 sequences, 5374353539 bases, 3718120949 kmers -num_kmers 3718120949 -cost: 2.0 + 0.890898 [bits/kmer] -max_len 17920 -num. bits per_absolute_offset 33 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.90.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.91.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.92.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.93.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.94.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.95.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.96.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.97.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.98.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.99.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.100.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.101.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.102.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.103.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.104.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.105.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.106.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.107.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.108.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.109.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.110.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.111.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.112.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.113.bin'... -=== step 1.2: 'computing minimizers tuples' 6.82763 [sec] (1.83631 [ns/kmer]) -=== step 1: 'parse file' 24.1285 [sec] (6.48944 [ns/kmer]) - == files to merge = 114 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.1: 'merging minimizers tuples' 53.8513 [sec] (14.4835 [ns/kmer]) -num_minimizers = 544808214 -num_minimizer_positions = 661139039 -num_super_kmers = 661139039 -building minimizers MPHF with 64 threads and 182 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 23.2314 [sec] (6.24814 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 24.0437 [sec] (6.46663 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140028819704712.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -num_super_kmers = 550000000 -num_super_kmers = 600000000 -num_super_kmers = 650000000 -=== step 2.4: 'merging minimizers tuples ' 33.8791 [sec] (9.1119 [ns/kmer]) -num_bits_per_offset = 33 -num_buckets_larger_than_1_not_in_skew_index 51666891/544808214 (9.4835%) -num_buckets_in_skew_index 108291/544808214 (0.0198769%) -max_bucket_size 81171 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 149056975/661139039 (22.5455%) -num_minimizer_positions_of_buckets_in_skew_index 19049032/661139039 (2.88124%) -computing minimizers offsets: 11.3559 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28872109 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21161002 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14619521 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 8967010 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 5825185 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3889571 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2412718 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 81171: 2510316 -num_kmers_in_skew_index 88257432 (2.37371%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 28872109 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[0] for 28872109 kmers; bits/key = 2.53953 - built positions[0] for 28872109 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21161002 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21161002 kmers; bits/key = 2.665 - built positions[1] for 21161002 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 14619521 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 14619521 kmers; bits/key = 2.58618 - built positions[2] for 14619521 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 8967010 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 8967010 kmers; bits/key = 2.51981 - built positions[3] for 8967010 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 5825185 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 5825185 kmers; bits/key = 2.55049 - built positions[4] for 5825185 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3889571 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3889571 kmers; bits/key = 2.9515 - built positions[5] for 3889571 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2412718 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2412718)... - built mphs[6] for 2412718 kmers; bits/key = 2.41709 - built positions[6] for 2412718 kmers; bits/key = 13.0002 - lower = 8192; upper = 81171; num_bits_per_pos = 17; num_kmers_in_partition = 2510316 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2510316)... - built mphs[7] for 2510316 kmers; bits/key = 2.55991 - built positions[7] for 2510316 kmers; bits/key = 17.0001 -computing skew index took: 15.3327 [sec] -=== step 3: 'build sparse and skew index' 27.8147 [sec] (7.48084 [ns/kmer]) -=== total_time 186.949 [sec] (50.2804 [ns/kmer]) -total index size: 4810783158 [B] -- 4810.78 [MB] -SPACE BREAKDOWN: - mphf: 0.415447 [bits/kmer] (2.83528 [bits/key]) -- 4.01359% - strings_offsets: 0.300083 [bits/kmer] -- 2.89907% - control_codewords: 4.98195 [bits/kmer] -- 48.1301% - mid_load_buckets: 1.32295 [bits/kmer] -- 12.7809% - begin_buckets_of_size: 5.76635e-07 [bits/kmer] -- 5.57082e-06% - strings: 2.8909 [bits/kmer] -- 27.9287% - skew_index: 0.439676 [bits/kmer] -- 4.24766% - weights: 3.95899e-07 [bits/kmer] -- 3.82474e-06% - -------------- - total: 10.351 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 90.4966% -buckets with 2 minimizer positions = 7.33042% -buckets with 3 minimizer positions = 1.04104% -buckets with 4 minimizer positions = 0.358078% -buckets with 5 minimizer positions = 0.190444% -buckets with 6 minimizer positions = 0.119606% -buckets with 7 minimizer positions = 0.0815559% -buckets with 8 minimizer positions = 0.059031% -buckets with 9 minimizer positions = 0.0448457% -buckets with 10 minimizer positions = 0.0349758% -buckets with 11 minimizer positions = 0.0279273% -buckets with 12 minimizer positions = 0.022929% -buckets with 13 minimizer positions = 0.0189582% -buckets with 14 minimizer positions = 0.0159649% -buckets with 15 minimizer positions = 0.0135407% -buckets with 16 minimizer positions = 0.0117506% -max_bucket_size 81171 -2025-10-22 15:36:58: saving data structure to disk... -2025-10-22 15:37:00: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o ec.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k31.eulertigs.fa.gz'... -read 100000 sequences, 12802319 bases, 9802319 kmers -read 200000 sequences, 26155680 bases, 20155680 kmers -read 300000 sequences, 39727315 bases, 30727315 kmers -read 400000 sequences, 53567543 bases, 41567543 kmers -read 500000 sequences, 68009750 bases, 53009750 kmers -read 600000 sequences, 83050731 bases, 65050731 kmers -read 700000 sequences, 98819486 bases, 77819486 kmers -read 800000 sequences, 116043186 bases, 92043186 kmers -read 900000 sequences, 134201454 bases, 107201454 kmers -read 1000000 sequences, 153195620 bases, 123195620 kmers -read 1100000 sequences, 174787795 bases, 141787795 kmers -read 1200000 sequences, 183806919 bases, 147806919 kmers -read 1300000 sequences, 190658371 bases, 151658371 kmers -read 1400000 sequences, 197393762 bases, 155393762 kmers -read 1500000 sequences, 204308958 bases, 159308958 kmers -read 1600000 sequences, 211178004 bases, 163178004 kmers -read 1700000 sequences, 217938129 bases, 166938129 kmers -read 1800000 sequences, 224728931 bases, 170728931 kmers -read 1900000 sequences, 231435055 bases, 174435055 kmers -read 2000000 sequences, 238301856 bases, 178301856 kmers -read 2100000 sequences, 245162304 bases, 182162304 kmers -read 2200000 sequences, 251968534 bases, 185968534 kmers -read 2300000 sequences, 258797784 bases, 189797784 kmers -read 2400000 sequences, 265681419 bases, 193681419 kmers -read 2500000 sequences, 272480771 bases, 197480771 kmers -read 2600000 sequences, 279327274 bases, 201327274 kmers -read 2700000 sequences, 286169897 bases, 205169897 kmers -read 2800000 sequences, 293063897 bases, 209063897 kmers -read 2900000 sequences, 299941531 bases, 212941531 kmers -read 3000000 sequences, 306827724 bases, 216827724 kmers -read 3100000 sequences, 313725925 bases, 220725925 kmers -read 3200000 sequences, 320629887 bases, 224629887 kmers -read 3300000 sequences, 327545193 bases, 228545193 kmers -read 3400000 sequences, 334471610 bases, 232471610 kmers -read 3500000 sequences, 341603766 bases, 236603766 kmers -read 3600000 sequences, 348399690 bases, 240399690 kmers -read 3700000 sequences, 355270676 bases, 244270676 kmers -read 3800000 sequences, 362436143 bases, 248436143 kmers -read 3900000 sequences, 369341114 bases, 252341114 kmers -read 4000000 sequences, 376235441 bases, 256235441 kmers -read 4100000 sequences, 383163199 bases, 260163199 kmers -read 4200000 sequences, 390047987 bases, 264047987 kmers -read 4300000 sequences, 396880438 bases, 267880438 kmers -read 4400000 sequences, 403776565 bases, 271776565 kmers -read 4500000 sequences, 410576367 bases, 275576367 kmers -read 4600000 sequences, 417377049 bases, 279377049 kmers -read 4700000 sequences, 424274495 bases, 283274495 kmers -read 4800000 sequences, 431192311 bases, 287192311 kmers -read 4900000 sequences, 438257785 bases, 291257785 kmers -read 5000000 sequences, 445233170 bases, 295233170 kmers -read 5100000 sequences, 452307732 bases, 299307732 kmers -read 5200000 sequences, 459344438 bases, 303344438 kmers -read 5300000 sequences, 466255981 bases, 307255981 kmers -read 5400000 sequences, 473220156 bases, 311220156 kmers -read 5500000 sequences, 480178864 bases, 315178864 kmers -read 5600000 sequences, 487198091 bases, 319198091 kmers -read 5700000 sequences, 494051268 bases, 323051268 kmers -read 5800000 sequences, 501294774 bases, 327294774 kmers -read 5900000 sequences, 508386191 bases, 331386191 kmers -read 6000000 sequences, 515368260 bases, 335368260 kmers -read 6100000 sequences, 522265327 bases, 339265327 kmers -read 6200000 sequences, 529435219 bases, 343435219 kmers -read 6300000 sequences, 536513892 bases, 347513892 kmers -read 6400000 sequences, 543669227 bases, 351669227 kmers -read 6500000 sequences, 550654427 bases, 355654427 kmers -read 6600000 sequences, 557665979 bases, 359665979 kmers -read 6700000 sequences, 564815722 bases, 363815722 kmers -read 6800000 sequences, 571787007 bases, 367787007 kmers -read 6900000 sequences, 578923485 bases, 371923485 kmers -read 7000000 sequences, 586116050 bases, 376116050 kmers -read 7100000 sequences, 593247546 bases, 380247546 kmers -read 7200000 sequences, 600225954 bases, 384225954 kmers -read 7300000 sequences, 607331027 bases, 388331027 kmers -read 7400000 sequences, 614417238 bases, 392417238 kmers -read 7500000 sequences, 621494916 bases, 396494916 kmers -read 7600000 sequences, 628713296 bases, 400713296 kmers -read 7700000 sequences, 635875916 bases, 404875916 kmers -read 7800000 sequences, 643000132 bases, 409000132 kmers -read 7900000 sequences, 650054935 bases, 413054935 kmers -read 8000000 sequences, 657174193 bases, 417174193 kmers -read 8100000 sequences, 664392690 bases, 421392690 kmers -read 8200000 sequences, 671575430 bases, 425575430 kmers -read 8300000 sequences, 678822397 bases, 429822397 kmers -read 8400000 sequences, 685932522 bases, 433932522 kmers -read 8500000 sequences, 693003257 bases, 438003257 kmers -read 8600000 sequences, 700264806 bases, 442264806 kmers -read 8700000 sequences, 707441916 bases, 446441916 kmers -read 8800000 sequences, 714783716 bases, 450783716 kmers -read 8900000 sequences, 722048687 bases, 455048687 kmers -read 9000000 sequences, 729536721 bases, 459536721 kmers -read 9100000 sequences, 736820834 bases, 463820834 kmers -read 9200000 sequences, 744240551 bases, 468240551 kmers -read 9300000 sequences, 751532385 bases, 472532385 kmers -read 9400000 sequences, 758908308 bases, 476908308 kmers -read 9500000 sequences, 766152765 bases, 481152765 kmers -read 9600000 sequences, 773460104 bases, 485460104 kmers -read 9700000 sequences, 780744999 bases, 489744999 kmers -read 9800000 sequences, 788046688 bases, 494046688 kmers -read 9900000 sequences, 795444088 bases, 498444088 kmers -read 10000000 sequences, 802902838 bases, 502902838 kmers -read 10100000 sequences, 810379702 bases, 507379702 kmers -read 10200000 sequences, 817713311 bases, 511713311 kmers -read 10300000 sequences, 825011133 bases, 516011133 kmers -read 10400000 sequences, 832292513 bases, 520292513 kmers -read 10500000 sequences, 839612784 bases, 524612784 kmers -read 10600000 sequences, 847027439 bases, 529027439 kmers -read 10700000 sequences, 854363725 bases, 533363725 kmers -read 10800000 sequences, 861721984 bases, 537721984 kmers -read 10900000 sequences, 869045250 bases, 542045250 kmers -read 11000000 sequences, 876372447 bases, 546372447 kmers -read 11100000 sequences, 883866002 bases, 550866002 kmers -read 11200000 sequences, 891340279 bases, 555340279 kmers -read 11300000 sequences, 899036889 bases, 560036889 kmers -read 11400000 sequences, 906434241 bases, 564434241 kmers -read 11500000 sequences, 913824257 bases, 568824257 kmers -read 11600000 sequences, 921342281 bases, 573342281 kmers -read 11700000 sequences, 928719144 bases, 577719144 kmers -read 11800000 sequences, 936164765 bases, 582164765 kmers -read 11900000 sequences, 943653758 bases, 586653758 kmers -read 12000000 sequences, 951284053 bases, 591284053 kmers -read 12100000 sequences, 958744772 bases, 595744772 kmers -read 12200000 sequences, 966275858 bases, 600275858 kmers -read 12300000 sequences, 973962686 bases, 604962686 kmers -read 12400000 sequences, 981647965 bases, 609647965 kmers -read 12500000 sequences, 989234531 bases, 614234531 kmers -read 12600000 sequences, 996919849 bases, 618919849 kmers -read 12700000 sequences, 1004488446 bases, 623488446 kmers -read 12800000 sequences, 1012083435 bases, 628083435 kmers -read 12900000 sequences, 1019844583 bases, 632844583 kmers -read 13000000 sequences, 1027636701 bases, 637636701 kmers -read 13100000 sequences, 1035458430 bases, 642458430 kmers -read 13200000 sequences, 1043299596 bases, 647299596 kmers -read 13300000 sequences, 1051100294 bases, 652100294 kmers -read 13400000 sequences, 1058940054 bases, 656940054 kmers -read 13500000 sequences, 1066735225 bases, 661735225 kmers -read 13600000 sequences, 1074662997 bases, 666662997 kmers -read 13700000 sequences, 1082381283 bases, 671381283 kmers -read 13800000 sequences, 1090055507 bases, 676055507 kmers -read 13900000 sequences, 1097835965 bases, 680835965 kmers -read 14000000 sequences, 1105722693 bases, 685722693 kmers -read 14100000 sequences, 1113495622 bases, 690495622 kmers -read 14200000 sequences, 1121380038 bases, 695380038 kmers -read 14300000 sequences, 1129522879 bases, 700522879 kmers -read 14400000 sequences, 1137515487 bases, 705515487 kmers -read 14500000 sequences, 1145547633 bases, 710547633 kmers -read 14600000 sequences, 1153636718 bases, 715636718 kmers -read 14700000 sequences, 1161507672 bases, 720507672 kmers -read 14800000 sequences, 1169638977 bases, 725638977 kmers -read 14900000 sequences, 1177765602 bases, 730765602 kmers -read 15000000 sequences, 1185796892 bases, 735796892 kmers -read 15100000 sequences, 1193966066 bases, 740966066 kmers -read 15200000 sequences, 1201992531 bases, 745992531 kmers -read 15300000 sequences, 1210139564 bases, 751139564 kmers -read 15400000 sequences, 1218303770 bases, 756303770 kmers -read 15500000 sequences, 1226563924 bases, 761563924 kmers -read 15600000 sequences, 1234769102 bases, 766769102 kmers -read 15700000 sequences, 1243038710 bases, 772038710 kmers -read 15800000 sequences, 1251312331 bases, 777312331 kmers -read 15900000 sequences, 1259505857 bases, 782505857 kmers -read 16000000 sequences, 1267846293 bases, 787846293 kmers -read 16100000 sequences, 1276258510 bases, 793258510 kmers -read 16200000 sequences, 1284600618 bases, 798600618 kmers -read 16300000 sequences, 1292910529 bases, 803910529 kmers -read 16400000 sequences, 1301315569 bases, 809315569 kmers -read 16500000 sequences, 1309948482 bases, 814948482 kmers -read 16600000 sequences, 1318536932 bases, 820536932 kmers -read 16700000 sequences, 1326901868 bases, 825901868 kmers -read 16800000 sequences, 1335658656 bases, 831658656 kmers -read 16900000 sequences, 1344318999 bases, 837318999 kmers -read 17000000 sequences, 1352901026 bases, 842901026 kmers -read 17100000 sequences, 1361738649 bases, 848738649 kmers -read 17200000 sequences, 1370441463 bases, 854441463 kmers -read 17300000 sequences, 1379104762 bases, 860104762 kmers -read 17400000 sequences, 1387857799 bases, 865857799 kmers -read 17500000 sequences, 1396827318 bases, 871827318 kmers -read 17600000 sequences, 1405624638 bases, 877624638 kmers -read 17700000 sequences, 1414580410 bases, 883580410 kmers -read 17800000 sequences, 1423596393 bases, 889596393 kmers -read 17900000 sequences, 1432608671 bases, 895608671 kmers -read 18000000 sequences, 1442015880 bases, 902015880 kmers -read 18100000 sequences, 1451131708 bases, 908131708 kmers -read 18200000 sequences, 1460386801 bases, 914386801 kmers -read 18300000 sequences, 1469583369 bases, 920583369 kmers -read 18400000 sequences, 1478759459 bases, 926759459 kmers -read 18500000 sequences, 1488122391 bases, 933122391 kmers -read 18600000 sequences, 1497569745 bases, 939569745 kmers -read 18700000 sequences, 1507030485 bases, 946030485 kmers -read 18800000 sequences, 1516707149 bases, 952707149 kmers -read 18900000 sequences, 1526397934 bases, 959397934 kmers -read 19000000 sequences, 1536308350 bases, 966308350 kmers -read 19100000 sequences, 1546342668 bases, 973342668 kmers -read 19200000 sequences, 1556281669 bases, 980281669 kmers -read 19300000 sequences, 1566271275 bases, 987271275 kmers -read 19400000 sequences, 1576402796 bases, 994402796 kmers -read 19500000 sequences, 1586440957 bases, 1001440957 kmers -read 19600000 sequences, 1596689344 bases, 1008689344 kmers -read 19700000 sequences, 1607088748 bases, 1016088748 kmers -read 19800000 sequences, 1617543387 bases, 1023543387 kmers -read 19900000 sequences, 1628261415 bases, 1031261415 kmers -read 20000000 sequences, 1639158516 bases, 1039158516 kmers -read 20100000 sequences, 1650338356 bases, 1047338356 kmers -read 20200000 sequences, 1661398094 bases, 1055398094 kmers -read 20300000 sequences, 1672652108 bases, 1063652108 kmers -read 20400000 sequences, 1683961135 bases, 1071961135 kmers -read 20500000 sequences, 1695700838 bases, 1080700838 kmers -read 20600000 sequences, 1707448842 bases, 1089448842 kmers -read 20700000 sequences, 1719587691 bases, 1098587691 kmers -read 20800000 sequences, 1732024822 bases, 1108024822 kmers -=== step 1.1: 'encoding input' 5.89151 [sec] (5.3028 [ns/kmer]) -read 20822360 sequences, 1735689645 bases, 1111018845 kmers -num_kmers 1111018845 -cost: 2.0 + 1.1245 [bits/kmer] -max_len 176455 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.43371 [sec] (1.29045 [ns/kmer]) -=== step 1: 'parse file' 7.32535 [sec] (6.59336 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -=== step 2.1: 'merging minimizers tuples' 15.2236 [sec] (13.7024 [ns/kmer]) -num_minimizers = 153003346 -num_minimizer_positions = 201447538 -num_super_kmers = 201447538 -building minimizers MPHF with 64 threads and 52 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.77046 [sec] (6.09392 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140221204212217.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 7.59272 [sec] (6.83402 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 4.55477 [sec] (4.09964 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 16447921/153003346 (10.75%) -num_buckets_in_skew_index 10727/153003346 (0.00701096%) -max_bucket_size 71743 -log2_max_bucket_size 17 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 61815481/201447538 (30.6856%) -num_minimizer_positions_of_buckets_in_skew_index 3087359/201447538 (1.53259%) -computing minimizers offsets: 3.9153 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2530324 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1770374 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1563484 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1214204 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1091924 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1055593 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 789627 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 71743: 1030596 -num_kmers_in_skew_index 11046126 (0.994234%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2530324 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2530324)... - built mphs[0] for 2530324 kmers; bits/key = 2.5599 - built positions[0] for 2530324 kmers; bits/key = 7.00015 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1770374 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1770374)... - built mphs[1] for 1770374 kmers; bits/key = 2.56029 - built positions[1] for 1770374 kmers; bits/key = 8.00019 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1563484 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1563484)... - built mphs[2] for 1563484 kmers; bits/key = 2.56038 - built positions[2] for 1563484 kmers; bits/key = 9.00021 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1214204 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1214204)... - built mphs[3] for 1214204 kmers; bits/key = 2.56081 - built positions[3] for 1214204 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1091924 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1091924)... - built mphs[4] for 1091924 kmers; bits/key = 2.4182 - built positions[4] for 1091924 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1055593 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1055593)... - built mphs[5] for 1055593 kmers; bits/key = 2.56108 - built positions[5] for 1055593 kmers; bits/key = 12.0003 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 789627 - building MPHF with 64 threads and 1 partitions (avg. partition size = 789627)... - built mphs[6] for 789627 kmers; bits/key = 2.41888 - built positions[6] for 789627 kmers; bits/key = 13.0004 - lower = 8192; upper = 71743; num_bits_per_pos = 17; num_kmers_in_partition = 1030596 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1030596)... - built mphs[7] for 1030596 kmers; bits/key = 2.4183 - built positions[7] for 1030596 kmers; bits/key = 17.0004 -computing skew index took: 6.0632 [sec] -=== step 3: 'build sparse and skew index' 10.3031 [sec] (9.27357 [ns/kmer]) -=== total_time 51.77 [sec] (46.5969 [ns/kmer]) -total index size: 1416509363 [B] -- 1416.51 [MB] -SPACE BREAKDOWN: - mphf: 0.394931 [bits/kmer] (2.86775 [bits/key]) -- 3.87198% - strings_offsets: 0.337884 [bits/kmer] -- 3.31268% - control_codewords: 4.40686 [bits/kmer] -- 43.2057% - mid_load_buckets: 1.7248 [bits/kmer] -- 16.9102% - begin_buckets_of_size: 1.92976e-06 [bits/kmer] -- 1.89197e-05% - strings: 3.1245 [bits/kmer] -- 30.6332% - skew_index: 0.210737 [bits/kmer] -- 2.0661% - weights: 1.32491e-06 [bits/kmer] -- 1.29897e-05% - -------------- - total: 10.1997 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 89.2429% -buckets with 2 minimizer positions = 6.05035% -buckets with 3 minimizer positions = 1.71539% -buckets with 4 minimizer positions = 0.818195% -buckets with 5 minimizer positions = 0.497438% -buckets with 6 minimizer positions = 0.343779% -buckets with 7 minimizer positions = 0.255749% -buckets with 8 minimizer positions = 0.199702% -buckets with 9 minimizer positions = 0.159387% -buckets with 10 minimizer positions = 0.13028% -buckets with 11 minimizer positions = 0.107217% -buckets with 12 minimizer positions = 0.0878229% -buckets with 13 minimizer positions = 0.0717429% -buckets with 14 minimizer positions = 0.0589601% -buckets with 15 minimizer positions = 0.0471898% -buckets with 16 minimizer positions = 0.0377861% -max_bucket_size 71743 -2025-10-22 15:37:53: saving data structure to disk... -2025-10-22 15:37:54: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -g 16 -t 64 --verbose -d tmp_dir -o se.k31.sshash -k = 31, m = 21, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... -read 100000 sequences, 8718431 bases, 5718431 kmers -read 200000 sequences, 17474097 bases, 11474097 kmers -read 300000 sequences, 26299449 bases, 17299449 kmers -read 400000 sequences, 35167130 bases, 23167130 kmers -read 500000 sequences, 43967965 bases, 28967965 kmers -read 600000 sequences, 52886445 bases, 34886445 kmers -read 700000 sequences, 61937196 bases, 40937196 kmers -read 800000 sequences, 71070714 bases, 47070714 kmers -read 900000 sequences, 80176912 bases, 53176912 kmers -read 1000000 sequences, 89525906 bases, 59525906 kmers -read 1100000 sequences, 98984859 bases, 65984859 kmers -read 1200000 sequences, 108719881 bases, 72719881 kmers -read 1300000 sequences, 118280880 bases, 79280880 kmers -read 1400000 sequences, 127917770 bases, 85917770 kmers -read 1500000 sequences, 137591691 bases, 92591691 kmers -read 1600000 sequences, 147395215 bases, 99395215 kmers -read 1700000 sequences, 157335047 bases, 106335047 kmers -read 1800000 sequences, 167445213 bases, 113445213 kmers -read 1900000 sequences, 177725569 bases, 120725569 kmers -read 2000000 sequences, 188052064 bases, 128052064 kmers -read 2100000 sequences, 198499534 bases, 135499534 kmers -read 2200000 sequences, 209053278 bases, 143053278 kmers -read 2300000 sequences, 219848016 bases, 150848016 kmers -read 2400000 sequences, 230787167 bases, 158787167 kmers -read 2500000 sequences, 242014409 bases, 167014409 kmers -read 2600000 sequences, 253501985 bases, 175501985 kmers -read 2700000 sequences, 265108770 bases, 184108770 kmers -read 2800000 sequences, 277040197 bases, 193040197 kmers -read 2900000 sequences, 289406751 bases, 202406751 kmers -read 3000000 sequences, 302142183 bases, 212142183 kmers -read 3100000 sequences, 315168435 bases, 222168435 kmers -read 3200000 sequences, 329083083 bases, 233083083 kmers -read 3300000 sequences, 343508535 bases, 244508535 kmers -read 3400000 sequences, 358608045 bases, 256608045 kmers -read 3500000 sequences, 374790387 bases, 269790387 kmers -read 3600000 sequences, 392124136 bases, 284124136 kmers -read 3700000 sequences, 410698510 bases, 299698510 kmers -read 3800000 sequences, 431358064 bases, 317358064 kmers -read 3900000 sequences, 454179453 bases, 337179453 kmers -read 4000000 sequences, 461236524 bases, 341236524 kmers -read 4100000 sequences, 468031549 bases, 345031549 kmers -read 4200000 sequences, 474889571 bases, 348889571 kmers -read 4300000 sequences, 481729708 bases, 352729708 kmers -read 4400000 sequences, 488721954 bases, 356721954 kmers -read 4500000 sequences, 495625078 bases, 360625078 kmers -read 4600000 sequences, 502596576 bases, 364596576 kmers -read 4700000 sequences, 509600517 bases, 368600517 kmers -read 4800000 sequences, 516484470 bases, 372484470 kmers -read 4900000 sequences, 523427219 bases, 376427219 kmers -read 5000000 sequences, 530371783 bases, 380371783 kmers -read 5100000 sequences, 537329595 bases, 384329595 kmers -read 5200000 sequences, 544209359 bases, 388209359 kmers -read 5300000 sequences, 551189922 bases, 392189922 kmers -read 5400000 sequences, 558101939 bases, 396101939 kmers -read 5500000 sequences, 565120163 bases, 400120163 kmers -read 5600000 sequences, 572157570 bases, 404157570 kmers -read 5700000 sequences, 579064866 bases, 408064866 kmers -read 5800000 sequences, 586002711 bases, 412002711 kmers -read 5900000 sequences, 592940936 bases, 415940936 kmers -read 6000000 sequences, 600036489 bases, 420036489 kmers -read 6100000 sequences, 607035798 bases, 424035798 kmers -read 6200000 sequences, 614208718 bases, 428208718 kmers -read 6300000 sequences, 621168245 bases, 432168245 kmers -read 6400000 sequences, 628072498 bases, 436072498 kmers -read 6500000 sequences, 635102614 bases, 440102614 kmers -read 6600000 sequences, 642120732 bases, 444120732 kmers -read 6700000 sequences, 649088967 bases, 448088967 kmers -read 6800000 sequences, 656101755 bases, 452101755 kmers -read 6900000 sequences, 663148884 bases, 456148884 kmers -read 7000000 sequences, 670072473 bases, 460072473 kmers -read 7100000 sequences, 677027864 bases, 464027864 kmers -read 7200000 sequences, 684172202 bases, 468172202 kmers -read 7300000 sequences, 691211207 bases, 472211207 kmers -read 7400000 sequences, 698208790 bases, 476208790 kmers -read 7500000 sequences, 705328995 bases, 480328995 kmers -read 7600000 sequences, 712361023 bases, 484361023 kmers -read 7700000 sequences, 719471804 bases, 488471804 kmers -read 7800000 sequences, 726605138 bases, 492605138 kmers -read 7900000 sequences, 733774594 bases, 496774594 kmers -read 8000000 sequences, 740830673 bases, 500830673 kmers -read 8100000 sequences, 747950180 bases, 504950180 kmers -read 8200000 sequences, 755058730 bases, 509058730 kmers -read 8300000 sequences, 762216427 bases, 513216427 kmers -read 8400000 sequences, 769353851 bases, 517353851 kmers -read 8500000 sequences, 776583161 bases, 521583161 kmers -read 8600000 sequences, 783816261 bases, 525816261 kmers -read 8700000 sequences, 791077370 bases, 530077370 kmers -read 8800000 sequences, 798157781 bases, 534157781 kmers -read 8900000 sequences, 805241016 bases, 538241016 kmers -read 9000000 sequences, 812530455 bases, 542530455 kmers -read 9100000 sequences, 819617693 bases, 546617693 kmers -read 9200000 sequences, 826809772 bases, 550809772 kmers -read 9300000 sequences, 833919107 bases, 554919107 kmers -read 9400000 sequences, 841155666 bases, 559155666 kmers -read 9500000 sequences, 848401695 bases, 563401695 kmers -read 9600000 sequences, 855643716 bases, 567643716 kmers -read 9700000 sequences, 862872782 bases, 571872782 kmers -read 9800000 sequences, 870171741 bases, 576171741 kmers -read 9900000 sequences, 877460939 bases, 580460939 kmers -read 10000000 sequences, 884692153 bases, 584692153 kmers -read 10100000 sequences, 891988915 bases, 588988915 kmers -read 10200000 sequences, 899332167 bases, 593332167 kmers -read 10300000 sequences, 906596132 bases, 597596132 kmers -read 10400000 sequences, 913914222 bases, 601914222 kmers -read 10500000 sequences, 921197164 bases, 606197164 kmers -read 10600000 sequences, 928621352 bases, 610621352 kmers -read 10700000 sequences, 935962590 bases, 614962590 kmers -read 10800000 sequences, 943225398 bases, 619225398 kmers -read 10900000 sequences, 950606271 bases, 623606271 kmers -read 11000000 sequences, 958222271 bases, 628222271 kmers -read 11100000 sequences, 965609642 bases, 632609642 kmers -read 11200000 sequences, 972999574 bases, 636999574 kmers -read 11300000 sequences, 980385996 bases, 641385996 kmers -read 11400000 sequences, 987756692 bases, 645756692 kmers -read 11500000 sequences, 995228727 bases, 650228727 kmers -read 11600000 sequences, 1002716000 bases, 654716000 kmers -read 11700000 sequences, 1010163238 bases, 659163238 kmers -read 11800000 sequences, 1017604060 bases, 663604060 kmers -read 11900000 sequences, 1025150347 bases, 668150347 kmers -read 12000000 sequences, 1032736062 bases, 672736062 kmers -read 12100000 sequences, 1040213508 bases, 677213508 kmers -read 12200000 sequences, 1047864763 bases, 681864763 kmers -read 12300000 sequences, 1055370986 bases, 686370986 kmers -read 12400000 sequences, 1062882136 bases, 690882136 kmers -read 12500000 sequences, 1070457834 bases, 695457834 kmers -read 12600000 sequences, 1078056503 bases, 700056503 kmers -read 12700000 sequences, 1085619892 bases, 704619892 kmers -read 12800000 sequences, 1093220371 bases, 709220371 kmers -read 12900000 sequences, 1100938017 bases, 713938017 kmers -read 13000000 sequences, 1108501169 bases, 718501169 kmers -read 13100000 sequences, 1116117667 bases, 723117667 kmers -read 13200000 sequences, 1123791984 bases, 727791984 kmers -read 13300000 sequences, 1131456294 bases, 732456294 kmers -read 13400000 sequences, 1139167231 bases, 737167231 kmers -read 13500000 sequences, 1147084240 bases, 742084240 kmers -read 13600000 sequences, 1154903455 bases, 746903455 kmers -read 13700000 sequences, 1162719581 bases, 751719581 kmers -read 13800000 sequences, 1170515268 bases, 756515268 kmers -read 13900000 sequences, 1178310906 bases, 761310906 kmers -read 14000000 sequences, 1186158510 bases, 766158510 kmers -read 14100000 sequences, 1194143461 bases, 771143461 kmers -read 14200000 sequences, 1202037257 bases, 776037257 kmers -read 14300000 sequences, 1210016774 bases, 781016774 kmers -read 14400000 sequences, 1217929746 bases, 785929746 kmers -read 14500000 sequences, 1226009557 bases, 791009557 kmers -read 14600000 sequences, 1233936531 bases, 795936531 kmers -read 14700000 sequences, 1241953842 bases, 800953842 kmers -read 14800000 sequences, 1249971925 bases, 805971925 kmers -read 14900000 sequences, 1258012031 bases, 811012031 kmers -read 15000000 sequences, 1266102895 bases, 816102895 kmers -read 15100000 sequences, 1274149698 bases, 821149698 kmers -read 15200000 sequences, 1282474916 bases, 826474916 kmers -read 15300000 sequences, 1290768947 bases, 831768947 kmers -read 15400000 sequences, 1299121797 bases, 837121797 kmers -read 15500000 sequences, 1307304198 bases, 842304198 kmers -read 15600000 sequences, 1315661756 bases, 847661756 kmers -read 15700000 sequences, 1324089837 bases, 853089837 kmers -read 15800000 sequences, 1332318617 bases, 858318617 kmers -read 15900000 sequences, 1340760587 bases, 863760587 kmers -read 16000000 sequences, 1349263765 bases, 869263765 kmers -read 16100000 sequences, 1357811757 bases, 874811757 kmers -read 16200000 sequences, 1366358226 bases, 880358226 kmers -read 16300000 sequences, 1375027036 bases, 886027036 kmers -read 16400000 sequences, 1383710258 bases, 891710258 kmers -=== step 1.1: 'encoding input' 5.00424 [sec] (5.59564 [ns/kmer]) -read 16440873 sequences, 1387536274 bases, 894310084 kmers -num_kmers 894310084 -cost: 2.0 + 1.10303 [bits/kmer] -max_len 117016 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 17 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.64.bin'... -=== step 1.2: 'computing minimizers tuples' 1.1442 [sec] (1.27942 [ns/kmer]) -=== step 1: 'parse file' 6.14854 [sec] (6.87518 [ns/kmer]) - == files to merge = 65 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.0613 [sec] (13.4867 [ns/kmer]) -num_minimizers = 126246665 -num_minimizer_positions = 162006751 -num_super_kmers = 162006751 -building minimizers MPHF with 64 threads and 43 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.61504 [sec] (6.27863 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140274667494522.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.20336 [sec] (6.93648 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 6.29036 [sec] (7.03375 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 14059268/126246665 (11.1363%) -num_buckets_in_skew_index 8266/126246665 (0.0065475%) -max_bucket_size 36894 -log2_max_bucket_size 16 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 48164669/162006751 (29.73%) -num_minimizer_positions_of_buckets_in_skew_index 1662951/162006751 (1.02647%) -computing minimizers offsets: 3.16291 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2254325 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1183762 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 885561 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 591648 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 450833 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 373731 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 338406 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 36894: 388502 -num_kmers_in_skew_index 6466768 (0.723101%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 2254325 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2254325)... - built mphs[0] for 2254325 kmers; bits/key = 2.56001 - built positions[0] for 2254325 kmers; bits/key = 7.00015 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 1183762 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1183762)... - built mphs[1] for 1183762 kmers; bits/key = 2.56081 - built positions[1] for 1183762 kmers; bits/key = 8.00031 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 885561 - building MPHF with 64 threads and 1 partitions (avg. partition size = 885561)... - built mphs[2] for 885561 kmers; bits/key = 2.56147 - built positions[2] for 885561 kmers; bits/key = 9.00043 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 591648 - building MPHF with 64 threads and 1 partitions (avg. partition size = 591648)... - built mphs[3] for 591648 kmers; bits/key = 2.56263 - built positions[3] for 591648 kmers; bits/key = 10.0005 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 450833 - building MPHF with 64 threads and 1 partitions (avg. partition size = 450833)... - built mphs[4] for 450833 kmers; bits/key = 2.42098 - built positions[4] for 450833 kmers; bits/key = 11.0007 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 373731 - building MPHF with 64 threads and 1 partitions (avg. partition size = 373731)... - built mphs[5] for 373731 kmers; bits/key = 2.56484 - built positions[5] for 373731 kmers; bits/key = 12.0009 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 338406 - building MPHF with 64 threads and 1 partitions (avg. partition size = 338406)... - built mphs[6] for 338406 kmers; bits/key = 2.4226 - built positions[6] for 338406 kmers; bits/key = 13.001 - lower = 8192; upper = 36894; num_bits_per_pos = 16; num_kmers_in_partition = 388502 - building MPHF with 64 threads and 1 partitions (avg. partition size = 388502)... - built mphs[7] for 388502 kmers; bits/key = 2.56472 - built positions[7] for 388502 kmers; bits/key = 16.0009 -computing skew index took: 3.60778 [sec] -=== step 3: 'build sparse and skew index' 7.03857 [sec] (7.87039 [ns/kmer]) -=== total_time 43.3572 [sec] (48.4811 [ns/kmer]) -total index size: 1137030132 [B] -- 1137.03 [MB] -SPACE BREAKDOWN: - mphf: 0.405702 [bits/kmer] (2.87392 [bits/key]) -- 3.98871% - strings_offsets: 0.333373 [bits/kmer] -- 3.2776% - control_codewords: 4.51733 [bits/kmer] -- 44.4128% - mid_load_buckets: 1.66956 [bits/kmer] -- 16.4145% - begin_buckets_of_size: 2.39738e-06 [bits/kmer] -- 2.35702e-05% - strings: 3.10303 [bits/kmer] -- 30.5079% - skew_index: 0.142237 [bits/kmer] -- 1.39842% - weights: 1.64596e-06 [bits/kmer] -- 1.61825e-05% - -------------- - total: 10.1712 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 88.8571% -buckets with 2 minimizer positions = 6.64024% -buckets with 3 minimizer positions = 1.83049% -buckets with 4 minimizer positions = 0.817717% -buckets with 5 minimizer positions = 0.475524% -buckets with 6 minimizer positions = 0.319677% -buckets with 7 minimizer positions = 0.233881% -buckets with 8 minimizer positions = 0.178737% -buckets with 9 minimizer positions = 0.138965% -buckets with 10 minimizer positions = 0.107245% -buckets with 11 minimizer positions = 0.0823246% -buckets with 12 minimizer positions = 0.0632579% -buckets with 13 minimizer positions = 0.0483173% -buckets with 14 minimizer positions = 0.0365673% -buckets with 15 minimizer positions = 0.027916% -buckets with 16 minimizer positions = 0.0218604% -max_bucket_size 36894 -2025-10-22 15:38:38: saving data structure to disk... -2025-10-22 15:38:39: DONE diff --git a/benchmarks/results-22-10-25/k63/canon-bench.log b/benchmarks/results-22-10-25/k63/canon-bench.log deleted file mode 100644 index c307f83..0000000 --- a/benchmarks/results-22-10-25/k63/canon-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 625.152 -avg_nanosec_per_negative_lookup 476.825 -avg_nanosec_per_access 297.102 -iterator: avg_nanosec_per_kmer 2.7503 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 625.786 -avg_nanosec_per_negative_lookup 463.014 -avg_nanosec_per_access 299 -iterator: avg_nanosec_per_kmer 2.76641 -./sshash bench -i cod.k63.canon.sshash -avg_nanosec_per_positive_lookup 619.386 -avg_nanosec_per_negative_lookup 455.896 -avg_nanosec_per_access 306.879 -iterator: avg_nanosec_per_kmer 2.8279 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 571.126 -avg_nanosec_per_negative_lookup 485.048 -avg_nanosec_per_access 343.688 -iterator: avg_nanosec_per_kmer 2.79569 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 564.902 -avg_nanosec_per_negative_lookup 484.953 -avg_nanosec_per_access 342.74 -iterator: avg_nanosec_per_kmer 2.75394 -./sshash bench -i kestrel.k63.canon.sshash -avg_nanosec_per_positive_lookup 562.664 -avg_nanosec_per_negative_lookup 481.77 -avg_nanosec_per_access 342.762 -iterator: avg_nanosec_per_kmer 2.75729 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 727.407 -avg_nanosec_per_negative_lookup 540.515 -avg_nanosec_per_access 357.969 -iterator: avg_nanosec_per_kmer 2.78199 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 707.179 -avg_nanosec_per_negative_lookup 537.748 -avg_nanosec_per_access 369.65 -iterator: avg_nanosec_per_kmer 2.98267 -./sshash bench -i human.k63.canon.sshash -avg_nanosec_per_positive_lookup 729.143 -avg_nanosec_per_negative_lookup 526.801 -avg_nanosec_per_access 367.36 -iterator: avg_nanosec_per_kmer 2.76464 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1163.11 -avg_nanosec_per_negative_lookup 620.751 -avg_nanosec_per_access 670.786 -iterator: avg_nanosec_per_kmer 2.87851 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1151.82 -avg_nanosec_per_negative_lookup 621.635 -avg_nanosec_per_access 673.045 -iterator: avg_nanosec_per_kmer 2.89931 -./sshash bench -i hprc.k63.canon.sshash -avg_nanosec_per_positive_lookup 1155.34 -avg_nanosec_per_negative_lookup 615.418 -avg_nanosec_per_access 672.742 -iterator: avg_nanosec_per_kmer 2.88102 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1488.37 -avg_nanosec_per_negative_lookup 533.721 -avg_nanosec_per_access 473.19 -iterator: avg_nanosec_per_kmer 2.96014 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1473.8 -avg_nanosec_per_negative_lookup 523.615 -avg_nanosec_per_access 507.294 -iterator: avg_nanosec_per_kmer 2.90659 -./sshash bench -i ec.k63.canon.sshash -avg_nanosec_per_positive_lookup 1492.72 -avg_nanosec_per_negative_lookup 536.841 -avg_nanosec_per_access 467.657 -iterator: avg_nanosec_per_kmer 2.90476 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1372.62 -avg_nanosec_per_negative_lookup 523.641 -avg_nanosec_per_access 431.371 -iterator: avg_nanosec_per_kmer 2.97875 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1376.07 -avg_nanosec_per_negative_lookup 508.084 -avg_nanosec_per_access 440.472 -iterator: avg_nanosec_per_kmer 2.80899 -./sshash bench -i se.k63.canon.sshash -avg_nanosec_per_positive_lookup 1407.79 -avg_nanosec_per_negative_lookup 506.944 -avg_nanosec_per_access 448.106 -iterator: avg_nanosec_per_kmer 2.8181 diff --git a/benchmarks/results-22-10-25/k63/canon-build.log b/benchmarks/results-22-10-25/k63/canon-build.log deleted file mode 100644 index da7a1b6..0000000 --- a/benchmarks/results-22-10-25/k63/canon-build.log +++ /dev/null @@ -1,2131 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o cod.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.48886 [sec] (2.67498 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.436807 [sec] (0.784797 [ns/kmer]) -=== step 1: 'parse file' 1.92575 [sec] (3.45993 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.51997 [sec] (4.52755 [ns/kmer]) -num_minimizers = 29275778 -num_minimizer_positions = 34590805 -num_super_kmers = 36307176 -building minimizers MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.63668 [sec] (2.94058 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141291417507964.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.34013 [sec] (2.40776 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.693623 [sec] (1.24621 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 1189512/29275778 (4.06313%) -num_buckets_in_skew_index 5032/29275778 (0.0171883%) -max_bucket_size 815743 -log2_max_bucket_size 20 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 4643594/34590805 (13.4244%) -num_minimizer_positions_of_buckets_in_skew_index 1865977/34590805 (5.39443%) -computing minimizers offsets: 0.513675 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4850737 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3133092 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1886121 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1113398 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 945186 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1019479 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 681501 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 815743: 5508330 -num_kmers_in_skew_index 19137844 (3.43844%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 4850737 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 4850737 kmers; bits/key = 2.71418 - built positions[0] for 4850737 kmers; bits/key = 7.00007 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 3133092 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[1] for 3133092 kmers; bits/key = 3.15324 - built positions[1] for 3133092 kmers; bits/key = 8.00011 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1886121 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1886121)... - built mphs[2] for 1886121 kmers; bits/key = 2.5602 - built positions[2] for 1886121 kmers; bits/key = 9.00018 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1113398 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1113398)... - built mphs[3] for 1113398 kmers; bits/key = 2.56094 - built positions[3] for 1113398 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 945186 - building MPHF with 64 threads and 1 partitions (avg. partition size = 945186)... - built mphs[4] for 945186 kmers; bits/key = 2.56129 - built positions[4] for 945186 kmers; bits/key = 11.0003 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 1019479 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1019479)... - built mphs[5] for 1019479 kmers; bits/key = 2.56115 - built positions[5] for 1019479 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 681501 - building MPHF with 64 threads and 1 partitions (avg. partition size = 681501)... - built mphs[6] for 681501 kmers; bits/key = 2.41941 - built positions[6] for 681501 kmers; bits/key = 13.0005 - lower = 8192; upper = 815743; num_bits_per_pos = 20; num_kmers_in_partition = 5508330 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 5508330 kmers; bits/key = 2.59546 - built positions[7] for 5508330 kmers; bits/key = 20.0001 -computing skew index took: 5.81458 [sec] -=== step 3: 'build sparse and skew index' 6.38025 [sec] (11.4632 [ns/kmer]) -=== total_time 14.4964 [sec] (26.0452 [ns/kmer]) -total index size: 345440534 [B] -- 345.441 [MB] -SPACE BREAKDOWN: - mphf: 0.151285 [bits/kmer] (2.87621 [bits/key]) -- 3.04695% - strings_offsets: 0.115799 [bits/kmer] -- 2.33223% - control_codewords: 1.63057 [bits/kmer] -- 32.8403% - mid_load_buckets: 0.250291 [bits/kmer] -- 5.04096% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 7.75821e-05% - strings: 2.21266 [bits/kmer] -- 44.564% - skew_index: 0.604527 [bits/kmer] -- 12.1754% - weights: 2.6447e-06 [bits/kmer] -- 5.32653e-05% - -------------- - total: 4.96514 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 95.9197% -buckets with 2 minimizer positions = 2.25505% -buckets with 3 minimizer positions = 0.743143% -buckets with 4 minimizer positions = 0.33953% -buckets with 5 minimizer positions = 0.188914% -buckets with 6 minimizer positions = 0.116602% -buckets with 7 minimizer positions = 0.0799535% -buckets with 8 minimizer positions = 0.0565963% -buckets with 9 minimizer positions = 0.0427691% -buckets with 10 minimizer positions = 0.0324774% -buckets with 11 minimizer positions = 0.0259498% -buckets with 12 minimizer positions = 0.0206382% -buckets with 13 minimizer positions = 0.017038% -buckets with 14 minimizer positions = 0.0148143% -buckets with 15 minimizer positions = 0.0124232% -buckets with 16 minimizer positions = 0.0107973% -max_bucket_size 815743 -2025-10-22 15:55:06: saving data structure to disk... -2025-10-22 15:55:06: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --canonical --verbose -d tmp_dir -o kestrel.k63.canon.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.72496 [sec] (2.35876 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.689165 [sec] (0.59655 [ns/kmer]) -=== step 1: 'parse file' 3.41425 [sec] (2.95542 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 5.09407 [sec] (4.40949 [ns/kmer]) -num_minimizers = 68497878 -num_minimizer_positions = 69282395 -num_super_kmers = 73080845 -building minimizers MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.03499 [sec] (2.62712 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141306272701477.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.68175 [sec] (2.32136 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.37776 [sec] (1.19261 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 296941/68497878 (0.433504%) -num_buckets_in_skew_index 787/68497878 (0.00114894%) -max_bucket_size 1509 -log2_max_bucket_size 11 -skew index num_partitions 5 -num_minimizer_positions_of_buckets_larger_than_1 973386/69282395 (1.40495%) -num_minimizer_positions_of_buckets_in_skew_index 108859/69282395 (0.157124%) -computing minimizers offsets: 0.575347 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 854803 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 508726 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 353088 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 143157 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1509: 45334 -num_kmers_in_skew_index 1905108 (0.164909%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 854803 - building MPHF with 64 threads and 1 partitions (avg. partition size = 854803)... - built mphs[0] for 854803 kmers; bits/key = 2.5616 - built positions[0] for 854803 kmers; bits/key = 7.00044 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 508726 - building MPHF with 64 threads and 1 partitions (avg. partition size = 508726)... - built mphs[1] for 508726 kmers; bits/key = 2.42032 - built positions[1] for 508726 kmers; bits/key = 8.00066 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 353088 - building MPHF with 64 threads and 1 partitions (avg. partition size = 353088)... - built mphs[2] for 353088 kmers; bits/key = 2.56521 - built positions[2] for 353088 kmers; bits/key = 9.00091 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 143157 - building MPHF with 64 threads and 1 partitions (avg. partition size = 143157)... - built mphs[3] for 143157 kmers; bits/key = 2.4309 - built positions[3] for 143157 kmers; bits/key = 10.0026 - lower = 1024; upper = 1509; num_bits_per_pos = 11; num_kmers_in_partition = 45334 - building MPHF with 64 threads and 1 partitions (avg. partition size = 45334)... - built mphs[4] for 45334 kmers; bits/key = 2.46173 - built positions[4] for 45334 kmers; bits/key = 11.0074 -computing skew index took: 1.06363 [sec] -=== step 3: 'build sparse and skew index' 1.72241 [sec] (1.49094 [ns/kmer]) -=== total_time 17.3252 [sec] (14.9969 [ns/kmer]) -total index size: 610013381 [B] -- 610.013 [MB] -SPACE BREAKDOWN: - mphf: 0.16806 [bits/kmer] (2.83441 [bits/key]) -- 3.97842% - strings_offsets: 0.0958241 [bits/kmer] -- 2.26841% - control_codewords: 1.89737 [bits/kmer] -- 44.9157% - mid_load_buckets: 0.0261201 [bits/kmer] -- 0.618333% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.39335e-05% - strings: 2.01672 [bits/kmer] -- 47.7411% - skew_index: 0.0201901 [bits/kmer] -- 0.477952% - weights: 1.27418e-06 [bits/kmer] -- 3.01633e-05% - -------------- - total: 4.22428 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.5653% -buckets with 2 minimizer positions = 0.296122% -buckets with 3 minimizer positions = 0.0602092% -buckets with 4 minimizer positions = 0.0251672% -buckets with 5 minimizer positions = 0.0136895% -buckets with 6 minimizer positions = 0.00842362% -buckets with 7 minimizer positions = 0.00572864% -buckets with 8 minimizer positions = 0.00416071% -buckets with 9 minimizer positions = 0.00301323% -buckets with 10 minimizer positions = 0.00248183% -buckets with 11 minimizer positions = 0.00184093% -buckets with 12 minimizer positions = 0.00158691% -buckets with 13 minimizer positions = 0.00117084% -buckets with 14 minimizer positions = 0.00105697% -buckets with 15 minimizer positions = 0.000887619% -buckets with 16 minimizer positions = 0.000756228% -max_bucket_size 1509 -2025-10-22 15:55:23: saving data structure to disk... -2025-10-22 15:55:24: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --canonical --verbose -d tmp_dir -o human.k63.canon.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 7.01186 [sec] (2.53015 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.56781 [sec] (0.565729 [ns/kmer]) -=== step 1: 'parse file' 8.57981 [sec] (3.09593 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.5318 [sec] (4.52197 [ns/kmer]) -num_minimizers = 149769567 -num_minimizer_positions = 173272792 -num_super_kmers = 182565576 -building minimizers MPHF with 64 threads and 50 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 6.18506 [sec] (2.23182 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141324265708404.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 6.3913 [sec] (2.30623 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.74666 [sec] (1.35194 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 4082749/149769567 (2.72602%) -num_buckets_in_skew_index 35781/149769567 (0.0238907%) -max_bucket_size 284250 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 16495406/173272792 (9.51991%) -num_minimizer_positions_of_buckets_in_skew_index 11126349/173272792 (6.42129%) -computing minimizers offsets: 2.12159 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 26742724 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 24475836 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 21113117 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19260150 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17989259 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15443443 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 12315344 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 284250: 28690575 -num_kmers_in_skew_index 166030448 (5.99103%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 26742724 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 26742724 kmers; bits/key = 2.56429 - built positions[0] for 26742724 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 24475836 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 24475836 kmers; bits/key = 2.62316 - built positions[1] for 24475836 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 21113117 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[2] for 21113117 kmers; bits/key = 2.6904 - built positions[2] for 21113117 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 19260150 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 19260150 kmers; bits/key = 2.59757 - built positions[3] for 19260150 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17989259 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17989259 kmers; bits/key = 2.53715 - built positions[4] for 17989259 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 15443443 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[5] for 15443443 kmers; bits/key = 2.69254 - built positions[5] for 15443443 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 12315344 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[6] for 12315344 kmers; bits/key = 2.67895 - built positions[6] for 12315344 kmers; bits/key = 13 - lower = 8192; upper = 284250; num_bits_per_pos = 19; num_kmers_in_partition = 28690575 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[7] for 28690575 kmers; bits/key = 2.55295 - built positions[7] for 28690575 kmers; bits/key = 19 -computing skew index took: 21.6427 [sec] -=== step 3: 'build sparse and skew index' 24.0033 [sec] (8.66133 [ns/kmer]) -=== total_time 61.4379 [sec] (22.1692 [ns/kmer]) -total index size: 1839839288 [B] -- 1839.84 [MB] -SPACE BREAKDOWN: - mphf: 0.152644 [bits/kmer] (2.82451 [bits/key]) -- 2.87406% - strings_offsets: 0.11255 [bits/kmer] -- 2.11915% - control_codewords: 1.78341 [bits/kmer] -- 33.579% - mid_load_buckets: 0.19047 [bits/kmer] -- 3.58627% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.45665e-05% - strings: 2.11826 [bits/kmer] -- 39.8836% - skew_index: 0.95376 [bits/kmer] -- 17.9579% - weights: 5.31156e-07 [bits/kmer] -- 1.00009e-05% - -------------- - total: 5.31109 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.2501% -buckets with 2 minimizer positions = 1.59767% -buckets with 3 minimizer positions = 0.444706% -buckets with 4 minimizer positions = 0.198987% -buckets with 5 minimizer positions = 0.113029% -buckets with 6 minimizer positions = 0.07244% -buckets with 7 minimizer positions = 0.0504562% -buckets with 8 minimizer positions = 0.0370322% -buckets with 9 minimizer positions = 0.0281472% -buckets with 10 minimizer positions = 0.0224598% -buckets with 11 minimizer positions = 0.0182414% -buckets with 12 minimizer positions = 0.0149463% -buckets with 13 minimizer positions = 0.0124745% -buckets with 14 minimizer positions = 0.0107405% -buckets with 15 minimizer positions = 0.00923686% -buckets with 16 minimizer positions = 0.00803234% -max_bucket_size 284250 -2025-10-22 15:56:26: saving data structure to disk... -2025-10-22 15:56:27: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o hprc.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.7347 [sec] (4.67955 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.82.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.83.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.84.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.85.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.86.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.87.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.88.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.89.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.90.bin'... -=== step 1.2: 'computing minimizers tuples' 11.09 [sec] (1.87116 [ns/kmer]) -=== step 1: 'parse file' 38.8247 [sec] (6.55073 [ns/kmer]) - == files to merge = 91 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.1: 'merging minimizers tuples' 37.899 [sec] (6.39453 [ns/kmer]) -num_minimizers = 295344565 -num_minimizer_positions = 485764487 -num_super_kmers = 507036670 -building minimizers MPHF with 64 threads and 99 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 12.3942 [sec] (2.09122 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.1.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 17.3753 [sec] (2.93165 [ns/kmer]) - == files to merge = 2 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141387443656133.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -num_super_kmers = 450000000 -num_super_kmers = 500000000 -=== step 2.4: 'merging minimizers tuples ' 22.3015 [sec] (3.76284 [ns/kmer]) -num_bits_per_offset = 34 -num_buckets_larger_than_1_not_in_skew_index 76095635/295344565 (25.765%) -num_buckets_in_skew_index 164193/295344565 (0.0555937%) -max_bucket_size 265182 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 218504008/485764487 (44.9815%) -num_minimizer_positions_of_buckets_in_skew_index 48175742/485764487 (9.91751%) -computing minimizers offsets: 13.3273 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 91237805 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 81089595 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 71244043 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 64999827 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 55340829 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 44026748 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 33883659 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 265182: 85368523 -num_kmers_in_skew_index 527191029 (8.89506%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 91237805 - building MPHF with 64 threads and 31 partitions (avg. partition size = 3000000)... - built mphs[0] for 91237805 kmers; bits/key = 2.54472 - built positions[0] for 91237805 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 81089595 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[1] for 81089595 kmers; bits/key = 2.56263 - built positions[1] for 81089595 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 71244043 - building MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... - built mphs[2] for 71244043 kmers; bits/key = 2.56439 - built positions[2] for 71244043 kmers; bits/key = 9 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 64999827 - building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... - built mphs[3] for 64999827 kmers; bits/key = 2.54652 - built positions[3] for 64999827 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 55340829 - building MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... - built mphs[4] for 55340829 kmers; bits/key = 2.53877 - built positions[4] for 55340829 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 44026748 - building MPHF with 64 threads and 15 partitions (avg. partition size = 3000000)... - built mphs[5] for 44026748 kmers; bits/key = 2.53894 - built positions[5] for 44026748 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 33883659 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[6] for 33883659 kmers; bits/key = 2.5671 - built positions[6] for 33883659 kmers; bits/key = 13 - lower = 8192; upper = 265182; num_bits_per_pos = 19; num_kmers_in_partition = 85368523 - building MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... - built mphs[7] for 85368523 kmers; bits/key = 2.56049 - built positions[7] for 85368523 kmers; bits/key = 19 -computing skew index took: 73.1911 [sec] -=== step 3: 'build sparse and skew index' 87.5243 [sec] (14.7676 [ns/kmer]) -=== total_time 216.319 [sec] (36.4985 [ns/kmer]) -total index size: 6028576012 [B] -- 6028.58 [MB] -SPACE BREAKDOWN: - mphf: 0.141443 [bits/kmer] (2.83839 [bits/key]) -- 1.73819% - strings_offsets: 0.273643 [bits/kmer] -- 3.36278% - control_codewords: 1.74413 [bits/kmer] -- 21.4335% - mid_load_buckets: 1.25348 [bits/kmer] -- 15.404% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.44549e-06% - strings: 3.2463 [bits/kmer] -- 39.8936% - skew_index: 1.4784 [bits/kmer] -- 18.168% - weights: 2.48364e-07 [bits/kmer] -- 3.05213e-06% - -------------- - total: 8.1374 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 74.1794% -buckets with 2 minimizer positions = 17.5493% -buckets with 3 minimizer positions = 4.9171% -buckets with 4 minimizer positions = 1.47166% -buckets with 5 minimizer positions = 0.573611% -buckets with 6 minimizer positions = 0.301038% -buckets with 7 minimizer positions = 0.190827% -buckets with 8 minimizer positions = 0.133018% -buckets with 9 minimizer positions = 0.0984907% -buckets with 10 minimizer positions = 0.0753777% -buckets with 11 minimizer positions = 0.0590937% -buckets with 12 minimizer positions = 0.0475793% -buckets with 13 minimizer positions = 0.0389636% -buckets with 14 minimizer positions = 0.0324661% -buckets with 15 minimizer positions = 0.0273305% -buckets with 16 minimizer positions = 0.0232809% -max_bucket_size 265182 -2025-10-22 16:00:05: saving data structure to disk... -2025-10-22 16:00:08: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o ec.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... -read 100000 sequences, 14595280 bases, 8395280 kmers -read 200000 sequences, 29023453 bases, 16623453 kmers -read 300000 sequences, 43790922 bases, 25190922 kmers -read 400000 sequences, 58362099 bases, 33562099 kmers -read 500000 sequences, 72908170 bases, 41908170 kmers -read 600000 sequences, 87446702 bases, 50246702 kmers -read 700000 sequences, 102099804 bases, 58699804 kmers -read 800000 sequences, 117134400 bases, 67534400 kmers -read 900000 sequences, 131713463 bases, 75913463 kmers -read 1000000 sequences, 146366718 bases, 84366718 kmers -read 1100000 sequences, 161101660 bases, 92901660 kmers -read 1200000 sequences, 175910768 bases, 101510768 kmers -read 1300000 sequences, 190897904 bases, 110297904 kmers -read 1400000 sequences, 205802973 bases, 119002973 kmers -read 1500000 sequences, 221158148 bases, 128158148 kmers -read 1600000 sequences, 236346274 bases, 137146274 kmers -read 1700000 sequences, 251304432 bases, 145904432 kmers -read 1800000 sequences, 266473950 bases, 154873950 kmers -read 1900000 sequences, 281471604 bases, 163671604 kmers -read 2000000 sequences, 296791327 bases, 172791327 kmers -read 2100000 sequences, 312420706 bases, 182220706 kmers -read 2200000 sequences, 327946210 bases, 191546210 kmers -read 2300000 sequences, 343525540 bases, 200925540 kmers -read 2400000 sequences, 358949847 bases, 210149847 kmers -read 2500000 sequences, 374380009 bases, 219380009 kmers -read 2600000 sequences, 390142304 bases, 228942304 kmers -read 2700000 sequences, 405642535 bases, 238242535 kmers -read 2800000 sequences, 421259989 bases, 247659989 kmers -read 2900000 sequences, 436893769 bases, 257093769 kmers -read 3000000 sequences, 452465563 bases, 266465563 kmers -read 3100000 sequences, 468090902 bases, 275890902 kmers -read 3200000 sequences, 483923930 bases, 285523930 kmers -read 3300000 sequences, 499749509 bases, 295149509 kmers -read 3400000 sequences, 515726709 bases, 304926709 kmers -read 3500000 sequences, 532169207 bases, 315169207 kmers -read 3600000 sequences, 548394020 bases, 325194020 kmers -read 3700000 sequences, 564809686 bases, 335409686 kmers -read 3800000 sequences, 581403559 bases, 345803559 kmers -read 3900000 sequences, 597837340 bases, 356037340 kmers -read 4000000 sequences, 614198433 bases, 366198433 kmers -read 4100000 sequences, 630803806 bases, 376603806 kmers -read 4200000 sequences, 647222216 bases, 386822216 kmers -read 4300000 sequences, 663750824 bases, 397150824 kmers -read 4400000 sequences, 680423234 bases, 407623234 kmers -read 4500000 sequences, 696967173 bases, 417967173 kmers -read 4600000 sequences, 714107161 bases, 428907161 kmers -read 4700000 sequences, 731190344 bases, 439790344 kmers -read 4800000 sequences, 748610325 bases, 451010325 kmers -read 4900000 sequences, 765806425 bases, 462006425 kmers -read 5000000 sequences, 783034539 bases, 473034539 kmers -read 5100000 sequences, 800681271 bases, 484481271 kmers -read 5200000 sequences, 818515777 bases, 496115777 kmers -read 5300000 sequences, 836324012 bases, 507724012 kmers -read 5400000 sequences, 854771265 bases, 519971265 kmers -read 5500000 sequences, 873098069 bases, 532098069 kmers -read 5600000 sequences, 891182426 bases, 543982426 kmers -read 5700000 sequences, 910053448 bases, 556653448 kmers -read 5800000 sequences, 928444429 bases, 568844429 kmers -read 5900000 sequences, 947244294 bases, 581444294 kmers -read 6000000 sequences, 966455345 bases, 594455345 kmers -read 6100000 sequences, 985974168 bases, 607774168 kmers -read 6200000 sequences, 1005630833 bases, 621230833 kmers -read 6300000 sequences, 1026020245 bases, 635420245 kmers -read 6400000 sequences, 1046696751 bases, 649896751 kmers -read 6500000 sequences, 1067596462 bases, 664596462 kmers -read 6600000 sequences, 1088718265 bases, 679518265 kmers -read 6700000 sequences, 1110387368 bases, 694987368 kmers -read 6800000 sequences, 1132578732 bases, 710978732 kmers -read 6900000 sequences, 1155047095 bases, 727247095 kmers -read 7000000 sequences, 1177950483 bases, 743950483 kmers -read 7100000 sequences, 1201726249 bases, 761526249 kmers -read 7200000 sequences, 1226646751 bases, 780246751 kmers -read 7300000 sequences, 1252079351 bases, 799479351 kmers -read 7400000 sequences, 1279261003 bases, 820461003 kmers -read 7500000 sequences, 1307802702 bases, 842802702 kmers -read 7600000 sequences, 1338212409 bases, 867012409 kmers -read 7700000 sequences, 1370354710 bases, 892954710 kmers -read 7800000 sequences, 1383049738 bases, 899449738 kmers -read 7900000 sequences, 1395810952 bases, 906010952 kmers -read 8000000 sequences, 1408450282 bases, 912450282 kmers -read 8100000 sequences, 1421220952 bases, 919020952 kmers -read 8200000 sequences, 1433887434 bases, 925487434 kmers -read 8300000 sequences, 1446445917 bases, 931845917 kmers -read 8400000 sequences, 1459153909 bases, 938353909 kmers -read 8500000 sequences, 1471877671 bases, 944877671 kmers -read 8600000 sequences, 1484865624 bases, 951665624 kmers -read 8700000 sequences, 1497567228 bases, 958167228 kmers -read 8800000 sequences, 1510543060 bases, 964943060 kmers -read 8900000 sequences, 1523371874 bases, 971571874 kmers -read 9000000 sequences, 1536152549 bases, 978152549 kmers -read 9100000 sequences, 1548860619 bases, 984660619 kmers -read 9200000 sequences, 1561712707 bases, 991312707 kmers -read 9300000 sequences, 1574401520 bases, 997801520 kmers -read 9400000 sequences, 1586885001 bases, 1004085001 kmers -read 9500000 sequences, 1599621412 bases, 1010621412 kmers -read 9600000 sequences, 1612397675 bases, 1017197675 kmers -read 9700000 sequences, 1625388385 bases, 1023988385 kmers -read 9800000 sequences, 1638536946 bases, 1030936946 kmers -read 9900000 sequences, 1651980650 bases, 1038180650 kmers -read 10000000 sequences, 1664904910 bases, 1044904910 kmers -read 10100000 sequences, 1677570910 bases, 1051370910 kmers -read 10200000 sequences, 1690246890 bases, 1057846890 kmers -read 10300000 sequences, 1703230366 bases, 1064630366 kmers -read 10400000 sequences, 1716086552 bases, 1071286552 kmers -read 10500000 sequences, 1729082411 bases, 1078082411 kmers -read 10600000 sequences, 1741944091 bases, 1084744091 kmers -read 10700000 sequences, 1754780793 bases, 1091380793 kmers -read 10800000 sequences, 1767537304 bases, 1097937304 kmers -read 10900000 sequences, 1780512088 bases, 1104712088 kmers -read 11000000 sequences, 1794061925 bases, 1112061925 kmers -read 11100000 sequences, 1807103354 bases, 1118903354 kmers -read 11200000 sequences, 1819865542 bases, 1125465542 kmers -read 11300000 sequences, 1832952701 bases, 1132352701 kmers -read 11400000 sequences, 1846108191 bases, 1139308191 kmers -read 11500000 sequences, 1859202023 bases, 1146202023 kmers -read 11600000 sequences, 1872125111 bases, 1152925111 kmers -read 11700000 sequences, 1884949294 bases, 1159549294 kmers -read 11800000 sequences, 1897879213 bases, 1166279213 kmers -read 11900000 sequences, 1910688502 bases, 1172888502 kmers -read 12000000 sequences, 1923575230 bases, 1179575230 kmers -read 12100000 sequences, 1936528765 bases, 1186328765 kmers -read 12200000 sequences, 1949822939 bases, 1193422939 kmers -read 12300000 sequences, 1962607705 bases, 1200007705 kmers -read 12400000 sequences, 1975528951 bases, 1206728951 kmers -read 12500000 sequences, 1988356507 bases, 1213356507 kmers -read 12600000 sequences, 2001310116 bases, 1220110116 kmers -read 12700000 sequences, 2014316977 bases, 1226916977 kmers -read 12800000 sequences, 2027300676 bases, 1233700676 kmers -read 12900000 sequences, 2040283112 bases, 1240483112 kmers -read 13000000 sequences, 2053070210 bases, 1247070210 kmers -read 13100000 sequences, 2066357392 bases, 1254157392 kmers -read 13200000 sequences, 2079514117 bases, 1261114117 kmers -read 13300000 sequences, 2092587055 bases, 1267987055 kmers -read 13400000 sequences, 2105687861 bases, 1274887861 kmers -read 13500000 sequences, 2118896002 bases, 1281896002 kmers -read 13600000 sequences, 2131841724 bases, 1288641724 kmers -read 13700000 sequences, 2144909308 bases, 1295509308 kmers -read 13800000 sequences, 2157799174 bases, 1302199174 kmers -read 13900000 sequences, 2170824760 bases, 1309024760 kmers -read 14000000 sequences, 2183943636 bases, 1315943636 kmers -read 14100000 sequences, 2196888939 bases, 1322688939 kmers -read 14200000 sequences, 2209993052 bases, 1329593052 kmers -read 14300000 sequences, 2223177518 bases, 1336577518 kmers -read 14400000 sequences, 2236324767 bases, 1343524767 kmers -read 14500000 sequences, 2249926194 bases, 1350926194 kmers -read 14600000 sequences, 2263244067 bases, 1358044067 kmers -read 14700000 sequences, 2276666210 bases, 1365266210 kmers -read 14800000 sequences, 2289846389 bases, 1372246389 kmers -read 14900000 sequences, 2303142205 bases, 1379342205 kmers -read 15000000 sequences, 2316373175 bases, 1386373175 kmers -read 15100000 sequences, 2329658257 bases, 1393458257 kmers -read 15200000 sequences, 2342799874 bases, 1400399874 kmers -read 15300000 sequences, 2355936598 bases, 1407336598 kmers -read 15400000 sequences, 2369202825 bases, 1414402825 kmers -read 15500000 sequences, 2382453933 bases, 1421453933 kmers -read 15600000 sequences, 2395606868 bases, 1428406868 kmers -read 15700000 sequences, 2408903524 bases, 1435503524 kmers -read 15800000 sequences, 2422488600 bases, 1442888600 kmers -read 15900000 sequences, 2435763741 bases, 1449963741 kmers -read 16000000 sequences, 2449041041 bases, 1457041041 kmers -read 16100000 sequences, 2462152775 bases, 1463952775 kmers -read 16200000 sequences, 2475426803 bases, 1471026803 kmers -read 16300000 sequences, 2488985859 bases, 1478385859 kmers -read 16400000 sequences, 2502322646 bases, 1485522646 kmers -read 16500000 sequences, 2515682566 bases, 1492682566 kmers -read 16600000 sequences, 2529274259 bases, 1500074259 kmers -read 16700000 sequences, 2542622794 bases, 1507222794 kmers -read 16800000 sequences, 2556056912 bases, 1514456912 kmers -read 16900000 sequences, 2569267145 bases, 1521467145 kmers -read 17000000 sequences, 2582562981 bases, 1528562981 kmers -read 17100000 sequences, 2596061102 bases, 1535861102 kmers -read 17200000 sequences, 2609459388 bases, 1543059388 kmers -read 17300000 sequences, 2622881245 bases, 1550281245 kmers -read 17400000 sequences, 2636336794 bases, 1557536794 kmers -read 17500000 sequences, 2649678629 bases, 1564678629 kmers -read 17600000 sequences, 2663341782 bases, 1572141782 kmers -read 17700000 sequences, 2676693590 bases, 1579293590 kmers -read 17800000 sequences, 2690200716 bases, 1586600716 kmers -read 17900000 sequences, 2703543489 bases, 1593743489 kmers -read 18000000 sequences, 2717390529 bases, 1601390529 kmers -read 18100000 sequences, 2730783796 bases, 1608583796 kmers -read 18200000 sequences, 2744196467 bases, 1615796467 kmers -read 18300000 sequences, 2757894852 bases, 1623294852 kmers -read 18400000 sequences, 2771403521 bases, 1630603521 kmers -read 18500000 sequences, 2784930678 bases, 1637930678 kmers -read 18600000 sequences, 2798778608 bases, 1645578608 kmers -read 18700000 sequences, 2812434788 bases, 1653034788 kmers -read 18800000 sequences, 2826041925 bases, 1660441925 kmers -read 18900000 sequences, 2839594143 bases, 1667794143 kmers -read 19000000 sequences, 2853100531 bases, 1675100531 kmers -read 19100000 sequences, 2866645368 bases, 1682445368 kmers -read 19200000 sequences, 2880162017 bases, 1689762017 kmers -read 19300000 sequences, 2893733500 bases, 1697133500 kmers -read 19400000 sequences, 2907861888 bases, 1705061888 kmers -read 19500000 sequences, 2921431859 bases, 1712431859 kmers -read 19600000 sequences, 2934950257 bases, 1719750257 kmers -read 19700000 sequences, 2948908590 bases, 1727508590 kmers -read 19800000 sequences, 2962655324 bases, 1735055324 kmers -read 19900000 sequences, 2976658842 bases, 1742858842 kmers -read 20000000 sequences, 2990606476 bases, 1750606476 kmers -read 20100000 sequences, 3004463124 bases, 1758263124 kmers -read 20200000 sequences, 3018263669 bases, 1765863669 kmers -read 20300000 sequences, 3032235817 bases, 1773635817 kmers -read 20400000 sequences, 3045926851 bases, 1781126851 kmers -read 20500000 sequences, 3059718085 bases, 1788718085 kmers -read 20600000 sequences, 3073465760 bases, 1796265760 kmers -read 20700000 sequences, 3087374365 bases, 1803974365 kmers -read 20800000 sequences, 3101202279 bases, 1811602279 kmers -read 20900000 sequences, 3115301042 bases, 1819501042 kmers -read 21000000 sequences, 3129300415 bases, 1827300415 kmers -read 21100000 sequences, 3143428950 bases, 1835228950 kmers -read 21200000 sequences, 3157337269 bases, 1842937269 kmers -read 21300000 sequences, 3171218453 bases, 1850618453 kmers -read 21400000 sequences, 3185386330 bases, 1858586330 kmers -read 21500000 sequences, 3199499619 bases, 1866499619 kmers -read 21600000 sequences, 3213699144 bases, 1874499144 kmers -read 21700000 sequences, 3227725083 bases, 1882325083 kmers -read 21800000 sequences, 3241636024 bases, 1890036024 kmers -read 21900000 sequences, 3255686690 bases, 1897886690 kmers -read 22000000 sequences, 3269949888 bases, 1905949888 kmers -read 22100000 sequences, 3284189309 bases, 1913989309 kmers -read 22200000 sequences, 3298558467 bases, 1922158467 kmers -read 22300000 sequences, 3312627222 bases, 1930027222 kmers -read 22400000 sequences, 3326674715 bases, 1937874715 kmers -read 22500000 sequences, 3340769161 bases, 1945769161 kmers -read 22600000 sequences, 3355403951 bases, 1954203951 kmers -read 22700000 sequences, 3369592323 bases, 1962192323 kmers -read 22800000 sequences, 3383749832 bases, 1970149832 kmers -read 22900000 sequences, 3398280808 bases, 1978480808 kmers -read 23000000 sequences, 3412658016 bases, 1986658016 kmers -read 23100000 sequences, 3427105278 bases, 1994905278 kmers -read 23200000 sequences, 3441898165 bases, 2003498165 kmers -read 23300000 sequences, 3456307790 bases, 2011707790 kmers -read 23400000 sequences, 3470437552 bases, 2019637552 kmers -=== step 1.1: 'encoding input' 10.3603 [sec] (5.10952 [ns/kmer]) -read 23474327 sequences, 3483064285 bases, 2027656011 kmers -num_kmers 2027656011 -cost: 2.0 + 1.43556 [bits/kmer] -max_len 643923 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 20 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.54498 [sec] (0.761952 [ns/kmer]) -=== step 1: 'parse file' 11.9055 [sec] (5.87155 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -=== step 2.1: 'merging minimizers tuples' 12.7517 [sec] (6.2889 [ns/kmer]) -num_minimizers = 86631941 -num_minimizer_positions = 169264838 -num_super_kmers = 176725324 -building minimizers MPHF with 64 threads and 29 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 4.0348 [sec] (1.98988 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141609048089565.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.80174 [sec] (2.8613 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 3.47564 [sec] (1.71412 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 14311872/86631941 (16.5203%) -num_buckets_in_skew_index 167883/86631941 (0.193789%) -max_bucket_size 475227 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 74713236/169264838 (44.1398%) -num_minimizer_positions_of_buckets_in_skew_index 22399416/169264838 (13.2334%) -computing minimizers offsets: 4.11465 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 164308993 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 48058096 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13657562 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6137831 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4414714 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 4433156 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 4082117 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 475227: 35954358 -num_kmers_in_skew_index 281046827 (13.8607%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 164308993 - building MPHF with 64 threads and 55 partitions (avg. partition size = 3000000)... - built mphs[0] for 164308993 kmers; bits/key = 2.56349 - built positions[0] for 164308993 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 48058096 - building MPHF with 64 threads and 17 partitions (avg. partition size = 3000000)... - built mphs[1] for 48058096 kmers; bits/key = 2.53932 - built positions[1] for 48058096 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13657562 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 13657562 kmers; bits/key = 2.61351 - built positions[2] for 13657562 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6137831 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 6137831 kmers; bits/key = 2.93085 - built positions[3] for 6137831 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4414714 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4414714 kmers; bits/key = 2.84407 - built positions[4] for 4414714 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 4433156 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 4433156 kmers; bits/key = 2.73731 - built positions[5] for 4433156 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 4082117 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 4082117 kmers; bits/key = 2.9369 - built positions[6] for 4082117 kmers; bits/key = 13.0001 - lower = 8192; upper = 475227; num_bits_per_pos = 19; num_kmers_in_partition = 35954358 - building MPHF with 64 threads and 12 partitions (avg. partition size = 3000000)... - built mphs[7] for 35954358 kmers; bits/key = 2.55049 - built positions[7] for 35954358 kmers; bits/key = 19 -computing skew index took: 41.8865 [sec] -=== step 3: 'build sparse and skew index' 46.2928 [sec] (22.8307 [ns/kmer]) -=== total_time 84.2622 [sec] (41.5564 [ns/kmer]) -total index size: 2131440126 [B] -- 2131.44 [MB] -SPACE BREAKDOWN: - mphf: 0.120785 [bits/kmer] (2.82702 [bits/key]) -- 1.43629% - strings_offsets: 0.291878 [bits/kmer] -- 3.47083% - control_codewords: 1.40993 [bits/kmer] -- 16.766% - mid_load_buckets: 1.17911 [bits/kmer] -- 14.0212% - begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.25737e-05% - strings: 3.43556 [bits/kmer] -- 40.8534% - skew_index: 1.97221 [bits/kmer] -- 23.4523% - weights: 7.25961e-07 [bits/kmer] -- 8.63266e-06% - -------------- - total: 8.40947 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 83.2859% -buckets with 2 minimizer positions = 8.38918% -buckets with 3 minimizer positions = 2.77772% -buckets with 4 minimizer positions = 1.31798% -buckets with 5 minimizer positions = 0.776307% -buckets with 6 minimizer positions = 0.518707% -buckets with 7 minimizer positions = 0.374551% -buckets with 8 minimizer positions = 0.285226% -buckets with 9 minimizer positions = 0.226981% -buckets with 10 minimizer positions = 0.183834% -buckets with 11 minimizer positions = 0.15397% -buckets with 12 minimizer positions = 0.131367% -buckets with 13 minimizer positions = 0.113066% -buckets with 14 minimizer positions = 0.0987326% -buckets with 15 minimizer positions = 0.0868144% -buckets with 16 minimizer positions = 0.0771828% -max_bucket_size 475227 -2025-10-22 16:01:33: saving data structure to disk... -2025-10-22 16:01:35: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --canonical --verbose -d tmp_dir -o se.k63.canon.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = true, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... -read 100000 sequences, 29016680 bases, 22816680 kmers -read 200000 sequences, 59512851 bases, 47112851 kmers -read 300000 sequences, 93672898 bases, 75072898 kmers -read 400000 sequences, 116504758 bases, 91704758 kmers -read 500000 sequences, 129640784 bases, 98640784 kmers -read 600000 sequences, 142888339 bases, 105688339 kmers -read 700000 sequences, 156121559 bases, 112721559 kmers -read 800000 sequences, 169296181 bases, 119696181 kmers -read 900000 sequences, 182473664 bases, 126673664 kmers -read 1000000 sequences, 195596653 bases, 133596653 kmers -read 1100000 sequences, 208767883 bases, 140567883 kmers -read 1200000 sequences, 222206242 bases, 147806242 kmers -read 1300000 sequences, 235299002 bases, 154699002 kmers -read 1400000 sequences, 248482676 bases, 161682676 kmers -read 1500000 sequences, 261589002 bases, 168589002 kmers -read 1600000 sequences, 275055224 bases, 175855224 kmers -read 1700000 sequences, 288035899 bases, 182635899 kmers -read 1800000 sequences, 301349839 bases, 189749839 kmers -read 1900000 sequences, 314875402 bases, 197075402 kmers -read 2000000 sequences, 328155468 bases, 204155468 kmers -read 2100000 sequences, 341368638 bases, 211168638 kmers -read 2200000 sequences, 354712561 bases, 218312561 kmers -read 2300000 sequences, 368072063 bases, 225472063 kmers -read 2400000 sequences, 381369139 bases, 232569139 kmers -read 2500000 sequences, 395076735 bases, 240076735 kmers -read 2600000 sequences, 408571236 bases, 247371236 kmers -read 2700000 sequences, 421770941 bases, 254370941 kmers -read 2800000 sequences, 434931097 bases, 261331097 kmers -read 2900000 sequences, 448299063 bases, 268499063 kmers -read 3000000 sequences, 461539333 bases, 275539333 kmers -read 3100000 sequences, 474884907 bases, 282684907 kmers -read 3200000 sequences, 488437875 bases, 290037875 kmers -read 3300000 sequences, 501681623 bases, 297081623 kmers -read 3400000 sequences, 514981749 bases, 304181749 kmers -read 3500000 sequences, 528308911 bases, 311308911 kmers -read 3600000 sequences, 541636977 bases, 318436977 kmers -read 3700000 sequences, 555162428 bases, 325762428 kmers -read 3800000 sequences, 568696864 bases, 333096864 kmers -read 3900000 sequences, 581917367 bases, 340117367 kmers -read 4000000 sequences, 595230806 bases, 347230806 kmers -read 4100000 sequences, 608987326 bases, 354787326 kmers -read 4200000 sequences, 622285230 bases, 361885230 kmers -read 4300000 sequences, 635647937 bases, 369047937 kmers -read 4400000 sequences, 648992641 bases, 376192641 kmers -read 4500000 sequences, 662513085 bases, 383513085 kmers -read 4600000 sequences, 675930708 bases, 390730708 kmers -read 4700000 sequences, 689630997 bases, 398230997 kmers -read 4800000 sequences, 702998525 bases, 405398525 kmers -read 4900000 sequences, 716509106 bases, 412709106 kmers -read 5000000 sequences, 730213776 bases, 420213776 kmers -read 5100000 sequences, 743782200 bases, 427582200 kmers -read 5200000 sequences, 757644345 bases, 435244345 kmers -read 5300000 sequences, 771125199 bases, 442525199 kmers -read 5400000 sequences, 784691064 bases, 449891064 kmers -read 5500000 sequences, 798294855 bases, 457294855 kmers -read 5600000 sequences, 811868593 bases, 464668593 kmers -read 5700000 sequences, 825311254 bases, 471911254 kmers -read 5800000 sequences, 838965535 bases, 479365535 kmers -read 5900000 sequences, 852651369 bases, 486851369 kmers -read 6000000 sequences, 866286185 bases, 494286185 kmers -read 6100000 sequences, 879791139 bases, 501591139 kmers -read 6200000 sequences, 893568574 bases, 509168574 kmers -read 6300000 sequences, 907221132 bases, 516621132 kmers -read 6400000 sequences, 920850746 bases, 524050746 kmers -read 6500000 sequences, 934451496 bases, 531451496 kmers -read 6600000 sequences, 948058192 bases, 538858192 kmers -read 6700000 sequences, 961672076 bases, 546272076 kmers -read 6800000 sequences, 975396607 bases, 553796607 kmers -read 6900000 sequences, 989058970 bases, 561258970 kmers -read 7000000 sequences, 1002901529 bases, 568901529 kmers -read 7100000 sequences, 1016671875 bases, 576471875 kmers -read 7200000 sequences, 1030411659 bases, 584011659 kmers -read 7300000 sequences, 1044405182 bases, 591805182 kmers -read 7400000 sequences, 1058406016 bases, 599606016 kmers -read 7500000 sequences, 1072419258 bases, 607419258 kmers -read 7600000 sequences, 1086161571 bases, 614961571 kmers -read 7700000 sequences, 1100358439 bases, 622958439 kmers -read 7800000 sequences, 1114261097 bases, 630661097 kmers -read 7900000 sequences, 1128307808 bases, 638507808 kmers -read 8000000 sequences, 1142394085 bases, 646394085 kmers -read 8100000 sequences, 1156357087 bases, 654157087 kmers -read 8200000 sequences, 1170571919 bases, 662171919 kmers -read 8300000 sequences, 1184451177 bases, 669851177 kmers -read 8400000 sequences, 1198299415 bases, 677499415 kmers -read 8500000 sequences, 1212442446 bases, 685442446 kmers -read 8600000 sequences, 1226405386 bases, 693205386 kmers -read 8700000 sequences, 1240703127 bases, 701303127 kmers -read 8800000 sequences, 1254656983 bases, 709056983 kmers -read 8900000 sequences, 1268621397 bases, 716821397 kmers -read 9000000 sequences, 1282878983 bases, 724878983 kmers -read 9100000 sequences, 1297350868 bases, 733150868 kmers -read 9200000 sequences, 1311516008 bases, 741116008 kmers -read 9300000 sequences, 1325689722 bases, 749089722 kmers -read 9400000 sequences, 1339681966 bases, 756881966 kmers -read 9500000 sequences, 1353794378 bases, 764794378 kmers -read 9600000 sequences, 1368052593 bases, 772852593 kmers -read 9700000 sequences, 1382481060 bases, 781081060 kmers -read 9800000 sequences, 1397029165 bases, 789429165 kmers -read 9900000 sequences, 1411261935 bases, 797461935 kmers -read 10000000 sequences, 1425636398 bases, 805636398 kmers -read 10100000 sequences, 1439978158 bases, 813778158 kmers -read 10200000 sequences, 1454566042 bases, 822166042 kmers -read 10300000 sequences, 1469140008 bases, 830540008 kmers -read 10400000 sequences, 1483590209 bases, 838790209 kmers -read 10500000 sequences, 1497966729 bases, 846966729 kmers -read 10600000 sequences, 1512656712 bases, 855456712 kmers -read 10700000 sequences, 1527179954 bases, 863779954 kmers -read 10800000 sequences, 1541782827 bases, 872182827 kmers -read 10900000 sequences, 1556446263 bases, 880646263 kmers -read 11000000 sequences, 1571133044 bases, 889133044 kmers -read 11100000 sequences, 1585817113 bases, 897617113 kmers -read 11200000 sequences, 1600557391 bases, 906157391 kmers -read 11300000 sequences, 1615262703 bases, 914662703 kmers -read 11400000 sequences, 1629999627 bases, 923199627 kmers -read 11500000 sequences, 1644860568 bases, 931860568 kmers -read 11600000 sequences, 1659779614 bases, 940579614 kmers -read 11700000 sequences, 1674792374 bases, 949392374 kmers -read 11800000 sequences, 1689736749 bases, 958136749 kmers -read 11900000 sequences, 1704892610 bases, 967092610 kmers -read 12000000 sequences, 1720028668 bases, 976028668 kmers -read 12100000 sequences, 1735135576 bases, 984935576 kmers -read 12200000 sequences, 1750297083 bases, 993897083 kmers -read 12300000 sequences, 1765691330 bases, 1003091330 kmers -read 12400000 sequences, 1781168609 bases, 1012368609 kmers -read 12500000 sequences, 1796591819 bases, 1021591819 kmers -read 12600000 sequences, 1811901104 bases, 1030701104 kmers -read 12700000 sequences, 1827876510 bases, 1040476510 kmers -read 12800000 sequences, 1843393773 bases, 1049793773 kmers -read 12900000 sequences, 1858842782 bases, 1059042782 kmers -read 13000000 sequences, 1874571339 bases, 1068571339 kmers -read 13100000 sequences, 1890244268 bases, 1078044268 kmers -read 13200000 sequences, 1905959273 bases, 1087559273 kmers -read 13300000 sequences, 1922228338 bases, 1097628338 kmers -read 13400000 sequences, 1938520111 bases, 1107720111 kmers -read 13500000 sequences, 1954665049 bases, 1117665049 kmers -read 13600000 sequences, 1970696591 bases, 1127496591 kmers -read 13700000 sequences, 1987164795 bases, 1137764795 kmers -read 13800000 sequences, 2003371475 bases, 1147771475 kmers -read 13900000 sequences, 2019649864 bases, 1157849864 kmers -read 14000000 sequences, 2036208720 bases, 1168208720 kmers -read 14100000 sequences, 2052986091 bases, 1178786091 kmers -read 14200000 sequences, 2069712172 bases, 1189312172 kmers -read 14300000 sequences, 2086760589 bases, 1200160589 kmers -read 14400000 sequences, 2103719627 bases, 1210919627 kmers -read 14500000 sequences, 2120768565 bases, 1221768565 kmers -read 14600000 sequences, 2137973642 bases, 1232773642 kmers -read 14700000 sequences, 2155333528 bases, 1243933528 kmers -read 14800000 sequences, 2173029002 bases, 1255429002 kmers -read 14900000 sequences, 2190761957 bases, 1266961957 kmers -read 15000000 sequences, 2208992707 bases, 1278992707 kmers -read 15100000 sequences, 2226994114 bases, 1290794114 kmers -read 15200000 sequences, 2245240873 bases, 1302840873 kmers -read 15300000 sequences, 2264078057 bases, 1315478057 kmers -read 15400000 sequences, 2282789468 bases, 1327989468 kmers -read 15500000 sequences, 2301835717 bases, 1340835717 kmers -read 15600000 sequences, 2321337137 bases, 1354137137 kmers -read 15700000 sequences, 2341431175 bases, 1368031175 kmers -read 15800000 sequences, 2361547906 bases, 1381947906 kmers -read 15900000 sequences, 2382126087 bases, 1396326087 kmers -read 16000000 sequences, 2403498478 bases, 1411498478 kmers -read 16100000 sequences, 2424934550 bases, 1426734550 kmers -read 16200000 sequences, 2447209476 bases, 1442809476 kmers -read 16300000 sequences, 2470231832 bases, 1459631832 kmers -read 16400000 sequences, 2494281037 bases, 1477481037 kmers -read 16500000 sequences, 2519161670 bases, 1496161670 kmers -read 16600000 sequences, 2545406869 bases, 1516206869 kmers -=== step 1.1: 'encoding input' 7.51924 [sec] (4.93096 [ns/kmer]) -read 16636523 sequences, 2556368582 bases, 1524904156 kmers -num_kmers 1524904156 -cost: 2.0 + 1.35283 [bits/kmer] -max_len 499189 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 19 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.15614 [sec] (0.758174 [ns/kmer]) -=== step 1: 'parse file' 8.67553 [sec] (5.68923 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 9.67185 [sec] (6.3426 [ns/kmer]) -num_minimizers = 69577229 -num_minimizer_positions = 126350163 -num_super_kmers = 131966527 -building minimizers MPHF with 64 threads and 24 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.24873 [sec] (2.13045 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141695249487100.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.42341 [sec] (2.90078 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.55747 [sec] (1.67713 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 12190335/69577229 (17.5206%) -num_buckets_in_skew_index 86973/69577229 (0.125002%) -max_bucket_size 245177 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 57511599/126350163 (45.5176%) -num_minimizer_positions_of_buckets_in_skew_index 11538643/126350163 (9.13227%) -computing minimizers offsets: 3.17096 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 77399356 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26776297 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 13974034 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6504754 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3263868 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2527517 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2420664 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 245177: 10756294 -num_kmers_in_skew_index 143622784 (9.41848%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 77399356 - building MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... - built mphs[0] for 77399356 kmers; bits/key = 2.54863 - built positions[0] for 77399356 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 26776297 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[1] for 26776297 kmers; bits/key = 2.54559 - built positions[1] for 26776297 kmers; bits/key = 8.00001 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 13974034 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[2] for 13974034 kmers; bits/key = 2.56375 - built positions[2] for 13974034 kmers; bits/key = 9.00003 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 6504754 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[3] for 6504754 kmers; bits/key = 2.78902 - built positions[3] for 6504754 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 3263868 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 3263868 kmers; bits/key = 3.30619 - built positions[4] for 3263868 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2527517 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2527517)... - built mphs[5] for 2527517 kmers; bits/key = 2.55992 - built positions[5] for 2527517 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2420664 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2420664)... - built mphs[6] for 2420664 kmers; bits/key = 2.55997 - built positions[6] for 2420664 kmers; bits/key = 13.0001 - lower = 8192; upper = 245177; num_bits_per_pos = 18; num_kmers_in_partition = 10756294 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[7] for 10756294 kmers; bits/key = 2.64819 - built positions[7] for 10756294 kmers; bits/key = 18 -computing skew index took: 22.3367 [sec] -=== step 3: 'build sparse and skew index' 25.7206 [sec] (16.867 [ns/kmer]) -=== total_time 54.2976 [sec] (35.6072 [ns/kmer]) -total index size: 1481048952 [B] -- 1481.05 [MB] -SPACE BREAKDOWN: - mphf: 0.132337 [bits/kmer] (2.9004 [bits/key]) -- 1.7032% - strings_offsets: 0.274587 [bits/kmer] -- 3.53397% - control_codewords: 1.5057 [bits/kmer] -- 19.3786% - mid_load_buckets: 1.20688 [bits/kmer] -- 15.5327% - begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 1.80953e-05% - strings: 3.35283 [bits/kmer] -- 43.1513% - skew_index: 1.2976 [bits/kmer] -- 16.7002% - weights: 9.65307e-07 [bits/kmer] -- 1.24236e-05% - -------------- - total: 7.76993 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 82.3544% -buckets with 2 minimizer positions = 9.17598% -buckets with 3 minimizer positions = 3.08546% -buckets with 4 minimizer positions = 1.44294% -buckets with 5 minimizer positions = 0.830594% -buckets with 6 minimizer positions = 0.537643% -buckets with 7 minimizer positions = 0.377841% -buckets with 8 minimizer positions = 0.278926% -buckets with 9 minimizer positions = 0.215933% -buckets with 10 minimizer positions = 0.171191% -buckets with 11 minimizer positions = 0.139152% -buckets with 12 minimizer positions = 0.116435% -buckets with 13 minimizer positions = 0.0976368% -buckets with 14 minimizer positions = 0.0839542% -buckets with 15 minimizer positions = 0.0727882% -buckets with 16 minimizer positions = 0.064557% -max_bucket_size 245177 -2025-10-22 16:02:30: saving data structure to disk... -2025-10-22 16:02:30: DONE diff --git a/benchmarks/results-22-10-25/k63/regular-bench.log b/benchmarks/results-22-10-25/k63/regular-bench.log deleted file mode 100644 index 9a920b8..0000000 --- a/benchmarks/results-22-10-25/k63/regular-bench.log +++ /dev/null @@ -1,90 +0,0 @@ -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 764.647 -avg_nanosec_per_negative_lookup 760.908 -avg_nanosec_per_access 308.694 -iterator: avg_nanosec_per_kmer 2.80883 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 772.997 -avg_nanosec_per_negative_lookup 751.757 -avg_nanosec_per_access 302.239 -iterator: avg_nanosec_per_kmer 2.81303 -./sshash bench -i cod.k63.sshash -avg_nanosec_per_positive_lookup 761.568 -avg_nanosec_per_negative_lookup 747.962 -avg_nanosec_per_access 309.91 -iterator: avg_nanosec_per_kmer 2.82223 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 699.997 -avg_nanosec_per_negative_lookup 811.046 -avg_nanosec_per_access 330.173 -iterator: avg_nanosec_per_kmer 2.77744 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 693.577 -avg_nanosec_per_negative_lookup 810.535 -avg_nanosec_per_access 339.368 -iterator: avg_nanosec_per_kmer 2.79808 -./sshash bench -i kestrel.k63.sshash -avg_nanosec_per_positive_lookup 699.101 -avg_nanosec_per_negative_lookup 823.88 -avg_nanosec_per_access 330.99 -iterator: avg_nanosec_per_kmer 2.76731 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 954.247 -avg_nanosec_per_negative_lookup 885.886 -avg_nanosec_per_access 361.74 -iterator: avg_nanosec_per_kmer 2.78076 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 947.631 -avg_nanosec_per_negative_lookup 887.378 -avg_nanosec_per_access 358.481 -iterator: avg_nanosec_per_kmer 2.76542 -./sshash bench -i human.k63.sshash -avg_nanosec_per_positive_lookup 930.492 -avg_nanosec_per_negative_lookup 887.168 -avg_nanosec_per_access 361.001 -iterator: avg_nanosec_per_kmer 2.85186 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1421.12 -avg_nanosec_per_negative_lookup 1028.13 -avg_nanosec_per_access 680.06 -iterator: avg_nanosec_per_kmer 2.90325 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1396.7 -avg_nanosec_per_negative_lookup 1042.07 -avg_nanosec_per_access 655.762 -iterator: avg_nanosec_per_kmer 2.99233 -./sshash bench -i hprc.k63.sshash -avg_nanosec_per_positive_lookup 1423.04 -avg_nanosec_per_negative_lookup 1023.61 -avg_nanosec_per_access 669.37 -iterator: avg_nanosec_per_kmer 2.85262 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 2042.97 -avg_nanosec_per_negative_lookup 898.233 -avg_nanosec_per_access 514.323 -iterator: avg_nanosec_per_kmer 2.92814 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 2056.41 -avg_nanosec_per_negative_lookup 887.389 -avg_nanosec_per_access 465.931 -iterator: avg_nanosec_per_kmer 2.89742 -./sshash bench -i ec.k63.sshash -avg_nanosec_per_positive_lookup 2050.85 -avg_nanosec_per_negative_lookup 887.758 -avg_nanosec_per_access 498.662 -iterator: avg_nanosec_per_kmer 2.87881 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1802.93 -avg_nanosec_per_negative_lookup 880.058 -avg_nanosec_per_access 431.093 -iterator: avg_nanosec_per_kmer 2.85792 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1751.88 -avg_nanosec_per_negative_lookup 870.091 -avg_nanosec_per_access 430.992 -iterator: avg_nanosec_per_kmer 2.83586 -./sshash bench -i se.k63.sshash -avg_nanosec_per_positive_lookup 1759.84 -avg_nanosec_per_negative_lookup 875.743 -avg_nanosec_per_access 426.542 -iterator: avg_nanosec_per_kmer 2.79805 diff --git a/benchmarks/results-22-10-25/k63/regular-build.log b/benchmarks/results-22-10-25/k63/regular-build.log deleted file mode 100644 index 3112811..0000000 --- a/benchmarks/results-22-10-25/k63/regular-build.log +++ /dev/null @@ -1,2101 +0,0 @@ -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o cod.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... -read 100000 sequences, 61951464 bases, 55751464 kmers -read 200000 sequences, 122972958 bases, 110572958 kmers -read 300000 sequences, 183599874 bases, 164999874 kmers -read 400000 sequences, 245141781 bases, 220341781 kmers -read 500000 sequences, 306871742 bases, 275871742 kmers -read 600000 sequences, 368255372 bases, 331055372 kmers -read 700000 sequences, 430272672 bases, 386872672 kmers -read 800000 sequences, 496894673 bases, 447294673 kmers -read 900000 sequences, 580551939 bases, 524751939 kmers -=== step 1.1: 'encoding input' 1.6516 [sec] (2.96739 [ns/kmer]) -read 954555 sequences, 615768068 bases, 556585658 kmers -num_kmers 556585658 -cost: 2.0 + 0.212662 [bits/kmer] -max_len 46783 -num. bits per_absolute_offset 30 -num. bits per_relative_offset 16 -num. bits per_string_id 20 -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.382691 [sec] (0.687569 [ns/kmer]) -=== step 1: 'parse file' 2.04558 [sec] (3.67523 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.bin' -=== step 2.1: 'merging minimizers tuples' 2.0119 [sec] (3.61472 [ns/kmer]) -num_minimizers = 24306363 -num_minimizer_positions = 28148872 -num_super_kmers = 28148872 -building minimizers MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 1.33758 [sec] (2.40319 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140935507515045.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 1.10606 [sec] (1.98723 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 0.523687 [sec] (0.940892 [ns/kmer]) -num_bits_per_offset = 30 -num_buckets_larger_than_1_not_in_skew_index 957832/24306363 (3.94066%) -num_buckets_in_skew_index 3271/24306363 (0.0134574%) -max_bucket_size 414759 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 3653173/28148872 (12.978%) -num_minimizer_positions_of_buckets_in_skew_index 1150439/28148872 (4.08698%) -computing minimizers offsets: 0.365877 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3558021 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2129998 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1247229 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1130328 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1022110 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 790746 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 666283 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 414759: 3762004 -num_kmers_in_skew_index 14306719 (2.57044%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 3558021 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[0] for 3558021 kmers; bits/key = 3.06724 - built positions[0] for 3558021 kmers; bits/key = 7.0001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 2129998 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2129998)... - built mphs[1] for 2129998 kmers; bits/key = 2.56007 - built positions[1] for 2129998 kmers; bits/key = 8.00016 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 1247229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1247229)... - built mphs[2] for 1247229 kmers; bits/key = 2.56071 - built positions[2] for 1247229 kmers; bits/key = 9.00028 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 1130328 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1130328)... - built mphs[3] for 1130328 kmers; bits/key = 2.56088 - built positions[3] for 1130328 kmers; bits/key = 10.0003 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 1022110 - building MPHF with 64 threads and 1 partitions (avg. partition size = 1022110)... - built mphs[4] for 1022110 kmers; bits/key = 2.41826 - built positions[4] for 1022110 kmers; bits/key = 11.0004 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 790746 - building MPHF with 64 threads and 1 partitions (avg. partition size = 790746)... - built mphs[5] for 790746 kmers; bits/key = 2.4189 - built positions[5] for 790746 kmers; bits/key = 12.0004 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 666283 - building MPHF with 64 threads and 1 partitions (avg. partition size = 666283)... - built mphs[6] for 666283 kmers; bits/key = 2.5622 - built positions[6] for 666283 kmers; bits/key = 13.0005 - lower = 8192; upper = 414759; num_bits_per_pos = 19; num_kmers_in_partition = 3762004 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[7] for 3762004 kmers; bits/key = 2.9235 - built positions[7] for 3762004 kmers; bits/key = 19.0001 -computing skew index took: 4.84342 [sec] -=== step 3: 'build sparse and skew index' 5.24445 [sec] (9.42254 [ns/kmer]) -=== total_time 12.2693 [sec] (22.0438 [ns/kmer]) -total index size: 308878208 [B] -- 308.878 [MB] -SPACE BREAKDOWN: - mphf: 0.130318 [bits/kmer] (2.98412 [bits/key]) -- 2.93534% - strings_offsets: 0.115799 [bits/kmer] -- 2.6083% - control_codewords: 1.35379 [bits/kmer] -- 30.4933% - mid_load_buckets: 0.196907 [bits/kmer] -- 4.43522% - begin_buckets_of_size: 3.85206e-06 [bits/kmer] -- 8.67656e-05% - strings: 2.21266 [bits/kmer] -- 49.8391% - skew_index: 0.430136 [bits/kmer] -- 9.68858% - weights: 2.6447e-06 [bits/kmer] -- 5.95704e-05% - -------------- - total: 4.43961 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 96.0459% -buckets with 2 minimizer positions = 2.25565% -buckets with 3 minimizer positions = 0.699874% -buckets with 4 minimizer positions = 0.315284% -buckets with 5 minimizer positions = 0.173597% -buckets with 6 minimizer positions = 0.108305% -buckets with 7 minimizer positions = 0.0716932% -buckets with 8 minimizer positions = 0.0520522% -buckets with 9 minimizer positions = 0.0388458% -buckets with 10 minimizer positions = 0.0301485% -buckets with 11 minimizer positions = 0.0240019% -buckets with 12 minimizer positions = 0.0204144% -buckets with 13 minimizer positions = 0.0165265% -buckets with 14 minimizer positions = 0.013984% -buckets with 15 minimizer positions = 0.0120051% -buckets with 16 minimizer positions = 0.00972996% -max_bucket_size 414759 -2025-10-22 15:49:07: saving data structure to disk... -2025-10-22 15:49:08: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -g 16 -t 64 --verbose -d tmp_dir -o kestrel.k63.sshash -k = 63, m = 24, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... -read 100000 sequences, 726199646 bases, 719999646 kmers -=== step 1.1: 'encoding input' 2.94438 [sec] (2.54869 [ns/kmer]) -read 155784 sequences, 1164909275 bases, 1155250667 kmers -num_kmers 1155250667 -cost: 2.0 + 0.0167212 [bits/kmer] -max_len 261876 -num. bits per_absolute_offset 31 -num. bits per_relative_offset 18 -num. bits per_string_id 18 -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.533174 [sec] (0.461522 [ns/kmer]) -=== step 1: 'parse file' 3.50733 [sec] (3.03599 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.bin' -num_super_kmers = 50000000 -=== step 2.1: 'merging minimizers tuples' 4.05157 [sec] (3.50709 [ns/kmer]) -num_minimizers = 55464592 -num_minimizer_positions = 56006004 -num_super_kmers = 56006004 -building minimizers MPHF with 64 threads and 19 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.55136 [sec] (2.20849 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140948113259925.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 2.12257 [sec] (1.83732 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.03531 [sec] (0.89618 [ns/kmer]) -num_bits_per_offset = 31 -num_buckets_larger_than_1_not_in_skew_index 208120/55464592 (0.37523%) -num_buckets_in_skew_index 490/55464592 (0.000883447%) -max_bucket_size 794 -log2_max_bucket_size 10 -skew index num_partitions 4 -num_minimizer_positions_of_buckets_larger_than_1 687113/56006004 (1.22686%) -num_minimizer_positions_of_buckets_in_skew_index 62909/56006004 (0.112325%) -computing minimizers offsets: 0.438045 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 604884 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 417805 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 221219 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 794: 50229 -num_kmers_in_skew_index 1294137 (0.112022%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 604884 - building MPHF with 64 threads and 1 partitions (avg. partition size = 604884)... - built mphs[0] for 604884 kmers; bits/key = 2.41964 - built positions[0] for 604884 kmers; bits/key = 7.00061 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 417805 - building MPHF with 64 threads and 1 partitions (avg. partition size = 417805)... - built mphs[1] for 417805 kmers; bits/key = 2.42142 - built positions[1] for 417805 kmers; bits/key = 8.00082 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 221219 - building MPHF with 64 threads and 1 partitions (avg. partition size = 221219)... - built mphs[2] for 221219 kmers; bits/key = 2.42569 - built positions[2] for 221219 kmers; bits/key = 9.00147 - lower = 512; upper = 794; num_bits_per_pos = 10; num_kmers_in_partition = 50229 - building MPHF with 64 threads and 1 partitions (avg. partition size = 50229)... - built mphs[3] for 50229 kmers; bits/key = 2.45946 - built positions[3] for 50229 kmers; bits/key = 10.0073 -computing skew index took: 0.730156 [sec] -=== step 3: 'build sparse and skew index' 1.23687 [sec] (1.07065 [ns/kmer]) -=== total_time 14.505 [sec] (12.5557 [ns/kmer]) -total index size: 551471055 [B] -- 551.471 [MB] -SPACE BREAKDOWN: - mphf: 0.138428 [bits/kmer] (2.88327 [bits/key]) -- 3.62484% - strings_offsets: 0.0958241 [bits/kmer] -- 2.50922% - control_codewords: 1.53635 [bits/kmer] -- 40.2303% - mid_load_buckets: 0.0184383 [bits/kmer] -- 0.482819% - begin_buckets_of_size: 1.85587e-06 [bits/kmer] -- 4.85973e-05% - strings: 2.01672 [bits/kmer] -- 52.8092% - skew_index: 0.0131204 [bits/kmer] -- 0.343567% - weights: 1.27418e-06 [bits/kmer] -- 3.33653e-05% - -------------- - total: 3.81888 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 99.6239% -buckets with 2 minimizer positions = 0.253291% -buckets with 3 minimizer positions = 0.0530717% -buckets with 4 minimizer positions = 0.0227569% -buckets with 5 minimizer positions = 0.012325% -buckets with 6 minimizer positions = 0.00748405% -buckets with 7 minimizer positions = 0.00509695% -buckets with 8 minimizer positions = 0.00359148% -buckets with 9 minimizer positions = 0.00270803% -buckets with 10 minimizer positions = 0.0021383% -buckets with 11 minimizer positions = 0.00159201% -buckets with 12 minimizer positions = 0.00125666% -buckets with 13 minimizer positions = 0.00109619% -buckets with 14 minimizer positions = 0.000941141% -buckets with 15 minimizer positions = 0.000795102% -buckets with 16 minimizer positions = 0.000685122% -max_bucket_size 794 -2025-10-22 15:49:22: saving data structure to disk... -2025-10-22 15:49:23: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -g 16 -t 64 --verbose -d tmp_dir -o human.k63.sshash -k = 63, m = 25, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... -read 100000 sequences, 156072740 bases, 149872740 kmers -read 200000 sequences, 358422405 bases, 346022405 kmers -read 300000 sequences, 483978582 bases, 465378582 kmers -read 400000 sequences, 579661931 bases, 554861931 kmers -read 500000 sequences, 676698600 bases, 645698600 kmers -read 600000 sequences, 771042638 bases, 733842638 kmers -read 700000 sequences, 867362074 bases, 823962074 kmers -read 800000 sequences, 963948852 bases, 914348852 kmers -read 900000 sequences, 1061594001 bases, 1005794001 kmers -read 1000000 sequences, 1159508892 bases, 1097508892 kmers -read 1100000 sequences, 1258471425 bases, 1190271425 kmers -read 1200000 sequences, 1356700171 bases, 1282300171 kmers -read 1300000 sequences, 1455269127 bases, 1374669127 kmers -read 1400000 sequences, 1554765943 bases, 1467965943 kmers -read 1500000 sequences, 1655325717 bases, 1562325717 kmers -read 1600000 sequences, 1756677781 bases, 1657477781 kmers -read 1700000 sequences, 1857972693 bases, 1752572693 kmers -read 1800000 sequences, 1959726014 bases, 1848126014 kmers -read 1900000 sequences, 2064608823 bases, 1946808823 kmers -read 2000000 sequences, 2171598594 bases, 2047598594 kmers -read 2100000 sequences, 2280350234 bases, 2150150234 kmers -read 2200000 sequences, 2390845461 bases, 2254445461 kmers -read 2300000 sequences, 2504102196 bases, 2361502196 kmers -read 2400000 sequences, 2621983328 bases, 2473183328 kmers -read 2500000 sequences, 2745888150 bases, 2590888150 kmers -read 2600000 sequences, 2875580515 bases, 2714380515 kmers -=== step 1.1: 'encoding input' 7.74566 [sec] (2.79494 [ns/kmer]) -read 2642917 sequences, 2935176947 bases, 2771316093 kmers -num_kmers 2771316093 -cost: 2.0 + 0.118255 [bits/kmer] -max_len 124282 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 17 -num. bits per_string_id 22 -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.11804 [sec] (0.403432 [ns/kmer]) -=== step 1: 'parse file' 8.88067 [sec] (3.2045 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 9.74037 [sec] (3.51471 [ns/kmer]) -num_minimizers = 122838669 -num_minimizer_positions = 140756047 -num_super_kmers = 140756047 -building minimizers MPHF with 64 threads and 41 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 5.06657 [sec] (1.82822 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761140963158666531.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 5.10846 [sec] (1.84333 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.71827 [sec] (0.980859 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 3097190/122838669 (2.52135%) -num_buckets_in_skew_index 28203/122838669 (0.0229594%) -max_bucket_size 147936 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 12724460/140756047 (9.04008%) -num_minimizer_positions_of_buckets_in_skew_index 8318311/140756047 (5.90974%) -computing minimizers offsets: 1.60499 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25196923 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21919654 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19634878 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 18051454 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17018125 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 14085569 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 9296403 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 147936: 20255122 -num_kmers_in_skew_index 145458128 (5.2487%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 25196923 - building MPHF with 64 threads and 9 partitions (avg. partition size = 3000000)... - built mphs[0] for 25196923 kmers; bits/key = 2.56001 - built positions[0] for 25196923 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 21919654 - building MPHF with 64 threads and 8 partitions (avg. partition size = 3000000)... - built mphs[1] for 21919654 kmers; bits/key = 2.60671 - built positions[1] for 21919654 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 19634878 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[2] for 19634878 kmers; bits/key = 2.55594 - built positions[2] for 19634878 kmers; bits/key = 9.00002 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 18051454 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[3] for 18051454 kmers; bits/key = 2.60116 - built positions[3] for 18051454 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 17018125 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[4] for 17018125 kmers; bits/key = 2.58264 - built positions[4] for 17018125 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 14085569 - building MPHF with 64 threads and 5 partitions (avg. partition size = 3000000)... - built mphs[5] for 14085569 kmers; bits/key = 2.54674 - built positions[5] for 14085569 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 9296403 - building MPHF with 64 threads and 4 partitions (avg. partition size = 3000000)... - built mphs[6] for 9296403 kmers; bits/key = 2.72206 - built positions[6] for 9296403 kmers; bits/key = 13 - lower = 8192; upper = 147936; num_bits_per_pos = 18; num_kmers_in_partition = 20255122 - building MPHF with 64 threads and 7 partitions (avg. partition size = 3000000)... - built mphs[7] for 20255122 kmers; bits/key = 2.57505 - built positions[7] for 20255122 kmers; bits/key = 18 -computing skew index took: 18.2783 [sec] -=== step 3: 'build sparse and skew index' 20.0766 [sec] (7.24443 [ns/kmer]) -=== total_time 51.5909 [sec] (18.616 [ns/kmer]) -total index size: 1647878152 [B] -- 1647.88 [MB] -SPACE BREAKDOWN: - mphf: 0.125211 [bits/kmer] (2.82485 [bits/key]) -- 2.63218% - strings_offsets: 0.11255 [bits/kmer] -- 2.36601% - control_codewords: 1.46273 [bits/kmer] -- 30.7492% - mid_load_buckets: 0.146928 [bits/kmer] -- 3.08869% - begin_buckets_of_size: 7.7364e-07 [bits/kmer] -- 1.62633e-05% - strings: 2.11826 [bits/kmer] -- 44.5296% - skew_index: 0.791283 [bits/kmer] -- 16.6342% - weights: 5.31156e-07 [bits/kmer] -- 1.11659e-05% - -------------- - total: 4.75695 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 97.4557% -buckets with 2 minimizer positions = 1.46862% -buckets with 3 minimizer positions = 0.405135% -buckets with 4 minimizer positions = 0.185188% -buckets with 5 minimizer positions = 0.10523% -buckets with 6 minimizer positions = 0.0680771% -buckets with 7 minimizer positions = 0.0480598% -buckets with 8 minimizer positions = 0.0352926% -buckets with 9 minimizer positions = 0.0271502% -buckets with 10 minimizer positions = 0.0217871% -buckets with 11 minimizer positions = 0.0176866% -buckets with 12 minimizer positions = 0.014607% -buckets with 13 minimizer positions = 0.0121411% -buckets with 14 minimizer positions = 0.0105985% -buckets with 15 minimizer positions = 0.00909811% -buckets with 16 minimizer positions = 0.00794457% -max_bucket_size 147936 -2025-10-22 15:50:15: saving data structure to disk... -2025-10-22 15:50:16: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o hprc.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... -read 100000 sequences, 12340553 bases, 6140553 kmers -read 200000 sequences, 24646589 bases, 12246589 kmers -read 300000 sequences, 37018141 bases, 18418141 kmers -read 400000 sequences, 49395114 bases, 24595114 kmers -read 500000 sequences, 61758878 bases, 30758878 kmers -read 600000 sequences, 74141190 bases, 36941190 kmers -read 700000 sequences, 86514611 bases, 43114611 kmers -read 800000 sequences, 98874544 bases, 49274544 kmers -read 900000 sequences, 111243181 bases, 55443181 kmers -read 1000000 sequences, 123618042 bases, 61618042 kmers -read 1100000 sequences, 136042606 bases, 67842606 kmers -read 1200000 sequences, 148420872 bases, 74020872 kmers -read 1300000 sequences, 160881064 bases, 80281064 kmers -read 1400000 sequences, 173297356 bases, 86497356 kmers -read 1500000 sequences, 185720140 bases, 92720140 kmers -read 1600000 sequences, 198143865 bases, 98943865 kmers -read 1700000 sequences, 210604176 bases, 105204176 kmers -read 1800000 sequences, 223059063 bases, 111459063 kmers -read 1900000 sequences, 235529518 bases, 117729518 kmers -read 2000000 sequences, 248006699 bases, 124006699 kmers -read 2100000 sequences, 260467973 bases, 130267973 kmers -read 2200000 sequences, 272924559 bases, 136524559 kmers -read 2300000 sequences, 285441345 bases, 142841345 kmers -read 2400000 sequences, 297932660 bases, 149132660 kmers -read 2500000 sequences, 310464064 bases, 155464064 kmers -read 2600000 sequences, 323014693 bases, 161814693 kmers -read 2700000 sequences, 335527821 bases, 168127821 kmers -read 2800000 sequences, 348042847 bases, 174442847 kmers -read 2900000 sequences, 360581974 bases, 180781974 kmers -read 3000000 sequences, 373165849 bases, 187165849 kmers -read 3100000 sequences, 385714233 bases, 193514233 kmers -read 3200000 sequences, 398281117 bases, 199881117 kmers -read 3300000 sequences, 410870987 bases, 206270987 kmers -read 3400000 sequences, 423450505 bases, 212650505 kmers -read 3500000 sequences, 436046870 bases, 219046870 kmers -read 3600000 sequences, 448679908 bases, 225479908 kmers -read 3700000 sequences, 461321441 bases, 231921441 kmers -read 3800000 sequences, 473931444 bases, 238331444 kmers -read 3900000 sequences, 486569454 bases, 244769454 kmers -read 4000000 sequences, 499216806 bases, 251216806 kmers -read 4100000 sequences, 511895907 bases, 257695907 kmers -read 4200000 sequences, 524602572 bases, 264202572 kmers -read 4300000 sequences, 537274994 bases, 270674994 kmers -read 4400000 sequences, 549984374 bases, 277184374 kmers -read 4500000 sequences, 562700061 bases, 283700061 kmers -read 4600000 sequences, 575434925 bases, 290234925 kmers -read 4700000 sequences, 588209946 bases, 296809946 kmers -read 4800000 sequences, 600967911 bases, 303367911 kmers -read 4900000 sequences, 613729236 bases, 309929236 kmers -read 5000000 sequences, 626504126 bases, 316504126 kmers -read 5100000 sequences, 639246819 bases, 323046819 kmers -read 5200000 sequences, 652025682 bases, 329625682 kmers -read 5300000 sequences, 664852310 bases, 336252310 kmers -read 5400000 sequences, 677687649 bases, 342887649 kmers -read 5500000 sequences, 690503316 bases, 349503316 kmers -read 5600000 sequences, 703329176 bases, 356129176 kmers -read 5700000 sequences, 716216681 bases, 362816681 kmers -read 5800000 sequences, 729051812 bases, 369451812 kmers -read 5900000 sequences, 741932077 bases, 376132077 kmers -read 6000000 sequences, 754844978 bases, 382844978 kmers -read 6100000 sequences, 767765140 bases, 389565140 kmers -read 6200000 sequences, 780677776 bases, 396277776 kmers -read 6300000 sequences, 793620694 bases, 403020694 kmers -read 6400000 sequences, 806637996 bases, 409837996 kmers -read 6500000 sequences, 819598935 bases, 416598935 kmers -read 6600000 sequences, 832595328 bases, 423395328 kmers -read 6700000 sequences, 845581546 bases, 430181546 kmers -read 6800000 sequences, 858575854 bases, 436975854 kmers -read 6900000 sequences, 871622929 bases, 443822929 kmers -read 7000000 sequences, 884611558 bases, 450611558 kmers -read 7100000 sequences, 897672996 bases, 457472996 kmers -read 7200000 sequences, 910733015 bases, 464333015 kmers -read 7300000 sequences, 923812942 bases, 471212942 kmers -read 7400000 sequences, 936909625 bases, 478109625 kmers -read 7500000 sequences, 949997159 bases, 484997159 kmers -read 7600000 sequences, 963108020 bases, 491908020 kmers -read 7700000 sequences, 976263436 bases, 498863436 kmers -read 7800000 sequences, 989391405 bases, 505791405 kmers -read 7900000 sequences, 1002542485 bases, 512742485 kmers -read 8000000 sequences, 1015719906 bases, 519719906 kmers -read 8100000 sequences, 1028930197 bases, 526730197 kmers -read 8200000 sequences, 1042133468 bases, 533733468 kmers -read 8300000 sequences, 1055343127 bases, 540743127 kmers -read 8400000 sequences, 1068571427 bases, 547771427 kmers -read 8500000 sequences, 1081782196 bases, 554782196 kmers -read 8600000 sequences, 1095081437 bases, 561881437 kmers -read 8700000 sequences, 1108381806 bases, 568981806 kmers -read 8800000 sequences, 1121704584 bases, 576104584 kmers -read 8900000 sequences, 1135025841 bases, 583225841 kmers -read 9000000 sequences, 1148384128 bases, 590384128 kmers -read 9100000 sequences, 1161802584 bases, 597602584 kmers -read 9200000 sequences, 1175228394 bases, 604828394 kmers -read 9300000 sequences, 1188646412 bases, 612046412 kmers -read 9400000 sequences, 1202107297 bases, 619307297 kmers -read 9500000 sequences, 1215616980 bases, 626616980 kmers -read 9600000 sequences, 1229082437 bases, 633882437 kmers -read 9700000 sequences, 1242623591 bases, 641223591 kmers -read 9800000 sequences, 1256182433 bases, 648582433 kmers -read 9900000 sequences, 1269727668 bases, 655927668 kmers -read 10000000 sequences, 1283305186 bases, 663305186 kmers -read 10100000 sequences, 1296926205 bases, 670726205 kmers -read 10200000 sequences, 1310557071 bases, 678157071 kmers -read 10300000 sequences, 1324233675 bases, 685633675 kmers -read 10400000 sequences, 1337906923 bases, 693106923 kmers -read 10500000 sequences, 1351643244 bases, 700643244 kmers -read 10600000 sequences, 1365331150 bases, 708131150 kmers -read 10700000 sequences, 1379108550 bases, 715708550 kmers -read 10800000 sequences, 1392877827 bases, 723277827 kmers -read 10900000 sequences, 1406644102 bases, 730844102 kmers -read 11000000 sequences, 1420392618 bases, 738392618 kmers -read 11100000 sequences, 1434208379 bases, 746008379 kmers -read 11200000 sequences, 1448044972 bases, 753644972 kmers -read 11300000 sequences, 1461973854 bases, 761373854 kmers -read 11400000 sequences, 1475908509 bases, 769108509 kmers -read 11500000 sequences, 1489828724 bases, 776828724 kmers -read 11600000 sequences, 1503804264 bases, 784604264 kmers -read 11700000 sequences, 1517825235 bases, 792425235 kmers -read 11800000 sequences, 1531854974 bases, 800254974 kmers -read 11900000 sequences, 1545912508 bases, 808112508 kmers -read 12000000 sequences, 1559905103 bases, 815905103 kmers -read 12100000 sequences, 1574126683 bases, 823926683 kmers -read 12200000 sequences, 1588254047 bases, 831854047 kmers -read 12300000 sequences, 1602371782 bases, 839771782 kmers -read 12400000 sequences, 1616537282 bases, 847737282 kmers -read 12500000 sequences, 1630788706 bases, 855788706 kmers -read 12600000 sequences, 1644978439 bases, 863778439 kmers -read 12700000 sequences, 1659241271 bases, 871841271 kmers -read 12800000 sequences, 1673584186 bases, 879984186 kmers -read 12900000 sequences, 1687940640 bases, 888140640 kmers -read 13000000 sequences, 1702344045 bases, 896344045 kmers -read 13100000 sequences, 1716759629 bases, 904559629 kmers -read 13200000 sequences, 1731228745 bases, 912828745 kmers -read 13300000 sequences, 1745703705 bases, 921103705 kmers -read 13400000 sequences, 1760203272 bases, 929403272 kmers -read 13500000 sequences, 1774792711 bases, 937792711 kmers -read 13600000 sequences, 1789438714 bases, 946238714 kmers -read 13700000 sequences, 1804059654 bases, 954659654 kmers -read 13800000 sequences, 1818743992 bases, 963143992 kmers -read 13900000 sequences, 1833395678 bases, 971595678 kmers -read 14000000 sequences, 1848153905 bases, 980153905 kmers -read 14100000 sequences, 1862998607 bases, 988798607 kmers -read 14200000 sequences, 1877912070 bases, 997512070 kmers -read 14300000 sequences, 1892816876 bases, 1006216876 kmers -read 14400000 sequences, 1907719938 bases, 1014919938 kmers -read 14500000 sequences, 1922766653 bases, 1023766653 kmers -read 14600000 sequences, 1937831375 bases, 1032631375 kmers -read 14700000 sequences, 1952937615 bases, 1041537615 kmers -read 14800000 sequences, 1968048356 bases, 1050448356 kmers -read 14900000 sequences, 1983251476 bases, 1059451476 kmers -read 15000000 sequences, 1998487611 bases, 1068487611 kmers -read 15100000 sequences, 2013788359 bases, 1077588359 kmers -read 15200000 sequences, 2029113772 bases, 1086713772 kmers -read 15300000 sequences, 2044464755 bases, 1095864755 kmers -read 15400000 sequences, 2059908505 bases, 1105108505 kmers -read 15500000 sequences, 2075403120 bases, 1114403120 kmers -read 15600000 sequences, 2090966312 bases, 1123766312 kmers -read 15700000 sequences, 2106543902 bases, 1133143902 kmers -read 15800000 sequences, 2122217109 bases, 1142617109 kmers -read 15900000 sequences, 2137840183 bases, 1152040183 kmers -read 16000000 sequences, 2153589528 bases, 1161589528 kmers -read 16100000 sequences, 2169260701 bases, 1171060701 kmers -read 16200000 sequences, 2185177055 bases, 1180777055 kmers -read 16300000 sequences, 2201140740 bases, 1190540740 kmers -read 16400000 sequences, 2217102579 bases, 1200302579 kmers -read 16500000 sequences, 2233154655 bases, 1210154655 kmers -read 16600000 sequences, 2249289287 bases, 1220089287 kmers -read 16700000 sequences, 2265555086 bases, 1230155086 kmers -read 16800000 sequences, 2281740139 bases, 1240140139 kmers -read 16900000 sequences, 2298108132 bases, 1250308132 kmers -read 17000000 sequences, 2314472162 bases, 1260472162 kmers -read 17100000 sequences, 2331031402 bases, 1270831402 kmers -read 17200000 sequences, 2347660397 bases, 1281260397 kmers -read 17300000 sequences, 2364281513 bases, 1291681513 kmers -read 17400000 sequences, 2381151087 bases, 1302351087 kmers -read 17500000 sequences, 2398014935 bases, 1313014935 kmers -read 17600000 sequences, 2414848597 bases, 1323648597 kmers -read 17700000 sequences, 2431827823 bases, 1334427823 kmers -read 17800000 sequences, 2448880533 bases, 1345280533 kmers -read 17900000 sequences, 2466079483 bases, 1356279483 kmers -read 18000000 sequences, 2483331066 bases, 1367331066 kmers -read 18100000 sequences, 2500735835 bases, 1378535835 kmers -read 18200000 sequences, 2518182436 bases, 1389782436 kmers -read 18300000 sequences, 2535777011 bases, 1401177011 kmers -read 18400000 sequences, 2553420319 bases, 1412620319 kmers -read 18500000 sequences, 2571217551 bases, 1424217551 kmers -read 18600000 sequences, 2589036591 bases, 1435836591 kmers -read 18700000 sequences, 2607070590 bases, 1447670590 kmers -read 18800000 sequences, 2625277186 bases, 1459677186 kmers -read 18900000 sequences, 2643374333 bases, 1471574333 kmers -read 19000000 sequences, 2661730312 bases, 1483730312 kmers -read 19100000 sequences, 2680149797 bases, 1495949797 kmers -read 19200000 sequences, 2698694657 bases, 1508294657 kmers -read 19300000 sequences, 2717352983 bases, 1520752983 kmers -read 19400000 sequences, 2736256974 bases, 1533456974 kmers -read 19500000 sequences, 2755257180 bases, 1546257180 kmers -read 19600000 sequences, 2774351367 bases, 1559151367 kmers -read 19700000 sequences, 2793728312 bases, 1572328312 kmers -read 19800000 sequences, 2813220961 bases, 1585620961 kmers -read 19900000 sequences, 2832722443 bases, 1598922443 kmers -read 20000000 sequences, 2852409810 bases, 1612409810 kmers -read 20100000 sequences, 2872347566 bases, 1626147566 kmers -read 20200000 sequences, 2892389807 bases, 1639989807 kmers -read 20300000 sequences, 2912735414 bases, 1654135414 kmers -read 20400000 sequences, 2933385426 bases, 1668585426 kmers -read 20500000 sequences, 2954091535 bases, 1683091535 kmers -read 20600000 sequences, 2974925338 bases, 1697725338 kmers -read 20700000 sequences, 2995915917 bases, 1712515917 kmers -read 20800000 sequences, 3017122691 bases, 1727522691 kmers -read 20900000 sequences, 3038531782 bases, 1742731782 kmers -read 21000000 sequences, 3060194564 bases, 1758194564 kmers -read 21100000 sequences, 3081907101 bases, 1773707101 kmers -read 21200000 sequences, 3104086740 bases, 1789686740 kmers -read 21300000 sequences, 3126473358 bases, 1805873358 kmers -read 21400000 sequences, 3149108015 bases, 1822308015 kmers -read 21500000 sequences, 3171928734 bases, 1838928734 kmers -read 21600000 sequences, 3194958136 bases, 1855758136 kmers -read 21700000 sequences, 3218341306 bases, 1872941306 kmers -read 21800000 sequences, 3241998625 bases, 1890398625 kmers -read 21900000 sequences, 3265867648 bases, 1908067648 kmers -read 22000000 sequences, 3290140238 bases, 1926140238 kmers -read 22100000 sequences, 3314774267 bases, 1944574267 kmers -read 22200000 sequences, 3339683962 bases, 1963283962 kmers -read 22300000 sequences, 3365026242 bases, 1982426242 kmers -read 22400000 sequences, 3390524916 bases, 2001724916 kmers -read 22500000 sequences, 3416602911 bases, 2021602911 kmers -read 22600000 sequences, 3443068815 bases, 2041868815 kmers -read 22700000 sequences, 3469843783 bases, 2062443783 kmers -read 22800000 sequences, 3496984552 bases, 2083384552 kmers -read 22900000 sequences, 3524534540 bases, 2104734540 kmers -read 23000000 sequences, 3552570970 bases, 2126570970 kmers -read 23100000 sequences, 3581192379 bases, 2148992379 kmers -read 23200000 sequences, 3610381847 bases, 2171981847 kmers -read 23300000 sequences, 3639851051 bases, 2195251051 kmers -read 23400000 sequences, 3669893600 bases, 2219093600 kmers -read 23500000 sequences, 3700753305 bases, 2243753305 kmers -read 23600000 sequences, 3732004106 bases, 2268804106 kmers -read 23700000 sequences, 3763988610 bases, 2294588610 kmers -read 23800000 sequences, 3796342561 bases, 2320742561 kmers -read 23900000 sequences, 3829617231 bases, 2347817231 kmers -read 24000000 sequences, 3863888905 bases, 2375888905 kmers -read 24100000 sequences, 3898564027 bases, 2404364027 kmers -read 24200000 sequences, 3934105190 bases, 2433705190 kmers -read 24300000 sequences, 3970664280 bases, 2464064280 kmers -read 24400000 sequences, 4008289233 bases, 2495489233 kmers -read 24500000 sequences, 4046653113 bases, 2527653113 kmers -read 24600000 sequences, 4085474513 bases, 2560274513 kmers -read 24700000 sequences, 4125325954 bases, 2593925954 kmers -read 24800000 sequences, 4166644470 bases, 2629044470 kmers -read 24900000 sequences, 4209157187 bases, 2665357187 kmers -read 25000000 sequences, 4253358029 bases, 2703358029 kmers -read 25100000 sequences, 4298306053 bases, 2742106053 kmers -read 25200000 sequences, 4345043044 bases, 2782643044 kmers -read 25300000 sequences, 4392932896 bases, 2824332896 kmers -read 25400000 sequences, 4442655136 bases, 2867855136 kmers -read 25500000 sequences, 4494211117 bases, 2913211117 kmers -read 25600000 sequences, 4547341661 bases, 2960141661 kmers -read 25700000 sequences, 4602288756 bases, 3008888756 kmers -read 25800000 sequences, 4659271424 bases, 3059671424 kmers -read 25900000 sequences, 4718698784 bases, 3112898784 kmers -read 26000000 sequences, 4780487647 bases, 3168487647 kmers -read 26100000 sequences, 4845831097 bases, 3227631097 kmers -read 26200000 sequences, 4913892154 bases, 3289492154 kmers -read 26300000 sequences, 4985279757 bases, 3354679757 kmers -read 26400000 sequences, 5059260801 bases, 3422460801 kmers -read 26500000 sequences, 5137444413 bases, 3494444413 kmers -read 26600000 sequences, 5220218222 bases, 3571018222 kmers -read 26700000 sequences, 5307644834 bases, 3652244834 kmers -read 26800000 sequences, 5400268964 bases, 3738668964 kmers -read 26900000 sequences, 5498821243 bases, 3831021243 kmers -read 27000000 sequences, 5604484526 bases, 3930484526 kmers -read 27100000 sequences, 5717045846 bases, 4036845846 kmers -read 27200000 sequences, 5833611115 bases, 4147211115 kmers -read 27300000 sequences, 5846284956 bases, 4153684956 kmers -read 27400000 sequences, 5857666261 bases, 4158866261 kmers -read 27500000 sequences, 5869033274 bases, 4164033274 kmers -read 27600000 sequences, 5880412056 bases, 4169212056 kmers -read 27700000 sequences, 5891780133 bases, 4174380133 kmers -read 27800000 sequences, 5903175638 bases, 4179575638 kmers -read 27900000 sequences, 5914554494 bases, 4184754494 kmers -read 28000000 sequences, 5925952935 bases, 4189952935 kmers -read 28100000 sequences, 5937330032 bases, 4195130032 kmers -read 28200000 sequences, 5948710754 bases, 4200310754 kmers -read 28300000 sequences, 5960084167 bases, 4205484167 kmers -read 28400000 sequences, 5971480727 bases, 4210680727 kmers -read 28500000 sequences, 5982848912 bases, 4215848912 kmers -read 28600000 sequences, 5994224416 bases, 4221024416 kmers -read 28700000 sequences, 6005620576 bases, 4226220576 kmers -read 28800000 sequences, 6016990505 bases, 4231390505 kmers -read 28900000 sequences, 6028385718 bases, 4236585718 kmers -read 29000000 sequences, 6039783917 bases, 4241783917 kmers -read 29100000 sequences, 6051178807 bases, 4246978807 kmers -read 29200000 sequences, 6062557962 bases, 4252157962 kmers -read 29300000 sequences, 6073940879 bases, 4257340879 kmers -read 29400000 sequences, 6085331369 bases, 4262531369 kmers -read 29500000 sequences, 6096728471 bases, 4267728471 kmers -read 29600000 sequences, 6108103103 bases, 4272903103 kmers -read 29700000 sequences, 6119481434 bases, 4278081434 kmers -read 29800000 sequences, 6130856274 bases, 4283256274 kmers -read 29900000 sequences, 6142238370 bases, 4288438370 kmers -read 30000000 sequences, 6153634902 bases, 4293634902 kmers -read 30100000 sequences, 6165020174 bases, 4298820174 kmers -read 30200000 sequences, 6176433592 bases, 4304033592 kmers -read 30300000 sequences, 6187857678 bases, 4309257678 kmers -read 30400000 sequences, 6199252279 bases, 4314452279 kmers -read 30500000 sequences, 6210672636 bases, 4319672636 kmers -read 30600000 sequences, 6222092039 bases, 4324892039 kmers -read 30700000 sequences, 6233490560 bases, 4330090560 kmers -read 30800000 sequences, 6244878932 bases, 4335278932 kmers -read 30900000 sequences, 6256282501 bases, 4340482501 kmers -read 31000000 sequences, 6267684053 bases, 4345684053 kmers -read 31100000 sequences, 6279097938 bases, 4350897938 kmers -read 31200000 sequences, 6290508477 bases, 4356108477 kmers -read 31300000 sequences, 6301930335 bases, 4361330335 kmers -read 31400000 sequences, 6313323332 bases, 4366523332 kmers -read 31500000 sequences, 6324738742 bases, 4371738742 kmers -read 31600000 sequences, 6336131699 bases, 4376931699 kmers -read 31700000 sequences, 6347524619 bases, 4382124619 kmers -read 31800000 sequences, 6358957080 bases, 4387357080 kmers -read 31900000 sequences, 6370375111 bases, 4392575111 kmers -read 32000000 sequences, 6381788267 bases, 4397788267 kmers -read 32100000 sequences, 6393225045 bases, 4403025045 kmers -read 32200000 sequences, 6404646009 bases, 4408246009 kmers -read 32300000 sequences, 6416049898 bases, 4413449898 kmers -read 32400000 sequences, 6427468559 bases, 4418668559 kmers -read 32500000 sequences, 6438906261 bases, 4423906261 kmers -read 32600000 sequences, 6450334779 bases, 4429134779 kmers -read 32700000 sequences, 6461755133 bases, 4434355133 kmers -read 32800000 sequences, 6473195712 bases, 4439595712 kmers -read 32900000 sequences, 6484644292 bases, 4444844292 kmers -read 33000000 sequences, 6496092541 bases, 4450092541 kmers -read 33100000 sequences, 6507511566 bases, 4455311566 kmers -read 33200000 sequences, 6518945251 bases, 4460545251 kmers -read 33300000 sequences, 6530384550 bases, 4465784550 kmers -read 33400000 sequences, 6541805344 bases, 4471005344 kmers -read 33500000 sequences, 6553237577 bases, 4476237577 kmers -read 33600000 sequences, 6564689207 bases, 4481489207 kmers -read 33700000 sequences, 6576122207 bases, 4486722207 kmers -read 33800000 sequences, 6587572349 bases, 4491972349 kmers -read 33900000 sequences, 6599018868 bases, 4497218868 kmers -read 34000000 sequences, 6610456809 bases, 4502456809 kmers -read 34100000 sequences, 6621897412 bases, 4507697412 kmers -read 34200000 sequences, 6633348684 bases, 4512948684 kmers -read 34300000 sequences, 6644797017 bases, 4518197017 kmers -read 34400000 sequences, 6656241948 bases, 4523441948 kmers -read 34500000 sequences, 6667691134 bases, 4528691134 kmers -read 34600000 sequences, 6679157324 bases, 4533957324 kmers -read 34700000 sequences, 6690642313 bases, 4539242313 kmers -read 34800000 sequences, 6702109598 bases, 4544509598 kmers -read 34900000 sequences, 6713569428 bases, 4549769428 kmers -read 35000000 sequences, 6725025608 bases, 4555025608 kmers -read 35100000 sequences, 6736483973 bases, 4560283973 kmers -read 35200000 sequences, 6747950658 bases, 4565550658 kmers -read 35300000 sequences, 6759387045 bases, 4570787045 kmers -read 35400000 sequences, 6770873555 bases, 4576073555 kmers -read 35500000 sequences, 6782328921 bases, 4581328921 kmers -read 35600000 sequences, 6793801691 bases, 4586601691 kmers -read 35700000 sequences, 6805289064 bases, 4591889064 kmers -read 35800000 sequences, 6816766724 bases, 4597166724 kmers -read 35900000 sequences, 6828221729 bases, 4602421729 kmers -read 36000000 sequences, 6839697388 bases, 4607697388 kmers -read 36100000 sequences, 6851168093 bases, 4612968093 kmers -read 36200000 sequences, 6862661164 bases, 4618261164 kmers -read 36300000 sequences, 6874122285 bases, 4623522285 kmers -read 36400000 sequences, 6885602001 bases, 4628802001 kmers -read 36500000 sequences, 6897091095 bases, 4634091095 kmers -read 36600000 sequences, 6908577172 bases, 4639377172 kmers -read 36700000 sequences, 6920070520 bases, 4644670520 kmers -read 36800000 sequences, 6931583091 bases, 4649983091 kmers -read 36900000 sequences, 6943075024 bases, 4655275024 kmers -read 37000000 sequences, 6954566139 bases, 4660566139 kmers -read 37100000 sequences, 6966070577 bases, 4665870577 kmers -read 37200000 sequences, 6977560540 bases, 4671160540 kmers -read 37300000 sequences, 6989067050 bases, 4676467050 kmers -read 37400000 sequences, 7000566525 bases, 4681766525 kmers -read 37500000 sequences, 7012064234 bases, 4687064234 kmers -read 37600000 sequences, 7023579053 bases, 4692379053 kmers -read 37700000 sequences, 7035113872 bases, 4697713872 kmers -read 37800000 sequences, 7046611242 bases, 4703011242 kmers -read 37900000 sequences, 7058113038 bases, 4708313038 kmers -read 38000000 sequences, 7069620814 bases, 4713620814 kmers -read 38100000 sequences, 7081124727 bases, 4718924727 kmers -read 38200000 sequences, 7092641699 bases, 4724241699 kmers -read 38300000 sequences, 7104173446 bases, 4729573446 kmers -read 38400000 sequences, 7115693874 bases, 4734893874 kmers -read 38500000 sequences, 7127223462 bases, 4740223462 kmers -read 38600000 sequences, 7138742897 bases, 4745542897 kmers -read 38700000 sequences, 7150288045 bases, 4750888045 kmers -read 38800000 sequences, 7161816796 bases, 4756216796 kmers -read 38900000 sequences, 7173324459 bases, 4761524459 kmers -read 39000000 sequences, 7184856392 bases, 4766856392 kmers -read 39100000 sequences, 7196427393 bases, 4772227393 kmers -read 39200000 sequences, 7207963192 bases, 4777563192 kmers -read 39300000 sequences, 7219512149 bases, 4782912149 kmers -read 39400000 sequences, 7231059051 bases, 4788259051 kmers -read 39500000 sequences, 7242615872 bases, 4793615872 kmers -read 39600000 sequences, 7254152078 bases, 4798952078 kmers -read 39700000 sequences, 7265709373 bases, 4804309373 kmers -read 39800000 sequences, 7277261623 bases, 4809661623 kmers -read 39900000 sequences, 7288796039 bases, 4814996039 kmers -read 40000000 sequences, 7300352498 bases, 4820352498 kmers -read 40100000 sequences, 7311909288 bases, 4825709288 kmers -read 40200000 sequences, 7323455205 bases, 4831055205 kmers -read 40300000 sequences, 7335021154 bases, 4836421154 kmers -read 40400000 sequences, 7346572879 bases, 4841772879 kmers -read 40500000 sequences, 7358141934 bases, 4847141934 kmers -read 40600000 sequences, 7369701078 bases, 4852501078 kmers -read 40700000 sequences, 7381268609 bases, 4857868609 kmers -read 40800000 sequences, 7392842975 bases, 4863242975 kmers -read 40900000 sequences, 7404426134 bases, 4868626134 kmers -read 41000000 sequences, 7415987203 bases, 4873987203 kmers -read 41100000 sequences, 7427575222 bases, 4879375222 kmers -read 41200000 sequences, 7439175574 bases, 4884775574 kmers -read 41300000 sequences, 7450739591 bases, 4890139591 kmers -read 41400000 sequences, 7462314068 bases, 4895514068 kmers -read 41500000 sequences, 7473895691 bases, 4900895691 kmers -read 41600000 sequences, 7485498997 bases, 4906298997 kmers -read 41700000 sequences, 7497097716 bases, 4911697716 kmers -read 41800000 sequences, 7508699398 bases, 4917099398 kmers -read 41900000 sequences, 7520283511 bases, 4922483511 kmers -read 42000000 sequences, 7531875755 bases, 4927875755 kmers -read 42100000 sequences, 7543485297 bases, 4933285297 kmers -read 42200000 sequences, 7555088471 bases, 4938688471 kmers -read 42300000 sequences, 7566689783 bases, 4944089783 kmers -read 42400000 sequences, 7578300843 bases, 4949500843 kmers -read 42500000 sequences, 7589917091 bases, 4954917091 kmers -read 42600000 sequences, 7601521329 bases, 4960321329 kmers -read 42700000 sequences, 7613130662 bases, 4965730662 kmers -read 42800000 sequences, 7624734831 bases, 4971134831 kmers -read 42900000 sequences, 7636365711 bases, 4976565711 kmers -read 43000000 sequences, 7647987237 bases, 4981987237 kmers -read 43100000 sequences, 7659607458 bases, 4987407458 kmers -read 43200000 sequences, 7671221602 bases, 4992821602 kmers -read 43300000 sequences, 7682851139 bases, 4998251139 kmers -read 43400000 sequences, 7694478123 bases, 5003678123 kmers -read 43500000 sequences, 7706091778 bases, 5009091778 kmers -read 43600000 sequences, 7717739307 bases, 5014539307 kmers -read 43700000 sequences, 7729380054 bases, 5019980054 kmers -read 43800000 sequences, 7741005863 bases, 5025405863 kmers -read 43900000 sequences, 7752654882 bases, 5030854882 kmers -read 44000000 sequences, 7764325565 bases, 5036325565 kmers -read 44100000 sequences, 7775977379 bases, 5041777379 kmers -read 44200000 sequences, 7787629796 bases, 5047229796 kmers -read 44300000 sequences, 7799282513 bases, 5052682513 kmers -read 44400000 sequences, 7810951322 bases, 5058151322 kmers -read 44500000 sequences, 7822598496 bases, 5063598496 kmers -read 44600000 sequences, 7834244811 bases, 5069044811 kmers -read 44700000 sequences, 7845891393 bases, 5074491393 kmers -read 44800000 sequences, 7857565644 bases, 5079965644 kmers -read 44900000 sequences, 7869252433 bases, 5085452433 kmers -read 45000000 sequences, 7880919196 bases, 5090919196 kmers -read 45100000 sequences, 7892577075 bases, 5096377075 kmers -read 45200000 sequences, 7904242054 bases, 5101842054 kmers -read 45300000 sequences, 7915920783 bases, 5107320783 kmers -read 45400000 sequences, 7927605586 bases, 5112805586 kmers -read 45500000 sequences, 7939292913 bases, 5118292913 kmers -read 45600000 sequences, 7950976081 bases, 5123776081 kmers -read 45700000 sequences, 7962667096 bases, 5129267096 kmers -read 45800000 sequences, 7974342012 bases, 5134742012 kmers -read 45900000 sequences, 7986038737 bases, 5140238737 kmers -read 46000000 sequences, 7997748943 bases, 5145748943 kmers -read 46100000 sequences, 8009477824 bases, 5151277824 kmers -read 46200000 sequences, 8021166352 bases, 5156766352 kmers -read 46300000 sequences, 8032854246 bases, 5162254246 kmers -read 46400000 sequences, 8044556080 bases, 5167756080 kmers -read 46500000 sequences, 8056240574 bases, 5173240574 kmers -read 46600000 sequences, 8067931755 bases, 5178731755 kmers -read 46700000 sequences, 8079649033 bases, 5184249033 kmers -read 46800000 sequences, 8091384786 bases, 5189784786 kmers -read 46900000 sequences, 8103124165 bases, 5195324165 kmers -read 47000000 sequences, 8114852221 bases, 5200852221 kmers -read 47100000 sequences, 8126577498 bases, 5206377498 kmers -read 47200000 sequences, 8138321232 bases, 5211921232 kmers -read 47300000 sequences, 8150083009 bases, 5217483009 kmers -read 47400000 sequences, 8161823465 bases, 5223023465 kmers -read 47500000 sequences, 8173558457 bases, 5228558457 kmers -read 47600000 sequences, 8185297265 bases, 5234097265 kmers -read 47700000 sequences, 8197020963 bases, 5239620963 kmers -read 47800000 sequences, 8208783912 bases, 5245183912 kmers -read 47900000 sequences, 8220547911 bases, 5250747911 kmers -read 48000000 sequences, 8232292777 bases, 5256292777 kmers -read 48100000 sequences, 8244054559 bases, 5261854559 kmers -read 48200000 sequences, 8255808811 bases, 5267408811 kmers -read 48300000 sequences, 8267574548 bases, 5272974548 kmers -read 48400000 sequences, 8279340938 bases, 5278540938 kmers -read 48500000 sequences, 8291110439 bases, 5284110439 kmers -read 48600000 sequences, 8302889397 bases, 5289689397 kmers -read 48700000 sequences, 8314649020 bases, 5295249020 kmers -read 48800000 sequences, 8326414270 bases, 5300814270 kmers -read 48900000 sequences, 8338207427 bases, 5306407427 kmers -read 49000000 sequences, 8349993383 bases, 5311993383 kmers -read 49100000 sequences, 8361791437 bases, 5317591437 kmers -read 49200000 sequences, 8373582890 bases, 5323182890 kmers -read 49300000 sequences, 8385394696 bases, 5328794696 kmers -read 49400000 sequences, 8397203106 bases, 5334403106 kmers -read 49500000 sequences, 8409020385 bases, 5340020385 kmers -read 49600000 sequences, 8420828940 bases, 5345628940 kmers -read 49700000 sequences, 8432643406 bases, 5351243406 kmers -read 49800000 sequences, 8444451802 bases, 5356851802 kmers -read 49900000 sequences, 8456260306 bases, 5362460306 kmers -read 50000000 sequences, 8468086161 bases, 5368086161 kmers -read 50100000 sequences, 8479897357 bases, 5373697357 kmers -read 50200000 sequences, 8491729387 bases, 5379329387 kmers -read 50300000 sequences, 8503563532 bases, 5384963532 kmers -read 50400000 sequences, 8515408230 bases, 5390608230 kmers -read 50500000 sequences, 8527227002 bases, 5396227002 kmers -read 50600000 sequences, 8539067794 bases, 5401867794 kmers -read 50700000 sequences, 8550900112 bases, 5407500112 kmers -read 50800000 sequences, 8562770632 bases, 5413170632 kmers -read 50900000 sequences, 8574595670 bases, 5418795670 kmers -read 51000000 sequences, 8586456588 bases, 5424456588 kmers -read 51100000 sequences, 8598316350 bases, 5430116350 kmers -read 51200000 sequences, 8610172384 bases, 5435772384 kmers -read 51300000 sequences, 8622055840 bases, 5441455840 kmers -read 51400000 sequences, 8633927375 bases, 5447127375 kmers -read 51500000 sequences, 8645823649 bases, 5452823649 kmers -read 51600000 sequences, 8657691480 bases, 5458491480 kmers -read 51700000 sequences, 8669585688 bases, 5464185688 kmers -read 51800000 sequences, 8681474383 bases, 5469874383 kmers -read 51900000 sequences, 8693381973 bases, 5475581973 kmers -read 52000000 sequences, 8705279881 bases, 5481279881 kmers -read 52100000 sequences, 8717209576 bases, 5487009576 kmers -read 52200000 sequences, 8729118994 bases, 5492718994 kmers -read 52300000 sequences, 8741023578 bases, 5498423578 kmers -read 52400000 sequences, 8752969801 bases, 5504169801 kmers -read 52500000 sequences, 8764903801 bases, 5509903801 kmers -read 52600000 sequences, 8776822939 bases, 5515622939 kmers -read 52700000 sequences, 8788751140 bases, 5521351140 kmers -read 52800000 sequences, 8800669845 bases, 5527069845 kmers -read 52900000 sequences, 8812598474 bases, 5532798474 kmers -read 53000000 sequences, 8824571697 bases, 5538571697 kmers -read 53100000 sequences, 8836519008 bases, 5544319008 kmers -read 53200000 sequences, 8848466460 bases, 5550066460 kmers -read 53300000 sequences, 8860413233 bases, 5555813233 kmers -read 53400000 sequences, 8872384304 bases, 5561584304 kmers -read 53500000 sequences, 8884332260 bases, 5567332260 kmers -read 53600000 sequences, 8896284636 bases, 5573084636 kmers -read 53700000 sequences, 8908270656 bases, 5578870656 kmers -read 53800000 sequences, 8920268107 bases, 5584668107 kmers -read 53900000 sequences, 8932246098 bases, 5590446098 kmers -read 54000000 sequences, 8944259928 bases, 5596259928 kmers -read 54100000 sequences, 8956269394 bases, 5602069394 kmers -read 54200000 sequences, 8968276927 bases, 5607876927 kmers -read 54300000 sequences, 8980258970 bases, 5613658970 kmers -read 54400000 sequences, 8992247866 bases, 5619447866 kmers -read 54500000 sequences, 9004254206 bases, 5625254206 kmers -read 54600000 sequences, 9016278401 bases, 5631078401 kmers -read 54700000 sequences, 9028312154 bases, 5636912154 kmers -read 54800000 sequences, 9040331981 bases, 5642731981 kmers -read 54900000 sequences, 9052350829 bases, 5648550829 kmers -read 55000000 sequences, 9064361649 bases, 5654361649 kmers -read 55100000 sequences, 9076390853 bases, 5660190853 kmers -read 55200000 sequences, 9088446181 bases, 5666046181 kmers -read 55300000 sequences, 9100525911 bases, 5671925911 kmers -read 55400000 sequences, 9112587250 bases, 5677787250 kmers -read 55500000 sequences, 9124623806 bases, 5683623806 kmers -read 55600000 sequences, 9136715507 bases, 5689515507 kmers -read 55700000 sequences, 9148800858 bases, 5695400858 kmers -read 55800000 sequences, 9160843772 bases, 5701243772 kmers -read 55900000 sequences, 9172925342 bases, 5707125342 kmers -read 56000000 sequences, 9185024212 bases, 5713024212 kmers -read 56100000 sequences, 9197117149 bases, 5718917149 kmers -read 56200000 sequences, 9209230596 bases, 5724830596 kmers -read 56300000 sequences, 9221344558 bases, 5730744558 kmers -read 56400000 sequences, 9233465406 bases, 5736665406 kmers -read 56500000 sequences, 9245571958 bases, 5742571958 kmers -read 56600000 sequences, 9257641670 bases, 5748441670 kmers -read 56700000 sequences, 9269746246 bases, 5754346246 kmers -read 56800000 sequences, 9281862497 bases, 5760262497 kmers -read 56900000 sequences, 9294025360 bases, 5766225360 kmers -read 57000000 sequences, 9306137968 bases, 5772137968 kmers -read 57100000 sequences, 9318287606 bases, 5778087606 kmers -read 57200000 sequences, 9330445614 bases, 5784045614 kmers -read 57300000 sequences, 9342615044 bases, 5790015044 kmers -read 57400000 sequences, 9354790676 bases, 5795990676 kmers -read 57500000 sequences, 9366968309 bases, 5801968309 kmers -read 57600000 sequences, 9379136177 bases, 5807936177 kmers -read 57700000 sequences, 9391324421 bases, 5813924421 kmers -read 57800000 sequences, 9403503043 bases, 5819903043 kmers -read 57900000 sequences, 9415684703 bases, 5825884703 kmers -read 58000000 sequences, 9427875971 bases, 5831875971 kmers -read 58100000 sequences, 9440085397 bases, 5837885397 kmers -read 58200000 sequences, 9452280546 bases, 5843880546 kmers -read 58300000 sequences, 9464471942 bases, 5849871942 kmers -read 58400000 sequences, 9476715998 bases, 5855915998 kmers -read 58500000 sequences, 9488920051 bases, 5861920051 kmers -read 58600000 sequences, 9501146210 bases, 5867946210 kmers -read 58700000 sequences, 9513406566 bases, 5874006566 kmers -read 58800000 sequences, 9525653288 bases, 5880053288 kmers -read 58900000 sequences, 9537898122 bases, 5886098122 kmers -read 59000000 sequences, 9550182119 bases, 5892182119 kmers -read 59100000 sequences, 9562418780 bases, 5898218780 kmers -read 59200000 sequences, 9574665051 bases, 5904265051 kmers -read 59300000 sequences, 9586958666 bases, 5910358666 kmers -read 59400000 sequences, 9599304794 bases, 5916504794 kmers -read 59500000 sequences, 9611573081 bases, 5922573081 kmers -=== step 1.1: 'encoding input' 27.6126 [sec] (4.65895 [ns/kmer]) -read 59568965 sequences, 9620061299 bases, 5926785469 kmers -num_kmers 5926785469 -cost: 2.0 + 1.2463 [bits/kmer] -max_len 27681 -num. bits per_absolute_offset 34 -num. bits per_relative_offset 15 -num. bits per_string_id 26 -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.63.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.64.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.65.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.66.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.67.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.68.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.69.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.70.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.71.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.72.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.73.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.74.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.75.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.76.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.77.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.78.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.79.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.80.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.81.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.82.bin'... -=== step 1.2: 'computing minimizers tuples' 6.87492 [sec] (1.15997 [ns/kmer]) -=== step 1: 'parse file' 34.4876 [sec] (5.81894 [ns/kmer]) - == files to merge = 83 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -num_super_kmers = 150000000 -num_super_kmers = 200000000 -num_super_kmers = 250000000 -num_super_kmers = 300000000 -num_super_kmers = 350000000 -num_super_kmers = 400000000 -=== step 2.1: 'merging minimizers tuples' 31.0569 [sec] (5.2401 [ns/kmer]) -num_minimizers = 274429863 -num_minimizer_positions = 406062800 -num_super_kmers = 406062800 -building minimizers MPHF with 64 threads and 92 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 11.9786 [sec] (2.02109 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141016339619166.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 14.0434 [sec] (2.36948 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 5.84638 [sec] (0.986433 [ns/kmer]) -num_bits_per_offset = 34 -num_buckets_larger_than_1_not_in_skew_index 51299487/274429863 (18.6931%) -num_buckets_in_skew_index 131946/274429863 (0.04808%) -max_bucket_size 176220 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 146053805/406062800 (35.9683%) -num_minimizer_positions_of_buckets_in_skew_index 37010565/406062800 (9.11449%) -computing minimizers offsets: 9.1496 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 83316513 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 74231522 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 67271777 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 57125353 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 46013184 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 37921473 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 28349062 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 176220: 62824185 -num_kmers_in_skew_index 457053069 (7.71165%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 83316513 - building MPHF with 64 threads and 28 partitions (avg. partition size = 3000000)... - built mphs[0] for 83316513 kmers; bits/key = 2.55669 - built positions[0] for 83316513 kmers; bits/key = 7 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 74231522 - building MPHF with 64 threads and 25 partitions (avg. partition size = 3000000)... - built mphs[1] for 74231522 kmers; bits/key = 2.57033 - built positions[1] for 74231522 kmers; bits/key = 8 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 67271777 - building MPHF with 64 threads and 23 partitions (avg. partition size = 3000000)... - built mphs[2] for 67271777 kmers; bits/key = 2.54468 - built positions[2] for 67271777 kmers; bits/key = 9.00001 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 57125353 - building MPHF with 64 threads and 20 partitions (avg. partition size = 3000000)... - built mphs[3] for 57125353 kmers; bits/key = 2.53252 - built positions[3] for 57125353 kmers; bits/key = 10 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 46013184 - building MPHF with 64 threads and 16 partitions (avg. partition size = 3000000)... - built mphs[4] for 46013184 kmers; bits/key = 2.53117 - built positions[4] for 46013184 kmers; bits/key = 11 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 37921473 - building MPHF with 64 threads and 13 partitions (avg. partition size = 3000000)... - built mphs[5] for 37921473 kmers; bits/key = 2.56414 - built positions[5] for 37921473 kmers; bits/key = 12 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 28349062 - building MPHF with 64 threads and 10 partitions (avg. partition size = 3000000)... - built mphs[6] for 28349062 kmers; bits/key = 2.56358 - built positions[6] for 28349062 kmers; bits/key = 13 - lower = 8192; upper = 176220; num_bits_per_pos = 18; num_kmers_in_partition = 62824185 - building MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... - built mphs[7] for 62824185 kmers; bits/key = 2.55204 - built positions[7] for 62824185 kmers; bits/key = 18 -computing skew index took: 61.3503 [sec] -=== step 3: 'build sparse and skew index' 71.2392 [sec] (12.0199 [ns/kmer]) -=== total_time 168.652 [sec] (28.4559 [ns/kmer]) -total index size: 5431161966 [B] -- 5431.16 [MB] -SPACE BREAKDOWN: - mphf: 0.131165 [bits/kmer] (2.83273 [bits/key]) -- 1.78918% - strings_offsets: 0.273643 [bits/kmer] -- 3.73268% - control_codewords: 1.62062 [bits/kmer] -- 22.1063% - mid_load_buckets: 0.837862 [bits/kmer] -- 11.429% - begin_buckets_of_size: 3.61748e-07 [bits/kmer] -- 4.93449e-06% - strings: 3.2463 [bits/kmer] -- 44.2818% - skew_index: 1.22142 [bits/kmer] -- 16.661% - weights: 2.48364e-07 [bits/kmer] -- 3.38786e-06% - -------------- - total: 7.33101 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 81.2588% -buckets with 2 minimizer positions = 13.7158% -buckets with 3 minimizer positions = 2.82467% -buckets with 4 minimizer positions = 0.819903% -buckets with 5 minimizer positions = 0.371916% -buckets with 6 minimizer positions = 0.218785% -buckets with 7 minimizer positions = 0.143859% -buckets with 8 minimizer positions = 0.101665% -buckets with 9 minimizer positions = 0.0751737% -buckets with 10 minimizer positions = 0.0573965% -buckets with 11 minimizer positions = 0.0451926% -buckets with 12 minimizer positions = 0.0368258% -buckets with 13 minimizer positions = 0.0299698% -buckets with 14 minimizer positions = 0.025193% -buckets with 15 minimizer positions = 0.0214499% -buckets with 16 minimizer positions = 0.0183803% -max_bucket_size 176220 -2025-10-22 15:53:06: saving data structure to disk... -2025-10-22 15:53:08: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o ec.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/ec.k63.eulertigs.fa.gz'... -read 100000 sequences, 14595280 bases, 8395280 kmers -read 200000 sequences, 29023453 bases, 16623453 kmers -read 300000 sequences, 43790922 bases, 25190922 kmers -read 400000 sequences, 58362099 bases, 33562099 kmers -read 500000 sequences, 72908170 bases, 41908170 kmers -read 600000 sequences, 87446702 bases, 50246702 kmers -read 700000 sequences, 102099804 bases, 58699804 kmers -read 800000 sequences, 117134400 bases, 67534400 kmers -read 900000 sequences, 131713463 bases, 75913463 kmers -read 1000000 sequences, 146366718 bases, 84366718 kmers -read 1100000 sequences, 161101660 bases, 92901660 kmers -read 1200000 sequences, 175910768 bases, 101510768 kmers -read 1300000 sequences, 190897904 bases, 110297904 kmers -read 1400000 sequences, 205802973 bases, 119002973 kmers -read 1500000 sequences, 221158148 bases, 128158148 kmers -read 1600000 sequences, 236346274 bases, 137146274 kmers -read 1700000 sequences, 251304432 bases, 145904432 kmers -read 1800000 sequences, 266473950 bases, 154873950 kmers -read 1900000 sequences, 281471604 bases, 163671604 kmers -read 2000000 sequences, 296791327 bases, 172791327 kmers -read 2100000 sequences, 312420706 bases, 182220706 kmers -read 2200000 sequences, 327946210 bases, 191546210 kmers -read 2300000 sequences, 343525540 bases, 200925540 kmers -read 2400000 sequences, 358949847 bases, 210149847 kmers -read 2500000 sequences, 374380009 bases, 219380009 kmers -read 2600000 sequences, 390142304 bases, 228942304 kmers -read 2700000 sequences, 405642535 bases, 238242535 kmers -read 2800000 sequences, 421259989 bases, 247659989 kmers -read 2900000 sequences, 436893769 bases, 257093769 kmers -read 3000000 sequences, 452465563 bases, 266465563 kmers -read 3100000 sequences, 468090902 bases, 275890902 kmers -read 3200000 sequences, 483923930 bases, 285523930 kmers -read 3300000 sequences, 499749509 bases, 295149509 kmers -read 3400000 sequences, 515726709 bases, 304926709 kmers -read 3500000 sequences, 532169207 bases, 315169207 kmers -read 3600000 sequences, 548394020 bases, 325194020 kmers -read 3700000 sequences, 564809686 bases, 335409686 kmers -read 3800000 sequences, 581403559 bases, 345803559 kmers -read 3900000 sequences, 597837340 bases, 356037340 kmers -read 4000000 sequences, 614198433 bases, 366198433 kmers -read 4100000 sequences, 630803806 bases, 376603806 kmers -read 4200000 sequences, 647222216 bases, 386822216 kmers -read 4300000 sequences, 663750824 bases, 397150824 kmers -read 4400000 sequences, 680423234 bases, 407623234 kmers -read 4500000 sequences, 696967173 bases, 417967173 kmers -read 4600000 sequences, 714107161 bases, 428907161 kmers -read 4700000 sequences, 731190344 bases, 439790344 kmers -read 4800000 sequences, 748610325 bases, 451010325 kmers -read 4900000 sequences, 765806425 bases, 462006425 kmers -read 5000000 sequences, 783034539 bases, 473034539 kmers -read 5100000 sequences, 800681271 bases, 484481271 kmers -read 5200000 sequences, 818515777 bases, 496115777 kmers -read 5300000 sequences, 836324012 bases, 507724012 kmers -read 5400000 sequences, 854771265 bases, 519971265 kmers -read 5500000 sequences, 873098069 bases, 532098069 kmers -read 5600000 sequences, 891182426 bases, 543982426 kmers -read 5700000 sequences, 910053448 bases, 556653448 kmers -read 5800000 sequences, 928444429 bases, 568844429 kmers -read 5900000 sequences, 947244294 bases, 581444294 kmers -read 6000000 sequences, 966455345 bases, 594455345 kmers -read 6100000 sequences, 985974168 bases, 607774168 kmers -read 6200000 sequences, 1005630833 bases, 621230833 kmers -read 6300000 sequences, 1026020245 bases, 635420245 kmers -read 6400000 sequences, 1046696751 bases, 649896751 kmers -read 6500000 sequences, 1067596462 bases, 664596462 kmers -read 6600000 sequences, 1088718265 bases, 679518265 kmers -read 6700000 sequences, 1110387368 bases, 694987368 kmers -read 6800000 sequences, 1132578732 bases, 710978732 kmers -read 6900000 sequences, 1155047095 bases, 727247095 kmers -read 7000000 sequences, 1177950483 bases, 743950483 kmers -read 7100000 sequences, 1201726249 bases, 761526249 kmers -read 7200000 sequences, 1226646751 bases, 780246751 kmers -read 7300000 sequences, 1252079351 bases, 799479351 kmers -read 7400000 sequences, 1279261003 bases, 820461003 kmers -read 7500000 sequences, 1307802702 bases, 842802702 kmers -read 7600000 sequences, 1338212409 bases, 867012409 kmers -read 7700000 sequences, 1370354710 bases, 892954710 kmers -read 7800000 sequences, 1383049738 bases, 899449738 kmers -read 7900000 sequences, 1395810952 bases, 906010952 kmers -read 8000000 sequences, 1408450282 bases, 912450282 kmers -read 8100000 sequences, 1421220952 bases, 919020952 kmers -read 8200000 sequences, 1433887434 bases, 925487434 kmers -read 8300000 sequences, 1446445917 bases, 931845917 kmers -read 8400000 sequences, 1459153909 bases, 938353909 kmers -read 8500000 sequences, 1471877671 bases, 944877671 kmers -read 8600000 sequences, 1484865624 bases, 951665624 kmers -read 8700000 sequences, 1497567228 bases, 958167228 kmers -read 8800000 sequences, 1510543060 bases, 964943060 kmers -read 8900000 sequences, 1523371874 bases, 971571874 kmers -read 9000000 sequences, 1536152549 bases, 978152549 kmers -read 9100000 sequences, 1548860619 bases, 984660619 kmers -read 9200000 sequences, 1561712707 bases, 991312707 kmers -read 9300000 sequences, 1574401520 bases, 997801520 kmers -read 9400000 sequences, 1586885001 bases, 1004085001 kmers -read 9500000 sequences, 1599621412 bases, 1010621412 kmers -read 9600000 sequences, 1612397675 bases, 1017197675 kmers -read 9700000 sequences, 1625388385 bases, 1023988385 kmers -read 9800000 sequences, 1638536946 bases, 1030936946 kmers -read 9900000 sequences, 1651980650 bases, 1038180650 kmers -read 10000000 sequences, 1664904910 bases, 1044904910 kmers -read 10100000 sequences, 1677570910 bases, 1051370910 kmers -read 10200000 sequences, 1690246890 bases, 1057846890 kmers -read 10300000 sequences, 1703230366 bases, 1064630366 kmers -read 10400000 sequences, 1716086552 bases, 1071286552 kmers -read 10500000 sequences, 1729082411 bases, 1078082411 kmers -read 10600000 sequences, 1741944091 bases, 1084744091 kmers -read 10700000 sequences, 1754780793 bases, 1091380793 kmers -read 10800000 sequences, 1767537304 bases, 1097937304 kmers -read 10900000 sequences, 1780512088 bases, 1104712088 kmers -read 11000000 sequences, 1794061925 bases, 1112061925 kmers -read 11100000 sequences, 1807103354 bases, 1118903354 kmers -read 11200000 sequences, 1819865542 bases, 1125465542 kmers -read 11300000 sequences, 1832952701 bases, 1132352701 kmers -read 11400000 sequences, 1846108191 bases, 1139308191 kmers -read 11500000 sequences, 1859202023 bases, 1146202023 kmers -read 11600000 sequences, 1872125111 bases, 1152925111 kmers -read 11700000 sequences, 1884949294 bases, 1159549294 kmers -read 11800000 sequences, 1897879213 bases, 1166279213 kmers -read 11900000 sequences, 1910688502 bases, 1172888502 kmers -read 12000000 sequences, 1923575230 bases, 1179575230 kmers -read 12100000 sequences, 1936528765 bases, 1186328765 kmers -read 12200000 sequences, 1949822939 bases, 1193422939 kmers -read 12300000 sequences, 1962607705 bases, 1200007705 kmers -read 12400000 sequences, 1975528951 bases, 1206728951 kmers -read 12500000 sequences, 1988356507 bases, 1213356507 kmers -read 12600000 sequences, 2001310116 bases, 1220110116 kmers -read 12700000 sequences, 2014316977 bases, 1226916977 kmers -read 12800000 sequences, 2027300676 bases, 1233700676 kmers -read 12900000 sequences, 2040283112 bases, 1240483112 kmers -read 13000000 sequences, 2053070210 bases, 1247070210 kmers -read 13100000 sequences, 2066357392 bases, 1254157392 kmers -read 13200000 sequences, 2079514117 bases, 1261114117 kmers -read 13300000 sequences, 2092587055 bases, 1267987055 kmers -read 13400000 sequences, 2105687861 bases, 1274887861 kmers -read 13500000 sequences, 2118896002 bases, 1281896002 kmers -read 13600000 sequences, 2131841724 bases, 1288641724 kmers -read 13700000 sequences, 2144909308 bases, 1295509308 kmers -read 13800000 sequences, 2157799174 bases, 1302199174 kmers -read 13900000 sequences, 2170824760 bases, 1309024760 kmers -read 14000000 sequences, 2183943636 bases, 1315943636 kmers -read 14100000 sequences, 2196888939 bases, 1322688939 kmers -read 14200000 sequences, 2209993052 bases, 1329593052 kmers -read 14300000 sequences, 2223177518 bases, 1336577518 kmers -read 14400000 sequences, 2236324767 bases, 1343524767 kmers -read 14500000 sequences, 2249926194 bases, 1350926194 kmers -read 14600000 sequences, 2263244067 bases, 1358044067 kmers -read 14700000 sequences, 2276666210 bases, 1365266210 kmers -read 14800000 sequences, 2289846389 bases, 1372246389 kmers -read 14900000 sequences, 2303142205 bases, 1379342205 kmers -read 15000000 sequences, 2316373175 bases, 1386373175 kmers -read 15100000 sequences, 2329658257 bases, 1393458257 kmers -read 15200000 sequences, 2342799874 bases, 1400399874 kmers -read 15300000 sequences, 2355936598 bases, 1407336598 kmers -read 15400000 sequences, 2369202825 bases, 1414402825 kmers -read 15500000 sequences, 2382453933 bases, 1421453933 kmers -read 15600000 sequences, 2395606868 bases, 1428406868 kmers -read 15700000 sequences, 2408903524 bases, 1435503524 kmers -read 15800000 sequences, 2422488600 bases, 1442888600 kmers -read 15900000 sequences, 2435763741 bases, 1449963741 kmers -read 16000000 sequences, 2449041041 bases, 1457041041 kmers -read 16100000 sequences, 2462152775 bases, 1463952775 kmers -read 16200000 sequences, 2475426803 bases, 1471026803 kmers -read 16300000 sequences, 2488985859 bases, 1478385859 kmers -read 16400000 sequences, 2502322646 bases, 1485522646 kmers -read 16500000 sequences, 2515682566 bases, 1492682566 kmers -read 16600000 sequences, 2529274259 bases, 1500074259 kmers -read 16700000 sequences, 2542622794 bases, 1507222794 kmers -read 16800000 sequences, 2556056912 bases, 1514456912 kmers -read 16900000 sequences, 2569267145 bases, 1521467145 kmers -read 17000000 sequences, 2582562981 bases, 1528562981 kmers -read 17100000 sequences, 2596061102 bases, 1535861102 kmers -read 17200000 sequences, 2609459388 bases, 1543059388 kmers -read 17300000 sequences, 2622881245 bases, 1550281245 kmers -read 17400000 sequences, 2636336794 bases, 1557536794 kmers -read 17500000 sequences, 2649678629 bases, 1564678629 kmers -read 17600000 sequences, 2663341782 bases, 1572141782 kmers -read 17700000 sequences, 2676693590 bases, 1579293590 kmers -read 17800000 sequences, 2690200716 bases, 1586600716 kmers -read 17900000 sequences, 2703543489 bases, 1593743489 kmers -read 18000000 sequences, 2717390529 bases, 1601390529 kmers -read 18100000 sequences, 2730783796 bases, 1608583796 kmers -read 18200000 sequences, 2744196467 bases, 1615796467 kmers -read 18300000 sequences, 2757894852 bases, 1623294852 kmers -read 18400000 sequences, 2771403521 bases, 1630603521 kmers -read 18500000 sequences, 2784930678 bases, 1637930678 kmers -read 18600000 sequences, 2798778608 bases, 1645578608 kmers -read 18700000 sequences, 2812434788 bases, 1653034788 kmers -read 18800000 sequences, 2826041925 bases, 1660441925 kmers -read 18900000 sequences, 2839594143 bases, 1667794143 kmers -read 19000000 sequences, 2853100531 bases, 1675100531 kmers -read 19100000 sequences, 2866645368 bases, 1682445368 kmers -read 19200000 sequences, 2880162017 bases, 1689762017 kmers -read 19300000 sequences, 2893733500 bases, 1697133500 kmers -read 19400000 sequences, 2907861888 bases, 1705061888 kmers -read 19500000 sequences, 2921431859 bases, 1712431859 kmers -read 19600000 sequences, 2934950257 bases, 1719750257 kmers -read 19700000 sequences, 2948908590 bases, 1727508590 kmers -read 19800000 sequences, 2962655324 bases, 1735055324 kmers -read 19900000 sequences, 2976658842 bases, 1742858842 kmers -read 20000000 sequences, 2990606476 bases, 1750606476 kmers -read 20100000 sequences, 3004463124 bases, 1758263124 kmers -read 20200000 sequences, 3018263669 bases, 1765863669 kmers -read 20300000 sequences, 3032235817 bases, 1773635817 kmers -read 20400000 sequences, 3045926851 bases, 1781126851 kmers -read 20500000 sequences, 3059718085 bases, 1788718085 kmers -read 20600000 sequences, 3073465760 bases, 1796265760 kmers -read 20700000 sequences, 3087374365 bases, 1803974365 kmers -read 20800000 sequences, 3101202279 bases, 1811602279 kmers -read 20900000 sequences, 3115301042 bases, 1819501042 kmers -read 21000000 sequences, 3129300415 bases, 1827300415 kmers -read 21100000 sequences, 3143428950 bases, 1835228950 kmers -read 21200000 sequences, 3157337269 bases, 1842937269 kmers -read 21300000 sequences, 3171218453 bases, 1850618453 kmers -read 21400000 sequences, 3185386330 bases, 1858586330 kmers -read 21500000 sequences, 3199499619 bases, 1866499619 kmers -read 21600000 sequences, 3213699144 bases, 1874499144 kmers -read 21700000 sequences, 3227725083 bases, 1882325083 kmers -read 21800000 sequences, 3241636024 bases, 1890036024 kmers -read 21900000 sequences, 3255686690 bases, 1897886690 kmers -read 22000000 sequences, 3269949888 bases, 1905949888 kmers -read 22100000 sequences, 3284189309 bases, 1913989309 kmers -read 22200000 sequences, 3298558467 bases, 1922158467 kmers -read 22300000 sequences, 3312627222 bases, 1930027222 kmers -read 22400000 sequences, 3326674715 bases, 1937874715 kmers -read 22500000 sequences, 3340769161 bases, 1945769161 kmers -read 22600000 sequences, 3355403951 bases, 1954203951 kmers -read 22700000 sequences, 3369592323 bases, 1962192323 kmers -read 22800000 sequences, 3383749832 bases, 1970149832 kmers -read 22900000 sequences, 3398280808 bases, 1978480808 kmers -read 23000000 sequences, 3412658016 bases, 1986658016 kmers -read 23100000 sequences, 3427105278 bases, 1994905278 kmers -read 23200000 sequences, 3441898165 bases, 2003498165 kmers -read 23300000 sequences, 3456307790 bases, 2011707790 kmers -read 23400000 sequences, 3470437552 bases, 2019637552 kmers -=== step 1.1: 'encoding input' 11.3166 [sec] (5.58111 [ns/kmer]) -read 23474327 sequences, 3483064285 bases, 2027656011 kmers -num_kmers 2027656011 -cost: 2.0 + 1.43556 [bits/kmer] -max_len 643923 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 20 -num. bits per_string_id 25 -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 1.09069 [sec] (0.537907 [ns/kmer]) -=== step 1: 'parse file' 12.4197 [sec] (6.12516 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 10.4309 [sec] (5.1443 [ns/kmer]) -num_minimizers = 76630489 -num_minimizer_positions = 141268659 -num_super_kmers = 141268659 -building minimizers MPHF with 64 threads and 26 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 3.69853 [sec] (1.82404 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141189565436089.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 4.77704 [sec] (2.35594 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 2.10531 [sec] (1.0383 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 12031601/76630489 (15.7008%) -num_buckets_in_skew_index 62262/76630489 (0.0812496%) -max_bucket_size 281880 -log2_max_bucket_size 19 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 66085279/141268659 (46.7799%) -num_minimizer_positions_of_buckets_in_skew_index 10646754/141268659 (7.53653%) -computing minimizers offsets: 3.27945 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 65292887 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16768176 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 6866326 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4652668 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 4307414 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3858894 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 5911410 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 281880: 31685511 -num_kmers_in_skew_index 139343286 (6.87214%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 65292887 - building MPHF with 64 threads and 22 partitions (avg. partition size = 3000000)... - built mphs[0] for 65292887 kmers; bits/key = 2.55008 - built positions[0] for 65292887 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16768176 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[1] for 16768176 kmers; bits/key = 2.56383 - built positions[1] for 16768176 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 6866326 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 6866326 kmers; bits/key = 2.72645 - built positions[2] for 6866326 kmers; bits/key = 9.00006 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 4652668 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 4652668 kmers; bits/key = 2.812 - built positions[3] for 4652668 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 4307414 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[4] for 4307414 kmers; bits/key = 2.80506 - built positions[4] for 4307414 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 3858894 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[5] for 3858894 kmers; bits/key = 3.08272 - built positions[5] for 3858894 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 5911410 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[6] for 5911410 kmers; bits/key = 2.51936 - built positions[6] for 5911410 kmers; bits/key = 13.0001 - lower = 8192; upper = 281880; num_bits_per_pos = 19; num_kmers_in_partition = 31685511 - building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... - built mphs[7] for 31685511 kmers; bits/key = 2.52689 - built positions[7] for 31685511 kmers; bits/key = 19 -computing skew index took: 20.2379 [sec] -=== step 3: 'build sparse and skew index' 23.7471 [sec] (11.7116 [ns/kmer]) -=== total_time 57.1785 [sec] (28.1993 [ns/kmer]) -total index size: 1824281552 [B] -- 1824.28 [MB] -SPACE BREAKDOWN: - mphf: 0.108372 [bits/kmer] (2.86754 [bits/key]) -- 1.50567% - strings_offsets: 0.291878 [bits/kmer] -- 4.05522% - control_codewords: 1.24716 [bits/kmer] -- 17.3274% - mid_load_buckets: 1.04294 [bits/kmer] -- 14.4902% - begin_buckets_of_size: 1.05738e-06 [bits/kmer] -- 1.46907e-05% - strings: 3.43556 [bits/kmer] -- 47.732% - skew_index: 1.07169 [bits/kmer] -- 14.8895% - weights: 7.25961e-07 [bits/kmer] -- 1.00862e-05% - -------------- - total: 7.1976 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 84.2179% -buckets with 2 minimizer positions = 7.76108% -buckets with 3 minimizer positions = 2.50949% -buckets with 4 minimizer positions = 1.23307% -buckets with 5 minimizer positions = 0.750442% -buckets with 6 minimizer positions = 0.516927% -buckets with 7 minimizer positions = 0.38172% -buckets with 8 minimizer positions = 0.296813% -buckets with 9 minimizer positions = 0.239214% -buckets with 10 minimizer positions = 0.197673% -buckets with 11 minimizer positions = 0.166211% -buckets with 12 minimizer positions = 0.142668% -buckets with 13 minimizer positions = 0.124415% -buckets with 14 minimizer positions = 0.108818% -buckets with 15 minimizer positions = 0.0962646% -buckets with 16 minimizer positions = 0.0863325% -max_bucket_size 281880 -2025-10-22 15:54:07: saving data structure to disk... -2025-10-22 15:54:08: DONE -./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -g 16 -t 64 --verbose -d tmp_dir -o se.k63.sshash -k = 63, m = 31, seed = 1, num_threads = 64, ram_limit_in_GiB = 16, lambda = 5, canonical = false, weighted = false, verbose = true, fast = false, tmp_dirname = 'tmp_dir' -reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... -read 100000 sequences, 29016680 bases, 22816680 kmers -read 200000 sequences, 59512851 bases, 47112851 kmers -read 300000 sequences, 93672898 bases, 75072898 kmers -read 400000 sequences, 116504758 bases, 91704758 kmers -read 500000 sequences, 129640784 bases, 98640784 kmers -read 600000 sequences, 142888339 bases, 105688339 kmers -read 700000 sequences, 156121559 bases, 112721559 kmers -read 800000 sequences, 169296181 bases, 119696181 kmers -read 900000 sequences, 182473664 bases, 126673664 kmers -read 1000000 sequences, 195596653 bases, 133596653 kmers -read 1100000 sequences, 208767883 bases, 140567883 kmers -read 1200000 sequences, 222206242 bases, 147806242 kmers -read 1300000 sequences, 235299002 bases, 154699002 kmers -read 1400000 sequences, 248482676 bases, 161682676 kmers -read 1500000 sequences, 261589002 bases, 168589002 kmers -read 1600000 sequences, 275055224 bases, 175855224 kmers -read 1700000 sequences, 288035899 bases, 182635899 kmers -read 1800000 sequences, 301349839 bases, 189749839 kmers -read 1900000 sequences, 314875402 bases, 197075402 kmers -read 2000000 sequences, 328155468 bases, 204155468 kmers -read 2100000 sequences, 341368638 bases, 211168638 kmers -read 2200000 sequences, 354712561 bases, 218312561 kmers -read 2300000 sequences, 368072063 bases, 225472063 kmers -read 2400000 sequences, 381369139 bases, 232569139 kmers -read 2500000 sequences, 395076735 bases, 240076735 kmers -read 2600000 sequences, 408571236 bases, 247371236 kmers -read 2700000 sequences, 421770941 bases, 254370941 kmers -read 2800000 sequences, 434931097 bases, 261331097 kmers -read 2900000 sequences, 448299063 bases, 268499063 kmers -read 3000000 sequences, 461539333 bases, 275539333 kmers -read 3100000 sequences, 474884907 bases, 282684907 kmers -read 3200000 sequences, 488437875 bases, 290037875 kmers -read 3300000 sequences, 501681623 bases, 297081623 kmers -read 3400000 sequences, 514981749 bases, 304181749 kmers -read 3500000 sequences, 528308911 bases, 311308911 kmers -read 3600000 sequences, 541636977 bases, 318436977 kmers -read 3700000 sequences, 555162428 bases, 325762428 kmers -read 3800000 sequences, 568696864 bases, 333096864 kmers -read 3900000 sequences, 581917367 bases, 340117367 kmers -read 4000000 sequences, 595230806 bases, 347230806 kmers -read 4100000 sequences, 608987326 bases, 354787326 kmers -read 4200000 sequences, 622285230 bases, 361885230 kmers -read 4300000 sequences, 635647937 bases, 369047937 kmers -read 4400000 sequences, 648992641 bases, 376192641 kmers -read 4500000 sequences, 662513085 bases, 383513085 kmers -read 4600000 sequences, 675930708 bases, 390730708 kmers -read 4700000 sequences, 689630997 bases, 398230997 kmers -read 4800000 sequences, 702998525 bases, 405398525 kmers -read 4900000 sequences, 716509106 bases, 412709106 kmers -read 5000000 sequences, 730213776 bases, 420213776 kmers -read 5100000 sequences, 743782200 bases, 427582200 kmers -read 5200000 sequences, 757644345 bases, 435244345 kmers -read 5300000 sequences, 771125199 bases, 442525199 kmers -read 5400000 sequences, 784691064 bases, 449891064 kmers -read 5500000 sequences, 798294855 bases, 457294855 kmers -read 5600000 sequences, 811868593 bases, 464668593 kmers -read 5700000 sequences, 825311254 bases, 471911254 kmers -read 5800000 sequences, 838965535 bases, 479365535 kmers -read 5900000 sequences, 852651369 bases, 486851369 kmers -read 6000000 sequences, 866286185 bases, 494286185 kmers -read 6100000 sequences, 879791139 bases, 501591139 kmers -read 6200000 sequences, 893568574 bases, 509168574 kmers -read 6300000 sequences, 907221132 bases, 516621132 kmers -read 6400000 sequences, 920850746 bases, 524050746 kmers -read 6500000 sequences, 934451496 bases, 531451496 kmers -read 6600000 sequences, 948058192 bases, 538858192 kmers -read 6700000 sequences, 961672076 bases, 546272076 kmers -read 6800000 sequences, 975396607 bases, 553796607 kmers -read 6900000 sequences, 989058970 bases, 561258970 kmers -read 7000000 sequences, 1002901529 bases, 568901529 kmers -read 7100000 sequences, 1016671875 bases, 576471875 kmers -read 7200000 sequences, 1030411659 bases, 584011659 kmers -read 7300000 sequences, 1044405182 bases, 591805182 kmers -read 7400000 sequences, 1058406016 bases, 599606016 kmers -read 7500000 sequences, 1072419258 bases, 607419258 kmers -read 7600000 sequences, 1086161571 bases, 614961571 kmers -read 7700000 sequences, 1100358439 bases, 622958439 kmers -read 7800000 sequences, 1114261097 bases, 630661097 kmers -read 7900000 sequences, 1128307808 bases, 638507808 kmers -read 8000000 sequences, 1142394085 bases, 646394085 kmers -read 8100000 sequences, 1156357087 bases, 654157087 kmers -read 8200000 sequences, 1170571919 bases, 662171919 kmers -read 8300000 sequences, 1184451177 bases, 669851177 kmers -read 8400000 sequences, 1198299415 bases, 677499415 kmers -read 8500000 sequences, 1212442446 bases, 685442446 kmers -read 8600000 sequences, 1226405386 bases, 693205386 kmers -read 8700000 sequences, 1240703127 bases, 701303127 kmers -read 8800000 sequences, 1254656983 bases, 709056983 kmers -read 8900000 sequences, 1268621397 bases, 716821397 kmers -read 9000000 sequences, 1282878983 bases, 724878983 kmers -read 9100000 sequences, 1297350868 bases, 733150868 kmers -read 9200000 sequences, 1311516008 bases, 741116008 kmers -read 9300000 sequences, 1325689722 bases, 749089722 kmers -read 9400000 sequences, 1339681966 bases, 756881966 kmers -read 9500000 sequences, 1353794378 bases, 764794378 kmers -read 9600000 sequences, 1368052593 bases, 772852593 kmers -read 9700000 sequences, 1382481060 bases, 781081060 kmers -read 9800000 sequences, 1397029165 bases, 789429165 kmers -read 9900000 sequences, 1411261935 bases, 797461935 kmers -read 10000000 sequences, 1425636398 bases, 805636398 kmers -read 10100000 sequences, 1439978158 bases, 813778158 kmers -read 10200000 sequences, 1454566042 bases, 822166042 kmers -read 10300000 sequences, 1469140008 bases, 830540008 kmers -read 10400000 sequences, 1483590209 bases, 838790209 kmers -read 10500000 sequences, 1497966729 bases, 846966729 kmers -read 10600000 sequences, 1512656712 bases, 855456712 kmers -read 10700000 sequences, 1527179954 bases, 863779954 kmers -read 10800000 sequences, 1541782827 bases, 872182827 kmers -read 10900000 sequences, 1556446263 bases, 880646263 kmers -read 11000000 sequences, 1571133044 bases, 889133044 kmers -read 11100000 sequences, 1585817113 bases, 897617113 kmers -read 11200000 sequences, 1600557391 bases, 906157391 kmers -read 11300000 sequences, 1615262703 bases, 914662703 kmers -read 11400000 sequences, 1629999627 bases, 923199627 kmers -read 11500000 sequences, 1644860568 bases, 931860568 kmers -read 11600000 sequences, 1659779614 bases, 940579614 kmers -read 11700000 sequences, 1674792374 bases, 949392374 kmers -read 11800000 sequences, 1689736749 bases, 958136749 kmers -read 11900000 sequences, 1704892610 bases, 967092610 kmers -read 12000000 sequences, 1720028668 bases, 976028668 kmers -read 12100000 sequences, 1735135576 bases, 984935576 kmers -read 12200000 sequences, 1750297083 bases, 993897083 kmers -read 12300000 sequences, 1765691330 bases, 1003091330 kmers -read 12400000 sequences, 1781168609 bases, 1012368609 kmers -read 12500000 sequences, 1796591819 bases, 1021591819 kmers -read 12600000 sequences, 1811901104 bases, 1030701104 kmers -read 12700000 sequences, 1827876510 bases, 1040476510 kmers -read 12800000 sequences, 1843393773 bases, 1049793773 kmers -read 12900000 sequences, 1858842782 bases, 1059042782 kmers -read 13000000 sequences, 1874571339 bases, 1068571339 kmers -read 13100000 sequences, 1890244268 bases, 1078044268 kmers -read 13200000 sequences, 1905959273 bases, 1087559273 kmers -read 13300000 sequences, 1922228338 bases, 1097628338 kmers -read 13400000 sequences, 1938520111 bases, 1107720111 kmers -read 13500000 sequences, 1954665049 bases, 1117665049 kmers -read 13600000 sequences, 1970696591 bases, 1127496591 kmers -read 13700000 sequences, 1987164795 bases, 1137764795 kmers -read 13800000 sequences, 2003371475 bases, 1147771475 kmers -read 13900000 sequences, 2019649864 bases, 1157849864 kmers -read 14000000 sequences, 2036208720 bases, 1168208720 kmers -read 14100000 sequences, 2052986091 bases, 1178786091 kmers -read 14200000 sequences, 2069712172 bases, 1189312172 kmers -read 14300000 sequences, 2086760589 bases, 1200160589 kmers -read 14400000 sequences, 2103719627 bases, 1210919627 kmers -read 14500000 sequences, 2120768565 bases, 1221768565 kmers -read 14600000 sequences, 2137973642 bases, 1232773642 kmers -read 14700000 sequences, 2155333528 bases, 1243933528 kmers -read 14800000 sequences, 2173029002 bases, 1255429002 kmers -read 14900000 sequences, 2190761957 bases, 1266961957 kmers -read 15000000 sequences, 2208992707 bases, 1278992707 kmers -read 15100000 sequences, 2226994114 bases, 1290794114 kmers -read 15200000 sequences, 2245240873 bases, 1302840873 kmers -read 15300000 sequences, 2264078057 bases, 1315478057 kmers -read 15400000 sequences, 2282789468 bases, 1327989468 kmers -read 15500000 sequences, 2301835717 bases, 1340835717 kmers -read 15600000 sequences, 2321337137 bases, 1354137137 kmers -read 15700000 sequences, 2341431175 bases, 1368031175 kmers -read 15800000 sequences, 2361547906 bases, 1381947906 kmers -read 15900000 sequences, 2382126087 bases, 1396326087 kmers -read 16000000 sequences, 2403498478 bases, 1411498478 kmers -read 16100000 sequences, 2424934550 bases, 1426734550 kmers -read 16200000 sequences, 2447209476 bases, 1442809476 kmers -read 16300000 sequences, 2470231832 bases, 1459631832 kmers -read 16400000 sequences, 2494281037 bases, 1477481037 kmers -read 16500000 sequences, 2519161670 bases, 1496161670 kmers -read 16600000 sequences, 2545406869 bases, 1516206869 kmers -=== step 1.1: 'encoding input' 8.10293 [sec] (5.31373 [ns/kmer]) -read 16636523 sequences, 2556368582 bases, 1524904156 kmers -num_kmers 1524904156 -cost: 2.0 + 1.35283 [bits/kmer] -max_len 499189 -num. bits per_absolute_offset 32 -num. bits per_relative_offset 19 -num. bits per_string_id 24 -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.0.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.1.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.2.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.3.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.4.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.5.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.6.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.7.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.8.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.9.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.10.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.11.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.12.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.13.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.14.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.15.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.16.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.17.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.18.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.19.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.20.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.21.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.22.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.23.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.24.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.25.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.26.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.27.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.28.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.29.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.30.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.31.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.32.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.33.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.34.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.35.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.36.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.37.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.38.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.39.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.40.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.41.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.42.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.43.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.44.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.45.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.46.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.47.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.48.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.49.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.50.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.51.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.52.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.53.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.54.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.55.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.56.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.57.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.58.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.59.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.60.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.61.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.62.bin'... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.63.bin'... -=== step 1.2: 'computing minimizers tuples' 0.865644 [sec] (0.567671 [ns/kmer]) -=== step 1: 'parse file' 8.98579 [sec] (5.89269 [ns/kmer]) - == files to merge = 64 -saving tuples to 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.bin' -num_super_kmers = 50000000 -num_super_kmers = 100000000 -=== step 2.1: 'merging minimizers tuples' 7.8027 [sec] (5.11685 [ns/kmer]) -num_minimizers = 61951224 -num_minimizer_positions = 105337248 -num_super_kmers = 105337248 -building minimizers MPHF with 64 threads and 21 partitions (avg. partition size = 3000000)... -=== step 2.2: 'build minimizers mphf' 2.96761 [sec] (1.9461 [ns/kmer]) -re-sorting minimizer tuples... -saving to file 'tmp_dir/sshash.tmp.run_1761141248462557163.minimizers.0.bin'... -=== step 2.3: 'replacing minimizer values with MPHF hashes' 3.61928 [sec] (2.37345 [ns/kmer]) -=== step 2.4: 'merging minimizers tuples ' 1.97215 [sec] (1.2933 [ns/kmer]) -num_bits_per_offset = 32 -num_buckets_larger_than_1_not_in_skew_index 9999764/61951224 (16.1414%) -num_buckets_in_skew_index 36489/61951224 (0.0588996%) -max_bucket_size 144478 -log2_max_bucket_size 18 -skew index num_partitions 8 -num_minimizer_positions_of_buckets_larger_than_1 47622255/105337248 (45.2093%) -num_minimizer_positions_of_buckets_in_skew_index 5800022/105337248 (5.50615%) -computing minimizers offsets: 2.44727 [sec] -computing sizes of partitions... - partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 32078766 - partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16092632 - partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 8174536 - partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3454318 - partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 2781070 - partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2981930 - partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 8192: 2815305 - partition_id = 7: num_kmers belonging to buckets of size > 8192 and <= 144478: 7418130 -num_kmers_in_skew_index 75796687 (4.97059%) -building partitions... - lower = 64; upper = 128; num_bits_per_pos = 7; num_kmers_in_partition = 32078766 - building MPHF with 64 threads and 11 partitions (avg. partition size = 3000000)... - built mphs[0] for 32078766 kmers; bits/key = 2.51437 - built positions[0] for 32078766 kmers; bits/key = 7.00001 - lower = 128; upper = 256; num_bits_per_pos = 8; num_kmers_in_partition = 16092632 - building MPHF with 64 threads and 6 partitions (avg. partition size = 3000000)... - built mphs[1] for 16092632 kmers; bits/key = 2.65398 - built positions[1] for 16092632 kmers; bits/key = 8.00002 - lower = 256; upper = 512; num_bits_per_pos = 9; num_kmers_in_partition = 8174536 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[2] for 8174536 kmers; bits/key = 2.61889 - built positions[2] for 8174536 kmers; bits/key = 9.00005 - lower = 512; upper = 1024; num_bits_per_pos = 10; num_kmers_in_partition = 3454318 - building MPHF with 64 threads and 2 partitions (avg. partition size = 3000000)... - built mphs[3] for 3454318 kmers; bits/key = 3.14686 - built positions[3] for 3454318 kmers; bits/key = 10.0001 - lower = 1024; upper = 2048; num_bits_per_pos = 11; num_kmers_in_partition = 2781070 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2781070)... - built mphs[4] for 2781070 kmers; bits/key = 2.55987 - built positions[4] for 2781070 kmers; bits/key = 11.0001 - lower = 2048; upper = 4096; num_bits_per_pos = 12; num_kmers_in_partition = 2981930 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2981930)... - built mphs[5] for 2981930 kmers; bits/key = 2.55978 - built positions[5] for 2981930 kmers; bits/key = 12.0001 - lower = 4096; upper = 8192; num_bits_per_pos = 13; num_kmers_in_partition = 2815305 - building MPHF with 64 threads and 1 partitions (avg. partition size = 2815305)... - built mphs[6] for 2815305 kmers; bits/key = 2.55984 - built positions[6] for 2815305 kmers; bits/key = 13.0001 - lower = 8192; upper = 144478; num_bits_per_pos = 18; num_kmers_in_partition = 7418130 - building MPHF with 64 threads and 3 partitions (avg. partition size = 3000000)... - built mphs[7] for 7418130 kmers; bits/key = 2.72795 - built positions[7] for 7418130 kmers; bits/key = 18.0001 -computing skew index took: 13.7477 [sec] -=== step 3: 'build sparse and skew index' 16.3602 [sec] (10.7286 [ns/kmer]) -=== total_time 41.7077 [sec] (27.351 [ns/kmer]) -total index size: 1294767210 [B] -- 1294.77 [MB] -SPACE BREAKDOWN: - mphf: 0.116088 [bits/kmer] (2.85745 [bits/key]) -- 1.70902% - strings_offsets: 0.274587 [bits/kmer] -- 4.04241% - control_codewords: 1.34067 [bits/kmer] -- 19.737% - mid_load_buckets: 0.99935 [bits/kmer] -- 14.7122% - begin_buckets_of_size: 1.40599e-06 [bits/kmer] -- 2.06987e-05% - strings: 3.35283 [bits/kmer] -- 49.3596% - skew_index: 0.709128 [bits/kmer] -- 10.4396% - weights: 9.65307e-07 [bits/kmer] -- 1.4211e-05% - -------------- - total: 6.79265 [bits/kmer] - === bucket statistics (less) === -buckets with 1 minimizer positions = 83.7998% -buckets with 2 minimizer positions = 8.4968% -buckets with 3 minimizer positions = 2.71676% -buckets with 4 minimizer positions = 1.2809% -buckets with 5 minimizer positions = 0.745569% -buckets with 6 minimizer positions = 0.487324% -buckets with 7 minimizer positions = 0.345178% -buckets with 8 minimizer positions = 0.259136% -buckets with 9 minimizer positions = 0.202319% -buckets with 10 minimizer positions = 0.163595% -buckets with 11 minimizer positions = 0.136582% -buckets with 12 minimizer positions = 0.116401% -buckets with 13 minimizer positions = 0.100962% -buckets with 14 minimizer positions = 0.0888166% -buckets with 15 minimizer positions = 0.0782793% -buckets with 16 minimizer positions = 0.0706992% -max_bucket_size 144478 -2025-10-22 15:54:50: saving data structure to disk... -2025-10-22 15:54:51: DONE diff --git a/script/build.py b/script/build.py index 5e78cae..c80973b 100644 --- a/script/build.py +++ b/script/build.py @@ -5,15 +5,14 @@ import sys from pathlib import Path -if len(sys.argv) < 3: - print("Usage: python3 build.py ") +if len(sys.argv) < 4: + print("Usage: python3 build.py ") sys.exit(1) log_label = sys.argv[1] -index_dir = Path(sys.argv[2]).resolve() - -prefix = Path("/mnt/hd2/pibiri/DNA") -tmp_dir = prefix / "tmp_dir" +datasets_dir = Path(sys.argv[2]).resolve() +index_dir = Path(sys.argv[3]).resolve() +tmp_dir = datasets_dir / "tmp_dir" results_dir = Path(f"results-{log_label}") threads = 64 g = 16 @@ -65,7 +64,7 @@ def build_sshash(k, canonical, m_values): for dataset in datasets: m_val = m_values[dataset] - input_file = prefix / f"eulertigs/{dataset}.k{k}.eulertigs.fa.gz" + input_file = datasets_dir / f"{dataset}.k{k}.eulertigs.fa.gz" output_file = index_dir / f"{dataset}.k{k}" if canonical: output_file = str(output_file) + ".canon" diff --git a/script/streaming-query-high-hit.py b/script/streaming-query-high-hit.py index 27c774e..25008d5 100644 --- a/script/streaming-query-high-hit.py +++ b/script/streaming-query-high-hit.py @@ -8,7 +8,7 @@ # Argument parsing # ------------------------------ if len(sys.argv) < 4: - print("Usage: python3 bench.py ") + print("Usage: python3 streaming-query-high-hit.py ") sys.exit(1) log_label = sys.argv[1] diff --git a/script/streaming-query-low-hit.sh b/script/streaming-query-low-hit.sh deleted file mode 100644 index 1ee0e52..0000000 --- a/script/streaming-query-low-hit.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -echo "output log file =" $1 - -### regular indexes - -./sshash query -i cod.k31.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.regular.low-hit.streaming_query_log -# ./sshash query -i cod.k63.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.regular.low-hit.streaming_query_log - -./sshash query -i kestrel.k31.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.regular.low-hit.streaming_query_log -# ./sshash query -i kestrel.k63.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.regular.low-hit.streaming_query_log - -./sshash query -i human.k31.sshash -q ~/sshash_queries/SRR5901135_1.fastq.gz >> $1.regular.low-hit.streaming_query_log -# ./sshash query -i human.k63.sshash -q ~/sshash_queries/SRR5901135_1.fastq.gz >> $1.regular.low-hit.streaming_query_log - -### canonical indexes - -./sshash query -i cod.k31.canon.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.canon.low-hit.streaming_query_log -# ./sshash query -i cod.k63.canon.sshash -q ~/sshash_queries/SRR11449743_1.fastq.gz >> $1.canon.low-hit.streaming_query_log - -./sshash query -i kestrel.k31.canon.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.canon.low-hit.streaming_query_log -# ./sshash query -i kestrel.k63.canon.sshash -q ~/sshash_queries/SRR12858649.fastq.gz >> $1.canon.low-hit.streaming_query_log - -./sshash query -i human.k31.canon.sshash -q ~/sshash_queries/SRR5901135_1.fastq.gz >> $1.canon.low-hit.streaming_query_log -# ./sshash query -i human.k63.canon.sshash -q ~/sshash_queries/SRR5901135_1.fastq.gz >> $1.canon.low-hit.streaming_query_log From 98ee7a80ef2b434fc6231bb727ad7bd2fe458ba1 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 12 Nov 2025 21:11:42 +0100 Subject: [PATCH 100/112] print version number in main tool --- README.md | 14 ++------------ tools/sshash.cpp | 19 ++++++++++++------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index ad27756..c7dd506 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7772316.svg)](https://doi.org/10.5281/zenodo.7772316) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7239205.svg)](https://doi.org/10.5281/zenodo.7239205) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17582116.svg)](https://doi.org/10.5281/zenodo.17582116) @@ -141,18 +142,6 @@ Tools and Usage There is one executable called `sshash` after the compilation, which can be used to run a tool. Run `./sshash` as follows to see a list of available tools. - == SSHash: (S)parse and (S)kew (Hash)ing of k-mers ========================= - - Usage: ./sshash ... - - Available tools: - build build a dictionary - query query a dictionary - check check correctness of a dictionary - bench run performance tests for a dictionary - permute permute a weighted input file - compute-statistics compute index statistics - For large-scale indexing, it could be necessary to increase the number of file descriptors that can be opened simultaneously: ulimit -n 2048 @@ -287,6 +276,7 @@ the datasets that we used in [1]. For the experiments in [2] and [3], we used the datasets available on [Zenodo](https://doi.org/10.5281/zenodo.7772316). #### Weights + Using the option `-all-abundance-counts` of BCALM2, it is possible to also include the abundance counts of the k-mers in the BCALM2 output. Then, use the option `-a 1` of UST to include such counts in the stitched unitigs. Create a New Release diff --git a/tools/sshash.cpp b/tools/sshash.cpp index e8e83e4..d5a43b0 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -61,16 +61,21 @@ int bench(int argc, char** argv) { } int help(char* arg0) { - std::cout << "== SSHash: (S)parse and (S)kew (Hash)ing of k-mers =========================" - << std::endl + std::cout << "== SSHash: (S)parse and (S)kew (Hash)ing of k-mers "; + std::cout << "(v" + << essentials::version_number(constants::current_version_number::x, + constants::current_version_number::y, + constants::current_version_number::z) + .to_string() + << ") ==" << std::endl << std::endl; std::cout << "Usage: " << arg0 << " ...\n\n" << "Available tools:\n" - << " build \t build a dictionary \n" - << " query \t query a dictionary \n" - << " check \t check correctness of a dictionary \n" - << " bench \t run performance tests for a dictionary \n" - << " permute \t permute a weighted input file \n" + << " build build a dictionary \n" + << " query query a dictionary \n" + << " check check correctness of a dictionary \n" + << " bench run performance tests for a dictionary \n" + << " permute permute a weighted input file \n" << std::endl; return 0; From 3ed53ad2de740668e5f90db20bf00fe929a56821 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Wed, 12 Nov 2025 21:15:08 +0100 Subject: [PATCH 101/112] a note on benchmarks --- benchmarks/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/benchmarks/README.md b/benchmarks/README.md index 69c06db..89c3e87 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -18,6 +18,9 @@ These are the results obtained on 10/11/25 (see logs [here](results-10-11-25)) on a machine equipped with an AMD Ryzen Threadripper PRO 7985WX processor clocked at 5.40GHz. The code was compiled with `gcc` 13.3.0. +The indexes were build with a max RAM usage of 16 GB and 64 threads. +Queries were run using one thread, instead. + ![](results-10-11-25/results.png) The results can be exported in CSV format using From 4365223315b76edb5a7352bce01a5a13bc2e6ce6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sat, 15 Nov 2025 14:25:55 +0100 Subject: [PATCH 102/112] minor --- benchmarks/README.md | 2 +- benchmarks/{print.py => print_csv.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename benchmarks/{print.py => print_csv.py} (100%) diff --git a/benchmarks/README.md b/benchmarks/README.md index 89c3e87..f0780e3 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -23,7 +23,7 @@ Queries were run using one thread, instead. ![](results-10-11-25/results.png) -The results can be exported in CSV format using +The results can be exported to CSV format with python3 ../script/print_csv.py ../benchmarks/results-10-11-25/k31 python3 ../script/print_csv.py ../benchmarks/results-10-11-25/k63 diff --git a/benchmarks/print.py b/benchmarks/print_csv.py similarity index 100% rename from benchmarks/print.py rename to benchmarks/print_csv.py From c769e05c4a9a6020307f8e95e5586031fe1525aa Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 16 Nov 2025 11:23:27 +0100 Subject: [PATCH 103/112] sbwt results for k=63 --- include/spectrum_preserving_string_set.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 0e86c24..5116380 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -44,10 +44,10 @@ struct spectrum_preserving_string_set // for (uint64_t i = 0; i != size; ++i, ++it) { uint64_t minimizer_offset = *it; auto p = strings_offsets.decode(minimizer_offset); - __builtin_prefetch( - addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // - 0, 3 // - ); + // __builtin_prefetch( + // addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // + // 0, 3 // + // ); v[i] = p; } } From 8c6ac62ac364999b2078b52f4130199cdbdc7694 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Sun, 16 Nov 2025 11:37:07 +0100 Subject: [PATCH 104/112] prefetching does not actually help but writing offsets to an array first it does --- include/spectrum_preserving_string_set.hpp | 30 +++++----------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/include/spectrum_preserving_string_set.hpp b/include/spectrum_preserving_string_set.hpp index 5116380..d5aacd2 100644 --- a/include/spectrum_preserving_string_set.hpp +++ b/include/spectrum_preserving_string_set.hpp @@ -38,18 +38,9 @@ struct spectrum_preserving_string_set // std::array v; - { - /* prefetch all memory locations */ - uint64_t const* addr = strings.data().data(); - for (uint64_t i = 0; i != size; ++i, ++it) { - uint64_t minimizer_offset = *it; - auto p = strings_offsets.decode(minimizer_offset); - // __builtin_prefetch( - // addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // - // 0, 3 // - // ); - v[i] = p; - } + for (uint64_t i = 0; i != size; ++i, ++it) { + uint64_t minimizer_offset = *it; + v[i] = strings_offsets.decode(minimizer_offset); } /* check minimizer first */ @@ -93,18 +84,9 @@ struct spectrum_preserving_string_set // std::array v; - { - /* prefetch all memory locations */ - uint64_t const* addr = strings.data().data(); - for (uint64_t i = 0; i != size; ++i, ++it) { - uint64_t minimizer_offset = *it; - auto p = strings_offsets.decode(minimizer_offset); - __builtin_prefetch( - addr + (Kmer::bits_per_char * (p.absolute_offset - (k - m))) / 64, // - 0, 3 // - ); - v[i] = p; - } + for (uint64_t i = 0; i != size; ++i, ++it) { + uint64_t minimizer_offset = *it; + v[i] = strings_offsets.decode(minimizer_offset); } /* check minimizer first */ From 6f225a25c3b4ecb645fad262969a95ccd1f721cc Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 28 Nov 2025 17:34:30 +0100 Subject: [PATCH 105/112] added results for sshash-v3 to compare against --- .../results-27-11-25-v3/k31/canon-bench.json | 0 .../results-27-11-25-v3/k31/canon-bench.log | 108 ++ .../results-27-11-25-v3/k31/canon-build.json | 6 + .../results-27-11-25-v3/k31/canon-build.log | 1623 +++++++++++++++++ .../k31/canon-build.time.log | 138 ++ .../k31/canon-streaming-queries-high-hit.json | 0 .../k31/canon-streaming-queries-high-hit.log | 48 + .../k31/regular-bench.json | 0 .../results-27-11-25-v3/k31/regular-bench.log | 108 ++ .../k31/regular-build.json | 5 + .../results-27-11-25-v3/k31/regular-build.log | 1565 ++++++++++++++++ .../k31/regular-build.time.log | 138 ++ .../regular-streaming-queries-high-hit.json | 0 .../regular-streaming-queries-high-hit.log | 48 + .../results-27-11-25-v3/k63/canon-bench.json | 0 .../results-27-11-25-v3/k63/canon-bench.log | 108 ++ .../results-27-11-25-v3/k63/canon-build.json | 6 + .../results-27-11-25-v3/k63/canon-build.log | 1465 +++++++++++++++ .../k63/canon-build.time.log | 138 ++ .../k63/canon-streaming-queries-high-hit.json | 0 .../k63/canon-streaming-queries-high-hit.log | 48 + .../k63/regular-bench.json | 0 .../results-27-11-25-v3/k63/regular-bench.log | 108 ++ .../k63/regular-build.json | 6 + .../results-27-11-25-v3/k63/regular-build.log | 1428 +++++++++++++++ .../k63/regular-build.time.log | 138 ++ .../regular-streaming-queries-high-hit.json | 0 .../regular-streaming-queries-high-hit.log | 48 + 28 files changed, 7280 insertions(+) create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-bench.json create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-bench.log create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-build.json create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-build.log create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-build.time.log create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json create mode 100644 benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.log create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-bench.json create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-bench.log create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-build.json create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-build.log create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-build.time.log create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json create mode 100644 benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.log create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-bench.json create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-bench.log create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-build.json create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-build.log create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-build.time.log create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json create mode 100644 benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.log create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-bench.json create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-bench.log create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-build.json create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-build.log create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-build.time.log create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json create mode 100644 benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.log diff --git a/benchmarks/results-27-11-25-v3/k31/canon-bench.json b/benchmarks/results-27-11-25-v3/k31/canon-bench.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k31/canon-bench.log b/benchmarks/results-27-11-25-v3/k31/canon-bench.log new file mode 100644 index 0000000..7be1405 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/canon-bench.log @@ -0,0 +1,108 @@ +avg_nanosec_per_positive_lookup 700.616 +avg_nanosec_per_negative_lookup 626.943 +avg_nanosec_per_positive_lookup_advanced 690.957 +avg_nanosec_per_negative_lookup_advanced 623.486 +avg_nanosec_per_access 289.502 +iterator: avg_nanosec_per_kmer 13.5817 +avg_nanosec_per_positive_lookup 704.192 +avg_nanosec_per_negative_lookup 633.771 +avg_nanosec_per_positive_lookup_advanced 697.2 +avg_nanosec_per_negative_lookup_advanced 631.435 +avg_nanosec_per_access 294.007 +iterator: avg_nanosec_per_kmer 13.7049 +avg_nanosec_per_positive_lookup 690.87 +avg_nanosec_per_negative_lookup 629.068 +avg_nanosec_per_positive_lookup_advanced 699.277 +avg_nanosec_per_negative_lookup_advanced 620.572 +avg_nanosec_per_access 286.391 +iterator: avg_nanosec_per_kmer 13.9873 +avg_nanosec_per_positive_lookup 711.757 +avg_nanosec_per_negative_lookup 704.801 +avg_nanosec_per_positive_lookup_advanced 712.397 +avg_nanosec_per_negative_lookup_advanced 704.947 +avg_nanosec_per_access 270.911 +iterator: avg_nanosec_per_kmer 14.1877 +avg_nanosec_per_positive_lookup 712.672 +avg_nanosec_per_negative_lookup 701.529 +avg_nanosec_per_positive_lookup_advanced 712 +avg_nanosec_per_negative_lookup_advanced 701.063 +avg_nanosec_per_access 266.977 +iterator: avg_nanosec_per_kmer 13.4956 +avg_nanosec_per_positive_lookup 710.204 +avg_nanosec_per_negative_lookup 698.747 +avg_nanosec_per_positive_lookup_advanced 722.988 +avg_nanosec_per_negative_lookup_advanced 696.887 +avg_nanosec_per_access 262.977 +iterator: avg_nanosec_per_kmer 15.5531 +avg_nanosec_per_positive_lookup 942.956 +avg_nanosec_per_negative_lookup 849.007 +avg_nanosec_per_positive_lookup_advanced 952.594 +avg_nanosec_per_negative_lookup_advanced 838.399 +avg_nanosec_per_access 367.911 +iterator: avg_nanosec_per_kmer 13.7541 +avg_nanosec_per_positive_lookup 945.996 +avg_nanosec_per_negative_lookup 836.111 +avg_nanosec_per_positive_lookup_advanced 943.087 +avg_nanosec_per_negative_lookup_advanced 836.9 +avg_nanosec_per_access 366.92 +iterator: avg_nanosec_per_kmer 13.5471 +avg_nanosec_per_positive_lookup 938.95 +avg_nanosec_per_negative_lookup 836.566 +avg_nanosec_per_positive_lookup_advanced 941.974 +avg_nanosec_per_negative_lookup_advanced 841.379 +avg_nanosec_per_access 372.83 +iterator: avg_nanosec_per_kmer 13.6391 +avg_nanosec_per_positive_lookup 596.857 +avg_nanosec_per_negative_lookup 599.08 +avg_nanosec_per_positive_lookup_advanced 595.354 +avg_nanosec_per_negative_lookup_advanced 592.708 +avg_nanosec_per_access 281.541 +iterator: avg_nanosec_per_kmer 13.6549 +avg_nanosec_per_positive_lookup 604.474 +avg_nanosec_per_negative_lookup 604.22 +avg_nanosec_per_positive_lookup_advanced 601.334 +avg_nanosec_per_negative_lookup_advanced 592.762 +avg_nanosec_per_access 285.191 +iterator: avg_nanosec_per_kmer 13.5116 +avg_nanosec_per_positive_lookup 588.148 +avg_nanosec_per_negative_lookup 599.255 +avg_nanosec_per_positive_lookup_advanced 593.973 +avg_nanosec_per_negative_lookup_advanced 606.877 +avg_nanosec_per_access 286.88 +iterator: avg_nanosec_per_kmer 13.6461 +avg_nanosec_per_positive_lookup 1029.48 +avg_nanosec_per_negative_lookup 853.139 +avg_nanosec_per_positive_lookup_advanced 1026.21 +avg_nanosec_per_negative_lookup_advanced 851.519 +avg_nanosec_per_access 388.951 +iterator: avg_nanosec_per_kmer 14.9005 +avg_nanosec_per_positive_lookup 1021.87 +avg_nanosec_per_negative_lookup 855.54 +avg_nanosec_per_positive_lookup_advanced 1023 +avg_nanosec_per_negative_lookup_advanced 873.386 +avg_nanosec_per_access 390.695 +iterator: avg_nanosec_per_kmer 13.9961 +avg_nanosec_per_positive_lookup 1023.94 +avg_nanosec_per_negative_lookup 851.869 +avg_nanosec_per_positive_lookup_advanced 1029.24 +avg_nanosec_per_negative_lookup_advanced 856.582 +avg_nanosec_per_access 385.955 +iterator: avg_nanosec_per_kmer 14.0033 +avg_nanosec_per_positive_lookup 1328.29 +avg_nanosec_per_negative_lookup 1137.21 +avg_nanosec_per_positive_lookup_advanced 1317.02 +avg_nanosec_per_negative_lookup_advanced 1112.24 +avg_nanosec_per_access 602.465 +iterator: avg_nanosec_per_kmer 13.713 +avg_nanosec_per_positive_lookup 1320.87 +avg_nanosec_per_negative_lookup 1134.09 +avg_nanosec_per_positive_lookup_advanced 1332.24 +avg_nanosec_per_negative_lookup_advanced 1123.15 +avg_nanosec_per_access 601.874 +iterator: avg_nanosec_per_kmer 13.7209 +avg_nanosec_per_positive_lookup 1317.3 +avg_nanosec_per_negative_lookup 1117.27 +avg_nanosec_per_positive_lookup_advanced 1316.38 +avg_nanosec_per_negative_lookup_advanced 1123.79 +avg_nanosec_per_access 603.53 +iterator: avg_nanosec_per_kmer 13.6625 diff --git a/benchmarks/results-27-11-25-v3/k31/canon-build.json b/benchmarks/results-27-11-25-v3/k31/canon-build.json new file mode 100644 index 0000000..833ad3a --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/canon-build.json @@ -0,0 +1,6 @@ +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists diff --git a/benchmarks/results-27-11-25-v3/k31/canon-build.log b/benchmarks/results-27-11-25-v3/k31/canon-build.log new file mode 100644 index 0000000..d2d356f --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/canon-build.log @@ -0,0 +1,1623 @@ +k = 31, m = 20, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 25039667 bases, 22039697 kmers +read 200000 sequences, 50140708 bases, 44140738 kmers +read 300000 sequences, 75429441 bases, 66429471 kmers +read 400000 sequences, 100861228 bases, 88861258 kmers +read 500000 sequences, 126668305 bases, 111668335 kmers +read 600000 sequences, 152842148 bases, 134842178 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278659621105956.minimizers.0.bin'... +read 700000 sequences, 179047050 bases, 158047080 kmers +read 800000 sequences, 205700376 bases, 181700406 kmers +read 900000 sequences, 232873950 bases, 205873980 kmers +read 1000000 sequences, 260757565 bases, 230757595 kmers +read 1100000 sequences, 290088622 bases, 257088652 kmers +read 1200000 sequences, 322579647 bases, 286579677 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278659621105956.minimizers.1.bin'... +read 1300000 sequences, 361073626 bases, 322073656 kmers +read 1400000 sequences, 398961301 bases, 356961331 kmers +read 1500000 sequences, 424322286 bases, 379322316 kmers +read 1600000 sequences, 449411932 bases, 401411962 kmers +read 1700000 sequences, 474428195 bases, 423428225 kmers +read 1800000 sequences, 499637061 bases, 445637091 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278659621105956.minimizers.2.bin'... +read 1900000 sequences, 524718926 bases, 467718956 kmers +read 2000000 sequences, 549832029 bases, 489832059 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278659621105956.minimizers.3.bin'... +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +num_super_kmers 99045246 +num_pieces 2057243 (+0.245658 [bits/kmer]) +=== step 1: 'parse_file' 35.8195 [sec] (71.2875 [ns/kmer]) + == files to merge = 4 +num_written_tuples = 50000000 +num_written_tuples = 99045246 +num_minimizers 86909212 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 6.09538 [sec] (12.1309 [ns/kmer]) +bits_per_offset = ceil(log2(564182491)) = 30 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278701636967223.bucket_pairs.0.bin'... +num_singletons 80440205/86909212 (92.5566%) +=== step 3: 'build_index' 17.8435 [sec] (35.512 [ns/kmer]) +max_num_super_kmers_in_bucket 22004 +log2_max_num_super_kmers_in_bucket 15 +num_buckets_in_skew_index 6151/86909212 (0.0070775%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1731813 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1148051 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 939482 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 749103 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 516253 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 400682 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 22004: 574096 +num_kmers_in_skew_index 6059480 (1.20595%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 1731813 + building MPHF with 64 threads and 86 partitions... + built mphs[0] for 1731813 keys; bits/key = 3.10989 + built positions[0] for 1731813 keys; bits/key = 7.00022 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 1148051 + building MPHF with 64 threads and 57 partitions... + built mphs[1] for 1148051 keys; bits/key = 3.01227 + built positions[1] for 1148051 keys; bits/key = 8.00031 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 939482 + building MPHF with 64 threads and 46 partitions... + built mphs[2] for 939482 keys; bits/key = 2.98842 + built positions[2] for 939482 keys; bits/key = 9.00036 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 749103 + building MPHF with 64 threads and 37 partitions... + built mphs[3] for 749103 keys; bits/key = 2.98093 + built positions[3] for 749103 keys; bits/key = 10.0005 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 516253 + building MPHF with 64 threads and 25 partitions... + built mphs[4] for 516253 keys; bits/key = 2.95018 + built positions[4] for 516253 keys; bits/key = 11.0006 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 400682 + building MPHF with 64 threads and 20 partitions... + built mphs[5] for 400682 keys; bits/key = 2.95939 + built positions[5] for 400682 keys; bits/key = 12.0008 + lower 4096; upper 22004; num_bits_per_pos 15; keys_in_partition.size() 574096 + building MPHF with 64 threads and 28 partitions... + built mphs[6] for 574096 keys; bits/key = 2.95948 + built positions[6] for 574096 keys; bits/key = 15.0006 +num_bits_for_skew_index 74646912(0.148561 [bits/kmer]) +=== step 4: 'build_skew_index' 0.902275 [sec] (1.7957 [ns/kmer]) +=== total_time 60.6607 [sec] (120.726 [ns/kmer]) +total index size: 572200160 [B] -- 572.2 [MB] +SPACE BREAKDOWN: + minimizers: 0.462082 [bits/kmer] (2.67152 [bits/key]) -- 5.07209% + pieces: 0.0460074 [bits/kmer] -- 0.505005% + num_super_kmers_before_bucket: 0.294414 [bits/kmer] -- 3.23167% + offsets: 5.91356 [bits/kmer] -- 64.9108% + strings: 2.24566 [bits/kmer] -- 24.6497% + skew_index: 0.148561 [bits/kmer] -- 1.6307% + weights: 2.92956e-06 [bits/kmer] -- 3.21566e-05% + weight_interval_values: 5.09488e-07 [bits/kmer] + weight_interval_lengths: 1.91058e-06 [bits/kmer] + weight_dictionary: 5.09488e-07 [bits/kmer] + -------------- + total: 9.11029 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 92.5566% +buckets with 2 super_kmers = 5.94664% +buckets with 3 super_kmers = 0.722249% +buckets with 4 super_kmers = 0.278271% +buckets with 5 super_kmers = 0.141909% +buckets with 6 super_kmers = 0.084189% +buckets with 7 super_kmers = 0.054336% +buckets with 8 super_kmers = 0.037752% +buckets with 9 super_kmers = 0.0277301% +buckets with 10 super_kmers = 0.0212797% +buckets with 11 super_kmers = 0.0166691% +buckets with 12 super_kmers = 0.0132437% +buckets with 13 super_kmers = 0.0110966% +buckets with 14 super_kmers = 0.00920041% +buckets with 15 super_kmers = 0.00754465% +buckets with 16 super_kmers = 0.00658964% +max_num_super_kmers_in_bucket 22004 +2025-11-27 22:25:20: saving data structure to disk... +2025-11-27 22:25:20: DONE +k = 31, m = 20, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.0.bin'... +read 100000 sequences, 213090615 bases, 210090645 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.1.bin'... +read 200000 sequences, 390706022 bases, 384706052 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.2.bin'... +read 300000 sequences, 575071881 bases, 566071911 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.3.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.4.bin'... +read 400000 sequences, 764532455 bases, 752532485 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.5.bin'... +read 500000 sequences, 971034152 bases, 956034182 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.6.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278720874064879.minimizers.7.bin'... +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +num_super_kmers 225292355 +num_pieces 582861 (+0.0303996 [bits/kmer]) +=== step 1: 'parse_file' 80.4675 [sec] (69.9475 [ns/kmer]) + == files to merge = 8 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 225292355 +num_minimizers 212008472 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 15.8973 [sec] (13.8189 [ns/kmer]) +bits_per_offset = ceil(log2(1167885036)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278817502740446.bucket_pairs.0.bin'... +num_singletons 201072056/212008472 (94.8415%) +=== step 3: 'build_index' 56.2443 [sec] (48.8911 [ns/kmer]) +max_num_super_kmers_in_bucket 7372 +log2_max_num_super_kmers_in_bucket 13 +num_buckets_in_skew_index 2668/212008472 (0.00125844%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 861838 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 486191 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 276778 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 158755 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 86161 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15153 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 7372: 37685 +num_kmers_in_skew_index 1922561 (0.167121%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 861838 + building MPHF with 64 threads and 43 partitions... + built mphs[0] for 861838 keys; bits/key = 2.98449 + built positions[0] for 861838 keys; bits/key = 7.00041 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 486191 + building MPHF with 64 threads and 24 partitions... + built mphs[1] for 486191 keys; bits/key = 2.95601 + built positions[1] for 486191 keys; bits/key = 8.00067 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 276778 + building MPHF with 64 threads and 13 partitions... + built mphs[2] for 276778 keys; bits/key = 2.90601 + built positions[2] for 276778 keys; bits/key = 9.00118 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 158755 + building MPHF with 64 threads and 7 partitions... + built mphs[3] for 158755 keys; bits/key = 2.86308 + built positions[3] for 158755 keys; bits/key = 10.0022 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 86161 + building MPHF with 64 threads and 4 partitions... + built mphs[4] for 86161 keys; bits/key = 2.9216 + built positions[4] for 86161 keys; bits/key = 11.0038 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 15153 + building MPHF with 64 threads and 1 partitions... + built mphs[5] for 15153 keys; bits/key = 2.98924 + built positions[5] for 15153 keys; bits/key = 12.0245 + lower 4096; upper 7372; num_bits_per_pos 13; keys_in_partition.size() 37685 + building MPHF with 64 threads and 1 partitions... + built mphs[6] for 37685 keys; bits/key = 2.74274 + built positions[6] for 37685 keys; bits/key = 13.0089 +num_bits_for_skew_index 21291600(0.018508 [bits/kmer]) +=== step 4: 'build_skew_index' 1.03843 [sec] (0.902674 [ns/kmer]) +=== total_time 153.648 [sec] (133.56 [ns/kmer]) +total index size: 1284336368 [B] -- 1284.34 [MB] +SPACE BREAKDOWN: + minimizers: 0.504602 [bits/kmer] (2.73807 [bits/key]) -- 5.64974% + pieces: 0.00740836 [bits/kmer] -- 0.0829473% + num_super_kmers_before_bucket: 0.299503 [bits/kmer] -- 3.35337% + offsets: 6.07099 [bits/kmer] -- 67.9735% + strings: 2.0304 [bits/kmer] -- 22.7332% + skew_index: 0.018508 [bits/kmer] -- 0.207224% + weights: 1.27956e-06 [bits/kmer] -- 1.43265e-05% + weight_interval_values: 2.22531e-07 [bits/kmer] + weight_interval_lengths: 8.34493e-07 [bits/kmer] + weight_dictionary: 2.22531e-07 [bits/kmer] + -------------- + total: 8.93141 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 94.8415% +buckets with 2 super_kmers = 4.84071% +buckets with 3 super_kmers = 0.187797% +buckets with 4 super_kmers = 0.0463713% +buckets with 5 super_kmers = 0.0230014% +buckets with 6 super_kmers = 0.0138645% +buckets with 7 super_kmers = 0.00932793% +buckets with 8 super_kmers = 0.00652804% +buckets with 9 super_kmers = 0.00484226% +buckets with 10 super_kmers = 0.00370363% +buckets with 11 super_kmers = 0.00290932% +buckets with 12 super_kmers = 0.00224755% +buckets with 13 super_kmers = 0.00189285% +buckets with 14 super_kmers = 0.00158814% +buckets with 15 super_kmers = 0.00133438% +buckets with 16 super_kmers = 0.00109854% +max_num_super_kmers_in_bucket 7372 +2025-11-27 22:27:54: saving data structure to disk... +2025-11-27 22:27:55: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 24154188 bases, 21154218 kmers +read 200000 sequences, 48616692 bases, 42616722 kmers +read 300000 sequences, 73131027 bases, 64131057 kmers +read 400000 sequences, 97783723 bases, 85783753 kmers +read 500000 sequences, 122219519 bases, 107219549 kmers +read 600000 sequences, 146714842 bases, 128714872 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.0.bin'... +read 700000 sequences, 171233673 bases, 150233703 kmers +read 800000 sequences, 195693297 bases, 171693327 kmers +read 900000 sequences, 220477596 bases, 193477626 kmers +read 1000000 sequences, 245136480 bases, 215136510 kmers +read 1100000 sequences, 269861488 bases, 236861518 kmers +read 1200000 sequences, 294553400 bases, 258553430 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.1.bin'... +read 1300000 sequences, 319281499 bases, 280281529 kmers +read 1400000 sequences, 344258826 bases, 302258856 kmers +read 1500000 sequences, 368900321 bases, 323900351 kmers +read 1600000 sequences, 393909637 bases, 345909667 kmers +read 1700000 sequences, 418576764 bases, 367576794 kmers +read 1800000 sequences, 443411012 bases, 389411042 kmers +read 1900000 sequences, 468034254 bases, 411034284 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.2.bin'... +read 2000000 sequences, 492922181 bases, 432922211 kmers +read 2100000 sequences, 517852856 bases, 454852886 kmers +read 2200000 sequences, 542402258 bases, 476402288 kmers +read 2300000 sequences, 567260857 bases, 498260887 kmers +read 2400000 sequences, 592478462 bases, 520478492 kmers +read 2500000 sequences, 617295027 bases, 542295057 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.3.bin'... +read 2600000 sequences, 642487995 bases, 564488025 kmers +read 2700000 sequences, 667681489 bases, 586681519 kmers +read 2800000 sequences, 693019221 bases, 609019251 kmers +read 2900000 sequences, 718419082 bases, 631419112 kmers +read 3000000 sequences, 743136645 bases, 653136675 kmers +read 3100000 sequences, 768135598 bases, 675135628 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.4.bin'... +read 3200000 sequences, 793535023 bases, 697535053 kmers +read 3300000 sequences, 819156616 bases, 720156646 kmers +read 3400000 sequences, 844256779 bases, 742256809 kmers +read 3500000 sequences, 869741880 bases, 764741910 kmers +read 3600000 sequences, 895152151 bases, 787152181 kmers +read 3700000 sequences, 920884314 bases, 809884344 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.5.bin'... +read 3800000 sequences, 946277252 bases, 832277282 kmers +read 3900000 sequences, 972103084 bases, 855103114 kmers +read 4000000 sequences, 997901794 bases, 877901824 kmers +read 4100000 sequences, 1023962565 bases, 900962595 kmers +read 4200000 sequences, 1050002905 bases, 924002935 kmers +read 4300000 sequences, 1076025926 bases, 947025956 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.6.bin'... +read 4400000 sequences, 1101901550 bases, 969901580 kmers +read 4500000 sequences, 1127998210 bases, 992998240 kmers +read 4600000 sequences, 1153713252 bases, 1015713282 kmers +read 4700000 sequences, 1179840867 bases, 1038840897 kmers +read 4800000 sequences, 1205900933 bases, 1061900963 kmers +read 4900000 sequences, 1232271094 bases, 1085271124 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.7.bin'... +read 5000000 sequences, 1259012297 bases, 1109012327 kmers +read 5100000 sequences, 1285390407 bases, 1132390437 kmers +read 5200000 sequences, 1312574199 bases, 1156574229 kmers +read 5300000 sequences, 1339714447 bases, 1180714477 kmers +read 5400000 sequences, 1366712530 bases, 1204712560 kmers +read 5500000 sequences, 1394310431 bases, 1229310461 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.8.bin'... +read 5600000 sequences, 1421869864 bases, 1253869894 kmers +read 5700000 sequences, 1449547608 bases, 1278547638 kmers +read 5800000 sequences, 1477685978 bases, 1303686008 kmers +read 5900000 sequences, 1505662869 bases, 1328662899 kmers +read 6000000 sequences, 1534165192 bases, 1354165222 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.9.bin'... +read 6100000 sequences, 1562404847 bases, 1379404877 kmers +read 6200000 sequences, 1591527035 bases, 1405527065 kmers +read 6300000 sequences, 1620530378 bases, 1431530408 kmers +read 6400000 sequences, 1650356135 bases, 1458356165 kmers +read 6500000 sequences, 1680100604 bases, 1485100634 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.10.bin'... +read 6600000 sequences, 1709838161 bases, 1511838191 kmers +read 6700000 sequences, 1739768824 bases, 1538768854 kmers +read 6800000 sequences, 1771033237 bases, 1567033267 kmers +read 6900000 sequences, 1802734155 bases, 1595734185 kmers +read 7000000 sequences, 1835088122 bases, 1625088152 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.11.bin'... +read 7100000 sequences, 1868202990 bases, 1655203020 kmers +read 7200000 sequences, 1901851887 bases, 1685851917 kmers +read 7300000 sequences, 1936102636 bases, 1717102666 kmers +read 7400000 sequences, 1971764013 bases, 1749764043 kmers +read 7500000 sequences, 2008379618 bases, 1783379648 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.12.bin'... +read 7600000 sequences, 2046720278 bases, 1818720308 kmers +read 7700000 sequences, 2086661084 bases, 1855661114 kmers +read 7800000 sequences, 2129062919 bases, 1895062949 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.13.bin'... +read 7900000 sequences, 2174787944 bases, 1937787974 kmers +read 8000000 sequences, 2224822145 bases, 1984822175 kmers +read 8100000 sequences, 2283235897 bases, 2040235927 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.14.bin'... +read 8200000 sequences, 2311905284 bases, 2065905314 kmers +read 8300000 sequences, 2336057180 bases, 2087057210 kmers +read 8400000 sequences, 2360509664 bases, 2108509694 kmers +read 8500000 sequences, 2384831256 bases, 2129831286 kmers +read 8600000 sequences, 2409417232 bases, 2151417262 kmers +read 8700000 sequences, 2433616800 bases, 2172616830 kmers +read 8800000 sequences, 2458186051 bases, 2194186081 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.15.bin'... +read 8900000 sequences, 2482411631 bases, 2215411661 kmers +read 9000000 sequences, 2506972327 bases, 2236972357 kmers +read 9100000 sequences, 2531678245 bases, 2258678275 kmers +read 9200000 sequences, 2555989557 bases, 2279989587 kmers +read 9300000 sequences, 2580569574 bases, 2301569604 kmers +read 9400000 sequences, 2605362813 bases, 2323362843 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.16.bin'... +read 9500000 sequences, 2629786923 bases, 2344786953 kmers +read 9600000 sequences, 2654330633 bases, 2366330663 kmers +read 9700000 sequences, 2679002198 bases, 2388002228 kmers +read 9800000 sequences, 2703471555 bases, 2409471585 kmers +read 9900000 sequences, 2727977401 bases, 2430977431 kmers +read 10000000 sequences, 2751909350 bases, 2451909380 kmers +read 10100000 sequences, 2776332527 bases, 2473332557 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.17.bin'... +read 10200000 sequences, 2800726002 bases, 2494726032 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278875702441678.minimizers.18.bin'... +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +num_super_kmers 535721942 +num_pieces 10250466 (+0.245454 [bits/kmer]) +=== step 1: 'parse_file' 172.811 [sec] (68.9679 [ns/kmer]) + == files to merge = 19 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 450000000 +num_written_tuples = 500000000 +num_written_tuples = 535721942 +num_minimizers 465919362 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 39.4847 [sec] (15.7581 [ns/kmer]) +bits_per_offset = ceil(log2(2813192661)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279088618654493.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279088618654493.bucket_pairs.1.bin'... +num_singletons 433242759/465919362 (92.9866%) + == files to merge = 2 +num_written_pairs = 32676603 +=== step 3: 'build_index' 141.348 [sec] (56.4112 [ns/kmer]) +max_num_super_kmers_in_bucket 32249 +log2_max_num_super_kmers_in_bucket 15 +num_buckets_in_skew_index 63334/465919362 (0.0135933%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 15191124 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 11100430 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 7610580 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 4687038 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3133730 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1594207 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 32249: 1243030 +num_kmers_in_skew_index 44560139 (1.77837%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 15191124 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 15191124 keys; bits/key = 2.94094 + built positions[0] for 15191124 keys; bits/key = 7.00002 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 11100430 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 11100430 keys; bits/key = 2.99917 + built positions[1] for 11100430 keys; bits/key = 8.00003 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 7610580 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 7610580 keys; bits/key = 3.05914 + built positions[2] for 7610580 keys; bits/key = 9.00004 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 4687038 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 4687038 keys; bits/key = 3.21486 + built positions[3] for 4687038 keys; bits/key = 10.0001 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 3133730 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 3133730 keys; bits/key = 3.32063 + built positions[4] for 3133730 keys; bits/key = 11.0001 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 1594207 + building MPHF with 64 threads and 79 partitions... + built mphs[5] for 1594207 keys; bits/key = 3.09712 + built positions[5] for 1594207 keys; bits/key = 12.0002 + lower 4096; upper 32249; num_bits_per_pos 15; keys_in_partition.size() 1243030 + building MPHF with 64 threads and 62 partitions... + built mphs[6] for 1243030 keys; bits/key = 3.0308 + built positions[6] for 1243030 keys; bits/key = 15.0003 +num_bits_for_skew_index 518185552(0.206804 [bits/kmer]) +=== step 4: 'build_skew_index' 6.26459 [sec] (2.50016 [ns/kmer]) +=== total_time 359.909 [sec] (143.637 [ns/kmer]) +total index size: 3180099170 [B] -- 3180.1 [MB] +SPACE BREAKDOWN: + minimizers: 0.494925 [bits/kmer] (2.66167 [bits/key]) -- 4.87455% + pieces: 0.0459722 [bits/kmer] -- 0.452783% + num_super_kmers_before_bucket: 0.318398 [bits/kmer] -- 3.13592% + offsets: 6.8417 [bits/kmer] -- 67.3843% + strings: 2.24545 [bits/kmer] -- 22.1156% + skew_index: 0.206804 [bits/kmer] -- 2.03683% + weights: 5.87466e-07 [bits/kmer] -- 5.78598e-06% + weight_interval_values: 1.02168e-07 [bits/kmer] + weight_interval_lengths: 3.8313e-07 [bits/kmer] + weight_dictionary: 1.02168e-07 [bits/kmer] + -------------- + total: 10.1533 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 92.9866% +buckets with 2 super_kmers = 5.6374% +buckets with 3 super_kmers = 0.597685% +buckets with 4 super_kmers = 0.239291% +buckets with 5 super_kmers = 0.131087% +buckets with 6 super_kmers = 0.0829399% +buckets with 7 super_kmers = 0.0571751% +buckets with 8 super_kmers = 0.0415825% +buckets with 9 super_kmers = 0.0314344% +buckets with 10 super_kmers = 0.0244089% +buckets with 11 super_kmers = 0.0195858% +buckets with 12 super_kmers = 0.0160863% +buckets with 13 super_kmers = 0.0133457% +buckets with 14 super_kmers = 0.0112569% +buckets with 15 super_kmers = 0.00953792% +buckets with 16 super_kmers = 0.00818575% +max_num_super_kmers_in_bucket 32249 +2025-11-27 22:33:56: saving data structure to disk... +2025-11-27 22:33:58: DONE +k = 31, m = 19, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 25244517 bases, 22244547 kmers +read 200000 sequences, 51983063 bases, 45983093 kmers +read 300000 sequences, 83502239 bases, 74502269 kmers +read 400000 sequences, 125957954 bases, 113957984 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279238485636807.minimizers.0.bin'... +read 500000 sequences, 196376539 bases, 181376569 kmers +read 600000 sequences, 214563709 bases, 196563739 kmers +read 700000 sequences, 233311986 bases, 212312016 kmers +read 800000 sequences, 251082581 bases, 227082611 kmers +read 900000 sequences, 269982481 bases, 242982511 kmers +read 1000000 sequences, 289026734 bases, 259026764 kmers +read 1100000 sequences, 308418289 bases, 275418319 kmers +read 1200000 sequences, 328185212 bases, 292185242 kmers +read 1300000 sequences, 349175412 bases, 310175442 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279238485636807.minimizers.1.bin'... +read 1400000 sequences, 370064780 bases, 328064810 kmers +read 1500000 sequences, 391112878 bases, 346112908 kmers +read 1600000 sequences, 413509635 bases, 365509665 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279238485636807.minimizers.2.bin'... +read 1645464 sequences, 425569105 bases, 376205185 kmers +num_kmers 376205185 +num_super_kmers 70028206 +num_pieces 1645465 (+0.262431 [bits/kmer]) +=== step 1: 'parse_file' 27.9652 [sec] (74.335 [ns/kmer]) + == files to merge = 3 +num_written_tuples = 50000000 +num_written_tuples = 70028206 +num_minimizers 62055494 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 4.32492 [sec] (11.4962 [ns/kmer]) +bits_per_offset = ceil(log2(425569136)) = 29 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279270850453237.bucket_pairs.0.bin'... +num_singletons 55876049/62055494 (90.0421%) +=== step 3: 'build_index' 11.3486 [sec] (30.1659 [ns/kmer]) +max_num_super_kmers_in_bucket 311 +log2_max_num_super_kmers_in_bucket 9 +num_buckets_in_skew_index 33/62055494 (5.31782e-05%) +num_partitions 3 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11429 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 4613 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 311: 4820 +num_kmers_in_skew_index 20862 (0.00554538%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 11429 + building MPHF with 64 threads and 1 partitions... + built mphs[0] for 11429 keys; bits/key = 3.11208 + built positions[0] for 11429 keys; bits/key = 7.03334 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 4613 + building MPHF with 64 threads and 1 partitions... + built mphs[1] for 4613 keys; bits/key = 3.79449 + built positions[1] for 4613 keys; bits/key = 8.07457 + lower 256; upper 311; num_bits_per_pos 9; keys_in_partition.size() 4820 + building MPHF with 64 threads and 1 partitions... + built mphs[2] for 4820 keys; bits/key = 3.69793 + built positions[2] for 4820 keys; bits/key = 9.06888 +num_bits_for_skew_index 232432(0.000617833 [bits/kmer]) +=== step 4: 'build_skew_index' 0.308427 [sec] (0.819837 [ns/kmer]) +=== total_time 43.9471 [sec] (116.817 [ns/kmer]) +total index size: 396825922 [B] -- 396.826 [MB] +SPACE BREAKDOWN: + minimizers: 0.449615 [bits/kmer] (2.72575 [bits/key]) -- 5.32814% + pieces: 0.0487325 [bits/kmer] -- 0.577502% + num_super_kmers_before_bucket: 0.278932 [bits/kmer] -- 3.30547% + offsets: 5.39817 [bits/kmer] -- 63.9707% + strings: 2.26243 [bits/kmer] -- 26.8108% + skew_index: 0.000617833 [bits/kmer] -- 0.0073216% + weights: 3.91276e-06 [bits/kmer] -- 4.63679e-05% + weight_interval_values: 6.8048e-07 [bits/kmer] + weight_interval_lengths: 2.5518e-06 [bits/kmer] + weight_dictionary: 6.8048e-07 [bits/kmer] + -------------- + total: 8.4385 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 90.0421% +buckets with 2 super_kmers = 8.21444% +buckets with 3 super_kmers = 1.16879% +buckets with 4 super_kmers = 0.332915% +buckets with 5 super_kmers = 0.121902% +buckets with 6 super_kmers = 0.053631% +buckets with 7 super_kmers = 0.0266197% +buckets with 8 super_kmers = 0.0143613% +buckets with 9 super_kmers = 0.00850529% +buckets with 10 super_kmers = 0.00518085% +buckets with 11 super_kmers = 0.00316652% +buckets with 12 super_kmers = 0.00211585% +buckets with 13 super_kmers = 0.00149382% +buckets with 14 super_kmers = 0.0010265% +buckets with 15 super_kmers = 0.000747718% +buckets with 16 super_kmers = 0.000525336% +max_num_super_kmers_in_bucket 311 +2025-11-27 22:34:42: saving data structure to disk... +2025-11-27 22:34:42: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 8718376 bases, 5718406 kmers +read 200000 sequences, 17474036 bases, 11474066 kmers +read 300000 sequences, 26299388 bases, 17299418 kmers +read 400000 sequences, 35167021 bases, 23167051 kmers +read 500000 sequences, 43967859 bases, 28967889 kmers +read 600000 sequences, 52886411 bases, 34886441 kmers +read 700000 sequences, 61937165 bases, 40937195 kmers +read 800000 sequences, 71070675 bases, 47070705 kmers +read 900000 sequences, 80176820 bases, 53176850 kmers +read 1000000 sequences, 89525814 bases, 59525844 kmers +read 1100000 sequences, 98984767 bases, 65984797 kmers +read 1200000 sequences, 108719822 bases, 72719852 kmers +read 1300000 sequences, 118280750 bases, 79280780 kmers +read 1400000 sequences, 127917709 bases, 85917739 kmers +read 1500000 sequences, 137591502 bases, 92591532 kmers +read 1600000 sequences, 147395162 bases, 99395192 kmers +read 1700000 sequences, 157334953 bases, 106334983 kmers +read 1800000 sequences, 167444668 bases, 113444698 kmers +read 1900000 sequences, 177725512 bases, 120725542 kmers +read 2000000 sequences, 188052017 bases, 128052047 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.0.bin'... +read 2100000 sequences, 198499489 bases, 135499519 kmers +read 2200000 sequences, 209053217 bases, 143053247 kmers +read 2300000 sequences, 219847953 bases, 150847983 kmers +read 2400000 sequences, 230787134 bases, 158787164 kmers +read 2500000 sequences, 242014317 bases, 167014347 kmers +read 2600000 sequences, 253501939 bases, 175501969 kmers +read 2700000 sequences, 265108629 bases, 184108659 kmers +read 2800000 sequences, 277040099 bases, 193040129 kmers +read 2900000 sequences, 289406610 bases, 202406640 kmers +read 3000000 sequences, 302142147 bases, 212142177 kmers +read 3100000 sequences, 315168399 bases, 222168429 kmers +read 3200000 sequences, 329083022 bases, 233083052 kmers +read 3300000 sequences, 343507959 bases, 244507989 kmers +read 3400000 sequences, 358607940 bases, 256607970 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.1.bin'... +read 3500000 sequences, 374790281 bases, 269790311 kmers +read 3600000 sequences, 392123240 bases, 284123270 kmers +read 3700000 sequences, 410698110 bases, 299698140 kmers +read 3800000 sequences, 431358012 bases, 317358042 kmers +read 3900000 sequences, 454179419 bases, 337179449 kmers +read 4000000 sequences, 461236464 bases, 341236494 kmers +read 4100000 sequences, 468031488 bases, 345031518 kmers +read 4200000 sequences, 474889537 bases, 348889567 kmers +read 4300000 sequences, 481729647 bases, 352729677 kmers +read 4400000 sequences, 488721923 bases, 356721953 kmers +read 4500000 sequences, 495625017 bases, 360625047 kmers +read 4600000 sequences, 502596529 bases, 364596559 kmers +read 4700000 sequences, 509600468 bases, 368600498 kmers +read 4800000 sequences, 516484409 bases, 372484439 kmers +read 4900000 sequences, 523427172 bases, 376427202 kmers +read 5000000 sequences, 530371696 bases, 380371726 kmers +read 5100000 sequences, 537329533 bases, 384329563 kmers +read 5200000 sequences, 544209307 bases, 388209337 kmers +read 5300000 sequences, 551189884 bases, 392189914 kmers +read 5400000 sequences, 558101859 bases, 396101889 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.2.bin'... +read 5500000 sequences, 565120102 bases, 400120132 kmers +read 5600000 sequences, 572157514 bases, 404157544 kmers +read 5700000 sequences, 579064805 bases, 408064835 kmers +read 5800000 sequences, 586002650 bases, 412002680 kmers +read 5900000 sequences, 592940870 bases, 415940900 kmers +read 6000000 sequences, 600036436 bases, 420036466 kmers +read 6100000 sequences, 607035741 bases, 424035771 kmers +read 6200000 sequences, 614208655 bases, 428208685 kmers +read 6300000 sequences, 621168185 bases, 432168215 kmers +read 6400000 sequences, 628072415 bases, 436072445 kmers +read 6500000 sequences, 635102553 bases, 440102583 kmers +read 6600000 sequences, 642120687 bases, 444120717 kmers +read 6700000 sequences, 649088919 bases, 448088949 kmers +read 6800000 sequences, 656101716 bases, 452101746 kmers +read 6900000 sequences, 663148824 bases, 456148854 kmers +read 7000000 sequences, 670072415 bases, 460072445 kmers +read 7100000 sequences, 677027793 bases, 464027823 kmers +read 7200000 sequences, 684172149 bases, 468172179 kmers +read 7300000 sequences, 691211136 bases, 472211166 kmers +read 7400000 sequences, 698208759 bases, 476208789 kmers +read 7500000 sequences, 705328918 bases, 480328948 kmers +read 7600000 sequences, 712360901 bases, 484360931 kmers +read 7700000 sequences, 719471743 bases, 488471773 kmers +read 7800000 sequences, 726605082 bases, 492605112 kmers +read 7900000 sequences, 733774553 bases, 496774583 kmers +read 8000000 sequences, 740830630 bases, 500830660 kmers +read 8100000 sequences, 747950142 bases, 504950172 kmers +read 8200000 sequences, 755058699 bases, 509058729 kmers +read 8300000 sequences, 762216366 bases, 513216396 kmers +read 8400000 sequences, 769353795 bases, 517353825 kmers +read 8500000 sequences, 776583104 bases, 521583134 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.3.bin'... +read 8600000 sequences, 783816161 bases, 525816191 kmers +read 8700000 sequences, 791077309 bases, 530077339 kmers +read 8800000 sequences, 798157720 bases, 534157750 kmers +read 8900000 sequences, 805240984 bases, 538241014 kmers +read 9000000 sequences, 812530422 bases, 542530452 kmers +read 9100000 sequences, 819617660 bases, 546617690 kmers +read 9200000 sequences, 826809679 bases, 550809709 kmers +read 9300000 sequences, 833919076 bases, 554919106 kmers +read 9400000 sequences, 841155631 bases, 559155661 kmers +read 9500000 sequences, 848401634 bases, 563401664 kmers +read 9600000 sequences, 855643616 bases, 567643646 kmers +read 9700000 sequences, 862872646 bases, 571872676 kmers +read 9800000 sequences, 870171662 bases, 576171692 kmers +read 9900000 sequences, 877460842 bases, 580460872 kmers +read 10000000 sequences, 884692117 bases, 584692147 kmers +read 10100000 sequences, 891988881 bases, 588988911 kmers +read 10200000 sequences, 899332113 bases, 593332143 kmers +read 10300000 sequences, 906596087 bases, 597596117 kmers +read 10400000 sequences, 913914165 bases, 601914195 kmers +read 10500000 sequences, 921197132 bases, 606197162 kmers +read 10600000 sequences, 928621300 bases, 610621330 kmers +read 10700000 sequences, 935962513 bases, 614962543 kmers +read 10800000 sequences, 943225364 bases, 619225394 kmers +read 10900000 sequences, 950606220 bases, 623606250 kmers +read 11000000 sequences, 958222210 bases, 628222240 kmers +read 11100000 sequences, 965609577 bases, 632609607 kmers +read 11200000 sequences, 972999540 bases, 636999570 kmers +read 11300000 sequences, 980385943 bases, 641385973 kmers +read 11400000 sequences, 987756659 bases, 645756689 kmers +read 11500000 sequences, 995228579 bases, 650228609 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.4.bin'... +read 11600000 sequences, 1002715916 bases, 654715946 kmers +read 11700000 sequences, 1010163181 bases, 659163211 kmers +read 11800000 sequences, 1017603999 bases, 663604029 kmers +read 11900000 sequences, 1025150283 bases, 668150313 kmers +read 12000000 sequences, 1032736012 bases, 672736042 kmers +read 12100000 sequences, 1040213462 bases, 677213492 kmers +read 12200000 sequences, 1047864710 bases, 681864740 kmers +read 12300000 sequences, 1055370919 bases, 686370949 kmers +read 12400000 sequences, 1062882101 bases, 690882131 kmers +read 12500000 sequences, 1070457753 bases, 695457783 kmers +read 12600000 sequences, 1078056452 bases, 700056482 kmers +read 12700000 sequences, 1085619838 bases, 704619868 kmers +read 12800000 sequences, 1093220312 bases, 709220342 kmers +read 12900000 sequences, 1100937956 bases, 713937986 kmers +read 13000000 sequences, 1108501138 bases, 718501168 kmers +read 13100000 sequences, 1116117632 bases, 723117662 kmers +read 13200000 sequences, 1123791900 bases, 727791930 kmers +read 13300000 sequences, 1131456231 bases, 732456261 kmers +read 13400000 sequences, 1139167200 bases, 737167230 kmers +read 13500000 sequences, 1147084189 bases, 742084219 kmers +read 13600000 sequences, 1154903385 bases, 746903415 kmers +read 13700000 sequences, 1162719538 bases, 751719568 kmers +read 13800000 sequences, 1170515131 bases, 756515161 kmers +read 13900000 sequences, 1178310843 bases, 761310873 kmers +read 14000000 sequences, 1186158447 bases, 766158477 kmers +read 14100000 sequences, 1194143426 bases, 771143456 kmers +read 14200000 sequences, 1202037098 bases, 776037128 kmers +read 14300000 sequences, 1210016683 bases, 781016713 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.5.bin'... +read 14400000 sequences, 1217929646 bases, 785929676 kmers +read 14500000 sequences, 1226009490 bases, 791009520 kmers +read 14600000 sequences, 1233936479 bases, 795936509 kmers +read 14700000 sequences, 1241953750 bases, 800953780 kmers +read 14800000 sequences, 1249971870 bases, 805971900 kmers +read 14900000 sequences, 1258011905 bases, 811011935 kmers +read 15000000 sequences, 1266102845 bases, 816102875 kmers +read 15100000 sequences, 1274149642 bases, 821149672 kmers +read 15200000 sequences, 1282474792 bases, 826474822 kmers +read 15300000 sequences, 1290768894 bases, 831768924 kmers +read 15400000 sequences, 1299121736 bases, 837121766 kmers +read 15500000 sequences, 1307304137 bases, 842304167 kmers +read 15600000 sequences, 1315661695 bases, 847661725 kmers +read 15700000 sequences, 1324089803 bases, 853089833 kmers +read 15800000 sequences, 1332318556 bases, 858318586 kmers +read 15900000 sequences, 1340760519 bases, 863760549 kmers +read 16000000 sequences, 1349263730 bases, 869263760 kmers +read 16100000 sequences, 1357811657 bases, 874811687 kmers +read 16200000 sequences, 1366358116 bases, 880358146 kmers +read 16300000 sequences, 1375026989 bases, 886027019 kmers +read 16400000 sequences, 1383710154 bases, 891710184 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279282875766784.minimizers.6.bin'... +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +num_super_kmers 201604301 +num_pieces 16440874 (+1.10303 [bits/kmer]) +=== step 1: 'parse_file' 65.3814 [sec] (73.1082 [ns/kmer]) + == files to merge = 7 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 201604301 +num_minimizers 144120499 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 12.6663 [sec] (14.1632 [ns/kmer]) +bits_per_offset = ceil(log2(1387536305)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279361141144604.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279361141144604.bucket_pairs.1.bin'... +num_singletons 121051637/144120499 (83.9934%) + == files to merge = 2 +num_written_pairs = 23068862 +=== step 3: 'build_index' 39.4047 [sec] (44.0616 [ns/kmer]) +max_num_super_kmers_in_bucket 84137 +log2_max_num_super_kmers_in_bucket 17 +num_buckets_in_skew_index 16248/144120499 (0.0112739%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 4477797 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1948141 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1144428 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 817502 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 598296 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 442321 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 84137: 911319 +num_kmers_in_skew_index 10339804 (1.15618%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 4477797 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 4477797 keys; bits/key = 3.22778 + built positions[0] for 4477797 keys; bits/key = 7.00009 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 1948141 + building MPHF with 64 threads and 97 partitions... + built mphs[1] for 1948141 keys; bits/key = 3.13402 + built positions[1] for 1948141 keys; bits/key = 8.00018 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 1144428 + building MPHF with 64 threads and 57 partitions... + built mphs[2] for 1144428 keys; bits/key = 3.01254 + built positions[2] for 1144428 keys; bits/key = 9.00033 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 817502 + building MPHF with 64 threads and 40 partitions... + built mphs[3] for 817502 keys; bits/key = 2.97329 + built positions[3] for 817502 keys; bits/key = 10.0004 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 598296 + building MPHF with 64 threads and 29 partitions... + built mphs[4] for 598296 keys; bits/key = 2.95535 + built positions[4] for 598296 keys; bits/key = 11.0006 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 442321 + building MPHF with 64 threads and 22 partitions... + built mphs[5] for 442321 keys; bits/key = 2.96053 + built positions[5] for 442321 keys; bits/key = 12.0008 + lower 4096; upper 84137; num_bits_per_pos 17; keys_in_partition.size() 911319 + building MPHF with 64 threads and 45 partitions... + built mphs[6] for 911319 keys; bits/key = 2.98769 + built positions[6] for 911319 keys; bits/key = 17.0004 +num_bits_for_skew_index 125026416(0.139802 [bits/kmer]) +=== step 4: 'build_skew_index' 1.81259 [sec] (2.0268 [ns/kmer]) +=== total_time 119.265 [sec] (133.36 [ns/kmer]) +total index size: 1246772410 [B] -- 1246.77 [MB] +SPACE BREAKDOWN: + minimizers: 0.428705 [bits/kmer] (2.66024 [bits/key]) -- 3.84388% + pieces: 0.176908 [bits/kmer] -- 1.5862% + num_super_kmers_before_bucket: 0.316153 [bits/kmer] -- 2.83471% + offsets: 6.98833 [bits/kmer] -- 62.6591% + strings: 3.10303 [bits/kmer] -- 27.8226% + skew_index: 0.139802 [bits/kmer] -- 1.2535% + weights: 1.64596e-06 [bits/kmer] -- 1.47581e-05% + weight_interval_values: 2.86254e-07 [bits/kmer] + weight_interval_lengths: 1.07345e-06 [bits/kmer] + weight_dictionary: 2.86254e-07 [bits/kmer] + -------------- + total: 11.1529 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 83.9934% +buckets with 2 super_kmers = 10.3451% +buckets with 3 super_kmers = 2.43817% +buckets with 4 super_kmers = 1.02502% +buckets with 5 super_kmers = 0.546504% +buckets with 6 super_kmers = 0.339% +buckets with 7 super_kmers = 0.232088% +buckets with 8 super_kmers = 0.170709% +buckets with 9 super_kmers = 0.132568% +buckets with 10 super_kmers = 0.106718% +buckets with 11 super_kmers = 0.088911% +buckets with 12 super_kmers = 0.075244% +buckets with 13 super_kmers = 0.0646494% +buckets with 14 super_kmers = 0.0560184% +buckets with 15 super_kmers = 0.049306% +buckets with 16 super_kmers = 0.0428447% +max_num_super_kmers_in_bucket 84137 +2025-11-27 22:36:42: saving data structure to disk... +2025-11-27 22:36:43: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 15142600 bases, 12142630 kmers +read 200000 sequences, 30291716 bases, 24291746 kmers +read 300000 sequences, 45689080 bases, 36689110 kmers +read 400000 sequences, 61242824 bases, 49242854 kmers +read 500000 sequences, 77204688 bases, 62204718 kmers +read 600000 sequences, 93322728 bases, 75322758 kmers +read 700000 sequences, 109580784 bases, 88580814 kmers +read 800000 sequences, 126019199 bases, 102019229 kmers +read 900000 sequences, 142771255 bases, 115771285 kmers +read 1000000 sequences, 159860280 bases, 129860310 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.0.bin'... +read 1100000 sequences, 177221889 bases, 144221919 kmers +read 1200000 sequences, 194614623 bases, 158614653 kmers +read 1300000 sequences, 212431367 bases, 173431397 kmers +read 1400000 sequences, 230443062 bases, 188443092 kmers +read 1500000 sequences, 248830724 bases, 203830754 kmers +read 1600000 sequences, 267495814 bases, 219495844 kmers +read 1700000 sequences, 286467424 bases, 235467454 kmers +read 1800000 sequences, 305974756 bases, 251974786 kmers +read 1900000 sequences, 325573452 bases, 268573482 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.1.bin'... +read 2000000 sequences, 345518992 bases, 285519022 kmers +read 2100000 sequences, 365932818 bases, 302932848 kmers +read 2200000 sequences, 386928554 bases, 320928584 kmers +read 2300000 sequences, 408196559 bases, 339196589 kmers +read 2400000 sequences, 429705966 bases, 357705996 kmers +read 2500000 sequences, 451663903 bases, 376663933 kmers +read 2600000 sequences, 474186039 bases, 396186069 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.2.bin'... +read 2700000 sequences, 497212102 bases, 416212132 kmers +read 2800000 sequences, 520661914 bases, 436661944 kmers +read 2900000 sequences, 544613770 bases, 457613800 kmers +read 3000000 sequences, 569210361 bases, 479210391 kmers +read 3100000 sequences, 594100200 bases, 501100230 kmers +read 3200000 sequences, 619323714 bases, 523323744 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.3.bin'... +read 3300000 sequences, 645628376 bases, 546628406 kmers +read 3400000 sequences, 672447793 bases, 570447823 kmers +read 3500000 sequences, 699905664 bases, 594905694 kmers +read 3600000 sequences, 728253444 bases, 620253474 kmers +read 3700000 sequences, 756996641 bases, 645996671 kmers +read 3800000 sequences, 786498161 bases, 672498191 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.4.bin'... +read 3900000 sequences, 816910234 bases, 699910264 kmers +read 4000000 sequences, 848332113 bases, 728332143 kmers +read 4100000 sequences, 880941119 bases, 757941149 kmers +read 4200000 sequences, 914418229 bases, 788418259 kmers +read 4300000 sequences, 948701080 bases, 819701110 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.5.bin'... +read 4400000 sequences, 984340067 bases, 852340097 kmers +read 4500000 sequences, 1021325774 bases, 886325804 kmers +read 4600000 sequences, 1059629391 bases, 921629421 kmers +read 4700000 sequences, 1098776183 bases, 957776213 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.6.bin'... +read 4800000 sequences, 1139816048 bases, 995816078 kmers +read 4900000 sequences, 1182502543 bases, 1035502573 kmers +read 5000000 sequences, 1226889874 bases, 1076889904 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.7.bin'... +read 5100000 sequences, 1272830961 bases, 1119830991 kmers +read 5200000 sequences, 1320724320 bases, 1164724350 kmers +read 5300000 sequences, 1371130682 bases, 1212130712 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.8.bin'... +read 5400000 sequences, 1423474687 bases, 1261474717 kmers +read 5500000 sequences, 1478532677 bases, 1313532707 kmers +read 5600000 sequences, 1536511057 bases, 1368511087 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.9.bin'... +read 5700000 sequences, 1597650497 bases, 1426650527 kmers +read 5800000 sequences, 1661331597 bases, 1487331627 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.10.bin'... +read 5900000 sequences, 1728788299 bases, 1551788329 kmers +read 6000000 sequences, 1800462732 bases, 1620462762 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.11.bin'... +read 6100000 sequences, 1855582708 bases, 1672582738 kmers +read 6200000 sequences, 1861290572 bases, 1675290602 kmers +read 6300000 sequences, 1866991959 bases, 1677991989 kmers +read 6400000 sequences, 1872712703 bases, 1680712733 kmers +read 6500000 sequences, 1878412742 bases, 1683412772 kmers +read 6600000 sequences, 1884126738 bases, 1686126768 kmers +read 6700000 sequences, 1889847765 bases, 1688847795 kmers +read 6800000 sequences, 1895565065 bases, 1691565095 kmers +read 6900000 sequences, 1901268580 bases, 1694268610 kmers +read 7000000 sequences, 1906975331 bases, 1696975361 kmers +read 7100000 sequences, 1912694936 bases, 1699694966 kmers +read 7200000 sequences, 1918405386 bases, 1702405416 kmers +read 7300000 sequences, 1924111712 bases, 1705111742 kmers +read 7400000 sequences, 1929830119 bases, 1707830149 kmers +read 7500000 sequences, 1935539974 bases, 1710540004 kmers +read 7600000 sequences, 1941266098 bases, 1713266128 kmers +read 7700000 sequences, 1946976061 bases, 1715976091 kmers +read 7800000 sequences, 1952688102 bases, 1718688132 kmers +read 7900000 sequences, 1958401942 bases, 1721401972 kmers +read 8000000 sequences, 1964117224 bases, 1724117254 kmers +read 8100000 sequences, 1969830329 bases, 1726830359 kmers +read 8200000 sequences, 1975558497 bases, 1729558527 kmers +read 8300000 sequences, 1981283991 bases, 1732284021 kmers +read 8400000 sequences, 1986995233 bases, 1734995263 kmers +read 8500000 sequences, 1992721377 bases, 1737721407 kmers +read 8600000 sequences, 1998449484 bases, 1740449514 kmers +read 8700000 sequences, 2004184325 bases, 1743184355 kmers +read 8800000 sequences, 2009910285 bases, 1745910315 kmers +read 8900000 sequences, 2015628049 bases, 1748628079 kmers +read 9000000 sequences, 2021346657 bases, 1751346687 kmers +read 9100000 sequences, 2027081520 bases, 1754081550 kmers +read 9200000 sequences, 2032818008 bases, 1756818038 kmers +read 9300000 sequences, 2038553000 bases, 1759553030 kmers +read 9400000 sequences, 2044303164 bases, 1762303194 kmers +read 9500000 sequences, 2050045456 bases, 1765045486 kmers +read 9600000 sequences, 2055782084 bases, 1767782114 kmers +read 9700000 sequences, 2061515459 bases, 1770515489 kmers +read 9800000 sequences, 2067264696 bases, 1773264726 kmers +read 9900000 sequences, 2073029586 bases, 1776029616 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.12.bin'... +read 10000000 sequences, 2078777071 bases, 1778777101 kmers +read 10100000 sequences, 2084516688 bases, 1781516718 kmers +read 10200000 sequences, 2090254180 bases, 1784254210 kmers +read 10300000 sequences, 2096010791 bases, 1787010821 kmers +read 10400000 sequences, 2101750068 bases, 1789750098 kmers +read 10500000 sequences, 2107490469 bases, 1792490499 kmers +read 10600000 sequences, 2113226774 bases, 1795226804 kmers +read 10700000 sequences, 2118983996 bases, 1797984026 kmers +read 10800000 sequences, 2124753124 bases, 1800753154 kmers +read 10900000 sequences, 2130500309 bases, 1803500339 kmers +read 11000000 sequences, 2136245797 bases, 1806245827 kmers +read 11100000 sequences, 2141998968 bases, 1808998998 kmers +read 11200000 sequences, 2147751449 bases, 1811751479 kmers +read 11300000 sequences, 2153511605 bases, 1814511635 kmers +read 11400000 sequences, 2159254615 bases, 1817254645 kmers +read 11500000 sequences, 2165018820 bases, 1820018850 kmers +read 11600000 sequences, 2170788091 bases, 1822788121 kmers +read 11700000 sequences, 2176561459 bases, 1825561489 kmers +read 11800000 sequences, 2182327393 bases, 1828327423 kmers +read 11900000 sequences, 2188093393 bases, 1831093423 kmers +read 12000000 sequences, 2193864455 bases, 1833864485 kmers +read 12100000 sequences, 2199639949 bases, 1836639979 kmers +read 12200000 sequences, 2205409553 bases, 1839409583 kmers +read 12300000 sequences, 2211196032 bases, 1842196062 kmers +read 12400000 sequences, 2216980660 bases, 1844980690 kmers +read 12500000 sequences, 2222778653 bases, 1847778683 kmers +read 12600000 sequences, 2228548298 bases, 1850548328 kmers +read 12700000 sequences, 2234333686 bases, 1853333716 kmers +read 12800000 sequences, 2240119243 bases, 1856119273 kmers +read 12900000 sequences, 2245909832 bases, 1858909862 kmers +read 13000000 sequences, 2251713079 bases, 1861713109 kmers +read 13100000 sequences, 2257517156 bases, 1864517186 kmers +read 13200000 sequences, 2263299799 bases, 1867299829 kmers +read 13300000 sequences, 2269090355 bases, 1870090385 kmers +read 13400000 sequences, 2274889056 bases, 1872889086 kmers +read 13500000 sequences, 2280679358 bases, 1875679388 kmers +read 13600000 sequences, 2286496297 bases, 1878496327 kmers +read 13700000 sequences, 2292303406 bases, 1881303436 kmers +read 13800000 sequences, 2298095843 bases, 1884095873 kmers +read 13900000 sequences, 2303896230 bases, 1886896260 kmers +read 14000000 sequences, 2309685280 bases, 1889685310 kmers +read 14100000 sequences, 2315487789 bases, 1892487819 kmers +read 14200000 sequences, 2321299096 bases, 1895299126 kmers +read 14300000 sequences, 2327098692 bases, 1898098722 kmers +read 14400000 sequences, 2332930649 bases, 1900930679 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.13.bin'... +read 14500000 sequences, 2338742250 bases, 1903742280 kmers +read 14600000 sequences, 2344551767 bases, 1906551797 kmers +read 14700000 sequences, 2350372494 bases, 1909372524 kmers +read 14800000 sequences, 2356184423 bases, 1912184453 kmers +read 14900000 sequences, 2362012427 bases, 1915012457 kmers +read 15000000 sequences, 2367830829 bases, 1917830859 kmers +read 15100000 sequences, 2373646109 bases, 1920646139 kmers +read 15200000 sequences, 2379487578 bases, 1923487608 kmers +read 15300000 sequences, 2385319549 bases, 1926319579 kmers +read 15400000 sequences, 2391159959 bases, 1929159989 kmers +read 15500000 sequences, 2396996685 bases, 1931996715 kmers +read 15600000 sequences, 2402827442 bases, 1934827472 kmers +read 15700000 sequences, 2408655214 bases, 1937655244 kmers +read 15800000 sequences, 2414491211 bases, 1940491241 kmers +read 15900000 sequences, 2420340361 bases, 1943340391 kmers +read 16000000 sequences, 2426185046 bases, 1946185076 kmers +read 16100000 sequences, 2432032084 bases, 1949032114 kmers +read 16200000 sequences, 2437865309 bases, 1951865339 kmers +read 16300000 sequences, 2443712415 bases, 1954712445 kmers +read 16400000 sequences, 2449571035 bases, 1957571065 kmers +read 16500000 sequences, 2455436767 bases, 1960436797 kmers +read 16600000 sequences, 2461294139 bases, 1963294169 kmers +read 16700000 sequences, 2467151066 bases, 1966151096 kmers +read 16800000 sequences, 2473014518 bases, 1969014548 kmers +read 16900000 sequences, 2478879148 bases, 1971879178 kmers +read 17000000 sequences, 2484756311 bases, 1974756341 kmers +read 17100000 sequences, 2490639911 bases, 1977639941 kmers +read 17200000 sequences, 2496505090 bases, 1980505120 kmers +read 17300000 sequences, 2502376237 bases, 1983376267 kmers +read 17400000 sequences, 2508235866 bases, 1986235896 kmers +read 17500000 sequences, 2514118929 bases, 1989118959 kmers +read 17600000 sequences, 2520003821 bases, 1992003851 kmers +read 17700000 sequences, 2525879572 bases, 1994879602 kmers +read 17800000 sequences, 2531769727 bases, 1997769757 kmers +read 17900000 sequences, 2537665456 bases, 2000665486 kmers +read 18000000 sequences, 2543560738 bases, 2003560768 kmers +read 18100000 sequences, 2549454266 bases, 2006454296 kmers +read 18200000 sequences, 2555337271 bases, 2009337301 kmers +read 18300000 sequences, 2561224774 bases, 2012224804 kmers +read 18400000 sequences, 2567143057 bases, 2015143087 kmers +read 18500000 sequences, 2573036123 bases, 2018036153 kmers +read 18600000 sequences, 2578923948 bases, 2020923978 kmers +read 18700000 sequences, 2584830711 bases, 2023830741 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.14.bin'... +read 18800000 sequences, 2590732809 bases, 2026732839 kmers +read 18900000 sequences, 2596629138 bases, 2029629168 kmers +read 19000000 sequences, 2602544769 bases, 2032544799 kmers +read 19100000 sequences, 2608476616 bases, 2035476646 kmers +read 19200000 sequences, 2614389831 bases, 2038389861 kmers +read 19300000 sequences, 2620312306 bases, 2041312336 kmers +read 19400000 sequences, 2626244668 bases, 2044244698 kmers +read 19500000 sequences, 2632165840 bases, 2047165870 kmers +read 19600000 sequences, 2638096284 bases, 2050096314 kmers +read 19700000 sequences, 2644022948 bases, 2053022978 kmers +read 19800000 sequences, 2649949779 bases, 2055949809 kmers +read 19900000 sequences, 2655887655 bases, 2058887685 kmers +read 20000000 sequences, 2661829270 bases, 2061829300 kmers +read 20100000 sequences, 2667773885 bases, 2064773915 kmers +read 20200000 sequences, 2673731680 bases, 2067731710 kmers +read 20300000 sequences, 2679668638 bases, 2070668668 kmers +read 20400000 sequences, 2685621410 bases, 2073621440 kmers +read 20500000 sequences, 2691583280 bases, 2076583310 kmers +read 20600000 sequences, 2697548031 bases, 2079548061 kmers +read 20700000 sequences, 2703523021 bases, 2082523051 kmers +read 20800000 sequences, 2709482823 bases, 2085482853 kmers +read 20900000 sequences, 2715437358 bases, 2088437388 kmers +read 21000000 sequences, 2721408412 bases, 2091408442 kmers +read 21100000 sequences, 2727378283 bases, 2094378313 kmers +read 21200000 sequences, 2733356793 bases, 2097356823 kmers +read 21300000 sequences, 2739324030 bases, 2100324060 kmers +read 21400000 sequences, 2745310949 bases, 2103310979 kmers +read 21500000 sequences, 2751305483 bases, 2106305513 kmers +read 21600000 sequences, 2757279970 bases, 2109280000 kmers +read 21700000 sequences, 2763250342 bases, 2112250372 kmers +read 21800000 sequences, 2769246031 bases, 2115246061 kmers +read 21900000 sequences, 2775228369 bases, 2118228399 kmers +read 22000000 sequences, 2781228805 bases, 2121228835 kmers +read 22100000 sequences, 2787227943 bases, 2124227973 kmers +read 22200000 sequences, 2793232303 bases, 2127232333 kmers +read 22300000 sequences, 2799254476 bases, 2130254506 kmers +read 22400000 sequences, 2805268478 bases, 2133268508 kmers +read 22500000 sequences, 2811273807 bases, 2136273837 kmers +read 22600000 sequences, 2817297446 bases, 2139297476 kmers +read 22700000 sequences, 2823311839 bases, 2142311869 kmers +read 22800000 sequences, 2829348673 bases, 2145348703 kmers +read 22900000 sequences, 2835387522 bases, 2148387552 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.15.bin'... +read 23000000 sequences, 2841415061 bases, 2151415091 kmers +read 23100000 sequences, 2847447355 bases, 2154447385 kmers +read 23200000 sequences, 2853464241 bases, 2157464271 kmers +read 23300000 sequences, 2859504344 bases, 2160504374 kmers +read 23400000 sequences, 2865558640 bases, 2163558670 kmers +read 23500000 sequences, 2871616623 bases, 2166616653 kmers +read 23600000 sequences, 2877666220 bases, 2169666250 kmers +read 23700000 sequences, 2883708997 bases, 2172709027 kmers +read 23800000 sequences, 2889780064 bases, 2175780094 kmers +read 23900000 sequences, 2895851763 bases, 2178851793 kmers +read 24000000 sequences, 2901936339 bases, 2181936369 kmers +read 24100000 sequences, 2908006001 bases, 2185006031 kmers +read 24200000 sequences, 2914097489 bases, 2188097519 kmers +read 24300000 sequences, 2920158525 bases, 2191158555 kmers +read 24400000 sequences, 2926232288 bases, 2194232318 kmers +read 24500000 sequences, 2932310359 bases, 2197310389 kmers +read 24600000 sequences, 2938383670 bases, 2200383700 kmers +read 24700000 sequences, 2944455547 bases, 2203455577 kmers +read 24800000 sequences, 2950553509 bases, 2206553539 kmers +read 24900000 sequences, 2956625157 bases, 2209625187 kmers +read 25000000 sequences, 2962750710 bases, 2212750740 kmers +read 25100000 sequences, 2968838441 bases, 2215838471 kmers +read 25200000 sequences, 2974964577 bases, 2218964607 kmers +read 25300000 sequences, 2981066348 bases, 2222066378 kmers +read 25400000 sequences, 2987174670 bases, 2225174700 kmers +read 25500000 sequences, 2993287441 bases, 2228287471 kmers +read 25600000 sequences, 2999404181 bases, 2231404211 kmers +read 25700000 sequences, 3005525939 bases, 2234525969 kmers +read 25800000 sequences, 3011641818 bases, 2237641848 kmers +read 25900000 sequences, 3017762680 bases, 2240762710 kmers +read 26000000 sequences, 3023914368 bases, 2243914398 kmers +read 26100000 sequences, 3030074467 bases, 2247074497 kmers +read 26200000 sequences, 3036215358 bases, 2250215388 kmers +read 26300000 sequences, 3042374173 bases, 2253374203 kmers +read 26400000 sequences, 3048520171 bases, 2256520201 kmers +read 26500000 sequences, 3054682791 bases, 2259682821 kmers +read 26600000 sequences, 3060872341 bases, 2262872371 kmers +read 26700000 sequences, 3067031340 bases, 2266031370 kmers +read 26800000 sequences, 3073202220 bases, 2269202250 kmers +read 26900000 sequences, 3079363082 bases, 2272363112 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.16.bin'... +read 27000000 sequences, 3085556027 bases, 2275556057 kmers +read 27100000 sequences, 3091751521 bases, 2278751551 kmers +read 27200000 sequences, 3097952572 bases, 2281952602 kmers +read 27300000 sequences, 3104145541 bases, 2285145571 kmers +read 27400000 sequences, 3110358894 bases, 2288358924 kmers +read 27500000 sequences, 3116536976 bases, 2291537006 kmers +read 27600000 sequences, 3122708679 bases, 2294708709 kmers +read 27700000 sequences, 3128900397 bases, 2297900427 kmers +read 27800000 sequences, 3135111542 bases, 2301111572 kmers +read 27900000 sequences, 3141317211 bases, 2304317241 kmers +read 28000000 sequences, 3147523754 bases, 2307523784 kmers +read 28100000 sequences, 3153730407 bases, 2310730437 kmers +read 28200000 sequences, 3159957684 bases, 2313957714 kmers +read 28300000 sequences, 3166181142 bases, 2317181172 kmers +read 28400000 sequences, 3172412131 bases, 2320412161 kmers +read 28500000 sequences, 3178654828 bases, 2323654858 kmers +read 28600000 sequences, 3184886524 bases, 2326886554 kmers +read 28700000 sequences, 3191117068 bases, 2330117098 kmers +read 28800000 sequences, 3197379540 bases, 2333379570 kmers +read 28900000 sequences, 3203639436 bases, 2336639466 kmers +read 29000000 sequences, 3209891656 bases, 2339891686 kmers +read 29100000 sequences, 3216141216 bases, 2343141246 kmers +read 29200000 sequences, 3222413290 bases, 2346413320 kmers +read 29300000 sequences, 3228708327 bases, 2349708357 kmers +read 29400000 sequences, 3234965760 bases, 2352965790 kmers +read 29500000 sequences, 3241275202 bases, 2356275232 kmers +read 29600000 sequences, 3247560688 bases, 2359560718 kmers +read 29700000 sequences, 3253851429 bases, 2362851459 kmers +read 29800000 sequences, 3260147813 bases, 2366147843 kmers +read 29900000 sequences, 3266443188 bases, 2369443218 kmers +read 30000000 sequences, 3272761129 bases, 2372761159 kmers +read 30100000 sequences, 3279084870 bases, 2376084900 kmers +read 30200000 sequences, 3285396291 bases, 2379396321 kmers +read 30300000 sequences, 3291706637 bases, 2382706667 kmers +read 30400000 sequences, 3298020747 bases, 2386020777 kmers +read 30500000 sequences, 3304364961 bases, 2389364991 kmers +read 30600000 sequences, 3310727391 bases, 2392727421 kmers +read 30700000 sequences, 3317071594 bases, 2396071624 kmers +read 30800000 sequences, 3323415712 bases, 2399415742 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.17.bin'... +read 30900000 sequences, 3329790954 bases, 2402790984 kmers +read 31000000 sequences, 3336150928 bases, 2406150958 kmers +read 31100000 sequences, 3342541624 bases, 2409541654 kmers +read 31200000 sequences, 3348907387 bases, 2412907417 kmers +read 31300000 sequences, 3355301252 bases, 2416301282 kmers +read 31400000 sequences, 3361677930 bases, 2419677960 kmers +read 31500000 sequences, 3368088580 bases, 2423088610 kmers +read 31600000 sequences, 3374497373 bases, 2426497403 kmers +read 31700000 sequences, 3380954973 bases, 2429955003 kmers +read 31800000 sequences, 3387385456 bases, 2433385486 kmers +read 31900000 sequences, 3393821566 bases, 2436821596 kmers +read 32000000 sequences, 3400254669 bases, 2440254699 kmers +read 32100000 sequences, 3406661433 bases, 2443661463 kmers +read 32200000 sequences, 3413130559 bases, 2447130589 kmers +read 32300000 sequences, 3419570382 bases, 2450570412 kmers +read 32400000 sequences, 3426014430 bases, 2454014460 kmers +read 32500000 sequences, 3432484446 bases, 2457484476 kmers +read 32600000 sequences, 3438957018 bases, 2460957048 kmers +read 32700000 sequences, 3445449720 bases, 2464449750 kmers +read 32800000 sequences, 3451918191 bases, 2467918221 kmers +read 32900000 sequences, 3458402208 bases, 2471402238 kmers +read 33000000 sequences, 3464886745 bases, 2474886775 kmers +read 33100000 sequences, 3471383068 bases, 2478383098 kmers +read 33200000 sequences, 3477878747 bases, 2481878777 kmers +read 33300000 sequences, 3484417152 bases, 2485417182 kmers +read 33400000 sequences, 3490941859 bases, 2488941889 kmers +read 33500000 sequences, 3497445803 bases, 2492445833 kmers +read 33600000 sequences, 3503981393 bases, 2495981423 kmers +read 33700000 sequences, 3510547286 bases, 2499547316 kmers +read 33800000 sequences, 3517100145 bases, 2503100175 kmers +read 33900000 sequences, 3523655251 bases, 2506655281 kmers +read 34000000 sequences, 3530247130 bases, 2510247160 kmers +read 34100000 sequences, 3536826114 bases, 2513826144 kmers +read 34200000 sequences, 3543370719 bases, 2517370749 kmers +read 34300000 sequences, 3549941926 bases, 2520941956 kmers +read 34400000 sequences, 3556525084 bases, 2524525114 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.18.bin'... +read 34500000 sequences, 3563130081 bases, 2528130111 kmers +read 34600000 sequences, 3569739780 bases, 2531739810 kmers +read 34700000 sequences, 3576369309 bases, 2535369339 kmers +read 34800000 sequences, 3582984603 bases, 2538984633 kmers +read 34900000 sequences, 3589639338 bases, 2542639368 kmers +read 35000000 sequences, 3596273782 bases, 2546273812 kmers +read 35100000 sequences, 3602915624 bases, 2549915654 kmers +read 35200000 sequences, 3609531465 bases, 2553531495 kmers +read 35300000 sequences, 3616196895 bases, 2557196925 kmers +read 35400000 sequences, 3622877377 bases, 2560877407 kmers +read 35500000 sequences, 3629566990 bases, 2564567020 kmers +read 35600000 sequences, 3636241308 bases, 2568241338 kmers +read 35700000 sequences, 3642914924 bases, 2571914954 kmers +read 35800000 sequences, 3649603351 bases, 2575603381 kmers +read 35900000 sequences, 3656318441 bases, 2579318471 kmers +read 36000000 sequences, 3663044755 bases, 2583044785 kmers +read 36100000 sequences, 3669777945 bases, 2586777975 kmers +read 36200000 sequences, 3676509798 bases, 2590509828 kmers +read 36300000 sequences, 3683277205 bases, 2594277235 kmers +read 36400000 sequences, 3690023259 bases, 2598023289 kmers +read 36500000 sequences, 3696780780 bases, 2601780810 kmers +read 36600000 sequences, 3703553916 bases, 2605553946 kmers +read 36700000 sequences, 3710337571 bases, 2609337601 kmers +read 36800000 sequences, 3717123025 bases, 2613123055 kmers +read 36900000 sequences, 3723910267 bases, 2616910297 kmers +read 37000000 sequences, 3730743453 bases, 2620743483 kmers +read 37100000 sequences, 3737567873 bases, 2624567903 kmers +read 37200000 sequences, 3744378273 bases, 2628378303 kmers +read 37300000 sequences, 3751211086 bases, 2632211116 kmers +read 37400000 sequences, 3758073143 bases, 2636073173 kmers +read 37500000 sequences, 3764943116 bases, 2639943146 kmers +read 37600000 sequences, 3771815746 bases, 2643815776 kmers +read 37700000 sequences, 3778661925 bases, 2647661955 kmers +read 37800000 sequences, 3785547694 bases, 2651547724 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.19.bin'... +read 37900000 sequences, 3792403153 bases, 2655403183 kmers +read 38000000 sequences, 3799297812 bases, 2659297842 kmers +read 38100000 sequences, 3806239974 bases, 2663240004 kmers +read 38200000 sequences, 3813157585 bases, 2667157615 kmers +read 38300000 sequences, 3820098418 bases, 2671098448 kmers +read 38400000 sequences, 3827045678 bases, 2675045708 kmers +read 38500000 sequences, 3834035768 bases, 2679035798 kmers +read 38600000 sequences, 3841003319 bases, 2683003349 kmers +read 38700000 sequences, 3848003705 bases, 2687003735 kmers +read 38800000 sequences, 3854998310 bases, 2690998340 kmers +read 38900000 sequences, 3861999344 bases, 2694999374 kmers +read 39000000 sequences, 3869022053 bases, 2699022083 kmers +read 39100000 sequences, 3876075267 bases, 2703075297 kmers +read 39200000 sequences, 3883150321 bases, 2707150351 kmers +read 39300000 sequences, 3890222625 bases, 2711222655 kmers +read 39400000 sequences, 3897268484 bases, 2715268514 kmers +read 39500000 sequences, 3904370112 bases, 2719370142 kmers +read 39600000 sequences, 3911448030 bases, 2723448060 kmers +read 39700000 sequences, 3918568345 bases, 2727568375 kmers +read 39800000 sequences, 3925645444 bases, 2731645474 kmers +read 39900000 sequences, 3932749408 bases, 2735749438 kmers +read 40000000 sequences, 3939899844 bases, 2739899874 kmers +read 40100000 sequences, 3947016310 bases, 2744016340 kmers +read 40200000 sequences, 3954176373 bases, 2748176403 kmers +read 40300000 sequences, 3961389382 bases, 2752389412 kmers +read 40400000 sequences, 3968552071 bases, 2756552101 kmers +read 40500000 sequences, 3975752223 bases, 2760752253 kmers +read 40600000 sequences, 3982970739 bases, 2764970769 kmers +read 40700000 sequences, 3990152709 bases, 2769152739 kmers +read 40800000 sequences, 3997405356 bases, 2773405386 kmers +read 40900000 sequences, 4004672388 bases, 2777672418 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.20.bin'... +read 41000000 sequences, 4011944292 bases, 2781944322 kmers +read 41100000 sequences, 4019238344 bases, 2786238374 kmers +read 41200000 sequences, 4026519143 bases, 2790519173 kmers +read 41300000 sequences, 4033822566 bases, 2794822596 kmers +read 41400000 sequences, 4041178251 bases, 2799178281 kmers +read 41500000 sequences, 4048493790 bases, 2803493820 kmers +read 41600000 sequences, 4055829038 bases, 2807829068 kmers +read 41700000 sequences, 4063212559 bases, 2812212589 kmers +read 41800000 sequences, 4070629890 bases, 2816629920 kmers +read 41900000 sequences, 4078028063 bases, 2821028093 kmers +read 42000000 sequences, 4085447723 bases, 2825447753 kmers +read 42100000 sequences, 4092897915 bases, 2829897945 kmers +read 42200000 sequences, 4100371858 bases, 2834371888 kmers +read 42300000 sequences, 4107845174 bases, 2838845204 kmers +read 42400000 sequences, 4115310509 bases, 2843310539 kmers +read 42500000 sequences, 4122794181 bases, 2847794211 kmers +read 42600000 sequences, 4130336752 bases, 2852336782 kmers +read 42700000 sequences, 4137838898 bases, 2856838928 kmers +read 42800000 sequences, 4145439502 bases, 2861439532 kmers +read 42900000 sequences, 4153050260 bases, 2866050290 kmers +read 43000000 sequences, 4160667131 bases, 2870667161 kmers +read 43100000 sequences, 4168281208 bases, 2875281238 kmers +read 43200000 sequences, 4175884381 bases, 2879884411 kmers +read 43300000 sequences, 4183510403 bases, 2884510433 kmers +read 43400000 sequences, 4191153977 bases, 2889154007 kmers +read 43500000 sequences, 4198862981 bases, 2893863011 kmers +read 43600000 sequences, 4206635916 bases, 2898635946 kmers +read 43700000 sequences, 4214404635 bases, 2903404665 kmers +read 43800000 sequences, 4222136044 bases, 2908136074 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.21.bin'... +read 43900000 sequences, 4229915489 bases, 2912915519 kmers +read 44000000 sequences, 4237696439 bases, 2917696469 kmers +read 44100000 sequences, 4245541347 bases, 2922541377 kmers +read 44200000 sequences, 4253343569 bases, 2927343599 kmers +read 44300000 sequences, 4261209160 bases, 2932209190 kmers +read 44400000 sequences, 4269076502 bases, 2937076532 kmers +read 44500000 sequences, 4276951507 bases, 2941951537 kmers +read 44600000 sequences, 4284863476 bases, 2946863506 kmers +read 44700000 sequences, 4292779395 bases, 2951779425 kmers +read 44800000 sequences, 4300761505 bases, 2956761535 kmers +read 44900000 sequences, 4308749134 bases, 2961749164 kmers +read 45000000 sequences, 4316730477 bases, 2966730507 kmers +read 45100000 sequences, 4324743898 bases, 2971743928 kmers +read 45200000 sequences, 4332706339 bases, 2976706369 kmers +read 45300000 sequences, 4340799702 bases, 2981799732 kmers +read 45400000 sequences, 4348938044 bases, 2986938074 kmers +read 45500000 sequences, 4357089148 bases, 2992089178 kmers +read 45600000 sequences, 4365213123 bases, 2997213153 kmers +read 45700000 sequences, 4373409255 bases, 3002409285 kmers +read 45800000 sequences, 4381555955 bases, 3007555985 kmers +read 45900000 sequences, 4389760124 bases, 3012760154 kmers +read 46000000 sequences, 4398064658 bases, 3018064688 kmers +read 46100000 sequences, 4406387022 bases, 3023387052 kmers +read 46200000 sequences, 4414694547 bases, 3028694577 kmers +read 46300000 sequences, 4423058645 bases, 3034058675 kmers +read 46400000 sequences, 4431425456 bases, 3039425486 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.22.bin'... +read 46500000 sequences, 4439833395 bases, 3044833425 kmers +read 46600000 sequences, 4448259061 bases, 3050259091 kmers +read 46700000 sequences, 4456674986 bases, 3055675016 kmers +read 46800000 sequences, 4465159451 bases, 3061159481 kmers +read 46900000 sequences, 4473635424 bases, 3066635454 kmers +read 47000000 sequences, 4482251403 bases, 3072251433 kmers +read 47100000 sequences, 4490782771 bases, 3077782801 kmers +read 47200000 sequences, 4499401922 bases, 3083401952 kmers +read 47300000 sequences, 4508109132 bases, 3089109162 kmers +read 47400000 sequences, 4516742321 bases, 3094742351 kmers +read 47500000 sequences, 4525469588 bases, 3100469618 kmers +read 47600000 sequences, 4534242679 bases, 3106242709 kmers +read 47700000 sequences, 4542982876 bases, 3111982906 kmers +read 47800000 sequences, 4551866465 bases, 3117866495 kmers +read 47900000 sequences, 4560699422 bases, 3123699452 kmers +read 48000000 sequences, 4569570230 bases, 3129570260 kmers +read 48100000 sequences, 4578501122 bases, 3135501152 kmers +read 48200000 sequences, 4587457020 bases, 3141457050 kmers +read 48300000 sequences, 4596477426 bases, 3147477456 kmers +read 48400000 sequences, 4605472867 bases, 3153472897 kmers +read 48500000 sequences, 4614570314 bases, 3159570344 kmers +read 48600000 sequences, 4623645571 bases, 3165645601 kmers +read 48700000 sequences, 4632844313 bases, 3171844343 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.23.bin'... +read 48800000 sequences, 4642092013 bases, 3178092043 kmers +read 48900000 sequences, 4651346054 bases, 3184346084 kmers +read 49000000 sequences, 4660631564 bases, 3190631594 kmers +read 49100000 sequences, 4670019434 bases, 3197019464 kmers +read 49200000 sequences, 4679397122 bases, 3203397152 kmers +read 49300000 sequences, 4688892126 bases, 3209892156 kmers +read 49400000 sequences, 4698398402 bases, 3216398432 kmers +read 49500000 sequences, 4707888048 bases, 3222888078 kmers +read 49600000 sequences, 4717466104 bases, 3229466134 kmers +read 49700000 sequences, 4727070074 bases, 3236070104 kmers +read 49800000 sequences, 4736756111 bases, 3242756141 kmers +read 49900000 sequences, 4746452257 bases, 3249452287 kmers +read 50000000 sequences, 4756246274 bases, 3256246304 kmers +read 50100000 sequences, 4766057201 bases, 3263057231 kmers +read 50200000 sequences, 4775878485 bases, 3269878515 kmers +read 50300000 sequences, 4785727317 bases, 3276727347 kmers +read 50400000 sequences, 4795653806 bases, 3283653836 kmers +read 50500000 sequences, 4805712567 bases, 3290712597 kmers +read 50600000 sequences, 4815738486 bases, 3297738516 kmers +read 50700000 sequences, 4825926061 bases, 3304926091 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.24.bin'... +read 50800000 sequences, 4836224392 bases, 3312224422 kmers +read 50900000 sequences, 4846451475 bases, 3319451505 kmers +read 51000000 sequences, 4856753402 bases, 3326753432 kmers +read 51100000 sequences, 4867266326 bases, 3334266356 kmers +read 51200000 sequences, 4877861799 bases, 3341861829 kmers +read 51300000 sequences, 4888414798 bases, 3349414828 kmers +read 51400000 sequences, 4899113746 bases, 3357113776 kmers +read 51500000 sequences, 4909857519 bases, 3364857549 kmers +read 51600000 sequences, 4920671018 bases, 3372671048 kmers +read 51700000 sequences, 4931456761 bases, 3380456791 kmers +read 51800000 sequences, 4942313146 bases, 3388313176 kmers +read 51900000 sequences, 4953292346 bases, 3396292376 kmers +read 52000000 sequences, 4964398640 bases, 3404398670 kmers +read 52100000 sequences, 4975538457 bases, 3412538487 kmers +read 52200000 sequences, 4986759889 bases, 3420759919 kmers +read 52300000 sequences, 4998126697 bases, 3429126727 kmers +read 52400000 sequences, 5009563077 bases, 3437563107 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.25.bin'... +read 52500000 sequences, 5021022583 bases, 3446022613 kmers +read 52600000 sequences, 5032535927 bases, 3454535957 kmers +read 52700000 sequences, 5044218660 bases, 3463218690 kmers +read 52800000 sequences, 5055973619 bases, 3471973649 kmers +read 52900000 sequences, 5067872804 bases, 3480872834 kmers +read 53000000 sequences, 5079791399 bases, 3489791429 kmers +read 53100000 sequences, 5091783497 bases, 3498783527 kmers +read 53200000 sequences, 5103925550 bases, 3507925580 kmers +read 53300000 sequences, 5116240983 bases, 3517241013 kmers +read 53400000 sequences, 5128584923 bases, 3526584953 kmers +read 53500000 sequences, 5140962917 bases, 3535962947 kmers +read 53600000 sequences, 5153500478 bases, 3545500508 kmers +read 53700000 sequences, 5166148888 bases, 3555148918 kmers +read 53800000 sequences, 5178959197 bases, 3564959227 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.26.bin'... +read 53900000 sequences, 5191971403 bases, 3574971433 kmers +read 54000000 sequences, 5205070227 bases, 3585070257 kmers +read 54100000 sequences, 5218297285 bases, 3595297315 kmers +read 54200000 sequences, 5231683093 bases, 3605683123 kmers +read 54300000 sequences, 5245150344 bases, 3616150374 kmers +read 54400000 sequences, 5258739173 bases, 3626739203 kmers +read 54500000 sequences, 5272405047 bases, 3637405077 kmers +read 54600000 sequences, 5286362231 bases, 3648362261 kmers +read 54700000 sequences, 5300436701 bases, 3659436731 kmers +read 54800000 sequences, 5314343049 bases, 3670343079 kmers +read 54900000 sequences, 5328793168 bases, 3681793198 kmers +read 55000000 sequences, 5343494365 bases, 3693494395 kmers +read 55100000 sequences, 5358294825 bases, 3705294855 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.27.bin'... +read 55200000 sequences, 5373204958 bases, 3717204988 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279403255191108.minimizers.28.bin'... +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +num_super_kmers 825700183 +num_pieces 55207754 (+0.890898 [bits/kmer]) +=== step 1: 'parse_file' 266.485 [sec] (71.672 [ns/kmer]) + == files to merge = 29 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 450000000 +num_written_tuples = 500000000 +num_written_tuples = 550000000 +num_written_tuples = 600000000 +num_written_tuples = 650000000 +num_written_tuples = 700000000 +num_written_tuples = 750000000 +num_written_tuples = 800000000 +num_written_tuples = 825700183 +num_minimizers 624010762 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 65.3272 [sec] (17.5699 [ns/kmer]) +bits_per_offset = ceil(log2(5374353570)) = 33 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279735999139401.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279735999139401.bucket_pairs.1.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279735999139401.bucket_pairs.2.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279735999139401.bucket_pairs.3.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279735999139401.bucket_pairs.4.bin'... +num_singletons 521231883/624010762 (83.5293%) + == files to merge = 5 +num_written_pairs = 50000000 +num_written_pairs = 100000000 +num_written_pairs = 102778879 +=== step 3: 'build_index' 216.456 [sec] (58.2165 [ns/kmer]) +max_num_super_kmers_in_bucket 95844 +log2_max_num_super_kmers_in_bucket 17 +num_buckets_in_skew_index 156279/624010762 (0.0250443%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 35996374 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 26993825 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 19373179 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 13381657 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 8418352 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 5915012 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 95844: 7265419 +num_kmers_in_skew_index 117343818 (3.156%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 35996374 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 35996374 keys; bits/key = 2.79838 + built positions[0] for 35996374 keys; bits/key = 7.00001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 26993825 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 26993825 keys; bits/key = 2.78053 + built positions[1] for 26993825 keys; bits/key = 8.00001 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 19373179 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 19373179 keys; bits/key = 2.86228 + built positions[2] for 19373179 keys; bits/key = 9.00002 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 13381657 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 13381657 keys; bits/key = 2.9839 + built positions[3] for 13381657 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 8418352 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 8418352 keys; bits/key = 3.02475 + built positions[4] for 8418352 keys; bits/key = 11 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 5915012 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 5915012 keys; bits/key = 3.15304 + built positions[5] for 5915012 keys; bits/key = 12.0001 + lower 4096; upper 95844; num_bits_per_pos 17; keys_in_partition.size() 7265419 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 7265419 keys; bits/key = 3.07772 + built positions[6] for 7265419 keys; bits/key = 17 +num_bits_for_skew_index 1400841344(0.376761 [bits/kmer]) +=== step 4: 'build_skew_index' 18.1439 [sec] (4.87987 [ns/kmer]) +=== total_time 566.412 [sec] (152.338 [ns/kmer]) +total index size: 5345319756 [B] -- 5345.32 [MB] +SPACE BREAKDOWN: + minimizers: 0.440906 [bits/kmer] (2.62711 [bits/key]) -- 3.8336% + pieces: 0.14758 [bits/kmer] -- 1.28318% + num_super_kmers_before_bucket: 0.316514 [bits/kmer] -- 2.75203% + offsets: 7.32846 [bits/kmer] -- 63.7195% + strings: 2.8909 [bits/kmer] -- 25.1358% + skew_index: 0.376761 [bits/kmer] -- 3.27586% + weights: 3.95899e-07 [bits/kmer] -- 3.44226e-06% + weight_interval_values: 6.8852e-08 [bits/kmer] + weight_interval_lengths: 2.58195e-07 [bits/kmer] + weight_dictionary: 6.8852e-08 [bits/kmer] + -------------- + total: 11.5011 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 83.5293% +buckets with 2 super_kmers = 12.8251% +buckets with 3 super_kmers = 2.10141% +buckets with 4 super_kmers = 0.585352% +buckets with 5 super_kmers = 0.255767% +buckets with 6 super_kmers = 0.149049% +buckets with 7 super_kmers = 0.0987449% +buckets with 8 super_kmers = 0.0706794% +buckets with 9 super_kmers = 0.0531121% +buckets with 10 super_kmers = 0.0414318% +buckets with 11 super_kmers = 0.0328145% +buckets with 12 super_kmers = 0.0267737% +buckets with 13 super_kmers = 0.0223161% +buckets with 14 super_kmers = 0.0187769% +buckets with 15 super_kmers = 0.0158791% +buckets with 16 super_kmers = 0.0137246% +max_num_super_kmers_in_bucket 95844 +2025-11-27 22:46:11: saving data structure to disk... +2025-11-27 22:46:13: DONE diff --git a/benchmarks/results-27-11-25-v3/k31/canon-build.time.log b/benchmarks/results-27-11-25-v3/k31/canon-build.time.log new file mode 100644 index 0000000..3f6adb8 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/canon-build.time.log @@ -0,0 +1,138 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/cod.k31.canon.sshash --canonical-parsing" + User time (seconds): 77.68 + System time (seconds): 6.18 + Percent of CPU this job got: 136% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:01.24 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3894516 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1483485 + Voluntary context switches: 455 + Involuntary context switches: 674 + Swaps: 0 + File system inputs: 0 + File system outputs: 10960280 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/kestrel.k31.canon.sshash --canonical-parsing" + User time (seconds): 191.92 + System time (seconds): 13.81 + Percent of CPU this job got: 132% + Elapsed (wall clock) time (h:mm:ss or m:ss): 2:34.82 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 8512312 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 3078706 + Voluntary context switches: 423 + Involuntary context switches: 1385 + Swaps: 0 + File system inputs: 0 + File system outputs: 25283168 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/human.k31.canon.sshash --canonical-parsing" + User time (seconds): 534.98 + System time (seconds): 31.40 + Percent of CPU this job got: 156% + Elapsed (wall clock) time (h:mm:ss or m:ss): 6:02.78 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 15455788 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 6071604 + Voluntary context switches: 962 + Involuntary context switches: 3836 + Swaps: 0 + File system inputs: 0 + File system outputs: 59862192 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/ncbi-virus.k31.canon.sshash --canonical-parsing" + User time (seconds): 52.13 + System time (seconds): 4.61 + Percent of CPU this job got: 127% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:44.38 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 2789936 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1118194 + Voluntary context switches: 244 + Involuntary context switches: 476 + Swaps: 0 + File system inputs: 0 + File system outputs: 7798200 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/se.k31.canon.sshash --canonical-parsing" + User time (seconds): 151.97 + System time (seconds): 11.62 + Percent of CPU this job got: 135% + Elapsed (wall clock) time (h:mm:ss or m:ss): 2:00.37 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 7380696 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2631466 + Voluntary context switches: 434 + Involuntary context switches: 1176 + Swaps: 0 + File system inputs: 0 + File system outputs: 22052600 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/hprc.k31.canon.sshash --canonical-parsing" + User time (seconds): 959.65 + System time (seconds): 48.93 + Percent of CPU this job got: 176% + Elapsed (wall clock) time (h:mm:ss or m:ss): 9:30.84 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 21183980 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 10595840 + Voluntary context switches: 922 + Involuntary context switches: 6040 + Swaps: 0 + File system inputs: 0 + File system outputs: 92217392 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.log b/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.log new file mode 100644 index 0000000..4291c99 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.log @@ -0,0 +1,48 @@ +2025-11-28 15:41:55: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-28 15:42:10: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_searches = 23768683/132860997 (17.8899%) +num_extensions = 109092314/132860997 (82.1101%) +elapsed = 14474.1 millisec / 14.4741 sec / 0.241235 min / 88.642 ns/kmer +2025-11-28 15:42:10: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-28 15:44:10: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_searches = 83672136/525542891 (15.9211%) +num_extensions = 441870755/525542891 (84.0789%) +elapsed = 119068 millisec / 119.068 sec / 1.98447 min / 171.14 ns/kmer +2025-11-28 15:44:11: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 15:51:23: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437949378 (91.5906%) +num_searches = 298261222/1437949378 (20.7421%) +num_extensions = 1139688156/1437949378 (79.2579%) +elapsed = 432143 millisec / 432.143 sec / 7.20239 min / 275.255 ns/kmer +2025-11-28 15:51:23: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-28 15:51:25: DONE +==== query report: +num_kmers = 14092875 +num_positive_kmers = 13983775 (99.2258%) +num_searches = 2252811/13983775 (16.1102%) +num_extensions = 11730964/13983775 (83.8898%) +elapsed = 1637.58 millisec / 1.63758 sec / 0.027293 min / 116.199 ns/kmer +2025-11-28 15:51:25: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-28 15:57:32: DONE +==== query report: +num_kmers = 789838196 +num_positive_kmers = 764882549 (96.8404%) +num_searches = 288913261/764882549 (37.7722%) +num_extensions = 475969288/764882549 (62.2278%) +elapsed = 366794 millisec / 366.794 sec / 6.11324 min / 464.392 ns/kmer +2025-11-28 15:57:34: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 16:06:20: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1485223278 (94.6017%) +num_searches = 332686229/1485223278 (22.3997%) +num_extensions = 1152537049/1485223278 (77.6003%) +elapsed = 525032 millisec / 525.032 sec / 8.75054 min / 334.421 ns/kmer diff --git a/benchmarks/results-27-11-25-v3/k31/regular-bench.json b/benchmarks/results-27-11-25-v3/k31/regular-bench.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-bench.log b/benchmarks/results-27-11-25-v3/k31/regular-bench.log new file mode 100644 index 0000000..d00b045 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/regular-bench.log @@ -0,0 +1,108 @@ +avg_nanosec_per_positive_lookup 978.981 +avg_nanosec_per_negative_lookup 1132.96 +avg_nanosec_per_positive_lookup_advanced 960.619 +avg_nanosec_per_negative_lookup_advanced 1140.81 +avg_nanosec_per_access 292.259 +iterator: avg_nanosec_per_kmer 13.7756 +avg_nanosec_per_positive_lookup 986.988 +avg_nanosec_per_negative_lookup 1142.34 +avg_nanosec_per_positive_lookup_advanced 958.331 +avg_nanosec_per_negative_lookup_advanced 1131.72 +avg_nanosec_per_access 292.949 +iterator: avg_nanosec_per_kmer 13.7967 +avg_nanosec_per_positive_lookup 968.186 +avg_nanosec_per_negative_lookup 1149.01 +avg_nanosec_per_positive_lookup_advanced 971.836 +avg_nanosec_per_negative_lookup_advanced 1133.44 +avg_nanosec_per_access 296.964 +iterator: avg_nanosec_per_kmer 13.8817 +avg_nanosec_per_positive_lookup 1022.64 +avg_nanosec_per_negative_lookup 1293.86 +avg_nanosec_per_positive_lookup_advanced 1008.02 +avg_nanosec_per_negative_lookup_advanced 1291.52 +avg_nanosec_per_access 263.68 +iterator: avg_nanosec_per_kmer 13.5254 +avg_nanosec_per_positive_lookup 995.541 +avg_nanosec_per_negative_lookup 1284.3 +avg_nanosec_per_positive_lookup_advanced 991.168 +avg_nanosec_per_negative_lookup_advanced 1282.28 +avg_nanosec_per_access 264.028 +iterator: avg_nanosec_per_kmer 13.6361 +avg_nanosec_per_positive_lookup 1021.09 +avg_nanosec_per_negative_lookup 1309.98 +avg_nanosec_per_positive_lookup_advanced 1004.92 +avg_nanosec_per_negative_lookup_advanced 1302.81 +avg_nanosec_per_access 262.37 +iterator: avg_nanosec_per_kmer 13.9982 +avg_nanosec_per_positive_lookup 1390.89 +avg_nanosec_per_negative_lookup 1620.25 +avg_nanosec_per_positive_lookup_advanced 1369.7 +avg_nanosec_per_negative_lookup_advanced 1600.59 +avg_nanosec_per_access 368.619 +iterator: avg_nanosec_per_kmer 13.5873 +avg_nanosec_per_positive_lookup 1390.01 +avg_nanosec_per_negative_lookup 1612.37 +avg_nanosec_per_positive_lookup_advanced 1392.58 +avg_nanosec_per_negative_lookup_advanced 1603.12 +avg_nanosec_per_access 370.64 +iterator: avg_nanosec_per_kmer 13.5535 +avg_nanosec_per_positive_lookup 1376.73 +avg_nanosec_per_negative_lookup 1623.33 +avg_nanosec_per_positive_lookup_advanced 1367.13 +avg_nanosec_per_negative_lookup_advanced 1597.43 +avg_nanosec_per_access 370.045 +iterator: avg_nanosec_per_kmer 13.5485 +avg_nanosec_per_positive_lookup 826.225 +avg_nanosec_per_negative_lookup 1075.4 +avg_nanosec_per_positive_lookup_advanced 805.128 +avg_nanosec_per_negative_lookup_advanced 1052.47 +avg_nanosec_per_access 287.705 +iterator: avg_nanosec_per_kmer 13.615 +avg_nanosec_per_positive_lookup 805.683 +avg_nanosec_per_negative_lookup 1071.25 +avg_nanosec_per_positive_lookup_advanced 809.982 +avg_nanosec_per_negative_lookup_advanced 1055.7 +avg_nanosec_per_access 282.47 +iterator: avg_nanosec_per_kmer 13.8545 +avg_nanosec_per_positive_lookup 824.257 +avg_nanosec_per_negative_lookup 1068.3 +avg_nanosec_per_positive_lookup_advanced 830.463 +avg_nanosec_per_negative_lookup_advanced 1066.87 +avg_nanosec_per_access 282.154 +iterator: avg_nanosec_per_kmer 13.8504 +avg_nanosec_per_positive_lookup 1482.44 +avg_nanosec_per_negative_lookup 1615.74 +avg_nanosec_per_positive_lookup_advanced 1446.03 +avg_nanosec_per_negative_lookup_advanced 1601.59 +avg_nanosec_per_access 388.119 +iterator: avg_nanosec_per_kmer 14.0195 +avg_nanosec_per_positive_lookup 1475.55 +avg_nanosec_per_negative_lookup 1612.43 +avg_nanosec_per_positive_lookup_advanced 1449.14 +avg_nanosec_per_negative_lookup_advanced 1590.2 +avg_nanosec_per_access 389.131 +iterator: avg_nanosec_per_kmer 14.2169 +avg_nanosec_per_positive_lookup 1475.76 +avg_nanosec_per_negative_lookup 1628.75 +avg_nanosec_per_positive_lookup_advanced 1451.51 +avg_nanosec_per_negative_lookup_advanced 1585.93 +avg_nanosec_per_access 384.968 +iterator: avg_nanosec_per_kmer 14.0822 +avg_nanosec_per_positive_lookup 1951.83 +avg_nanosec_per_negative_lookup 2164.91 +avg_nanosec_per_positive_lookup_advanced 1970.19 +avg_nanosec_per_negative_lookup_advanced 2144.56 +avg_nanosec_per_access 600.742 +iterator: avg_nanosec_per_kmer 13.9579 +avg_nanosec_per_positive_lookup 1973.43 +avg_nanosec_per_negative_lookup 2128.58 +avg_nanosec_per_positive_lookup_advanced 1929.4 +avg_nanosec_per_negative_lookup_advanced 2127.99 +avg_nanosec_per_access 599.777 +iterator: avg_nanosec_per_kmer 13.6554 +avg_nanosec_per_positive_lookup 1985.53 +avg_nanosec_per_negative_lookup 2145.04 +avg_nanosec_per_positive_lookup_advanced 1941.35 +avg_nanosec_per_negative_lookup_advanced 2111.76 +avg_nanosec_per_access 595.081 +iterator: avg_nanosec_per_kmer 13.9286 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-build.json b/benchmarks/results-27-11-25-v3/k31/regular-build.json new file mode 100644 index 0000000..2a7aca3 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/regular-build.json @@ -0,0 +1,5 @@ +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists diff --git a/benchmarks/results-27-11-25-v3/k31/regular-build.log b/benchmarks/results-27-11-25-v3/k31/regular-build.log new file mode 100644 index 0000000..21c3089 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/regular-build.log @@ -0,0 +1,1565 @@ +k = 31, m = 20, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 25039667 bases, 22039697 kmers +read 200000 sequences, 50140708 bases, 44140738 kmers +read 300000 sequences, 75429441 bases, 66429471 kmers +read 400000 sequences, 100861228 bases, 88861258 kmers +read 500000 sequences, 126668305 bases, 111668335 kmers +read 600000 sequences, 152842148 bases, 134842178 kmers +read 700000 sequences, 179047050 bases, 158047080 kmers +read 800000 sequences, 205700376 bases, 181700406 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277673890665311.minimizers.0.bin'... +read 900000 sequences, 232873950 bases, 205873980 kmers +read 1000000 sequences, 260757565 bases, 230757595 kmers +read 1100000 sequences, 290088622 bases, 257088652 kmers +read 1200000 sequences, 322579647 bases, 286579677 kmers +read 1300000 sequences, 361073626 bases, 322073656 kmers +read 1400000 sequences, 398961301 bases, 356961331 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277673890665311.minimizers.1.bin'... +read 1500000 sequences, 424322286 bases, 379322316 kmers +read 1600000 sequences, 449411932 bases, 401411962 kmers +read 1700000 sequences, 474428195 bases, 423428225 kmers +read 1800000 sequences, 499637061 bases, 445637091 kmers +read 1900000 sequences, 524718926 bases, 467718956 kmers +read 2000000 sequences, 549832029 bases, 489832059 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277673890665311.minimizers.2.bin'... +read 2057242 sequences, 564182460 bases, 502465200 kmers +num_kmers 502465200 +num_super_kmers 78977996 +num_pieces 2057243 (+0.245658 [bits/kmer]) +=== step 1: 'parse_file' 24.3023 [sec] (48.3661 [ns/kmer]) + == files to merge = 3 +num_written_tuples = 50000000 +num_written_tuples = 78977996 +num_minimizers 72949383 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 4.67916 [sec] (9.31241 [ns/kmer]) +bits_per_offset = ceil(log2(564182491)) = 30 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277702952335794.bucket_pairs.0.bin'... +num_singletons 70664621/72949383 (96.868%) +=== step 3: 'build_index' 13.4491 [sec] (26.7663 [ns/kmer]) +max_num_super_kmers_in_bucket 15010 +log2_max_num_super_kmers_in_bucket 14 +num_buckets_in_skew_index 4233/72949383 (0.00580265%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 1256367 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1008582 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 704270 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 516052 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 416157 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 408228 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 15010: 269630 +num_kmers_in_skew_index 4579286 (0.911364%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 1256367 + building MPHF with 64 threads and 62 partitions... + built mphs[0] for 1256367 keys; bits/key = 3.03817 + built positions[0] for 1256367 keys; bits/key = 7.0003 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 1008582 + building MPHF with 64 threads and 50 partitions... + built mphs[1] for 1008582 keys; bits/key = 2.9897 + built positions[1] for 1008582 keys; bits/key = 8.00033 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 704270 + building MPHF with 64 threads and 35 partitions... + built mphs[2] for 704270 keys; bits/key = 2.97527 + built positions[2] for 704270 keys; bits/key = 9.00046 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 516052 + building MPHF with 64 threads and 25 partitions... + built mphs[3] for 516052 keys; bits/key = 2.95704 + built positions[3] for 516052 keys; bits/key = 10.0007 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 416157 + building MPHF with 64 threads and 20 partitions... + built mphs[4] for 416157 keys; bits/key = 2.93739 + built positions[4] for 416157 keys; bits/key = 11.0008 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 408228 + building MPHF with 64 threads and 20 partitions... + built mphs[5] for 408228 keys; bits/key = 2.96254 + built positions[5] for 408228 keys; bits/key = 12.0008 + lower 4096; upper 15010; num_bits_per_pos 14; keys_in_partition.size() 269630 + building MPHF with 64 threads and 13 partitions... + built mphs[6] for 269630 keys; bits/key = 2.9376 + built positions[6] for 269630 keys; bits/key = 14.0013 +num_bits_for_skew_index 55293728(0.110045 [bits/kmer]) +=== step 4: 'build_skew_index' 0.674765 [sec] (1.34291 [ns/kmer]) +=== total_time 43.1054 [sec] (85.7877 [ns/kmer]) +total index size: 486626776 [B] -- 486.627 [MB] +SPACE BREAKDOWN: + minimizers: 0.391835 [bits/kmer] (2.6989 [bits/key]) -- 5.05735% + pieces: 0.0460074 [bits/kmer] -- 0.59381% + num_super_kmers_before_bucket: 0.238849 [bits/kmer] -- 3.08278% + offsets: 4.71543 [bits/kmer] -- 60.8613% + strings: 2.24566 [bits/kmer] -- 28.9844% + skew_index: 0.110045 [bits/kmer] -- 1.42033% + weights: 2.92956e-06 [bits/kmer] -- 3.78113e-05% + weight_interval_values: 5.09488e-07 [bits/kmer] + weight_interval_lengths: 1.91058e-06 [bits/kmer] + weight_dictionary: 5.09488e-07 [bits/kmer] + -------------- + total: 7.74783 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 96.868% +buckets with 2 super_kmers = 2.00603% +buckets with 3 super_kmers = 0.519181% +buckets with 4 super_kmers = 0.211233% +buckets with 5 super_kmers = 0.109983% +buckets with 6 super_kmers = 0.0659978% +buckets with 7 super_kmers = 0.0442074% +buckets with 8 super_kmers = 0.0308885% +buckets with 9 super_kmers = 0.0232874% +buckets with 10 super_kmers = 0.0180426% +buckets with 11 super_kmers = 0.0139809% +buckets with 12 super_kmers = 0.0113819% +buckets with 13 super_kmers = 0.00931879% +buckets with 14 super_kmers = 0.00762721% +buckets with 15 super_kmers = 0.00619882% +buckets with 16 super_kmers = 0.00540923% +max_num_super_kmers_in_bucket 15010 +2025-11-27 22:08:37: saving data structure to disk... +2025-11-27 22:08:37: DONE +k = 31, m = 20, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.0.bin'... +read 100000 sequences, 213090615 bases, 210090645 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.1.bin'... +read 200000 sequences, 390706022 bases, 384706052 kmers +read 300000 sequences, 575071881 bases, 566071911 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.2.bin'... +read 400000 sequences, 764532455 bases, 752532485 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.3.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.4.bin'... +read 500000 sequences, 971034152 bases, 956034182 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.5.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277717467247535.minimizers.6.bin'... +read 582860 sequences, 1167885005 bases, 1150399205 kmers +num_kmers 1150399205 +num_super_kmers 177472930 +num_pieces 582861 (+0.0303996 [bits/kmer]) +=== step 1: 'parse_file' 54.5614 [sec] (47.4282 [ns/kmer]) + == files to merge = 7 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 177472930 +num_minimizers 174750712 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 12.0222 [sec] (10.4504 [ns/kmer]) +bits_per_offset = ceil(log2(1167885036)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277784235171881.bucket_pairs.0.bin'... +num_singletons 173424689/174750712 (99.2412%) +=== step 3: 'build_index' 42.3889 [sec] (36.8472 [ns/kmer]) +max_num_super_kmers_in_bucket 3874 +log2_max_num_super_kmers_in_bucket 12 +num_buckets_in_skew_index 1487/174750712 (0.000850926%) +num_partitions 6 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 534745 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 306737 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 198082 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 68926 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 15246 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 3874: 38941 +num_kmers_in_skew_index 1162677 (0.101067%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 534745 + building MPHF with 64 threads and 26 partitions... + built mphs[0] for 534745 keys; bits/key = 2.94929 + built positions[0] for 534745 keys; bits/key = 7.00063 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 306737 + building MPHF with 64 threads and 15 partitions... + built mphs[1] for 306737 keys; bits/key = 2.93166 + built positions[1] for 306737 keys; bits/key = 8.00123 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 198082 + building MPHF with 64 threads and 9 partitions... + built mphs[2] for 198082 keys; bits/key = 2.88551 + built positions[2] for 198082 keys; bits/key = 9.00185 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 68926 + building MPHF with 64 threads and 3 partitions... + built mphs[3] for 68926 keys; bits/key = 2.89563 + built positions[3] for 68926 keys; bits/key = 10.0049 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 15246 + building MPHF with 64 threads and 1 partitions... + built mphs[4] for 15246 keys; bits/key = 2.96681 + built positions[4] for 15246 keys; bits/key = 11.0235 + lower 2048; upper 3874; num_bits_per_pos 12; keys_in_partition.size() 38941 + building MPHF with 64 threads and 1 partitions... + built mphs[5] for 38941 keys; bits/key = 2.74056 + built positions[5] for 38941 keys; bits/key = 12.0091 +num_bits_for_skew_index 12705904(0.0110448 [bits/kmer]) +=== step 4: 'build_skew_index' 0.726832 [sec] (0.631809 [ns/kmer]) +=== total_time 109.699 [sec] (95.3576 [ns/kmer]) +total index size: 1074747844 [B] -- 1074.75 [MB] +SPACE BREAKDOWN: + minimizers: 0.402947 [bits/kmer] (2.65264 [bits/key]) -- 5.39138% + pieces: 0.00740836 [bits/kmer] -- 0.099123% + num_super_kmers_before_bucket: 0.239718 [bits/kmer] -- 3.20739% + offsets: 4.78239 [bits/kmer] -- 63.9878% + strings: 2.0304 [bits/kmer] -- 27.1665% + skew_index: 0.0110448 [bits/kmer] -- 0.147778% + weights: 1.27956e-06 [bits/kmer] -- 1.71203e-05% + weight_interval_values: 2.22531e-07 [bits/kmer] + weight_interval_lengths: 8.34493e-07 [bits/kmer] + weight_dictionary: 2.22531e-07 [bits/kmer] + -------------- + total: 7.47391 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 99.2412% +buckets with 2 super_kmers = 0.572493% +buckets with 3 super_kmers = 0.083761% +buckets with 4 super_kmers = 0.0344628% +buckets with 5 super_kmers = 0.0184577% +buckets with 6 super_kmers = 0.0113899% +buckets with 7 super_kmers = 0.00777565% +buckets with 8 super_kmers = 0.00535448% +buckets with 9 super_kmers = 0.00398053% +buckets with 10 super_kmers = 0.0029791% +buckets with 11 super_kmers = 0.00242917% +buckets with 12 super_kmers = 0.00197024% +buckets with 13 super_kmers = 0.00158855% +buckets with 14 super_kmers = 0.00135393% +buckets with 15 super_kmers = 0.00107811% +buckets with 16 super_kmers = 0.000880111% +max_num_super_kmers_in_bucket 3874 +2025-11-27 22:10:27: saving data structure to disk... +2025-11-27 22:10:27: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 24154188 bases, 21154218 kmers +read 200000 sequences, 48616692 bases, 42616722 kmers +read 300000 sequences, 73131027 bases, 64131057 kmers +read 400000 sequences, 97783723 bases, 85783753 kmers +read 500000 sequences, 122219519 bases, 107219549 kmers +read 600000 sequences, 146714842 bases, 128714872 kmers +read 700000 sequences, 171233673 bases, 150233703 kmers +read 800000 sequences, 195693297 bases, 171693327 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.0.bin'... +read 900000 sequences, 220477596 bases, 193477626 kmers +read 1000000 sequences, 245136480 bases, 215136510 kmers +read 1100000 sequences, 269861488 bases, 236861518 kmers +read 1200000 sequences, 294553400 bases, 258553430 kmers +read 1300000 sequences, 319281499 bases, 280281529 kmers +read 1400000 sequences, 344258826 bases, 302258856 kmers +read 1500000 sequences, 368900321 bases, 323900351 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.1.bin'... +read 1600000 sequences, 393909637 bases, 345909667 kmers +read 1700000 sequences, 418576764 bases, 367576794 kmers +read 1800000 sequences, 443411012 bases, 389411042 kmers +read 1900000 sequences, 468034254 bases, 411034284 kmers +read 2000000 sequences, 492922181 bases, 432922211 kmers +read 2100000 sequences, 517852856 bases, 454852886 kmers +read 2200000 sequences, 542402258 bases, 476402288 kmers +read 2300000 sequences, 567260857 bases, 498260887 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.2.bin'... +read 2400000 sequences, 592478462 bases, 520478492 kmers +read 2500000 sequences, 617295027 bases, 542295057 kmers +read 2600000 sequences, 642487995 bases, 564488025 kmers +read 2700000 sequences, 667681489 bases, 586681519 kmers +read 2800000 sequences, 693019221 bases, 609019251 kmers +read 2900000 sequences, 718419082 bases, 631419112 kmers +read 3000000 sequences, 743136645 bases, 653136675 kmers +read 3100000 sequences, 768135598 bases, 675135628 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.3.bin'... +read 3200000 sequences, 793535023 bases, 697535053 kmers +read 3300000 sequences, 819156616 bases, 720156646 kmers +read 3400000 sequences, 844256779 bases, 742256809 kmers +read 3500000 sequences, 869741880 bases, 764741910 kmers +read 3600000 sequences, 895152151 bases, 787152181 kmers +read 3700000 sequences, 920884314 bases, 809884344 kmers +read 3800000 sequences, 946277252 bases, 832277282 kmers +read 3900000 sequences, 972103084 bases, 855103114 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.4.bin'... +read 4000000 sequences, 997901794 bases, 877901824 kmers +read 4100000 sequences, 1023962565 bases, 900962595 kmers +read 4200000 sequences, 1050002905 bases, 924002935 kmers +read 4300000 sequences, 1076025926 bases, 947025956 kmers +read 4400000 sequences, 1101901550 bases, 969901580 kmers +read 4500000 sequences, 1127998210 bases, 992998240 kmers +read 4600000 sequences, 1153713252 bases, 1015713282 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.5.bin'... +read 4700000 sequences, 1179840867 bases, 1038840897 kmers +read 4800000 sequences, 1205900933 bases, 1061900963 kmers +read 4900000 sequences, 1232271094 bases, 1085271124 kmers +read 5000000 sequences, 1259012297 bases, 1109012327 kmers +read 5100000 sequences, 1285390407 bases, 1132390437 kmers +read 5200000 sequences, 1312574199 bases, 1156574229 kmers +read 5300000 sequences, 1339714447 bases, 1180714477 kmers +read 5400000 sequences, 1366712530 bases, 1204712560 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.6.bin'... +read 5500000 sequences, 1394310431 bases, 1229310461 kmers +read 5600000 sequences, 1421869864 bases, 1253869894 kmers +read 5700000 sequences, 1449547608 bases, 1278547638 kmers +read 5800000 sequences, 1477685978 bases, 1303686008 kmers +read 5900000 sequences, 1505662869 bases, 1328662899 kmers +read 6000000 sequences, 1534165192 bases, 1354165222 kmers +read 6100000 sequences, 1562404847 bases, 1379404877 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.7.bin'... +read 6200000 sequences, 1591527035 bases, 1405527065 kmers +read 6300000 sequences, 1620530378 bases, 1431530408 kmers +read 6400000 sequences, 1650356135 bases, 1458356165 kmers +read 6500000 sequences, 1680100604 bases, 1485100634 kmers +read 6600000 sequences, 1709838161 bases, 1511838191 kmers +read 6700000 sequences, 1739768824 bases, 1538768854 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.8.bin'... +read 6800000 sequences, 1771033237 bases, 1567033267 kmers +read 6900000 sequences, 1802734155 bases, 1595734185 kmers +read 7000000 sequences, 1835088122 bases, 1625088152 kmers +read 7100000 sequences, 1868202990 bases, 1655203020 kmers +read 7200000 sequences, 1901851887 bases, 1685851917 kmers +read 7300000 sequences, 1936102636 bases, 1717102666 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.9.bin'... +read 7400000 sequences, 1971764013 bases, 1749764043 kmers +read 7500000 sequences, 2008379618 bases, 1783379648 kmers +read 7600000 sequences, 2046720278 bases, 1818720308 kmers +read 7700000 sequences, 2086661084 bases, 1855661114 kmers +read 7800000 sequences, 2129062919 bases, 1895062949 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.10.bin'... +read 7900000 sequences, 2174787944 bases, 1937787974 kmers +read 8000000 sequences, 2224822145 bases, 1984822175 kmers +read 8100000 sequences, 2283235897 bases, 2040235927 kmers +read 8200000 sequences, 2311905284 bases, 2065905314 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.11.bin'... +read 8300000 sequences, 2336057180 bases, 2087057210 kmers +read 8400000 sequences, 2360509664 bases, 2108509694 kmers +read 8500000 sequences, 2384831256 bases, 2129831286 kmers +read 8600000 sequences, 2409417232 bases, 2151417262 kmers +read 8700000 sequences, 2433616800 bases, 2172616830 kmers +read 8800000 sequences, 2458186051 bases, 2194186081 kmers +read 8900000 sequences, 2482411631 bases, 2215411661 kmers +read 9000000 sequences, 2506972327 bases, 2236972357 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.12.bin'... +read 9100000 sequences, 2531678245 bases, 2258678275 kmers +read 9200000 sequences, 2555989557 bases, 2279989587 kmers +read 9300000 sequences, 2580569574 bases, 2301569604 kmers +read 9400000 sequences, 2605362813 bases, 2323362843 kmers +read 9500000 sequences, 2629786923 bases, 2344786953 kmers +read 9600000 sequences, 2654330633 bases, 2366330663 kmers +read 9700000 sequences, 2679002198 bases, 2388002228 kmers +read 9800000 sequences, 2703471555 bases, 2409471585 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.13.bin'... +read 9900000 sequences, 2727977401 bases, 2430977431 kmers +read 10000000 sequences, 2751909350 bases, 2451909380 kmers +read 10100000 sequences, 2776332527 bases, 2473332557 kmers +read 10200000 sequences, 2800726002 bases, 2494726032 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277828104044627.minimizers.14.bin'... +read 10250465 sequences, 2813192630 bases, 2505678680 kmers +num_kmers 2505678680 +num_super_kmers 426160817 +num_pieces 10250466 (+0.245454 [bits/kmer]) +=== step 1: 'parse_file' 121.363 [sec] (48.4351 [ns/kmer]) + == files to merge = 15 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 426160817 +num_minimizers 389546619 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 31.7936 [sec] (12.6886 [ns/kmer]) +bits_per_offset = ceil(log2(2813192661)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764277981737441322.bucket_pairs.0.bin'... +num_singletons 378612640/389546619 (97.1932%) +=== step 3: 'build_index' 110.178 [sec] (43.9712 [ns/kmer]) +max_num_super_kmers_in_bucket 33466 +log2_max_num_super_kmers_in_bucket 16 +num_buckets_in_skew_index 42800/389546619 (0.0109871%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 11962893 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 8358542 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 5476185 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 2997306 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1840963 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1003460 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 33466: 777233 +num_kmers_in_skew_index 32416582 (1.29372%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 11962893 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 11962893 keys; bits/key = 2.99042 + built positions[0] for 11962893 keys; bits/key = 7.00003 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 8358542 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 8358542 keys; bits/key = 3.02981 + built positions[1] for 8358542 keys; bits/key = 8.00004 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 5476185 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 5476185 keys; bits/key = 3.18449 + built positions[2] for 5476185 keys; bits/key = 9.00006 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 2997306 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 2997306 keys; bits/key = 3.34393 + built positions[3] for 2997306 keys; bits/key = 10.0001 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 1840963 + building MPHF with 64 threads and 92 partitions... + built mphs[4] for 1840963 keys; bits/key = 3.12381 + built positions[4] for 1840963 keys; bits/key = 11.0002 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 1003460 + building MPHF with 64 threads and 50 partitions... + built mphs[5] for 1003460 keys; bits/key = 3.0005 + built positions[5] for 1003460 keys; bits/key = 12.0003 + lower 4096; upper 33466; num_bits_per_pos 16; keys_in_partition.size() 777233 + building MPHF with 64 threads and 38 partitions... + built mphs[6] for 777233 keys; bits/key = 2.97284 + built positions[6] for 777233 keys; bits/key = 16.0005 +num_bits_for_skew_index 374230592(0.149353 [bits/kmer]) +=== step 4: 'build_skew_index' 4.45634 [sec] (1.77849 [ns/kmer]) +=== total_time 267.79 [sec] (106.873 [ns/kmer]) +total index size: 2680470314 [B] -- 2680.47 [MB] +SPACE BREAKDOWN: + minimizers: 0.417262 [bits/kmer] (2.68395 [bits/key]) -- 4.87566% + pieces: 0.0459722 [bits/kmer] -- 0.53718% + num_super_kmers_before_bucket: 0.257528 [bits/kmer] -- 3.00918% + offsets: 5.4425 [bits/kmer] -- 63.5949% + strings: 2.24545 [bits/kmer] -- 26.2379% + skew_index: 0.149353 [bits/kmer] -- 1.74517% + weights: 5.87466e-07 [bits/kmer] -- 6.86447e-06% + weight_interval_values: 1.02168e-07 [bits/kmer] + weight_interval_lengths: 3.8313e-07 [bits/kmer] + weight_dictionary: 1.02168e-07 [bits/kmer] + -------------- + total: 8.55807 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 97.1932% +buckets with 2 super_kmers = 1.69307% +buckets with 3 super_kmers = 0.441852% +buckets with 4 super_kmers = 0.200951% +buckets with 5 super_kmers = 0.114315% +buckets with 6 super_kmers = 0.0738004% +buckets with 7 super_kmers = 0.0506224% +buckets with 8 super_kmers = 0.036724% +buckets with 9 super_kmers = 0.0279258% +buckets with 10 super_kmers = 0.0217155% +buckets with 11 super_kmers = 0.0172904% +buckets with 12 super_kmers = 0.0140499% +buckets with 13 super_kmers = 0.0117175% +buckets with 14 super_kmers = 0.00980242% +buckets with 15 super_kmers = 0.00828168% +buckets with 16 super_kmers = 0.00715729% +max_num_super_kmers_in_bucket 33466 +2025-11-27 22:14:56: saving data structure to disk... +2025-11-27 22:14:57: DONE +k = 31, m = 19, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 25244517 bases, 22244547 kmers +read 200000 sequences, 51983063 bases, 45983093 kmers +read 300000 sequences, 83502239 bases, 74502269 kmers +read 400000 sequences, 125957954 bases, 113957984 kmers +read 500000 sequences, 196376539 bases, 181376569 kmers +read 600000 sequences, 214563709 bases, 196563739 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278098218425720.minimizers.0.bin'... +read 700000 sequences, 233311986 bases, 212312016 kmers +read 800000 sequences, 251082581 bases, 227082611 kmers +read 900000 sequences, 269982481 bases, 242982511 kmers +read 1000000 sequences, 289026734 bases, 259026764 kmers +read 1100000 sequences, 308418289 bases, 275418319 kmers +read 1200000 sequences, 328185212 bases, 292185242 kmers +read 1300000 sequences, 349175412 bases, 310175442 kmers +read 1400000 sequences, 370064780 bases, 328064810 kmers +read 1500000 sequences, 391112878 bases, 346112908 kmers +read 1600000 sequences, 413509635 bases, 365509665 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278098218425720.minimizers.1.bin'... +read 1645464 sequences, 425569105 bases, 376205185 kmers +num_kmers 376205185 +num_super_kmers 55151083 +num_pieces 1645465 (+0.262431 [bits/kmer]) +=== step 1: 'parse_file' 20.8594 [sec] (55.4469 [ns/kmer]) + == files to merge = 2 +num_written_tuples = 50000000 +num_written_tuples = 55151083 +num_minimizers 52250663 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 3.27533 [sec] (8.70623 [ns/kmer]) +bits_per_offset = ceil(log2(425569136)) = 29 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278122406467019.bucket_pairs.0.bin'... +num_singletons 49978705/52250663 (95.6518%) +=== step 3: 'build_index' 8.66828 [sec] (23.0414 [ns/kmer]) +max_num_super_kmers_in_bucket 239 +log2_max_num_super_kmers_in_bucket 8 +num_buckets_in_skew_index 19/52250663 (3.63632e-05%) +num_partitions 2 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 8330 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 239: 5535 +num_kmers_in_skew_index 13865 (0.00368549%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 8330 + building MPHF with 64 threads and 1 partitions... + built mphs[0] for 8330 keys; bits/key = 3.40552 + built positions[0] for 8330 keys; bits/key = 7.04538 + lower 128; upper 239; num_bits_per_pos 8; keys_in_partition.size() 5535 + building MPHF with 64 threads and 1 partitions... + built mphs[1] for 5535 keys; bits/key = 3.5729 + built positions[1] for 5535 keys; bits/key = 8.05926 +num_bits_for_skew_index 151632(0.000403057 [bits/kmer]) +=== step 4: 'build_skew_index' 0.21561 [sec] (0.573118 [ns/kmer]) +=== total_time 33.0186 [sec] (87.7676 [ns/kmer]) +total index size: 337189658 [B] -- 337.19 [MB] +SPACE BREAKDOWN: + minimizers: 0.382683 [bits/kmer] (2.75532 [bits/key]) -- 5.33702% + pieces: 0.0487325 [bits/kmer] -- 0.679641% + num_super_kmers_before_bucket: 0.224726 [bits/kmer] -- 3.13411% + offsets: 4.25135 [bits/kmer] -- 59.2909% + strings: 2.26243 [bits/kmer] -- 31.5527% + skew_index: 0.000403057 [bits/kmer] -- 0.00562117% + weights: 3.91276e-06 [bits/kmer] -- 5.45687e-05% + weight_interval_values: 6.8048e-07 [bits/kmer] + weight_interval_lengths: 2.5518e-06 [bits/kmer] + weight_dictionary: 6.8048e-07 [bits/kmer] + -------------- + total: 7.17034 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 95.6518% +buckets with 2 super_kmers = 3.56262% +buckets with 3 super_kmers = 0.561857% +buckets with 4 super_kmers = 0.137876% +buckets with 5 super_kmers = 0.0462769% +buckets with 6 super_kmers = 0.0191175% +buckets with 7 super_kmers = 0.00872525% +buckets with 8 super_kmers = 0.00430234% +buckets with 9 super_kmers = 0.00245356% +buckets with 10 super_kmers = 0.0014373% +buckets with 11 super_kmers = 0.000855492% +buckets with 12 super_kmers = 0.00061626% +buckets with 13 super_kmers = 0.000449755% +buckets with 14 super_kmers = 0.000266025% +buckets with 15 super_kmers = 0.000218179% +buckets with 16 super_kmers = 0.000126314% +max_num_super_kmers_in_bucket 239 +2025-11-27 22:15:31: saving data structure to disk... +2025-11-27 22:15:31: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 8718376 bases, 5718406 kmers +read 200000 sequences, 17474036 bases, 11474066 kmers +read 300000 sequences, 26299388 bases, 17299418 kmers +read 400000 sequences, 35167021 bases, 23167051 kmers +read 500000 sequences, 43967859 bases, 28967889 kmers +read 600000 sequences, 52886411 bases, 34886441 kmers +read 700000 sequences, 61937165 bases, 40937195 kmers +read 800000 sequences, 71070675 bases, 47070705 kmers +read 900000 sequences, 80176820 bases, 53176850 kmers +read 1000000 sequences, 89525814 bases, 59525844 kmers +read 1100000 sequences, 98984767 bases, 65984797 kmers +read 1200000 sequences, 108719822 bases, 72719852 kmers +read 1300000 sequences, 118280750 bases, 79280780 kmers +read 1400000 sequences, 127917709 bases, 85917739 kmers +read 1500000 sequences, 137591502 bases, 92591532 kmers +read 1600000 sequences, 147395162 bases, 99395192 kmers +read 1700000 sequences, 157334953 bases, 106334983 kmers +read 1800000 sequences, 167444668 bases, 113444698 kmers +read 1900000 sequences, 177725512 bases, 120725542 kmers +read 2000000 sequences, 188052017 bases, 128052047 kmers +read 2100000 sequences, 198499489 bases, 135499519 kmers +read 2200000 sequences, 209053217 bases, 143053247 kmers +read 2300000 sequences, 219847953 bases, 150847983 kmers +read 2400000 sequences, 230787134 bases, 158787164 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.0.bin'... +read 2500000 sequences, 242014317 bases, 167014347 kmers +read 2600000 sequences, 253501939 bases, 175501969 kmers +read 2700000 sequences, 265108629 bases, 184108659 kmers +read 2800000 sequences, 277040099 bases, 193040129 kmers +read 2900000 sequences, 289406610 bases, 202406640 kmers +read 3000000 sequences, 302142147 bases, 212142177 kmers +read 3100000 sequences, 315168399 bases, 222168429 kmers +read 3200000 sequences, 329083022 bases, 233083052 kmers +read 3300000 sequences, 343507959 bases, 244507989 kmers +read 3400000 sequences, 358607940 bases, 256607970 kmers +read 3500000 sequences, 374790281 bases, 269790311 kmers +read 3600000 sequences, 392123240 bases, 284123270 kmers +read 3700000 sequences, 410698110 bases, 299698140 kmers +read 3800000 sequences, 431358012 bases, 317358042 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.1.bin'... +read 3900000 sequences, 454179419 bases, 337179449 kmers +read 4000000 sequences, 461236464 bases, 341236494 kmers +read 4100000 sequences, 468031488 bases, 345031518 kmers +read 4200000 sequences, 474889537 bases, 348889567 kmers +read 4300000 sequences, 481729647 bases, 352729677 kmers +read 4400000 sequences, 488721923 bases, 356721953 kmers +read 4500000 sequences, 495625017 bases, 360625047 kmers +read 4600000 sequences, 502596529 bases, 364596559 kmers +read 4700000 sequences, 509600468 bases, 368600498 kmers +read 4800000 sequences, 516484409 bases, 372484439 kmers +read 4900000 sequences, 523427172 bases, 376427202 kmers +read 5000000 sequences, 530371696 bases, 380371726 kmers +read 5100000 sequences, 537329533 bases, 384329563 kmers +read 5200000 sequences, 544209307 bases, 388209337 kmers +read 5300000 sequences, 551189884 bases, 392189914 kmers +read 5400000 sequences, 558101859 bases, 396101889 kmers +read 5500000 sequences, 565120102 bases, 400120132 kmers +read 5600000 sequences, 572157514 bases, 404157544 kmers +read 5700000 sequences, 579064805 bases, 408064835 kmers +read 5800000 sequences, 586002650 bases, 412002680 kmers +read 5900000 sequences, 592940870 bases, 415940900 kmers +read 6000000 sequences, 600036436 bases, 420036466 kmers +read 6100000 sequences, 607035741 bases, 424035771 kmers +read 6200000 sequences, 614208655 bases, 428208685 kmers +read 6300000 sequences, 621168185 bases, 432168215 kmers +read 6400000 sequences, 628072415 bases, 436072445 kmers +read 6500000 sequences, 635102553 bases, 440102583 kmers +read 6600000 sequences, 642120687 bases, 444120717 kmers +read 6700000 sequences, 649088919 bases, 448088949 kmers +read 6800000 sequences, 656101716 bases, 452101746 kmers +read 6900000 sequences, 663148824 bases, 456148854 kmers +read 7000000 sequences, 670072415 bases, 460072445 kmers +read 7100000 sequences, 677027793 bases, 464027823 kmers +read 7200000 sequences, 684172149 bases, 468172179 kmers +read 7300000 sequences, 691211136 bases, 472211166 kmers +read 7400000 sequences, 698208759 bases, 476208789 kmers +read 7500000 sequences, 705328918 bases, 480328948 kmers +read 7600000 sequences, 712360901 bases, 484360931 kmers +read 7700000 sequences, 719471743 bases, 488471773 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.2.bin'... +read 7800000 sequences, 726605082 bases, 492605112 kmers +read 7900000 sequences, 733774553 bases, 496774583 kmers +read 8000000 sequences, 740830630 bases, 500830660 kmers +read 8100000 sequences, 747950142 bases, 504950172 kmers +read 8200000 sequences, 755058699 bases, 509058729 kmers +read 8300000 sequences, 762216366 bases, 513216396 kmers +read 8400000 sequences, 769353795 bases, 517353825 kmers +read 8500000 sequences, 776583104 bases, 521583134 kmers +read 8600000 sequences, 783816161 bases, 525816191 kmers +read 8700000 sequences, 791077309 bases, 530077339 kmers +read 8800000 sequences, 798157720 bases, 534157750 kmers +read 8900000 sequences, 805240984 bases, 538241014 kmers +read 9000000 sequences, 812530422 bases, 542530452 kmers +read 9100000 sequences, 819617660 bases, 546617690 kmers +read 9200000 sequences, 826809679 bases, 550809709 kmers +read 9300000 sequences, 833919076 bases, 554919106 kmers +read 9400000 sequences, 841155631 bases, 559155661 kmers +read 9500000 sequences, 848401634 bases, 563401664 kmers +read 9600000 sequences, 855643616 bases, 567643646 kmers +read 9700000 sequences, 862872646 bases, 571872676 kmers +read 9800000 sequences, 870171662 bases, 576171692 kmers +read 9900000 sequences, 877460842 bases, 580460872 kmers +read 10000000 sequences, 884692117 bases, 584692147 kmers +read 10100000 sequences, 891988881 bases, 588988911 kmers +read 10200000 sequences, 899332113 bases, 593332143 kmers +read 10300000 sequences, 906596087 bases, 597596117 kmers +read 10400000 sequences, 913914165 bases, 601914195 kmers +read 10500000 sequences, 921197132 bases, 606197162 kmers +read 10600000 sequences, 928621300 bases, 610621330 kmers +read 10700000 sequences, 935962513 bases, 614962543 kmers +read 10800000 sequences, 943225364 bases, 619225394 kmers +read 10900000 sequences, 950606220 bases, 623606250 kmers +read 11000000 sequences, 958222210 bases, 628222240 kmers +read 11100000 sequences, 965609577 bases, 632609607 kmers +read 11200000 sequences, 972999540 bases, 636999570 kmers +read 11300000 sequences, 980385943 bases, 641385973 kmers +read 11400000 sequences, 987756659 bases, 645756689 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.3.bin'... +read 11500000 sequences, 995228579 bases, 650228609 kmers +read 11600000 sequences, 1002715916 bases, 654715946 kmers +read 11700000 sequences, 1010163181 bases, 659163211 kmers +read 11800000 sequences, 1017603999 bases, 663604029 kmers +read 11900000 sequences, 1025150283 bases, 668150313 kmers +read 12000000 sequences, 1032736012 bases, 672736042 kmers +read 12100000 sequences, 1040213462 bases, 677213492 kmers +read 12200000 sequences, 1047864710 bases, 681864740 kmers +read 12300000 sequences, 1055370919 bases, 686370949 kmers +read 12400000 sequences, 1062882101 bases, 690882131 kmers +read 12500000 sequences, 1070457753 bases, 695457783 kmers +read 12600000 sequences, 1078056452 bases, 700056482 kmers +read 12700000 sequences, 1085619838 bases, 704619868 kmers +read 12800000 sequences, 1093220312 bases, 709220342 kmers +read 12900000 sequences, 1100937956 bases, 713937986 kmers +read 13000000 sequences, 1108501138 bases, 718501168 kmers +read 13100000 sequences, 1116117632 bases, 723117662 kmers +read 13200000 sequences, 1123791900 bases, 727791930 kmers +read 13300000 sequences, 1131456231 bases, 732456261 kmers +read 13400000 sequences, 1139167200 bases, 737167230 kmers +read 13500000 sequences, 1147084189 bases, 742084219 kmers +read 13600000 sequences, 1154903385 bases, 746903415 kmers +read 13700000 sequences, 1162719538 bases, 751719568 kmers +read 13800000 sequences, 1170515131 bases, 756515161 kmers +read 13900000 sequences, 1178310843 bases, 761310873 kmers +read 14000000 sequences, 1186158447 bases, 766158477 kmers +read 14100000 sequences, 1194143426 bases, 771143456 kmers +read 14200000 sequences, 1202037098 bases, 776037128 kmers +read 14300000 sequences, 1210016683 bases, 781016713 kmers +read 14400000 sequences, 1217929646 bases, 785929676 kmers +read 14500000 sequences, 1226009490 bases, 791009520 kmers +read 14600000 sequences, 1233936479 bases, 795936509 kmers +read 14700000 sequences, 1241953750 bases, 800953780 kmers +read 14800000 sequences, 1249971870 bases, 805971900 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.4.bin'... +read 14900000 sequences, 1258011905 bases, 811011935 kmers +read 15000000 sequences, 1266102845 bases, 816102875 kmers +read 15100000 sequences, 1274149642 bases, 821149672 kmers +read 15200000 sequences, 1282474792 bases, 826474822 kmers +read 15300000 sequences, 1290768894 bases, 831768924 kmers +read 15400000 sequences, 1299121736 bases, 837121766 kmers +read 15500000 sequences, 1307304137 bases, 842304167 kmers +read 15600000 sequences, 1315661695 bases, 847661725 kmers +read 15700000 sequences, 1324089803 bases, 853089833 kmers +read 15800000 sequences, 1332318556 bases, 858318586 kmers +read 15900000 sequences, 1340760519 bases, 863760549 kmers +read 16000000 sequences, 1349263730 bases, 869263760 kmers +read 16100000 sequences, 1357811657 bases, 874811687 kmers +read 16200000 sequences, 1366358116 bases, 880358146 kmers +read 16300000 sequences, 1375026989 bases, 886027019 kmers +read 16400000 sequences, 1383710154 bases, 891710184 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278131588822619.minimizers.5.bin'... +read 16440873 sequences, 1387536274 bases, 894310084 kmers +num_kmers 894310084 +num_super_kmers 162771744 +num_pieces 16440874 (+1.10303 [bits/kmer]) +=== step 1: 'parse_file' 46.7945 [sec] (52.3247 [ns/kmer]) + == files to merge = 6 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 162771744 +num_minimizers 126769732 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 10.0352 [sec] (11.2212 [ns/kmer]) +bits_per_offset = ceil(log2(1387536305)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278188592687083.bucket_pairs.0.bin'... +num_singletons 112630701/126769732 (88.8467%) +=== step 3: 'build_index' 31.4503 [sec] (35.1671 [ns/kmer]) +max_num_super_kmers_in_bucket 51789 +log2_max_num_super_kmers_in_bucket 16 +num_buckets_in_skew_index 8370/126769732 (0.00660252%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 2275161 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 1223509 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 863425 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 648516 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 426533 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 398117 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 51789: 631711 +num_kmers_in_skew_index 6466972 (0.723124%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 2275161 + building MPHF with 64 threads and 113 partitions... + built mphs[0] for 2275161 keys; bits/key = 3.14493 + built positions[0] for 2275161 keys; bits/key = 7.00015 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 1223509 + building MPHF with 64 threads and 61 partitions... + built mphs[1] for 1223509 keys; bits/key = 3.02551 + built positions[1] for 1223509 keys; bits/key = 8.00028 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 863425 + building MPHF with 64 threads and 43 partitions... + built mphs[2] for 863425 keys; bits/key = 2.98758 + built positions[2] for 863425 keys; bits/key = 9.00043 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 648516 + building MPHF with 64 threads and 32 partitions... + built mphs[3] for 648516 keys; bits/key = 2.97413 + built positions[3] for 648516 keys; bits/key = 10.0005 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 426533 + building MPHF with 64 threads and 21 partitions... + built mphs[4] for 426533 keys; bits/key = 2.95521 + built positions[4] for 426533 keys; bits/key = 11.0008 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 398117 + building MPHF with 64 threads and 19 partitions... + built mphs[5] for 398117 keys; bits/key = 2.92545 + built positions[5] for 398117 keys; bits/key = 12.0008 + lower 4096; upper 51789; num_bits_per_pos 16; keys_in_partition.size() 631711 + building MPHF with 64 threads and 31 partitions... + built mphs[6] for 631711 keys; bits/key = 2.97017 + built positions[6] for 631711 keys; bits/key = 16.0005 +num_bits_for_skew_index 79216192(0.088578 [bits/kmer]) +=== step 4: 'build_skew_index' 1.3006 [sec] (1.45431 [ns/kmer]) +=== total_time 89.5806 [sec] (100.167 [ns/kmer]) +total index size: 1078619646 [B] -- 1078.62 [MB] +SPACE BREAKDOWN: + minimizers: 0.376213 [bits/kmer] (2.65403 [bits/key]) -- 3.89909% + pieces: 0.176908 [bits/kmer] -- 1.83349% + num_super_kmers_before_bucket: 0.261745 [bits/kmer] -- 2.71274% + offsets: 5.64225 [bits/kmer] -- 58.4766% + strings: 3.10303 [bits/kmer] -- 32.16% + skew_index: 0.088578 [bits/kmer] -- 0.918027% + weights: 1.64596e-06 [bits/kmer] -- 1.70588e-05% + weight_interval_values: 2.86254e-07 [bits/kmer] + weight_interval_lengths: 1.07345e-06 [bits/kmer] + weight_dictionary: 2.86254e-07 [bits/kmer] + -------------- + total: 9.64873 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 88.8467% +buckets with 2 super_kmers = 6.6467% +buckets with 3 super_kmers = 1.83072% +buckets with 4 super_kmers = 0.816895% +buckets with 5 super_kmers = 0.474662% +buckets with 6 super_kmers = 0.31934% +buckets with 7 super_kmers = 0.234625% +buckets with 8 super_kmers = 0.179613% +buckets with 9 super_kmers = 0.139152% +buckets with 10 super_kmers = 0.108534% +buckets with 11 super_kmers = 0.0830316% +buckets with 12 super_kmers = 0.0640003% +buckets with 13 super_kmers = 0.048454% +buckets with 14 super_kmers = 0.0367493% +buckets with 15 super_kmers = 0.028166% +buckets with 16 super_kmers = 0.0216187% +max_num_super_kmers_in_bucket 51789 +2025-11-27 22:17:01: saving data structure to disk... +2025-11-27 22:17:01: DONE +k = 31, m = 21, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 15142600 bases, 12142630 kmers +read 200000 sequences, 30291716 bases, 24291746 kmers +read 300000 sequences, 45689080 bases, 36689110 kmers +read 400000 sequences, 61242824 bases, 49242854 kmers +read 500000 sequences, 77204688 bases, 62204718 kmers +read 600000 sequences, 93322728 bases, 75322758 kmers +read 700000 sequences, 109580784 bases, 88580814 kmers +read 800000 sequences, 126019199 bases, 102019229 kmers +read 900000 sequences, 142771255 bases, 115771285 kmers +read 1000000 sequences, 159860280 bases, 129860310 kmers +read 1100000 sequences, 177221889 bases, 144221919 kmers +read 1200000 sequences, 194614623 bases, 158614653 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.0.bin'... +read 1300000 sequences, 212431367 bases, 173431397 kmers +read 1400000 sequences, 230443062 bases, 188443092 kmers +read 1500000 sequences, 248830724 bases, 203830754 kmers +read 1600000 sequences, 267495814 bases, 219495844 kmers +read 1700000 sequences, 286467424 bases, 235467454 kmers +read 1800000 sequences, 305974756 bases, 251974786 kmers +read 1900000 sequences, 325573452 bases, 268573482 kmers +read 2000000 sequences, 345518992 bases, 285519022 kmers +read 2100000 sequences, 365932818 bases, 302932848 kmers +read 2200000 sequences, 386928554 bases, 320928584 kmers +read 2300000 sequences, 408196559 bases, 339196589 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.1.bin'... +read 2400000 sequences, 429705966 bases, 357705996 kmers +read 2500000 sequences, 451663903 bases, 376663933 kmers +read 2600000 sequences, 474186039 bases, 396186069 kmers +read 2700000 sequences, 497212102 bases, 416212132 kmers +read 2800000 sequences, 520661914 bases, 436661944 kmers +read 2900000 sequences, 544613770 bases, 457613800 kmers +read 3000000 sequences, 569210361 bases, 479210391 kmers +read 3100000 sequences, 594100200 bases, 501100230 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.2.bin'... +read 3200000 sequences, 619323714 bases, 523323744 kmers +read 3300000 sequences, 645628376 bases, 546628406 kmers +read 3400000 sequences, 672447793 bases, 570447823 kmers +read 3500000 sequences, 699905664 bases, 594905694 kmers +read 3600000 sequences, 728253444 bases, 620253474 kmers +read 3700000 sequences, 756996641 bases, 645996671 kmers +read 3800000 sequences, 786498161 bases, 672498191 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.3.bin'... +read 3900000 sequences, 816910234 bases, 699910264 kmers +read 4000000 sequences, 848332113 bases, 728332143 kmers +read 4100000 sequences, 880941119 bases, 757941149 kmers +read 4200000 sequences, 914418229 bases, 788418259 kmers +read 4300000 sequences, 948701080 bases, 819701110 kmers +read 4400000 sequences, 984340067 bases, 852340097 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.4.bin'... +read 4500000 sequences, 1021325774 bases, 886325804 kmers +read 4600000 sequences, 1059629391 bases, 921629421 kmers +read 4700000 sequences, 1098776183 bases, 957776213 kmers +read 4800000 sequences, 1139816048 bases, 995816078 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.5.bin'... +read 4900000 sequences, 1182502543 bases, 1035502573 kmers +read 5000000 sequences, 1226889874 bases, 1076889904 kmers +read 5100000 sequences, 1272830961 bases, 1119830991 kmers +read 5200000 sequences, 1320724320 bases, 1164724350 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.6.bin'... +read 5300000 sequences, 1371130682 bases, 1212130712 kmers +read 5400000 sequences, 1423474687 bases, 1261474717 kmers +read 5500000 sequences, 1478532677 bases, 1313532707 kmers +read 5600000 sequences, 1536511057 bases, 1368511087 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.7.bin'... +read 5700000 sequences, 1597650497 bases, 1426650527 kmers +read 5800000 sequences, 1661331597 bases, 1487331627 kmers +read 5900000 sequences, 1728788299 bases, 1551788329 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.8.bin'... +read 6000000 sequences, 1800462732 bases, 1620462762 kmers +read 6100000 sequences, 1855582708 bases, 1672582738 kmers +read 6200000 sequences, 1861290572 bases, 1675290602 kmers +read 6300000 sequences, 1866991959 bases, 1677991989 kmers +read 6400000 sequences, 1872712703 bases, 1680712733 kmers +read 6500000 sequences, 1878412742 bases, 1683412772 kmers +read 6600000 sequences, 1884126738 bases, 1686126768 kmers +read 6700000 sequences, 1889847765 bases, 1688847795 kmers +read 6800000 sequences, 1895565065 bases, 1691565095 kmers +read 6900000 sequences, 1901268580 bases, 1694268610 kmers +read 7000000 sequences, 1906975331 bases, 1696975361 kmers +read 7100000 sequences, 1912694936 bases, 1699694966 kmers +read 7200000 sequences, 1918405386 bases, 1702405416 kmers +read 7300000 sequences, 1924111712 bases, 1705111742 kmers +read 7400000 sequences, 1929830119 bases, 1707830149 kmers +read 7500000 sequences, 1935539974 bases, 1710540004 kmers +read 7600000 sequences, 1941266098 bases, 1713266128 kmers +read 7700000 sequences, 1946976061 bases, 1715976091 kmers +read 7800000 sequences, 1952688102 bases, 1718688132 kmers +read 7900000 sequences, 1958401942 bases, 1721401972 kmers +read 8000000 sequences, 1964117224 bases, 1724117254 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.9.bin'... +read 8100000 sequences, 1969830329 bases, 1726830359 kmers +read 8200000 sequences, 1975558497 bases, 1729558527 kmers +read 8300000 sequences, 1981283991 bases, 1732284021 kmers +read 8400000 sequences, 1986995233 bases, 1734995263 kmers +read 8500000 sequences, 1992721377 bases, 1737721407 kmers +read 8600000 sequences, 1998449484 bases, 1740449514 kmers +read 8700000 sequences, 2004184325 bases, 1743184355 kmers +read 8800000 sequences, 2009910285 bases, 1745910315 kmers +read 8900000 sequences, 2015628049 bases, 1748628079 kmers +read 9000000 sequences, 2021346657 bases, 1751346687 kmers +read 9100000 sequences, 2027081520 bases, 1754081550 kmers +read 9200000 sequences, 2032818008 bases, 1756818038 kmers +read 9300000 sequences, 2038553000 bases, 1759553030 kmers +read 9400000 sequences, 2044303164 bases, 1762303194 kmers +read 9500000 sequences, 2050045456 bases, 1765045486 kmers +read 9600000 sequences, 2055782084 bases, 1767782114 kmers +read 9700000 sequences, 2061515459 bases, 1770515489 kmers +read 9800000 sequences, 2067264696 bases, 1773264726 kmers +read 9900000 sequences, 2073029586 bases, 1776029616 kmers +read 10000000 sequences, 2078777071 bases, 1778777101 kmers +read 10100000 sequences, 2084516688 bases, 1781516718 kmers +read 10200000 sequences, 2090254180 bases, 1784254210 kmers +read 10300000 sequences, 2096010791 bases, 1787010821 kmers +read 10400000 sequences, 2101750068 bases, 1789750098 kmers +read 10500000 sequences, 2107490469 bases, 1792490499 kmers +read 10600000 sequences, 2113226774 bases, 1795226804 kmers +read 10700000 sequences, 2118983996 bases, 1797984026 kmers +read 10800000 sequences, 2124753124 bases, 1800753154 kmers +read 10900000 sequences, 2130500309 bases, 1803500339 kmers +read 11000000 sequences, 2136245797 bases, 1806245827 kmers +read 11100000 sequences, 2141998968 bases, 1808998998 kmers +read 11200000 sequences, 2147751449 bases, 1811751479 kmers +read 11300000 sequences, 2153511605 bases, 1814511635 kmers +read 11400000 sequences, 2159254615 bases, 1817254645 kmers +read 11500000 sequences, 2165018820 bases, 1820018850 kmers +read 11600000 sequences, 2170788091 bases, 1822788121 kmers +read 11700000 sequences, 2176561459 bases, 1825561489 kmers +read 11800000 sequences, 2182327393 bases, 1828327423 kmers +read 11900000 sequences, 2188093393 bases, 1831093423 kmers +read 12000000 sequences, 2193864455 bases, 1833864485 kmers +read 12100000 sequences, 2199639949 bases, 1836639979 kmers +read 12200000 sequences, 2205409553 bases, 1839409583 kmers +read 12300000 sequences, 2211196032 bases, 1842196062 kmers +read 12400000 sequences, 2216980660 bases, 1844980690 kmers +read 12500000 sequences, 2222778653 bases, 1847778683 kmers +read 12600000 sequences, 2228548298 bases, 1850548328 kmers +read 12700000 sequences, 2234333686 bases, 1853333716 kmers +read 12800000 sequences, 2240119243 bases, 1856119273 kmers +read 12900000 sequences, 2245909832 bases, 1858909862 kmers +read 13000000 sequences, 2251713079 bases, 1861713109 kmers +read 13100000 sequences, 2257517156 bases, 1864517186 kmers +read 13200000 sequences, 2263299799 bases, 1867299829 kmers +read 13300000 sequences, 2269090355 bases, 1870090385 kmers +read 13400000 sequences, 2274889056 bases, 1872889086 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.10.bin'... +read 13500000 sequences, 2280679358 bases, 1875679388 kmers +read 13600000 sequences, 2286496297 bases, 1878496327 kmers +read 13700000 sequences, 2292303406 bases, 1881303436 kmers +read 13800000 sequences, 2298095843 bases, 1884095873 kmers +read 13900000 sequences, 2303896230 bases, 1886896260 kmers +read 14000000 sequences, 2309685280 bases, 1889685310 kmers +read 14100000 sequences, 2315487789 bases, 1892487819 kmers +read 14200000 sequences, 2321299096 bases, 1895299126 kmers +read 14300000 sequences, 2327098692 bases, 1898098722 kmers +read 14400000 sequences, 2332930649 bases, 1900930679 kmers +read 14500000 sequences, 2338742250 bases, 1903742280 kmers +read 14600000 sequences, 2344551767 bases, 1906551797 kmers +read 14700000 sequences, 2350372494 bases, 1909372524 kmers +read 14800000 sequences, 2356184423 bases, 1912184453 kmers +read 14900000 sequences, 2362012427 bases, 1915012457 kmers +read 15000000 sequences, 2367830829 bases, 1917830859 kmers +read 15100000 sequences, 2373646109 bases, 1920646139 kmers +read 15200000 sequences, 2379487578 bases, 1923487608 kmers +read 15300000 sequences, 2385319549 bases, 1926319579 kmers +read 15400000 sequences, 2391159959 bases, 1929159989 kmers +read 15500000 sequences, 2396996685 bases, 1931996715 kmers +read 15600000 sequences, 2402827442 bases, 1934827472 kmers +read 15700000 sequences, 2408655214 bases, 1937655244 kmers +read 15800000 sequences, 2414491211 bases, 1940491241 kmers +read 15900000 sequences, 2420340361 bases, 1943340391 kmers +read 16000000 sequences, 2426185046 bases, 1946185076 kmers +read 16100000 sequences, 2432032084 bases, 1949032114 kmers +read 16200000 sequences, 2437865309 bases, 1951865339 kmers +read 16300000 sequences, 2443712415 bases, 1954712445 kmers +read 16400000 sequences, 2449571035 bases, 1957571065 kmers +read 16500000 sequences, 2455436767 bases, 1960436797 kmers +read 16600000 sequences, 2461294139 bases, 1963294169 kmers +read 16700000 sequences, 2467151066 bases, 1966151096 kmers +read 16800000 sequences, 2473014518 bases, 1969014548 kmers +read 16900000 sequences, 2478879148 bases, 1971879178 kmers +read 17000000 sequences, 2484756311 bases, 1974756341 kmers +read 17100000 sequences, 2490639911 bases, 1977639941 kmers +read 17200000 sequences, 2496505090 bases, 1980505120 kmers +read 17300000 sequences, 2502376237 bases, 1983376267 kmers +read 17400000 sequences, 2508235866 bases, 1986235896 kmers +read 17500000 sequences, 2514118929 bases, 1989118959 kmers +read 17600000 sequences, 2520003821 bases, 1992003851 kmers +read 17700000 sequences, 2525879572 bases, 1994879602 kmers +read 17800000 sequences, 2531769727 bases, 1997769757 kmers +read 17900000 sequences, 2537665456 bases, 2000665486 kmers +read 18000000 sequences, 2543560738 bases, 2003560768 kmers +read 18100000 sequences, 2549454266 bases, 2006454296 kmers +read 18200000 sequences, 2555337271 bases, 2009337301 kmers +read 18300000 sequences, 2561224774 bases, 2012224804 kmers +read 18400000 sequences, 2567143057 bases, 2015143087 kmers +read 18500000 sequences, 2573036123 bases, 2018036153 kmers +read 18600000 sequences, 2578923948 bases, 2020923978 kmers +read 18700000 sequences, 2584830711 bases, 2023830741 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.11.bin'... +read 18800000 sequences, 2590732809 bases, 2026732839 kmers +read 18900000 sequences, 2596629138 bases, 2029629168 kmers +read 19000000 sequences, 2602544769 bases, 2032544799 kmers +read 19100000 sequences, 2608476616 bases, 2035476646 kmers +read 19200000 sequences, 2614389831 bases, 2038389861 kmers +read 19300000 sequences, 2620312306 bases, 2041312336 kmers +read 19400000 sequences, 2626244668 bases, 2044244698 kmers +read 19500000 sequences, 2632165840 bases, 2047165870 kmers +read 19600000 sequences, 2638096284 bases, 2050096314 kmers +read 19700000 sequences, 2644022948 bases, 2053022978 kmers +read 19800000 sequences, 2649949779 bases, 2055949809 kmers +read 19900000 sequences, 2655887655 bases, 2058887685 kmers +read 20000000 sequences, 2661829270 bases, 2061829300 kmers +read 20100000 sequences, 2667773885 bases, 2064773915 kmers +read 20200000 sequences, 2673731680 bases, 2067731710 kmers +read 20300000 sequences, 2679668638 bases, 2070668668 kmers +read 20400000 sequences, 2685621410 bases, 2073621440 kmers +read 20500000 sequences, 2691583280 bases, 2076583310 kmers +read 20600000 sequences, 2697548031 bases, 2079548061 kmers +read 20700000 sequences, 2703523021 bases, 2082523051 kmers +read 20800000 sequences, 2709482823 bases, 2085482853 kmers +read 20900000 sequences, 2715437358 bases, 2088437388 kmers +read 21000000 sequences, 2721408412 bases, 2091408442 kmers +read 21100000 sequences, 2727378283 bases, 2094378313 kmers +read 21200000 sequences, 2733356793 bases, 2097356823 kmers +read 21300000 sequences, 2739324030 bases, 2100324060 kmers +read 21400000 sequences, 2745310949 bases, 2103310979 kmers +read 21500000 sequences, 2751305483 bases, 2106305513 kmers +read 21600000 sequences, 2757279970 bases, 2109280000 kmers +read 21700000 sequences, 2763250342 bases, 2112250372 kmers +read 21800000 sequences, 2769246031 bases, 2115246061 kmers +read 21900000 sequences, 2775228369 bases, 2118228399 kmers +read 22000000 sequences, 2781228805 bases, 2121228835 kmers +read 22100000 sequences, 2787227943 bases, 2124227973 kmers +read 22200000 sequences, 2793232303 bases, 2127232333 kmers +read 22300000 sequences, 2799254476 bases, 2130254506 kmers +read 22400000 sequences, 2805268478 bases, 2133268508 kmers +read 22500000 sequences, 2811273807 bases, 2136273837 kmers +read 22600000 sequences, 2817297446 bases, 2139297476 kmers +read 22700000 sequences, 2823311839 bases, 2142311869 kmers +read 22800000 sequences, 2829348673 bases, 2145348703 kmers +read 22900000 sequences, 2835387522 bases, 2148387552 kmers +read 23000000 sequences, 2841415061 bases, 2151415091 kmers +read 23100000 sequences, 2847447355 bases, 2154447385 kmers +read 23200000 sequences, 2853464241 bases, 2157464271 kmers +read 23300000 sequences, 2859504344 bases, 2160504374 kmers +read 23400000 sequences, 2865558640 bases, 2163558670 kmers +read 23500000 sequences, 2871616623 bases, 2166616653 kmers +read 23600000 sequences, 2877666220 bases, 2169666250 kmers +read 23700000 sequences, 2883708997 bases, 2172709027 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.12.bin'... +read 23800000 sequences, 2889780064 bases, 2175780094 kmers +read 23900000 sequences, 2895851763 bases, 2178851793 kmers +read 24000000 sequences, 2901936339 bases, 2181936369 kmers +read 24100000 sequences, 2908006001 bases, 2185006031 kmers +read 24200000 sequences, 2914097489 bases, 2188097519 kmers +read 24300000 sequences, 2920158525 bases, 2191158555 kmers +read 24400000 sequences, 2926232288 bases, 2194232318 kmers +read 24500000 sequences, 2932310359 bases, 2197310389 kmers +read 24600000 sequences, 2938383670 bases, 2200383700 kmers +read 24700000 sequences, 2944455547 bases, 2203455577 kmers +read 24800000 sequences, 2950553509 bases, 2206553539 kmers +read 24900000 sequences, 2956625157 bases, 2209625187 kmers +read 25000000 sequences, 2962750710 bases, 2212750740 kmers +read 25100000 sequences, 2968838441 bases, 2215838471 kmers +read 25200000 sequences, 2974964577 bases, 2218964607 kmers +read 25300000 sequences, 2981066348 bases, 2222066378 kmers +read 25400000 sequences, 2987174670 bases, 2225174700 kmers +read 25500000 sequences, 2993287441 bases, 2228287471 kmers +read 25600000 sequences, 2999404181 bases, 2231404211 kmers +read 25700000 sequences, 3005525939 bases, 2234525969 kmers +read 25800000 sequences, 3011641818 bases, 2237641848 kmers +read 25900000 sequences, 3017762680 bases, 2240762710 kmers +read 26000000 sequences, 3023914368 bases, 2243914398 kmers +read 26100000 sequences, 3030074467 bases, 2247074497 kmers +read 26200000 sequences, 3036215358 bases, 2250215388 kmers +read 26300000 sequences, 3042374173 bases, 2253374203 kmers +read 26400000 sequences, 3048520171 bases, 2256520201 kmers +read 26500000 sequences, 3054682791 bases, 2259682821 kmers +read 26600000 sequences, 3060872341 bases, 2262872371 kmers +read 26700000 sequences, 3067031340 bases, 2266031370 kmers +read 26800000 sequences, 3073202220 bases, 2269202250 kmers +read 26900000 sequences, 3079363082 bases, 2272363112 kmers +read 27000000 sequences, 3085556027 bases, 2275556057 kmers +read 27100000 sequences, 3091751521 bases, 2278751551 kmers +read 27200000 sequences, 3097952572 bases, 2281952602 kmers +read 27300000 sequences, 3104145541 bases, 2285145571 kmers +read 27400000 sequences, 3110358894 bases, 2288358924 kmers +read 27500000 sequences, 3116536976 bases, 2291537006 kmers +read 27600000 sequences, 3122708679 bases, 2294708709 kmers +read 27700000 sequences, 3128900397 bases, 2297900427 kmers +read 27800000 sequences, 3135111542 bases, 2301111572 kmers +read 27900000 sequences, 3141317211 bases, 2304317241 kmers +read 28000000 sequences, 3147523754 bases, 2307523784 kmers +read 28100000 sequences, 3153730407 bases, 2310730437 kmers +read 28200000 sequences, 3159957684 bases, 2313957714 kmers +read 28300000 sequences, 3166181142 bases, 2317181172 kmers +read 28400000 sequences, 3172412131 bases, 2320412161 kmers +read 28500000 sequences, 3178654828 bases, 2323654858 kmers +read 28600000 sequences, 3184886524 bases, 2326886554 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.13.bin'... +read 28700000 sequences, 3191117068 bases, 2330117098 kmers +read 28800000 sequences, 3197379540 bases, 2333379570 kmers +read 28900000 sequences, 3203639436 bases, 2336639466 kmers +read 29000000 sequences, 3209891656 bases, 2339891686 kmers +read 29100000 sequences, 3216141216 bases, 2343141246 kmers +read 29200000 sequences, 3222413290 bases, 2346413320 kmers +read 29300000 sequences, 3228708327 bases, 2349708357 kmers +read 29400000 sequences, 3234965760 bases, 2352965790 kmers +read 29500000 sequences, 3241275202 bases, 2356275232 kmers +read 29600000 sequences, 3247560688 bases, 2359560718 kmers +read 29700000 sequences, 3253851429 bases, 2362851459 kmers +read 29800000 sequences, 3260147813 bases, 2366147843 kmers +read 29900000 sequences, 3266443188 bases, 2369443218 kmers +read 30000000 sequences, 3272761129 bases, 2372761159 kmers +read 30100000 sequences, 3279084870 bases, 2376084900 kmers +read 30200000 sequences, 3285396291 bases, 2379396321 kmers +read 30300000 sequences, 3291706637 bases, 2382706667 kmers +read 30400000 sequences, 3298020747 bases, 2386020777 kmers +read 30500000 sequences, 3304364961 bases, 2389364991 kmers +read 30600000 sequences, 3310727391 bases, 2392727421 kmers +read 30700000 sequences, 3317071594 bases, 2396071624 kmers +read 30800000 sequences, 3323415712 bases, 2399415742 kmers +read 30900000 sequences, 3329790954 bases, 2402790984 kmers +read 31000000 sequences, 3336150928 bases, 2406150958 kmers +read 31100000 sequences, 3342541624 bases, 2409541654 kmers +read 31200000 sequences, 3348907387 bases, 2412907417 kmers +read 31300000 sequences, 3355301252 bases, 2416301282 kmers +read 31400000 sequences, 3361677930 bases, 2419677960 kmers +read 31500000 sequences, 3368088580 bases, 2423088610 kmers +read 31600000 sequences, 3374497373 bases, 2426497403 kmers +read 31700000 sequences, 3380954973 bases, 2429955003 kmers +read 31800000 sequences, 3387385456 bases, 2433385486 kmers +read 31900000 sequences, 3393821566 bases, 2436821596 kmers +read 32000000 sequences, 3400254669 bases, 2440254699 kmers +read 32100000 sequences, 3406661433 bases, 2443661463 kmers +read 32200000 sequences, 3413130559 bases, 2447130589 kmers +read 32300000 sequences, 3419570382 bases, 2450570412 kmers +read 32400000 sequences, 3426014430 bases, 2454014460 kmers +read 32500000 sequences, 3432484446 bases, 2457484476 kmers +read 32600000 sequences, 3438957018 bases, 2460957048 kmers +read 32700000 sequences, 3445449720 bases, 2464449750 kmers +read 32800000 sequences, 3451918191 bases, 2467918221 kmers +read 32900000 sequences, 3458402208 bases, 2471402238 kmers +read 33000000 sequences, 3464886745 bases, 2474886775 kmers +read 33100000 sequences, 3471383068 bases, 2478383098 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.14.bin'... +read 33200000 sequences, 3477878747 bases, 2481878777 kmers +read 33300000 sequences, 3484417152 bases, 2485417182 kmers +read 33400000 sequences, 3490941859 bases, 2488941889 kmers +read 33500000 sequences, 3497445803 bases, 2492445833 kmers +read 33600000 sequences, 3503981393 bases, 2495981423 kmers +read 33700000 sequences, 3510547286 bases, 2499547316 kmers +read 33800000 sequences, 3517100145 bases, 2503100175 kmers +read 33900000 sequences, 3523655251 bases, 2506655281 kmers +read 34000000 sequences, 3530247130 bases, 2510247160 kmers +read 34100000 sequences, 3536826114 bases, 2513826144 kmers +read 34200000 sequences, 3543370719 bases, 2517370749 kmers +read 34300000 sequences, 3549941926 bases, 2520941956 kmers +read 34400000 sequences, 3556525084 bases, 2524525114 kmers +read 34500000 sequences, 3563130081 bases, 2528130111 kmers +read 34600000 sequences, 3569739780 bases, 2531739810 kmers +read 34700000 sequences, 3576369309 bases, 2535369339 kmers +read 34800000 sequences, 3582984603 bases, 2538984633 kmers +read 34900000 sequences, 3589639338 bases, 2542639368 kmers +read 35000000 sequences, 3596273782 bases, 2546273812 kmers +read 35100000 sequences, 3602915624 bases, 2549915654 kmers +read 35200000 sequences, 3609531465 bases, 2553531495 kmers +read 35300000 sequences, 3616196895 bases, 2557196925 kmers +read 35400000 sequences, 3622877377 bases, 2560877407 kmers +read 35500000 sequences, 3629566990 bases, 2564567020 kmers +read 35600000 sequences, 3636241308 bases, 2568241338 kmers +read 35700000 sequences, 3642914924 bases, 2571914954 kmers +read 35800000 sequences, 3649603351 bases, 2575603381 kmers +read 35900000 sequences, 3656318441 bases, 2579318471 kmers +read 36000000 sequences, 3663044755 bases, 2583044785 kmers +read 36100000 sequences, 3669777945 bases, 2586777975 kmers +read 36200000 sequences, 3676509798 bases, 2590509828 kmers +read 36300000 sequences, 3683277205 bases, 2594277235 kmers +read 36400000 sequences, 3690023259 bases, 2598023289 kmers +read 36500000 sequences, 3696780780 bases, 2601780810 kmers +read 36600000 sequences, 3703553916 bases, 2605553946 kmers +read 36700000 sequences, 3710337571 bases, 2609337601 kmers +read 36800000 sequences, 3717123025 bases, 2613123055 kmers +read 36900000 sequences, 3723910267 bases, 2616910297 kmers +read 37000000 sequences, 3730743453 bases, 2620743483 kmers +read 37100000 sequences, 3737567873 bases, 2624567903 kmers +read 37200000 sequences, 3744378273 bases, 2628378303 kmers +read 37300000 sequences, 3751211086 bases, 2632211116 kmers +read 37400000 sequences, 3758073143 bases, 2636073173 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.15.bin'... +read 37500000 sequences, 3764943116 bases, 2639943146 kmers +read 37600000 sequences, 3771815746 bases, 2643815776 kmers +read 37700000 sequences, 3778661925 bases, 2647661955 kmers +read 37800000 sequences, 3785547694 bases, 2651547724 kmers +read 37900000 sequences, 3792403153 bases, 2655403183 kmers +read 38000000 sequences, 3799297812 bases, 2659297842 kmers +read 38100000 sequences, 3806239974 bases, 2663240004 kmers +read 38200000 sequences, 3813157585 bases, 2667157615 kmers +read 38300000 sequences, 3820098418 bases, 2671098448 kmers +read 38400000 sequences, 3827045678 bases, 2675045708 kmers +read 38500000 sequences, 3834035768 bases, 2679035798 kmers +read 38600000 sequences, 3841003319 bases, 2683003349 kmers +read 38700000 sequences, 3848003705 bases, 2687003735 kmers +read 38800000 sequences, 3854998310 bases, 2690998340 kmers +read 38900000 sequences, 3861999344 bases, 2694999374 kmers +read 39000000 sequences, 3869022053 bases, 2699022083 kmers +read 39100000 sequences, 3876075267 bases, 2703075297 kmers +read 39200000 sequences, 3883150321 bases, 2707150351 kmers +read 39300000 sequences, 3890222625 bases, 2711222655 kmers +read 39400000 sequences, 3897268484 bases, 2715268514 kmers +read 39500000 sequences, 3904370112 bases, 2719370142 kmers +read 39600000 sequences, 3911448030 bases, 2723448060 kmers +read 39700000 sequences, 3918568345 bases, 2727568375 kmers +read 39800000 sequences, 3925645444 bases, 2731645474 kmers +read 39900000 sequences, 3932749408 bases, 2735749438 kmers +read 40000000 sequences, 3939899844 bases, 2739899874 kmers +read 40100000 sequences, 3947016310 bases, 2744016340 kmers +read 40200000 sequences, 3954176373 bases, 2748176403 kmers +read 40300000 sequences, 3961389382 bases, 2752389412 kmers +read 40400000 sequences, 3968552071 bases, 2756552101 kmers +read 40500000 sequences, 3975752223 bases, 2760752253 kmers +read 40600000 sequences, 3982970739 bases, 2764970769 kmers +read 40700000 sequences, 3990152709 bases, 2769152739 kmers +read 40800000 sequences, 3997405356 bases, 2773405386 kmers +read 40900000 sequences, 4004672388 bases, 2777672418 kmers +read 41000000 sequences, 4011944292 bases, 2781944322 kmers +read 41100000 sequences, 4019238344 bases, 2786238374 kmers +read 41200000 sequences, 4026519143 bases, 2790519173 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.16.bin'... +read 41300000 sequences, 4033822566 bases, 2794822596 kmers +read 41400000 sequences, 4041178251 bases, 2799178281 kmers +read 41500000 sequences, 4048493790 bases, 2803493820 kmers +read 41600000 sequences, 4055829038 bases, 2807829068 kmers +read 41700000 sequences, 4063212559 bases, 2812212589 kmers +read 41800000 sequences, 4070629890 bases, 2816629920 kmers +read 41900000 sequences, 4078028063 bases, 2821028093 kmers +read 42000000 sequences, 4085447723 bases, 2825447753 kmers +read 42100000 sequences, 4092897915 bases, 2829897945 kmers +read 42200000 sequences, 4100371858 bases, 2834371888 kmers +read 42300000 sequences, 4107845174 bases, 2838845204 kmers +read 42400000 sequences, 4115310509 bases, 2843310539 kmers +read 42500000 sequences, 4122794181 bases, 2847794211 kmers +read 42600000 sequences, 4130336752 bases, 2852336782 kmers +read 42700000 sequences, 4137838898 bases, 2856838928 kmers +read 42800000 sequences, 4145439502 bases, 2861439532 kmers +read 42900000 sequences, 4153050260 bases, 2866050290 kmers +read 43000000 sequences, 4160667131 bases, 2870667161 kmers +read 43100000 sequences, 4168281208 bases, 2875281238 kmers +read 43200000 sequences, 4175884381 bases, 2879884411 kmers +read 43300000 sequences, 4183510403 bases, 2884510433 kmers +read 43400000 sequences, 4191153977 bases, 2889154007 kmers +read 43500000 sequences, 4198862981 bases, 2893863011 kmers +read 43600000 sequences, 4206635916 bases, 2898635946 kmers +read 43700000 sequences, 4214404635 bases, 2903404665 kmers +read 43800000 sequences, 4222136044 bases, 2908136074 kmers +read 43900000 sequences, 4229915489 bases, 2912915519 kmers +read 44000000 sequences, 4237696439 bases, 2917696469 kmers +read 44100000 sequences, 4245541347 bases, 2922541377 kmers +read 44200000 sequences, 4253343569 bases, 2927343599 kmers +read 44300000 sequences, 4261209160 bases, 2932209190 kmers +read 44400000 sequences, 4269076502 bases, 2937076532 kmers +read 44500000 sequences, 4276951507 bases, 2941951537 kmers +read 44600000 sequences, 4284863476 bases, 2946863506 kmers +read 44700000 sequences, 4292779395 bases, 2951779425 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.17.bin'... +read 44800000 sequences, 4300761505 bases, 2956761535 kmers +read 44900000 sequences, 4308749134 bases, 2961749164 kmers +read 45000000 sequences, 4316730477 bases, 2966730507 kmers +read 45100000 sequences, 4324743898 bases, 2971743928 kmers +read 45200000 sequences, 4332706339 bases, 2976706369 kmers +read 45300000 sequences, 4340799702 bases, 2981799732 kmers +read 45400000 sequences, 4348938044 bases, 2986938074 kmers +read 45500000 sequences, 4357089148 bases, 2992089178 kmers +read 45600000 sequences, 4365213123 bases, 2997213153 kmers +read 45700000 sequences, 4373409255 bases, 3002409285 kmers +read 45800000 sequences, 4381555955 bases, 3007555985 kmers +read 45900000 sequences, 4389760124 bases, 3012760154 kmers +read 46000000 sequences, 4398064658 bases, 3018064688 kmers +read 46100000 sequences, 4406387022 bases, 3023387052 kmers +read 46200000 sequences, 4414694547 bases, 3028694577 kmers +read 46300000 sequences, 4423058645 bases, 3034058675 kmers +read 46400000 sequences, 4431425456 bases, 3039425486 kmers +read 46500000 sequences, 4439833395 bases, 3044833425 kmers +read 46600000 sequences, 4448259061 bases, 3050259091 kmers +read 46700000 sequences, 4456674986 bases, 3055675016 kmers +read 46800000 sequences, 4465159451 bases, 3061159481 kmers +read 46900000 sequences, 4473635424 bases, 3066635454 kmers +read 47000000 sequences, 4482251403 bases, 3072251433 kmers +read 47100000 sequences, 4490782771 bases, 3077782801 kmers +read 47200000 sequences, 4499401922 bases, 3083401952 kmers +read 47300000 sequences, 4508109132 bases, 3089109162 kmers +read 47400000 sequences, 4516742321 bases, 3094742351 kmers +read 47500000 sequences, 4525469588 bases, 3100469618 kmers +read 47600000 sequences, 4534242679 bases, 3106242709 kmers +read 47700000 sequences, 4542982876 bases, 3111982906 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.18.bin'... +read 47800000 sequences, 4551866465 bases, 3117866495 kmers +read 47900000 sequences, 4560699422 bases, 3123699452 kmers +read 48000000 sequences, 4569570230 bases, 3129570260 kmers +read 48100000 sequences, 4578501122 bases, 3135501152 kmers +read 48200000 sequences, 4587457020 bases, 3141457050 kmers +read 48300000 sequences, 4596477426 bases, 3147477456 kmers +read 48400000 sequences, 4605472867 bases, 3153472897 kmers +read 48500000 sequences, 4614570314 bases, 3159570344 kmers +read 48600000 sequences, 4623645571 bases, 3165645601 kmers +read 48700000 sequences, 4632844313 bases, 3171844343 kmers +read 48800000 sequences, 4642092013 bases, 3178092043 kmers +read 48900000 sequences, 4651346054 bases, 3184346084 kmers +read 49000000 sequences, 4660631564 bases, 3190631594 kmers +read 49100000 sequences, 4670019434 bases, 3197019464 kmers +read 49200000 sequences, 4679397122 bases, 3203397152 kmers +read 49300000 sequences, 4688892126 bases, 3209892156 kmers +read 49400000 sequences, 4698398402 bases, 3216398432 kmers +read 49500000 sequences, 4707888048 bases, 3222888078 kmers +read 49600000 sequences, 4717466104 bases, 3229466134 kmers +read 49700000 sequences, 4727070074 bases, 3236070104 kmers +read 49800000 sequences, 4736756111 bases, 3242756141 kmers +read 49900000 sequences, 4746452257 bases, 3249452287 kmers +read 50000000 sequences, 4756246274 bases, 3256246304 kmers +read 50100000 sequences, 4766057201 bases, 3263057231 kmers +read 50200000 sequences, 4775878485 bases, 3269878515 kmers +read 50300000 sequences, 4785727317 bases, 3276727347 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.19.bin'... +read 50400000 sequences, 4795653806 bases, 3283653836 kmers +read 50500000 sequences, 4805712567 bases, 3290712597 kmers +read 50600000 sequences, 4815738486 bases, 3297738516 kmers +read 50700000 sequences, 4825926061 bases, 3304926091 kmers +read 50800000 sequences, 4836224392 bases, 3312224422 kmers +read 50900000 sequences, 4846451475 bases, 3319451505 kmers +read 51000000 sequences, 4856753402 bases, 3326753432 kmers +read 51100000 sequences, 4867266326 bases, 3334266356 kmers +read 51200000 sequences, 4877861799 bases, 3341861829 kmers +read 51300000 sequences, 4888414798 bases, 3349414828 kmers +read 51400000 sequences, 4899113746 bases, 3357113776 kmers +read 51500000 sequences, 4909857519 bases, 3364857549 kmers +read 51600000 sequences, 4920671018 bases, 3372671048 kmers +read 51700000 sequences, 4931456761 bases, 3380456791 kmers +read 51800000 sequences, 4942313146 bases, 3388313176 kmers +read 51900000 sequences, 4953292346 bases, 3396292376 kmers +read 52000000 sequences, 4964398640 bases, 3404398670 kmers +read 52100000 sequences, 4975538457 bases, 3412538487 kmers +read 52200000 sequences, 4986759889 bases, 3420759919 kmers +read 52300000 sequences, 4998126697 bases, 3429126727 kmers +read 52400000 sequences, 5009563077 bases, 3437563107 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.20.bin'... +read 52500000 sequences, 5021022583 bases, 3446022613 kmers +read 52600000 sequences, 5032535927 bases, 3454535957 kmers +read 52700000 sequences, 5044218660 bases, 3463218690 kmers +read 52800000 sequences, 5055973619 bases, 3471973649 kmers +read 52900000 sequences, 5067872804 bases, 3480872834 kmers +read 53000000 sequences, 5079791399 bases, 3489791429 kmers +read 53100000 sequences, 5091783497 bases, 3498783527 kmers +read 53200000 sequences, 5103925550 bases, 3507925580 kmers +read 53300000 sequences, 5116240983 bases, 3517241013 kmers +read 53400000 sequences, 5128584923 bases, 3526584953 kmers +read 53500000 sequences, 5140962917 bases, 3535962947 kmers +read 53600000 sequences, 5153500478 bases, 3545500508 kmers +read 53700000 sequences, 5166148888 bases, 3555148918 kmers +read 53800000 sequences, 5178959197 bases, 3564959227 kmers +read 53900000 sequences, 5191971403 bases, 3574971433 kmers +read 54000000 sequences, 5205070227 bases, 3585070257 kmers +read 54100000 sequences, 5218297285 bases, 3595297315 kmers +read 54200000 sequences, 5231683093 bases, 3605683123 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.21.bin'... +read 54300000 sequences, 5245150344 bases, 3616150374 kmers +read 54400000 sequences, 5258739173 bases, 3626739203 kmers +read 54500000 sequences, 5272405047 bases, 3637405077 kmers +read 54600000 sequences, 5286362231 bases, 3648362261 kmers +read 54700000 sequences, 5300436701 bases, 3659436731 kmers +read 54800000 sequences, 5314343049 bases, 3670343079 kmers +read 54900000 sequences, 5328793168 bases, 3681793198 kmers +read 55000000 sequences, 5343494365 bases, 3693494395 kmers +read 55100000 sequences, 5358294825 bases, 3705294855 kmers +read 55200000 sequences, 5373204958 bases, 3717204988 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278222093021240.minimizers.22.bin'... +read 55207753 sequences, 5374353539 bases, 3718120949 kmers +num_kmers 3718120949 +num_super_kmers 665719630 +num_pieces 55207754 (+0.890898 [bits/kmer]) +=== step 1: 'parse_file' 193.423 [sec] (52.0218 [ns/kmer]) + == files to merge = 23 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 450000000 +num_written_tuples = 500000000 +num_written_tuples = 550000000 +num_written_tuples = 600000000 +num_written_tuples = 650000000 +num_written_tuples = 665719630 +num_minimizers 548538916 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 50.6416 [sec] (13.6202 [ns/kmer]) +bits_per_offset = ceil(log2(5374353570)) = 33 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278466893518192.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278466893518192.bucket_pairs.1.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764278466893518192.bucket_pairs.2.bin'... +num_singletons 496363606/548538916 (90.4883%) + == files to merge = 3 +num_written_pairs = 50000000 +num_written_pairs = 52175310 +=== step 3: 'build_index' 176.929 [sec] (47.5855 [ns/kmer]) +max_num_super_kmers_in_bucket 60581 +log2_max_num_super_kmers_in_bucket 16 +num_buckets_in_skew_index 108931/548538916 (0.0198584%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 28942203 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 21098680 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14673643 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 9194452 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 6106530 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 3939806 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 60581: 4902431 +num_kmers_in_skew_index 88857745 (2.38986%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 28942203 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 28942203 keys; bits/key = 2.82568 + built positions[0] for 28942203 keys; bits/key = 7.00001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 21098680 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 21098680 keys; bits/key = 2.8385 + built positions[1] for 21098680 keys; bits/key = 8.00002 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 14673643 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 14673643 keys; bits/key = 2.95348 + built positions[2] for 14673643 keys; bits/key = 9.00003 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 9194452 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 9194452 keys; bits/key = 2.99486 + built positions[3] for 9194452 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 6106530 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 6106530 keys; bits/key = 3.14313 + built positions[4] for 6106530 keys; bits/key = 11.0001 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 3939806 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 3939806 keys; bits/key = 3.19856 + built positions[5] for 3939806 keys; bits/key = 12.0001 + lower 4096; upper 60581; num_bits_per_pos 16; keys_in_partition.size() 4902431 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 4902431 keys; bits/key = 3.19579 + built positions[6] for 4902431 keys; bits/key = 16.0001 +num_bits_for_skew_index 1048290016(0.281941 [bits/kmer]) +=== step 4: 'build_skew_index' 12.7137 [sec] (3.4194 [ns/kmer]) +=== total_time 433.707 [sec] (116.647 [ns/kmer]) +total index size: 4592257806 [B] -- 4592.26 [MB] +SPACE BREAKDOWN: + minimizers: 0.3898 [bits/kmer] (2.64215 [bits/key]) -- 3.94501% + pieces: 0.14758 [bits/kmer] -- 1.4936% + num_super_kmers_before_bucket: 0.262034 [bits/kmer] -- 2.65195% + offsets: 5.90856 [bits/kmer] -- 59.7983% + strings: 2.8909 [bits/kmer] -- 29.2577% + skew_index: 0.281941 [bits/kmer] -- 2.85342% + weights: 3.95899e-07 [bits/kmer] -- 4.00674e-06% + weight_interval_values: 6.8852e-08 [bits/kmer] + weight_interval_lengths: 2.58195e-07 [bits/kmer] + weight_dictionary: 6.8852e-08 [bits/kmer] + -------------- + total: 9.88081 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 90.4883% +buckets with 2 super_kmers = 7.34098% +buckets with 3 super_kmers = 1.04053% +buckets with 4 super_kmers = 0.357644% +buckets with 5 super_kmers = 0.190087% +buckets with 6 super_kmers = 0.119244% +buckets with 7 super_kmers = 0.0815855% +buckets with 8 super_kmers = 0.0591728% +buckets with 9 super_kmers = 0.0447432% +buckets with 10 super_kmers = 0.0349151% +buckets with 11 super_kmers = 0.0279165% +buckets with 12 super_kmers = 0.0227947% +buckets with 13 super_kmers = 0.0188326% +buckets with 14 super_kmers = 0.0160384% +buckets with 15 super_kmers = 0.0135885% +buckets with 16 super_kmers = 0.0116692% +max_num_super_kmers_in_bucket 60581 +2025-11-27 22:24:17: saving data structure to disk... +2025-11-27 22:24:19: DONE diff --git a/benchmarks/results-27-11-25-v3/k31/regular-build.time.log b/benchmarks/results-27-11-25-v3/k31/regular-build.time.log new file mode 100644 index 0000000..297facb --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/regular-build.time.log @@ -0,0 +1,138 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k31.eulertigs.fa.gz -k 31 -m 20 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/cod.k31.sshash" + User time (seconds): 56.43 + System time (seconds): 4.91 + Percent of CPU this job got: 140% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:43.57 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3267596 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1285906 + Voluntary context switches: 453 + Involuntary context switches: 532 + Swaps: 0 + File system inputs: 345544 + File system outputs: 8865216 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k31.eulertigs.fa.gz -k 31 -m 20 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/kestrel.k31.sshash" + User time (seconds): 141.00 + System time (seconds): 10.78 + Percent of CPU this job got: 137% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:50.63 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 7473836 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2580204 + Voluntary context switches: 317 + Involuntary context switches: 977 + Swaps: 0 + File system inputs: 667848 + File system outputs: 20151280 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/human.k31.sshash" + User time (seconds): 400.27 + System time (seconds): 25.66 + Percent of CPU this job got: 157% + Elapsed (wall clock) time (h:mm:ss or m:ss): 4:30.11 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 13548460 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 5451900 + Voluntary context switches: 1378 + Involuntary context switches: 2990 + Swaps: 0 + File system inputs: 1725176 + File system outputs: 47635376 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k31.eulertigs.fa.gz -k 31 -m 19 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/ncbi-virus.k31.sshash" + User time (seconds): 37.45 + System time (seconds): 3.87 + Percent of CPU this job got: 123% + Elapsed (wall clock) time (h:mm:ss or m:ss): 0:33.36 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 2300480 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 963934 + Voluntary context switches: 677 + Involuntary context switches: 343 + Swaps: 0 + File system inputs: 265424 + File system outputs: 6252040 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/se.k31.sshash" + User time (seconds): 113.14 + System time (seconds): 9.40 + Percent of CPU this job got: 135% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:30.50 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 6236468 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2257001 + Voluntary context switches: 496 + Involuntary context switches: 981 + Swaps: 0 + File system inputs: 996864 + File system outputs: 17778952 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k31.eulertigs.fa.gz -k 31 -m 21 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/hprc.k31.sshash" + User time (seconds): 727.79 + System time (seconds): 37.81 + Percent of CPU this job got: 174% + Elapsed (wall clock) time (h:mm:ss or m:ss): 7:17.52 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 19294572 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 7854638 + Voluntary context switches: 1355 + Involuntary context switches: 4402 + Swaps: 0 + File system inputs: 3670336 + File system outputs: 75085936 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.log b/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.log new file mode 100644 index 0000000..5c3ef62 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.log @@ -0,0 +1,48 @@ +2025-11-28 15:11:25: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-28 15:11:48: DONE +==== query report: +num_kmers = 163287360 +num_positive_kmers = 132860997 (81.3664%) +num_searches = 26003321/132860997 (19.5718%) +num_extensions = 106857676/132860997 (80.4282%) +elapsed = 22893.3 millisec / 22.8933 sec / 0.381555 min / 140.203 ns/kmer +2025-11-28 15:11:49: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-28 15:14:35: DONE +==== query report: +num_kmers = 695737535 +num_positive_kmers = 525542891 (75.5375%) +num_searches = 91281351/525542891 (17.369%) +num_extensions = 434261540/525542891 (82.631%) +elapsed = 166627 millisec / 166.627 sec / 2.77712 min / 239.497 ns/kmer +2025-11-28 15:14:36: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 15:23:26: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1437949378 (91.5906%) +num_searches = 323160973/1437949378 (22.4737%) +num_extensions = 1114788405/1437949378 (77.5263%) +elapsed = 529247 millisec / 529.247 sec / 8.82078 min / 337.105 ns/kmer +2025-11-28 15:23:26: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-28 15:23:27: DONE +==== query report: +num_kmers = 14092875 +num_positive_kmers = 13983775 (99.2258%) +num_searches = 2503900/13983775 (17.9058%) +num_extensions = 11479875/13983775 (82.0942%) +elapsed = 1565.86 millisec / 1.56586 sec / 0.0260976 min / 111.11 ns/kmer +2025-11-28 15:23:28: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-28 15:31:05: DONE +==== query report: +num_kmers = 789838196 +num_positive_kmers = 764882549 (96.8404%) +num_searches = 309959354/764882549 (40.5238%) +num_extensions = 454923195/764882549 (59.4762%) +elapsed = 457145 millisec / 457.145 sec / 7.61908 min / 578.783 ns/kmer +2025-11-28 15:31:07: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 15:41:55: DONE +==== query report: +num_kmers = 1569974986 +num_positive_kmers = 1485223278 (94.6017%) +num_searches = 360774451/1485223278 (24.2909%) +num_extensions = 1124448827/1485223278 (75.7091%) +elapsed = 648068 millisec / 648.068 sec / 10.8011 min / 412.789 ns/kmer diff --git a/benchmarks/results-27-11-25-v3/k63/canon-bench.json b/benchmarks/results-27-11-25-v3/k63/canon-bench.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-bench.log b/benchmarks/results-27-11-25-v3/k63/canon-bench.log new file mode 100644 index 0000000..369986f --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/canon-bench.log @@ -0,0 +1,108 @@ +avg_nanosec_per_positive_lookup 876.394 +avg_nanosec_per_negative_lookup 799.672 +avg_nanosec_per_positive_lookup_advanced 884.564 +avg_nanosec_per_negative_lookup_advanced 780.401 +avg_nanosec_per_access 309.258 +iterator: avg_nanosec_per_kmer 13.8343 +avg_nanosec_per_positive_lookup 884.522 +avg_nanosec_per_negative_lookup 791.339 +avg_nanosec_per_positive_lookup_advanced 880.852 +avg_nanosec_per_negative_lookup_advanced 781.203 +avg_nanosec_per_access 306.341 +iterator: avg_nanosec_per_kmer 13.9389 +avg_nanosec_per_positive_lookup 884.412 +avg_nanosec_per_negative_lookup 775.545 +avg_nanosec_per_positive_lookup_advanced 885.548 +avg_nanosec_per_negative_lookup_advanced 786.303 +avg_nanosec_per_access 311.145 +iterator: avg_nanosec_per_kmer 13.9717 +avg_nanosec_per_positive_lookup 790.669 +avg_nanosec_per_negative_lookup 831.062 +avg_nanosec_per_positive_lookup_advanced 775.663 +avg_nanosec_per_negative_lookup_advanced 822.557 +avg_nanosec_per_access 268.456 +iterator: avg_nanosec_per_kmer 13.8201 +avg_nanosec_per_positive_lookup 788.897 +avg_nanosec_per_negative_lookup 837.625 +avg_nanosec_per_positive_lookup_advanced 795.719 +avg_nanosec_per_negative_lookup_advanced 841.535 +avg_nanosec_per_access 268.574 +iterator: avg_nanosec_per_kmer 13.7701 +avg_nanosec_per_positive_lookup 790.506 +avg_nanosec_per_negative_lookup 822.841 +avg_nanosec_per_positive_lookup_advanced 776.425 +avg_nanosec_per_negative_lookup_advanced 820.502 +avg_nanosec_per_access 271.404 +iterator: avg_nanosec_per_kmer 14.1039 +avg_nanosec_per_positive_lookup 1122.58 +avg_nanosec_per_negative_lookup 992.934 +avg_nanosec_per_positive_lookup_advanced 1106.31 +avg_nanosec_per_negative_lookup_advanced 981.115 +avg_nanosec_per_access 355.232 +iterator: avg_nanosec_per_kmer 13.7348 +avg_nanosec_per_positive_lookup 1124.01 +avg_nanosec_per_negative_lookup 985.904 +avg_nanosec_per_positive_lookup_advanced 1125.37 +avg_nanosec_per_negative_lookup_advanced 984.882 +avg_nanosec_per_access 352.495 +iterator: avg_nanosec_per_kmer 13.7978 +avg_nanosec_per_positive_lookup 1103.27 +avg_nanosec_per_negative_lookup 983.145 +avg_nanosec_per_positive_lookup_advanced 1108.69 +avg_nanosec_per_negative_lookup_advanced 982.661 +avg_nanosec_per_access 352.654 +iterator: avg_nanosec_per_kmer 14.1428 +avg_nanosec_per_positive_lookup 740.434 +avg_nanosec_per_negative_lookup 771.135 +avg_nanosec_per_positive_lookup_advanced 746.781 +avg_nanosec_per_negative_lookup_advanced 766.275 +avg_nanosec_per_access 299.402 +iterator: avg_nanosec_per_kmer 13.7976 +avg_nanosec_per_positive_lookup 742.4 +avg_nanosec_per_negative_lookup 769.248 +avg_nanosec_per_positive_lookup_advanced 745.91 +avg_nanosec_per_negative_lookup_advanced 761.47 +avg_nanosec_per_access 300.413 +iterator: avg_nanosec_per_kmer 13.9399 +avg_nanosec_per_positive_lookup 754.041 +avg_nanosec_per_negative_lookup 772.095 +avg_nanosec_per_positive_lookup_advanced 761.422 +avg_nanosec_per_negative_lookup_advanced 777.676 +avg_nanosec_per_access 301.703 +iterator: avg_nanosec_per_kmer 13.9785 +avg_nanosec_per_positive_lookup 1852.7 +avg_nanosec_per_negative_lookup 1178.69 +avg_nanosec_per_positive_lookup_advanced 1861.07 +avg_nanosec_per_negative_lookup_advanced 1181.97 +avg_nanosec_per_access 435.589 +iterator: avg_nanosec_per_kmer 14.2016 +avg_nanosec_per_positive_lookup 1862.48 +avg_nanosec_per_negative_lookup 1173.81 +avg_nanosec_per_positive_lookup_advanced 1855.42 +avg_nanosec_per_negative_lookup_advanced 1170.37 +avg_nanosec_per_access 448.032 +iterator: avg_nanosec_per_kmer 14.2286 +avg_nanosec_per_positive_lookup 1876.48 +avg_nanosec_per_negative_lookup 1178.68 +avg_nanosec_per_positive_lookup_advanced 1858.57 +avg_nanosec_per_negative_lookup_advanced 1180.2 +avg_nanosec_per_access 437.978 +iterator: avg_nanosec_per_kmer 14.1341 +avg_nanosec_per_positive_lookup 1816.43 +avg_nanosec_per_negative_lookup 1491.33 +avg_nanosec_per_positive_lookup_advanced 1810.89 +avg_nanosec_per_negative_lookup_advanced 1476.5 +avg_nanosec_per_access 683.845 +iterator: avg_nanosec_per_kmer 14.2063 +avg_nanosec_per_positive_lookup 1832.36 +avg_nanosec_per_negative_lookup 1494.86 +avg_nanosec_per_positive_lookup_advanced 1823.53 +avg_nanosec_per_negative_lookup_advanced 1486.1 +avg_nanosec_per_access 679.221 +iterator: avg_nanosec_per_kmer 14.1995 +avg_nanosec_per_positive_lookup 1808.8 +avg_nanosec_per_negative_lookup 1489.24 +avg_nanosec_per_positive_lookup_advanced 1805.45 +avg_nanosec_per_negative_lookup_advanced 1503.49 +avg_nanosec_per_access 679.005 +iterator: avg_nanosec_per_kmer 14.1574 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-build.json b/benchmarks/results-27-11-25-v3/k63/canon-build.json new file mode 100644 index 0000000..833ad3a --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/canon-build.json @@ -0,0 +1,6 @@ +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists diff --git a/benchmarks/results-27-11-25-v3/k63/canon-build.log b/benchmarks/results-27-11-25-v3/k63/canon-build.log new file mode 100644 index 0000000..02ded11 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/canon-build.log @@ -0,0 +1,1465 @@ +k = 63, m = 24, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 61951098 bases, 55751160 kmers +read 200000 sequences, 122972836 bases, 110572898 kmers +read 300000 sequences, 183599791 bases, 164999853 kmers +read 400000 sequences, 245140055 bases, 220340117 kmers +read 500000 sequences, 306871655 bases, 275871717 kmers +read 600000 sequences, 368254748 bases, 331054810 kmers +read 700000 sequences, 430272349 bases, 386872411 kmers +read 800000 sequences, 496894402 bases, 447294464 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764281980787087597.minimizers.0.bin'... +read 900000 sequences, 580548812 bases, 524748874 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764281980787087597.minimizers.1.bin'... +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +num_super_kmers 35999202 +num_pieces 954556 (+0.212663 [bits/kmer]) +=== step 1: 'parse_file' 134.198 [sec] (241.109 [ns/kmer]) + == files to merge = 2 +num_written_tuples = 35999202 +num_minimizers 29634633 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 2.01297 [sec] (3.61665 [ns/kmer]) +bits_per_offset = ceil(log2(615768131)) = 30 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282117040432330.bucket_pairs.0.bin'... +num_singletons 26933173/29634633 (90.8841%) +=== step 3: 'build_index' 4.44664 [sec] (7.98914 [ns/kmer]) +max_num_super_kmers_in_bucket 25891 +log2_max_num_super_kmers_in_bucket 15 +num_buckets_in_skew_index 5750/29634633 (0.019403%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 5076676 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 3464326 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 2275166 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1228212 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 944675 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 1172379 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 25891: 2762357 +num_kmers_in_skew_index 16923791 (3.04064%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 5076676 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 5076676 keys; bits/key = 3.18432 + built positions[0] for 5076676 keys; bits/key = 7.00007 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 3464326 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 3464326 keys; bits/key = 3.27072 + built positions[1] for 3464326 keys; bits/key = 8.0001 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 2275166 + building MPHF with 64 threads and 113 partitions... + built mphs[2] for 2275166 keys; bits/key = 3.14325 + built positions[2] for 2275166 keys; bits/key = 9.00016 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 1228212 + building MPHF with 64 threads and 61 partitions... + built mphs[3] for 1228212 keys; bits/key = 3.02254 + built positions[3] for 1228212 keys; bits/key = 10.0003 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 944675 + building MPHF with 64 threads and 47 partitions... + built mphs[4] for 944675 keys; bits/key = 2.99567 + built positions[4] for 944675 keys; bits/key = 11.0004 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 1172379 + building MPHF with 64 threads and 58 partitions... + built mphs[5] for 1172379 keys; bits/key = 3.01185 + built positions[5] for 1172379 keys; bits/key = 12.0003 + lower 4096; upper 25891; num_bits_per_pos 15; keys_in_partition.size() 2762357 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 2762357 keys; bits/key = 3.38579 + built positions[6] for 2762357 keys; bits/key = 15.0001 +num_bits_for_skew_index 215982112(0.388048 [bits/kmer]) +=== step 4: 'build_skew_index' 1.60188 [sec] (2.87805 [ns/kmer]) +=== total_time 142.259 [sec] (255.592 [ns/kmer]) +total index size: 334461174 [B] -- 334.461 [MB] +SPACE BREAKDOWN: + minimizers: 0.15013 [bits/kmer] (2.81968 [bits/key]) -- 3.12294% + pieces: 0.0214933 [bits/kmer] -- 0.447094% + num_super_kmers_before_bucket: 0.0946302 [bits/kmer] -- 1.96846% + offsets: 1.94036 [bits/kmer] -- 40.3625% + strings: 2.21266 [bits/kmer] -- 46.0269% + skew_index: 0.388048 [bits/kmer] -- 8.07202% + weights: 2.6447e-06 [bits/kmer] -- 5.50139e-05% + weight_interval_values: 4.59947e-07 [bits/kmer] + weight_interval_lengths: 1.7248e-06 [bits/kmer] + weight_dictionary: 4.59947e-07 [bits/kmer] + -------------- + total: 4.80733 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 90.8841% +buckets with 2 super_kmers = 6.99754% +buckets with 3 super_kmers = 0.925178% +buckets with 4 super_kmers = 0.38293% +buckets with 5 super_kmers = 0.209022% +buckets with 6 super_kmers = 0.128991% +buckets with 7 super_kmers = 0.086787% +buckets with 8 super_kmers = 0.0613336% +buckets with 9 super_kmers = 0.0456999% +buckets with 10 super_kmers = 0.0354855% +buckets with 11 super_kmers = 0.0268402% +buckets with 12 super_kmers = 0.0229158% +buckets with 13 super_kmers = 0.0188664% +buckets with 14 super_kmers = 0.0154178% +buckets with 15 super_kmers = 0.0131974% +buckets with 16 super_kmers = 0.0112638% +max_num_super_kmers_in_bucket 25891 +2025-11-27 23:22:03: saving data structure to disk... +2025-11-27 23:22:03: DONE +k = 63, m = 24, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282123366699764.minimizers.0.bin'... +read 100000 sequences, 726199521 bases, 719999583 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282123366699764.minimizers.1.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282123366699764.minimizers.2.bin'... +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +num_super_kmers 73789964 +num_pieces 155785 (+0.0167213 [bits/kmer]) +=== step 1: 'parse_file' 276.721 [sec] (239.534 [ns/kmer]) + == files to merge = 3 +num_written_tuples = 50000000 +num_written_tuples = 73789964 +num_minimizers 69116186 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 4.65197 [sec] (4.0268 [ns/kmer]) +bits_per_offset = ceil(log2(1164909338)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282404822659993.bucket_pairs.0.bin'... +num_singletons 65057767/69116186 (94.1281%) +=== step 3: 'build_index' 12.7972 [sec] (11.0775 [ns/kmer]) +max_num_super_kmers_in_bucket 1658 +log2_max_num_super_kmers_in_bucket 11 +num_buckets_in_skew_index 814/69116186 (0.00117773%) +num_partitions 5 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 745218 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 585708 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 406763 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 180974 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 1658: 80215 +num_kmers_in_skew_index 1998878 (0.173025%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 745218 + building MPHF with 64 threads and 37 partitions... + built mphs[0] for 745218 keys; bits/key = 2.97376 + built positions[0] for 745218 keys; bits/key = 7.0005 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 585708 + building MPHF with 64 threads and 29 partitions... + built mphs[1] for 585708 keys; bits/key = 2.96953 + built positions[1] for 585708 keys; bits/key = 8.0006 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 406763 + building MPHF with 64 threads and 20 partitions... + built mphs[2] for 406763 keys; bits/key = 2.94572 + built positions[2] for 406763 keys; bits/key = 9.00094 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 180974 + building MPHF with 64 threads and 9 partitions... + built mphs[3] for 180974 keys; bits/key = 2.92895 + built positions[3] for 180974 keys; bits/key = 10.0021 + lower 1024; upper 1658; num_bits_per_pos 11; keys_in_partition.size() 80215 + building MPHF with 64 threads and 4 partitions... + built mphs[4] for 80215 keys; bits/key = 2.93252 + built positions[4] for 80215 keys; bits/key = 11.004 +num_bits_for_skew_index 22176032(0.0191959 [bits/kmer]) +=== step 4: 'build_skew_index' 0.4794 [sec] (0.414975 [ns/kmer]) +=== total_time 294.65 [sec] (255.053 [ns/kmer]) +total index size: 617733492 [B] -- 617.733 [MB] +SPACE BREAKDOWN: + minimizers: 0.162004 [bits/kmer] (2.70783 [bits/key]) -- 3.78713% + pieces: 0.00221454 [bits/kmer] -- 0.0517689% + num_super_kmers_before_bucket: 0.0975277 [bits/kmer] -- 2.27989% + offsets: 1.98008 [bits/kmer] -- 46.2879% + strings: 2.01672 [bits/kmer] -- 47.1445% + skew_index: 0.0191959 [bits/kmer] -- 0.448738% + weights: 1.27418e-06 [bits/kmer] -- 2.97863e-05% + weight_interval_values: 2.21597e-07 [bits/kmer] + weight_interval_lengths: 8.30988e-07 [bits/kmer] + weight_dictionary: 2.21597e-07 [bits/kmer] + -------------- + total: 4.27775 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 94.1281% +buckets with 2 super_kmers = 5.60305% +buckets with 3 super_kmers = 0.178858% +buckets with 4 super_kmers = 0.0313704% +buckets with 5 super_kmers = 0.0156071% +buckets with 6 super_kmers = 0.00951007% +buckets with 7 super_kmers = 0.00636899% +buckets with 8 super_kmers = 0.00436801% +buckets with 9 super_kmers = 0.00342467% +buckets with 10 super_kmers = 0.00260286% +buckets with 11 super_kmers = 0.00198362% +buckets with 12 super_kmers = 0.00156548% +buckets with 13 super_kmers = 0.00138463% +buckets with 14 super_kmers = 0.00108079% +buckets with 15 super_kmers = 0.000963595% +buckets with 16 super_kmers = 0.000807336% +max_num_super_kmers_in_bucket 1658 +2025-11-27 23:26:58: saving data structure to disk... +2025-11-27 23:26:58: DONE +k = 63, m = 25, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 156072595 bases, 149872657 kmers +read 200000 sequences, 358422338 bases, 346022400 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.0.bin'... +read 300000 sequences, 483978517 bases, 465378579 kmers +read 400000 sequences, 579661118 bases, 554861180 kmers +read 500000 sequences, 676694662 bases, 645694724 kmers +read 600000 sequences, 771042496 bases, 733842558 kmers +read 700000 sequences, 867361949 bases, 823962011 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.1.bin'... +read 800000 sequences, 963947999 bases, 914348061 kmers +read 900000 sequences, 1061593876 bases, 1005793938 kmers +read 1000000 sequences, 1159508767 bases, 1097508829 kmers +read 1100000 sequences, 1258471359 bases, 1190271421 kmers +read 1200000 sequences, 1356700107 bases, 1282300169 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.2.bin'... +read 1300000 sequences, 1455266386 bases, 1374666448 kmers +read 1400000 sequences, 1554765716 bases, 1467965778 kmers +read 1500000 sequences, 1655325517 bases, 1562325579 kmers +read 1600000 sequences, 1756677712 bases, 1657477774 kmers +read 1700000 sequences, 1857972502 bases, 1752572564 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.3.bin'... +read 1800000 sequences, 1959725889 bases, 1848125951 kmers +read 1900000 sequences, 2064608705 bases, 1946808767 kmers +read 2000000 sequences, 2171598469 bases, 2047598531 kmers +read 2100000 sequences, 2280349838 bases, 2150149900 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.4.bin'... +read 2200000 sequences, 2390837388 bases, 2254437450 kmers +read 2300000 sequences, 2504101994 bases, 2361502056 kmers +read 2400000 sequences, 2621983258 bases, 2473183320 kmers +read 2500000 sequences, 2745887962 bases, 2590888024 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.5.bin'... +read 2600000 sequences, 2875578557 bases, 2714378619 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764282418542609190.minimizers.6.bin'... +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +num_super_kmers 183049284 +num_pieces 2642918 (+0.118255 [bits/kmer]) +=== step 1: 'parse_file' 654.74 [sec] (236.256 [ns/kmer]) + == files to merge = 7 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 183049284 +num_minimizers 150368801 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 11.44 [sec] (4.12799 [ns/kmer]) +bits_per_offset = ceil(log2(2935177010)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283084742078429.bucket_pairs.0.bin'... +num_singletons 138365468/150368801 (92.0174%) +=== step 3: 'build_index' 37.4042 [sec] (13.4969 [ns/kmer]) +max_num_super_kmers_in_bucket 80956 +log2_max_num_super_kmers_in_bucket 17 +num_buckets_in_skew_index 38821/150368801 (0.0258172%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 27564246 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 25356364 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 22733436 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19935611 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 18290988 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 15920993 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 80956: 34692171 +num_kmers_in_skew_index 164493809 (5.93558%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 27564246 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 27564246 keys; bits/key = 2.77233 + built positions[0] for 27564246 keys; bits/key = 7.00001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 25356364 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 25356364 keys; bits/key = 2.7863 + built positions[1] for 25356364 keys; bits/key = 8.00001 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 22733436 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 22733436 keys; bits/key = 2.81617 + built positions[2] for 22733436 keys; bits/key = 9.00002 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 19935611 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 19935611 keys; bits/key = 2.85625 + built positions[3] for 19935611 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 18290988 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 18290988 keys; bits/key = 2.88201 + built positions[4] for 18290988 keys; bits/key = 11 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 15920993 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 15920993 keys; bits/key = 2.92135 + built positions[5] for 15920993 keys; bits/key = 12 + lower 4096; upper 80956; num_bits_per_pos 17; keys_in_partition.size() 34692171 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 34692171 keys; bits/key = 2.80829 + built positions[6] for 34692171 keys; bits/key = 17 +num_bits_for_skew_index 2246461168(0.810612 [bits/kmer]) +=== step 4: 'build_skew_index' 21.0849 [sec] (7.60825 [ns/kmer]) +=== total_time 724.669 [sec] (261.489 [ns/kmer]) +total index size: 1834574722 [B] -- 1834.57 [MB] +SPACE BREAKDOWN: + minimizers: 0.14412 [bits/kmer] (2.65614 [bits/key]) -- 2.72135% + pieces: 0.0126433 [bits/kmer] -- 0.238738% + num_super_kmers_before_bucket: 0.0966198 [bits/kmer] -- 1.82443% + offsets: 2.11364 [bits/kmer] -- 39.911% + strings: 2.11825 [bits/kmer] -- 39.9981% + skew_index: 0.810612 [bits/kmer] -- 15.3064% + weights: 5.31156e-07 [bits/kmer] -- 1.00296e-05% + weight_interval_values: 9.23749e-08 [bits/kmer] + weight_interval_lengths: 3.46406e-07 [bits/kmer] + weight_dictionary: 9.23749e-08 [bits/kmer] + -------------- + total: 5.29589 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 92.0174% +buckets with 2 super_kmers = 6.57404% +buckets with 3 super_kmers = 0.622859% +buckets with 4 super_kmers = 0.231803% +buckets with 5 super_kmers = 0.1262% +buckets with 6 super_kmers = 0.080006% +buckets with 7 super_kmers = 0.0549768% +buckets with 8 super_kmers = 0.0401785% +buckets with 9 super_kmers = 0.0304717% +buckets with 10 super_kmers = 0.0240861% +buckets with 11 super_kmers = 0.0194163% +buckets with 12 super_kmers = 0.0160598% +buckets with 13 super_kmers = 0.0135819% +buckets with 14 super_kmers = 0.0115616% +buckets with 15 super_kmers = 0.00982252% +buckets with 16 super_kmers = 0.0086913% +max_num_super_kmers_in_bucket 80956 +2025-11-27 23:39:03: saving data structure to disk... +2025-11-27 23:39:04: DONE +k = 63, m = 23, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 48527990 bases, 42328052 kmers +read 200000 sequences, 101938174 bases, 89538236 kmers +read 300000 sequences, 171738001 bases, 153138063 kmers +read 400000 sequences, 279668649 bases, 254868711 kmers +read 500000 sequences, 322024377 bases, 291024439 kmers +read 600000 sequences, 367040069 bases, 329840131 kmers +read 700000 sequences, 412232472 bases, 368832534 kmers +read 800000 sequences, 457488794 bases, 407888856 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283144662988822.minimizers.0.bin'... +read 800231 sequences, 462130202 bases, 412515880 kmers +num_kmers 412515880 +num_super_kmers 26466010 +num_pieces 800232 (+0.240545 [bits/kmer]) +=== step 1: 'parse_file' 100.813 [sec] (244.385 [ns/kmer]) +num_minimizers 22039367 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 0.826242 [sec] (2.00293 [ns/kmer]) +bits_per_offset = ceil(log2(462130265)) = 29 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283246332743683.bucket_pairs.0.bin'... +num_singletons 19162998/22039367 (86.9489%) +=== step 3: 'build_index' 3.17876 [sec] (7.7058 [ns/kmer]) +max_num_super_kmers_in_bucket 722 +log2_max_num_super_kmers_in_bucket 10 +num_buckets_in_skew_index 29/22039367 (0.000131583%) +num_partitions 4 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 36447 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 6972 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 6633 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 722: 8845 +num_kmers_in_skew_index 58897 (0.0142775%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 36447 + building MPHF with 64 threads and 1 partitions... + built mphs[0] for 36447 keys; bits/key = 2.76083 + built positions[0] for 36447 keys; bits/key = 7.00985 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 6972 + building MPHF with 64 threads and 1 partitions... + built mphs[1] for 6972 keys; bits/key = 3.27252 + built positions[1] for 6972 keys; bits/key = 8.05049 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 6633 + building MPHF with 64 threads and 1 partitions... + built mphs[2] for 6633 keys; bits/key = 3.39153 + built positions[2] for 6633 keys; bits/key = 9.05051 + lower 512; upper 722; num_bits_per_pos 10; keys_in_partition.size() 8845 + building MPHF with 64 threads and 1 partitions... + built mphs[3] for 8845 keys; bits/key = 3.34652 + built positions[3] for 8845 keys; bits/key = 10.0432 +num_bits_for_skew_index 636208(0.00154226 [bits/kmer]) +=== step 4: 'build_skew_index' 0.154066 [sec] (0.373479 [ns/kmer]) +=== total_time 104.972 [sec] (254.467 [ns/kmer]) +total index size: 225173244 [B] -- 225.173 [MB] +SPACE BREAKDOWN: + minimizers: 0.146042 [bits/kmer] (2.7335 [bits/key]) -- 3.34435% + pieces: 0.0239116 [bits/kmer] -- 0.547574% + num_super_kmers_before_bucket: 0.0942127 [bits/kmer] -- 2.15746% + offsets: 1.86057 [bits/kmer] -- 42.6069% + strings: 2.24055 [bits/kmer] -- 51.3083% + skew_index: 0.00154226 [bits/kmer] -- 0.0353177% + weights: 3.56835e-06 [bits/kmer] -- 8.17149e-05% + weight_interval_values: 6.20582e-07 [bits/kmer] + weight_interval_lengths: 2.32718e-06 [bits/kmer] + weight_dictionary: 6.20582e-07 [bits/kmer] + -------------- + total: 4.36683 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 86.9489% +buckets with 2 super_kmers = 9.80079% +buckets with 3 super_kmers = 1.82954% +buckets with 4 super_kmers = 0.666848% +buckets with 5 super_kmers = 0.30254% +buckets with 6 super_kmers = 0.159315% +buckets with 7 super_kmers = 0.0922894% +buckets with 8 super_kmers = 0.0577467% +buckets with 9 super_kmers = 0.0374829% +buckets with 10 super_kmers = 0.0254681% +buckets with 11 super_kmers = 0.0181584% +buckets with 12 super_kmers = 0.0127091% +buckets with 13 super_kmers = 0.00979157% +buckets with 14 super_kmers = 0.00777699% +buckets with 15 super_kmers = 0.00571704% +buckets with 16 super_kmers = 0.00470975% +max_num_super_kmers_in_bucket 722 +2025-11-27 23:40:49: saving data structure to disk... +2025-11-27 23:40:49: DONE +k = 63, m = 31, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 29016582 bases, 22816644 kmers +read 200000 sequences, 59512666 bases, 47112728 kmers +read 300000 sequences, 93672597 bases, 75072659 kmers +read 400000 sequences, 116504475 bases, 91704537 kmers +read 500000 sequences, 129640659 bases, 98640721 kmers +read 600000 sequences, 142888268 bases, 105688330 kmers +read 700000 sequences, 156121434 bases, 112721496 kmers +read 800000 sequences, 169296056 bases, 119696118 kmers +read 900000 sequences, 182473552 bases, 126673614 kmers +read 1000000 sequences, 195596530 bases, 133596592 kmers +read 1100000 sequences, 208767758 bases, 140567820 kmers +read 1200000 sequences, 222206136 bases, 147806198 kmers +read 1300000 sequences, 235298907 bases, 154698969 kmers +read 1400000 sequences, 248482551 bases, 161682613 kmers +read 1500000 sequences, 261588927 bases, 168588989 kmers +read 1600000 sequences, 275055123 bases, 175855185 kmers +read 1700000 sequences, 288035774 bases, 182635836 kmers +read 1800000 sequences, 301349714 bases, 189749776 kmers +read 1900000 sequences, 314875277 bases, 197075339 kmers +read 2000000 sequences, 328155322 bases, 204155384 kmers +read 2100000 sequences, 341368561 bases, 211168623 kmers +read 2200000 sequences, 354712477 bases, 218312539 kmers +read 2300000 sequences, 368071956 bases, 225472018 kmers +read 2400000 sequences, 381369058 bases, 232569120 kmers +read 2500000 sequences, 395076617 bases, 240076679 kmers +read 2600000 sequences, 408571137 bases, 247371199 kmers +read 2700000 sequences, 421770863 bases, 254370925 kmers +read 2800000 sequences, 434931009 bases, 261331071 kmers +read 2900000 sequences, 448298966 bases, 268499028 kmers +read 3000000 sequences, 461539188 bases, 275539250 kmers +read 3100000 sequences, 474884720 bases, 282684782 kmers +read 3200000 sequences, 488437755 bases, 290037817 kmers +read 3300000 sequences, 501681431 bases, 297081493 kmers +read 3400000 sequences, 514981599 bases, 304181661 kmers +read 3500000 sequences, 528308841 bases, 311308903 kmers +read 3600000 sequences, 541636881 bases, 318436943 kmers +read 3700000 sequences, 555162303 bases, 325762365 kmers +read 3800000 sequences, 568696721 bases, 333096783 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283249882127208.minimizers.0.bin'... +read 3900000 sequences, 581917274 bases, 340117336 kmers +read 4000000 sequences, 595230685 bases, 347230747 kmers +read 4100000 sequences, 608987239 bases, 354787301 kmers +read 4200000 sequences, 622285126 bases, 361885188 kmers +read 4300000 sequences, 635647812 bases, 369047874 kmers +read 4400000 sequences, 648992570 bases, 376192632 kmers +read 4500000 sequences, 662513011 bases, 383513073 kmers +read 4600000 sequences, 675930610 bases, 390730672 kmers +read 4700000 sequences, 689630791 bases, 398230853 kmers +read 4800000 sequences, 702998442 bases, 405398504 kmers +read 4900000 sequences, 716508958 bases, 412709020 kmers +read 5000000 sequences, 730213651 bases, 420213713 kmers +read 5100000 sequences, 743782088 bases, 427582150 kmers +read 5200000 sequences, 757644219 bases, 435244281 kmers +read 5300000 sequences, 771125055 bases, 442525117 kmers +read 5400000 sequences, 784690986 bases, 449891048 kmers +read 5500000 sequences, 798294730 bases, 457294792 kmers +read 5600000 sequences, 811868508 bases, 464668570 kmers +read 5700000 sequences, 825311135 bases, 471911197 kmers +read 5800000 sequences, 838965446 bases, 479365508 kmers +read 5900000 sequences, 852651285 bases, 486851347 kmers +read 6000000 sequences, 866286122 bases, 494286184 kmers +read 6100000 sequences, 879791056 bases, 501591118 kmers +read 6200000 sequences, 893568449 bases, 509168511 kmers +read 6300000 sequences, 907221007 bases, 516621069 kmers +read 6400000 sequences, 920850613 bases, 524050675 kmers +read 6500000 sequences, 934451411 bases, 531451473 kmers +read 6600000 sequences, 948058118 bases, 538858180 kmers +read 6700000 sequences, 961671957 bases, 546272019 kmers +read 6800000 sequences, 975396455 bases, 553796517 kmers +read 6900000 sequences, 989058845 bases, 561258907 kmers +read 7000000 sequences, 1002901429 bases, 568901491 kmers +read 7100000 sequences, 1016671629 bases, 576471691 kmers +read 7200000 sequences, 1030411544 bases, 584011606 kmers +read 7300000 sequences, 1044405065 bases, 591805127 kmers +read 7400000 sequences, 1058405891 bases, 599605953 kmers +read 7500000 sequences, 1072419133 bases, 607419195 kmers +read 7600000 sequences, 1086161468 bases, 614961530 kmers +read 7700000 sequences, 1100358314 bases, 622958376 kmers +read 7800000 sequences, 1114260927 bases, 630660989 kmers +read 7900000 sequences, 1128307710 bases, 638507772 kmers +read 8000000 sequences, 1142393895 bases, 646393957 kmers +read 8100000 sequences, 1156356962 bases, 654157024 kmers +read 8200000 sequences, 1170571834 bases, 662171896 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283249882127208.minimizers.1.bin'... +read 8300000 sequences, 1184451092 bases, 669851154 kmers +read 8400000 sequences, 1198299201 bases, 677499263 kmers +read 8500000 sequences, 1212442291 bases, 685442353 kmers +read 8600000 sequences, 1226404988 bases, 693205050 kmers +read 8700000 sequences, 1240702863 bases, 701302925 kmers +read 8800000 sequences, 1254656858 bases, 709056920 kmers +read 8900000 sequences, 1268621255 bases, 716821317 kmers +read 9000000 sequences, 1282878920 bases, 724878982 kmers +read 9100000 sequences, 1297350483 bases, 733150545 kmers +read 9200000 sequences, 1311515942 bases, 741116004 kmers +read 9300000 sequences, 1325689602 bases, 749089664 kmers +read 9400000 sequences, 1339681841 bases, 756881903 kmers +read 9500000 sequences, 1353794253 bases, 764794315 kmers +read 9600000 sequences, 1368052405 bases, 772852467 kmers +read 9700000 sequences, 1382480965 bases, 781081027 kmers +read 9800000 sequences, 1397029040 bases, 789429102 kmers +read 9900000 sequences, 1411261749 bases, 797461811 kmers +read 10000000 sequences, 1425636281 bases, 805636343 kmers +read 10100000 sequences, 1439978068 bases, 813778130 kmers +read 10200000 sequences, 1454565939 bases, 822166001 kmers +read 10300000 sequences, 1469139911 bases, 830539973 kmers +read 10400000 sequences, 1483590146 bases, 838790208 kmers +read 10500000 sequences, 1497966602 bases, 846966664 kmers +read 10600000 sequences, 1512656597 bases, 855456659 kmers +read 10700000 sequences, 1527179829 bases, 863779891 kmers +read 10800000 sequences, 1541782704 bases, 872182766 kmers +read 10900000 sequences, 1556446136 bases, 880646198 kmers +read 11000000 sequences, 1571132909 bases, 889132971 kmers +read 11100000 sequences, 1585816988 bases, 897617050 kmers +read 11200000 sequences, 1600557306 bases, 906157368 kmers +read 11300000 sequences, 1615262515 bases, 914662577 kmers +read 11400000 sequences, 1629999559 bases, 923199621 kmers +read 11500000 sequences, 1644860500 bases, 931860562 kmers +read 11600000 sequences, 1659779470 bases, 940579532 kmers +read 11700000 sequences, 1674792249 bases, 949392311 kmers +read 11800000 sequences, 1689736650 bases, 958136712 kmers +read 11900000 sequences, 1704892540 bases, 967092602 kmers +read 12000000 sequences, 1720028604 bases, 976028666 kmers +read 12100000 sequences, 1735135339 bases, 984935401 kmers +read 12200000 sequences, 1750296958 bases, 993897020 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283249882127208.minimizers.2.bin'... +read 12300000 sequences, 1765691210 bases, 1003091272 kmers +read 12400000 sequences, 1781168535 bases, 1012368597 kmers +read 12500000 sequences, 1796591631 bases, 1021591693 kmers +read 12600000 sequences, 1811900898 bases, 1030700960 kmers +read 12700000 sequences, 1827876385 bases, 1040476447 kmers +read 12800000 sequences, 1843393661 bases, 1049793723 kmers +read 12900000 sequences, 1858842530 bases, 1059042592 kmers +read 13000000 sequences, 1874571274 bases, 1068571336 kmers +read 13100000 sequences, 1890244064 bases, 1078044126 kmers +read 13200000 sequences, 1905959037 bases, 1087559099 kmers +read 13300000 sequences, 1922228213 bases, 1097628275 kmers +read 13400000 sequences, 1938519944 bases, 1107720006 kmers +read 13500000 sequences, 1954664776 bases, 1117664838 kmers +read 13600000 sequences, 1970696460 bases, 1127496522 kmers +read 13700000 sequences, 1987164724 bases, 1137764786 kmers +read 13800000 sequences, 2003371237 bases, 1147771299 kmers +read 13900000 sequences, 2019649705 bases, 1157849767 kmers +read 14000000 sequences, 2036208623 bases, 1168208685 kmers +read 14100000 sequences, 2052985966 bases, 1178786028 kmers +read 14200000 sequences, 2069712096 bases, 1189312158 kmers +read 14300000 sequences, 2086760464 bases, 1200160526 kmers +read 14400000 sequences, 2103719550 bases, 1210919612 kmers +read 14500000 sequences, 2120768440 bases, 1221768502 kmers +read 14600000 sequences, 2137973451 bases, 1232773513 kmers +read 14700000 sequences, 2155333447 bases, 1243933509 kmers +read 14800000 sequences, 2173028894 bases, 1255428956 kmers +read 14900000 sequences, 2190761817 bases, 1266961879 kmers +read 15000000 sequences, 2208992504 bases, 1278992566 kmers +read 15100000 sequences, 2226993777 bases, 1290793839 kmers +read 15200000 sequences, 2245240709 bases, 1302840771 kmers +read 15300000 sequences, 2264077653 bases, 1315477715 kmers +read 15400000 sequences, 2282789133 bases, 1327989195 kmers +read 15500000 sequences, 2301835592 bases, 1340835654 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283249882127208.minimizers.3.bin'... +read 15600000 sequences, 2321337067 bases, 1354137129 kmers +read 15700000 sequences, 2341431050 bases, 1368031112 kmers +read 15800000 sequences, 2361547779 bases, 1381947841 kmers +read 15900000 sequences, 2382125643 bases, 1396325705 kmers +read 16000000 sequences, 2403497084 bases, 1411497146 kmers +read 16100000 sequences, 2424934249 bases, 1426734311 kmers +read 16200000 sequences, 2447209283 bases, 1442809345 kmers +read 16300000 sequences, 2470231701 bases, 1459631763 kmers +read 16400000 sequences, 2494280866 bases, 1477480928 kmers +read 16500000 sequences, 2519161479 bases, 1496161541 kmers +read 16600000 sequences, 2545406671 bases, 1516206733 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283249882127208.minimizers.4.bin'... +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +num_super_kmers 132294927 +num_pieces 16636524 (+1.35283 [bits/kmer]) +=== step 1: 'parse_file' 336.352 [sec] (220.573 [ns/kmer]) + == files to merge = 5 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 132294927 +num_minimizers 69798549 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 6.74322 [sec] (4.42206 [ns/kmer]) +bits_per_offset = ceil(log2(2556368645)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283593123304899.bucket_pairs.0.bin'... +num_singletons 54695912/69798549 (78.3625%) +=== step 3: 'build_index' 16.3246 [sec] (10.7053 [ns/kmer]) +max_num_super_kmers_in_bucket 106968 +log2_max_num_super_kmers_in_bucket 17 +num_buckets_in_skew_index 96980/69798549 (0.138943%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 82970878 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 28124833 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 14721360 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 6468312 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3625995 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2841777 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 106968: 11322400 +num_kmers_in_skew_index 150075555 (9.84164%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 82970878 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 82970878 keys; bits/key = 2.68699 + built positions[0] for 82970878 keys; bits/key = 7 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 28124833 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 28124833 keys; bits/key = 2.7999 + built positions[1] for 28124833 keys; bits/key = 8.00001 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 14721360 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 14721360 keys; bits/key = 2.94826 + built positions[2] for 14721360 keys; bits/key = 9.00002 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 6468312 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 6468312 keys; bits/key = 3.12586 + built positions[3] for 6468312 keys; bits/key = 10.0001 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 3625995 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 3625995 keys; bits/key = 3.24643 + built positions[4] for 3625995 keys; bits/key = 11.0001 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 2841777 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 2841777 keys; bits/key = 3.37226 + built positions[5] for 2841777 keys; bits/key = 12.0001 + lower 4096; upper 106968; num_bits_per_pos 17; keys_in_partition.size() 11322400 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 11322400 keys; bits/key = 3.00593 + built positions[6] for 11322400 keys; bits/key = 17 +num_bits_for_skew_index 1690139792(1.10836 [bits/kmer]) +=== step 4: 'build_skew_index' 25.8472 [sec] (16.9501 [ns/kmer]) +=== total_time 385.267 [sec] (252.65 [ns/kmer]) +total index size: 1446316528 [B] -- 1446.32 [MB] +SPACE BREAKDOWN: + minimizers: 0.123857 [bits/kmer] (2.70592 [bits/key]) -- 1.63233% + pieces: 0.113881 [bits/kmer] -- 1.50086% + num_super_kmers_before_bucket: 0.11259 [bits/kmer] -- 1.48385% + offsets: 2.7762 [bits/kmer] -- 36.5881% + strings: 3.35283 [bits/kmer] -- 44.1876% + skew_index: 1.10836 [bits/kmer] -- 14.6073% + weights: 9.65307e-07 [bits/kmer] -- 1.2722e-05% + weight_interval_values: 1.67879e-07 [bits/kmer] + weight_interval_lengths: 6.29548e-07 [bits/kmer] + weight_dictionary: 1.67879e-07 [bits/kmer] + -------------- + total: 7.58771 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 78.3625% +buckets with 2 super_kmers = 12.341% +buckets with 3 super_kmers = 3.49507% +buckets with 4 super_kmers = 1.61562% +buckets with 5 super_kmers = 0.906593% +buckets with 6 super_kmers = 0.580495% +buckets with 7 super_kmers = 0.403437% +buckets with 8 super_kmers = 0.297214% +buckets with 9 super_kmers = 0.228013% +buckets with 10 super_kmers = 0.179978% +buckets with 11 super_kmers = 0.146271% +buckets with 12 super_kmers = 0.121415% +buckets with 13 super_kmers = 0.102183% +buckets with 14 super_kmers = 0.0880205% +buckets with 15 super_kmers = 0.0757365% +buckets with 16 super_kmers = 0.0666547% +max_num_super_kmers_in_bucket 106968 +2025-11-27 23:47:15: saving data structure to disk... +2025-11-27 23:47:16: DONE +k = 63, m = 31, seed = 1, l = 6, c = 3, canonical_parsing = true, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 12340428 bases, 6140490 kmers +read 200000 sequences, 24646464 bases, 12246526 kmers +read 300000 sequences, 37018030 bases, 18418092 kmers +read 400000 sequences, 49394989 bases, 24595051 kmers +read 500000 sequences, 61758753 bases, 30758815 kmers +read 600000 sequences, 74141065 bases, 36941127 kmers +read 700000 sequences, 86514469 bases, 43114531 kmers +read 800000 sequences, 98874419 bases, 49274481 kmers +read 900000 sequences, 111243104 bases, 55443166 kmers +read 1000000 sequences, 123617917 bases, 61617979 kmers +read 1100000 sequences, 136042481 bases, 67842543 kmers +read 1200000 sequences, 148420567 bases, 74020629 kmers +read 1300000 sequences, 160880986 bases, 80281048 kmers +read 1400000 sequences, 173296738 bases, 86496800 kmers +read 1500000 sequences, 185720015 bases, 92720077 kmers +read 1600000 sequences, 198143788 bases, 98943850 kmers +read 1700000 sequences, 210604030 bases, 105204092 kmers +read 1800000 sequences, 223058949 bases, 111459011 kmers +read 1900000 sequences, 235529393 bases, 117729455 kmers +read 2000000 sequences, 248006332 bases, 124006394 kmers +read 2100000 sequences, 260467827 bases, 130267889 kmers +read 2200000 sequences, 272924289 bases, 136524351 kmers +read 2300000 sequences, 285441228 bases, 142841290 kmers +read 2400000 sequences, 297932568 bases, 149132630 kmers +read 2500000 sequences, 310463939 bases, 155464001 kmers +read 2600000 sequences, 323014521 bases, 161814583 kmers +read 2700000 sequences, 335527696 bases, 168127758 kmers +read 2800000 sequences, 348042722 bases, 174442784 kmers +read 2900000 sequences, 360581821 bases, 180781883 kmers +read 3000000 sequences, 373165681 bases, 187165743 kmers +read 3100000 sequences, 385714108 bases, 193514170 kmers +read 3200000 sequences, 398280992 bases, 199881054 kmers +read 3300000 sequences, 410870862 bases, 206270924 kmers +read 3400000 sequences, 423449691 bases, 212649753 kmers +read 3500000 sequences, 436046745 bases, 219046807 kmers +read 3600000 sequences, 448679809 bases, 225479871 kmers +read 3700000 sequences, 461321374 bases, 231921436 kmers +read 3800000 sequences, 473931319 bases, 238331381 kmers +read 3900000 sequences, 486569329 bases, 244769391 kmers +read 4000000 sequences, 499216681 bases, 251216743 kmers +read 4100000 sequences, 511895744 bases, 257695806 kmers +read 4200000 sequences, 524602447 bases, 264202509 kmers +read 4300000 sequences, 537274929 bases, 270674991 kmers +read 4400000 sequences, 549984249 bases, 277184311 kmers +read 4500000 sequences, 562699936 bases, 283699998 kmers +read 4600000 sequences, 575434830 bases, 290234892 kmers +read 4700000 sequences, 588209883 bases, 296809945 kmers +read 4800000 sequences, 600967786 bases, 303367848 kmers +read 4900000 sequences, 613729111 bases, 309929173 kmers +read 5000000 sequences, 626504015 bases, 316504077 kmers +read 5100000 sequences, 639246673 bases, 323046735 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.0.bin'... +read 5200000 sequences, 652025570 bases, 329625632 kmers +read 5300000 sequences, 664852185 bases, 336252247 kmers +read 5400000 sequences, 677687532 bases, 342887594 kmers +read 5500000 sequences, 690503191 bases, 349503253 kmers +read 5600000 sequences, 703329021 bases, 356129083 kmers +read 5700000 sequences, 716216575 bases, 362816637 kmers +read 5800000 sequences, 729051677 bases, 369451739 kmers +read 5900000 sequences, 741931929 bases, 376131991 kmers +read 6000000 sequences, 754844870 bases, 382844932 kmers +read 6100000 sequences, 767765015 bases, 389565077 kmers +read 6200000 sequences, 780677651 bases, 396277713 kmers +read 6300000 sequences, 793620604 bases, 403020666 kmers +read 6400000 sequences, 806637866 bases, 409837928 kmers +read 6500000 sequences, 819598810 bases, 416598872 kmers +read 6600000 sequences, 832595190 bases, 423395252 kmers +read 6700000 sequences, 845581476 bases, 430181538 kmers +read 6800000 sequences, 858575752 bases, 436975814 kmers +read 6900000 sequences, 871622804 bases, 443822866 kmers +read 7000000 sequences, 884611433 bases, 450611495 kmers +read 7100000 sequences, 897672844 bases, 457472906 kmers +read 7200000 sequences, 910732890 bases, 464332952 kmers +read 7300000 sequences, 923812876 bases, 471212938 kmers +read 7400000 sequences, 936909486 bases, 478109548 kmers +read 7500000 sequences, 949997076 bases, 484997138 kmers +read 7600000 sequences, 963107948 bases, 491908010 kmers +read 7700000 sequences, 976263311 bases, 498863373 kmers +read 7800000 sequences, 989391312 bases, 505791374 kmers +read 7900000 sequences, 1002542416 bases, 512742478 kmers +read 8000000 sequences, 1015719792 bases, 519719854 kmers +read 8100000 sequences, 1028930102 bases, 526730164 kmers +read 8200000 sequences, 1042133340 bases, 533733402 kmers +read 8300000 sequences, 1055343002 bases, 540743064 kmers +read 8400000 sequences, 1068571302 bases, 547771364 kmers +read 8500000 sequences, 1081782071 bases, 554782133 kmers +read 8600000 sequences, 1095081331 bases, 561881393 kmers +read 8700000 sequences, 1108381691 bases, 568981753 kmers +read 8800000 sequences, 1121704459 bases, 576104521 kmers +read 8900000 sequences, 1135025716 bases, 583225778 kmers +read 9000000 sequences, 1148384003 bases, 590384065 kmers +read 9100000 sequences, 1161802419 bases, 597602481 kmers +read 9200000 sequences, 1175228269 bases, 604828331 kmers +read 9300000 sequences, 1188645635 bases, 612045697 kmers +read 9400000 sequences, 1202107172 bases, 619307234 kmers +read 9500000 sequences, 1215616855 bases, 626616917 kmers +read 9600000 sequences, 1229082244 bases, 633882306 kmers +read 9700000 sequences, 1242623466 bases, 641223528 kmers +read 9800000 sequences, 1256182360 bases, 648582422 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.1.bin'... +read 9900000 sequences, 1269727590 bases, 655927652 kmers +read 10000000 sequences, 1283305118 bases, 663305180 kmers +read 10100000 sequences, 1296926048 bases, 670726110 kmers +read 10200000 sequences, 1310556982 bases, 678157044 kmers +read 10300000 sequences, 1324233550 bases, 685633612 kmers +read 10400000 sequences, 1337906859 bases, 693106921 kmers +read 10500000 sequences, 1351643168 bases, 700643230 kmers +read 10600000 sequences, 1365330951 bases, 708131013 kmers +read 10700000 sequences, 1379108463 bases, 715708525 kmers +read 10800000 sequences, 1392877680 bases, 723277742 kmers +read 10900000 sequences, 1406644001 bases, 730844063 kmers +read 11000000 sequences, 1420392493 bases, 738392555 kmers +read 11100000 sequences, 1434208255 bases, 746008317 kmers +read 11200000 sequences, 1448044904 bases, 753644966 kmers +read 11300000 sequences, 1461973739 bases, 761373801 kmers +read 11400000 sequences, 1475908384 bases, 769108446 kmers +read 11500000 sequences, 1489828655 bases, 776828717 kmers +read 11600000 sequences, 1503804136 bases, 784604198 kmers +read 11700000 sequences, 1517825110 bases, 792425172 kmers +read 11800000 sequences, 1531854849 bases, 800254911 kmers +read 11900000 sequences, 1545912444 bases, 808112506 kmers +read 12000000 sequences, 1559904915 bases, 815904977 kmers +read 12100000 sequences, 1574126558 bases, 823926620 kmers +read 12200000 sequences, 1588253922 bases, 831853984 kmers +read 12300000 sequences, 1602371618 bases, 839771680 kmers +read 12400000 sequences, 1616537157 bases, 847737219 kmers +read 12500000 sequences, 1630788602 bases, 855788664 kmers +read 12600000 sequences, 1644978314 bases, 863778376 kmers +read 12700000 sequences, 1659241146 bases, 871841208 kmers +read 12800000 sequences, 1673584118 bases, 879984180 kmers +read 12900000 sequences, 1687940515 bases, 888140577 kmers +read 13000000 sequences, 1702343713 bases, 896343775 kmers +read 13100000 sequences, 1716759504 bases, 904559566 kmers +read 13200000 sequences, 1731228620 bases, 912828682 kmers +read 13300000 sequences, 1745703567 bases, 921103629 kmers +read 13400000 sequences, 1760203118 bases, 929403180 kmers +read 13500000 sequences, 1774792602 bases, 937792664 kmers +read 13600000 sequences, 1789438596 bases, 946238658 kmers +read 13700000 sequences, 1804059588 bases, 954659650 kmers +read 13800000 sequences, 1818743867 bases, 963143929 kmers +read 13900000 sequences, 1833395553 bases, 971595615 kmers +read 14000000 sequences, 1848153717 bases, 980153779 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.2.bin'... +read 14100000 sequences, 1862998527 bases, 988798589 kmers +read 14200000 sequences, 1877911963 bases, 997512025 kmers +read 14300000 sequences, 1892816751 bases, 1006216813 kmers +read 14400000 sequences, 1907719813 bases, 1014919875 kmers +read 14500000 sequences, 1922766528 bases, 1023766590 kmers +read 14600000 sequences, 1937831250 bases, 1032631312 kmers +read 14700000 sequences, 1952937508 bases, 1041537570 kmers +read 14800000 sequences, 1968048267 bases, 1050448329 kmers +read 14900000 sequences, 1983251368 bases, 1059451430 kmers +read 15000000 sequences, 1998487486 bases, 1068487548 kmers +read 15100000 sequences, 2013788234 bases, 1077588296 kmers +read 15200000 sequences, 2029113702 bases, 1086713764 kmers +read 15300000 sequences, 2044464630 bases, 1095864692 kmers +read 15400000 sequences, 2059908322 bases, 1105108384 kmers +read 15500000 sequences, 2075402983 bases, 1114403045 kmers +read 15600000 sequences, 2090966187 bases, 1123766249 kmers +read 15700000 sequences, 2106543558 bases, 1133143620 kmers +read 15800000 sequences, 2122217022 bases, 1142617084 kmers +read 15900000 sequences, 2137840083 bases, 1152040145 kmers +read 16000000 sequences, 2153589344 bases, 1161589406 kmers +read 16100000 sequences, 2169260628 bases, 1171060690 kmers +read 16200000 sequences, 2185176930 bases, 1180776992 kmers +read 16300000 sequences, 2201140458 bases, 1190540520 kmers +read 16400000 sequences, 2217102473 bases, 1200302535 kmers +read 16500000 sequences, 2233154507 bases, 1210154569 kmers +read 16600000 sequences, 2249289162 bases, 1220089224 kmers +read 16700000 sequences, 2265554961 bases, 1230155023 kmers +read 16800000 sequences, 2281740014 bases, 1240140076 kmers +read 16900000 sequences, 2298107838 bases, 1250307900 kmers +read 17000000 sequences, 2314472095 bases, 1260472157 kmers +read 17100000 sequences, 2331031176 bases, 1270831238 kmers +read 17200000 sequences, 2347660266 bases, 1281260328 kmers +read 17300000 sequences, 2364281388 bases, 1291681450 kmers +read 17400000 sequences, 2381150963 bases, 1302351025 kmers +read 17500000 sequences, 2398014863 bases, 1313014925 kmers +read 17600000 sequences, 2414848399 bases, 1323648461 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.3.bin'... +read 17700000 sequences, 2431827698 bases, 1334427760 kmers +read 17800000 sequences, 2448880349 bases, 1345280411 kmers +read 17900000 sequences, 2466079400 bases, 1356279462 kmers +read 18000000 sequences, 2483330959 bases, 1367331021 kmers +read 18100000 sequences, 2500735710 bases, 1378535772 kmers +read 18200000 sequences, 2518182276 bases, 1389782338 kmers +read 18300000 sequences, 2535776920 bases, 1401176982 kmers +read 18400000 sequences, 2553420194 bases, 1412620256 kmers +read 18500000 sequences, 2571217426 bases, 1424217488 kmers +read 18600000 sequences, 2589036466 bases, 1435836528 kmers +read 18700000 sequences, 2607070465 bases, 1447670527 kmers +read 18800000 sequences, 2625276965 bases, 1459677027 kmers +read 18900000 sequences, 2643374208 bases, 1471574270 kmers +read 19000000 sequences, 2661730118 bases, 1483730180 kmers +read 19100000 sequences, 2680149690 bases, 1495949752 kmers +read 19200000 sequences, 2698694575 bases, 1508294637 kmers +read 19300000 sequences, 2717352858 bases, 1520752920 kmers +read 19400000 sequences, 2736256794 bases, 1533456856 kmers +read 19500000 sequences, 2755257099 bases, 1546257161 kmers +read 19600000 sequences, 2774351092 bases, 1559151154 kmers +read 19700000 sequences, 2793728147 bases, 1572328209 kmers +read 19800000 sequences, 2813220812 bases, 1585620874 kmers +read 19900000 sequences, 2832722318 bases, 1598922380 kmers +read 20000000 sequences, 2852409685 bases, 1612409747 kmers +read 20100000 sequences, 2872347441 bases, 1626147503 kmers +read 20200000 sequences, 2892389463 bases, 1639989525 kmers +read 20300000 sequences, 2912735330 bases, 1654135392 kmers +read 20400000 sequences, 2933385055 bases, 1668585117 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.4.bin'... +read 20500000 sequences, 2954091410 bases, 1683091472 kmers +read 20600000 sequences, 2974925213 bases, 1697725275 kmers +read 20700000 sequences, 2995915692 bases, 1712515754 kmers +read 20800000 sequences, 3017122624 bases, 1727522686 kmers +read 20900000 sequences, 3038531652 bases, 1742731714 kmers +read 21000000 sequences, 3060194460 bases, 1758194522 kmers +read 21100000 sequences, 3081907028 bases, 1773707090 kmers +read 21200000 sequences, 3104086626 bases, 1789686688 kmers +read 21300000 sequences, 3126473195 bases, 1805873257 kmers +read 21400000 sequences, 3149107906 bases, 1822307968 kmers +read 21500000 sequences, 3171928079 bases, 1838928141 kmers +read 21600000 sequences, 3194957971 bases, 1855758033 kmers +read 21700000 sequences, 3218340993 bases, 1872941055 kmers +read 21800000 sequences, 3241998343 bases, 1890398405 kmers +read 21900000 sequences, 3265867458 bases, 1908067520 kmers +read 22000000 sequences, 3290140116 bases, 1926140178 kmers +read 22100000 sequences, 3314773229 bases, 1944573291 kmers +read 22200000 sequences, 3339683134 bases, 1963283196 kmers +read 22300000 sequences, 3365026133 bases, 1982426195 kmers +read 22400000 sequences, 3390524791 bases, 2001724853 kmers +read 22500000 sequences, 3416602833 bases, 2021602895 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.5.bin'... +read 22600000 sequences, 3443068690 bases, 2041868752 kmers +read 22700000 sequences, 3469843700 bases, 2062443762 kmers +read 22800000 sequences, 3496984478 bases, 2083384540 kmers +read 22900000 sequences, 3524534052 bases, 2104734114 kmers +read 23000000 sequences, 3552570866 bases, 2126570928 kmers +read 23100000 sequences, 3581192297 bases, 2148992359 kmers +read 23200000 sequences, 3610381722 bases, 2171981784 kmers +read 23300000 sequences, 3639850904 bases, 2195250966 kmers +read 23400000 sequences, 3669893515 bases, 2219093577 kmers +read 23500000 sequences, 3700753180 bases, 2243753242 kmers +read 23600000 sequences, 3732004041 bases, 2268804103 kmers +read 23700000 sequences, 3763988485 bases, 2294588547 kmers +read 23800000 sequences, 3796342436 bases, 2320742498 kmers +read 23900000 sequences, 3829616775 bases, 2347816837 kmers +read 24000000 sequences, 3863888823 bases, 2375888885 kmers +read 24100000 sequences, 3898563459 bases, 2404363521 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.6.bin'... +read 24200000 sequences, 3934104488 bases, 2433704550 kmers +read 24300000 sequences, 3970663407 bases, 2464063469 kmers +read 24400000 sequences, 4008289022 bases, 2495489084 kmers +read 24500000 sequences, 4046653033 bases, 2527653095 kmers +read 24600000 sequences, 4085473878 bases, 2560273940 kmers +read 24700000 sequences, 4125325829 bases, 2593925891 kmers +read 24800000 sequences, 4166644355 bases, 2629044417 kmers +read 24900000 sequences, 4209155738 bases, 2665355800 kmers +read 25000000 sequences, 4253357779 bases, 2703357841 kmers +read 25100000 sequences, 4298305920 bases, 2742105982 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.7.bin'... +read 25200000 sequences, 4345040766 bases, 2782640828 kmers +read 25300000 sequences, 4392930039 bases, 2824330101 kmers +read 25400000 sequences, 4442653000 bases, 2867853062 kmers +read 25500000 sequences, 4494210063 bases, 2913210125 kmers +read 25600000 sequences, 4547341577 bases, 2960141639 kmers +read 25700000 sequences, 4602288626 bases, 3008888688 kmers +read 25800000 sequences, 4659267065 bases, 3059667127 kmers +read 25900000 sequences, 4718698709 bases, 3112898771 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.8.bin'... +read 26000000 sequences, 4780487522 bases, 3168487584 kmers +read 26100000 sequences, 4845830481 bases, 3227630543 kmers +read 26200000 sequences, 4913892030 bases, 3289492092 kmers +read 26300000 sequences, 4985279649 bases, 3354679711 kmers +read 26400000 sequences, 5059257799 bases, 3422457861 kmers +read 26500000 sequences, 5137444349 bases, 3494444411 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.9.bin'... +read 26600000 sequences, 5220217341 bases, 3571017403 kmers +read 26700000 sequences, 5307644757 bases, 3652244819 kmers +read 26800000 sequences, 5400268538 bases, 3738668600 kmers +read 26900000 sequences, 5498820865 bases, 3831020927 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.10.bin'... +read 27000000 sequences, 5604483878 bases, 3930483940 kmers +read 27100000 sequences, 5717045771 bases, 4036845833 kmers +read 27200000 sequences, 5833610977 bases, 4147211039 kmers +read 27300000 sequences, 5846284831 bases, 4153684893 kmers +read 27400000 sequences, 5857666136 bases, 4158866198 kmers +read 27500000 sequences, 5869033199 bases, 4164033261 kmers +read 27600000 sequences, 5880411993 bases, 4169212055 kmers +read 27700000 sequences, 5891780011 bases, 4174380073 kmers +read 27800000 sequences, 5903175513 bases, 4179575575 kmers +read 27900000 sequences, 5914554374 bases, 4184754436 kmers +read 28000000 sequences, 5925952810 bases, 4189952872 kmers +read 28100000 sequences, 5937329908 bases, 4195129970 kmers +read 28200000 sequences, 5948710629 bases, 4200310691 kmers +read 28300000 sequences, 5960084042 bases, 4205484104 kmers +read 28400000 sequences, 5971480602 bases, 4210680664 kmers +read 28500000 sequences, 5982848841 bases, 4215848903 kmers +read 28600000 sequences, 5994224296 bases, 4221024358 kmers +read 28700000 sequences, 6005620451 bases, 4226220513 kmers +read 28800000 sequences, 6016990442 bases, 4231390504 kmers +read 28900000 sequences, 6028385648 bases, 4236585710 kmers +read 29000000 sequences, 6039783825 bases, 4241783887 kmers +read 29100000 sequences, 6051178683 bases, 4246978745 kmers +read 29200000 sequences, 6062557847 bases, 4252157909 kmers +read 29300000 sequences, 6073940813 bases, 4257340875 kmers +read 29400000 sequences, 6085331250 bases, 4262531312 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.11.bin'... +read 29500000 sequences, 6096728346 bases, 4267728408 kmers +read 29600000 sequences, 6108102978 bases, 4272903040 kmers +read 29700000 sequences, 6119481358 bases, 4278081420 kmers +read 29800000 sequences, 6130856114 bases, 4283256176 kmers +read 29900000 sequences, 6142238297 bases, 4288438359 kmers +read 30000000 sequences, 6153634829 bases, 4293634891 kmers +read 30100000 sequences, 6165020049 bases, 4298820111 kmers +read 30200000 sequences, 6176433423 bases, 4304033485 kmers +read 30300000 sequences, 6187857491 bases, 4309257553 kmers +read 30400000 sequences, 6199252194 bases, 4314452256 kmers +read 30500000 sequences, 6210672548 bases, 4319672610 kmers +read 30600000 sequences, 6222091861 bases, 4324891923 kmers +read 30700000 sequences, 6233490435 bases, 4330090497 kmers +read 30800000 sequences, 6244878831 bases, 4335278893 kmers +read 30900000 sequences, 6256282376 bases, 4340482438 kmers +read 31000000 sequences, 6267683956 bases, 4345684018 kmers +read 31100000 sequences, 6279097813 bases, 4350897875 kmers +read 31200000 sequences, 6290508351 bases, 4356108413 kmers +read 31300000 sequences, 6301930261 bases, 4361330323 kmers +read 31400000 sequences, 6313323207 bases, 4366523269 kmers +read 31500000 sequences, 6324738619 bases, 4371738681 kmers +read 31600000 sequences, 6336131574 bases, 4376931636 kmers +read 31700000 sequences, 6347524494 bases, 4382124556 kmers +read 31800000 sequences, 6358957002 bases, 4387357064 kmers +read 31900000 sequences, 6370374986 bases, 4392575048 kmers +read 32000000 sequences, 6381788111 bases, 4397788173 kmers +read 32100000 sequences, 6393224920 bases, 4403024982 kmers +read 32200000 sequences, 6404645946 bases, 4408246008 kmers +read 32300000 sequences, 6416049834 bases, 4413449896 kmers +read 32400000 sequences, 6427468467 bases, 4418668529 kmers +read 32500000 sequences, 6438906136 bases, 4423906198 kmers +read 32600000 sequences, 6450334707 bases, 4429134769 kmers +read 32700000 sequences, 6461755008 bases, 4434355070 kmers +read 32800000 sequences, 6473195587 bases, 4439595649 kmers +read 32900000 sequences, 6484644167 bases, 4444844229 kmers +read 33000000 sequences, 6496092416 bases, 4450092478 kmers +read 33100000 sequences, 6507511441 bases, 4455311503 kmers +read 33200000 sequences, 6518945085 bases, 4460545147 kmers +read 33300000 sequences, 6530384425 bases, 4465784487 kmers +read 33400000 sequences, 6541805219 bases, 4471005281 kmers +read 33500000 sequences, 6553237504 bases, 4476237566 kmers +read 33600000 sequences, 6564689101 bases, 4481489163 kmers +read 33700000 sequences, 6576122082 bases, 4486722144 kmers +read 33800000 sequences, 6587572222 bases, 4491972284 kmers +read 33900000 sequences, 6599018743 bases, 4497218805 kmers +read 34000000 sequences, 6610456706 bases, 4502456768 kmers +read 34100000 sequences, 6621897287 bases, 4507697349 kmers +read 34200000 sequences, 6633348561 bases, 4512948623 kmers +read 34300000 sequences, 6644796892 bases, 4518196954 kmers +read 34400000 sequences, 6656241823 bases, 4523441885 kmers +read 34500000 sequences, 6667691043 bases, 4528691105 kmers +read 34600000 sequences, 6679157213 bases, 4533957275 kmers +read 34700000 sequences, 6690642188 bases, 4539242250 kmers +read 34800000 sequences, 6702109473 bases, 4544509535 kmers +read 34900000 sequences, 6713569359 bases, 4549769421 kmers +read 35000000 sequences, 6725025515 bases, 4555025577 kmers +read 35100000 sequences, 6736483861 bases, 4560283923 kmers +read 35200000 sequences, 6747950533 bases, 4565550595 kmers +read 35300000 sequences, 6759386980 bases, 4570787042 kmers +read 35400000 sequences, 6770873467 bases, 4576073529 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.12.bin'... +read 35500000 sequences, 6782328796 bases, 4581328858 kmers +read 35600000 sequences, 6793801566 bases, 4586601628 kmers +read 35700000 sequences, 6805288962 bases, 4591889024 kmers +read 35800000 sequences, 6816766599 bases, 4597166661 kmers +read 35900000 sequences, 6828221603 bases, 4602421665 kmers +read 36000000 sequences, 6839697263 bases, 4607697325 kmers +read 36100000 sequences, 6851167968 bases, 4612968030 kmers +read 36200000 sequences, 6862661069 bases, 4618261131 kmers +read 36300000 sequences, 6874122160 bases, 4623522222 kmers +read 36400000 sequences, 6885601876 bases, 4628801938 kmers +read 36500000 sequences, 6897090990 bases, 4634091052 kmers +read 36600000 sequences, 6908577092 bases, 4639377154 kmers +read 36700000 sequences, 6920070395 bases, 4644670457 kmers +read 36800000 sequences, 6931582953 bases, 4649983015 kmers +read 36900000 sequences, 6943074936 bases, 4655274998 kmers +read 37000000 sequences, 6954565924 bases, 4660565986 kmers +read 37100000 sequences, 6966070452 bases, 4665870514 kmers +read 37200000 sequences, 6977560415 bases, 4671160477 kmers +read 37300000 sequences, 6989066925 bases, 4676466987 kmers +read 37400000 sequences, 7000566400 bases, 4681766462 kmers +read 37500000 sequences, 7012064100 bases, 4687064162 kmers +read 37600000 sequences, 7023578971 bases, 4692379033 kmers +read 37700000 sequences, 7035113747 bases, 4697713809 kmers +read 37800000 sequences, 7046611117 bases, 4703011179 kmers +read 37900000 sequences, 7058112871 bases, 4708312933 kmers +read 38000000 sequences, 7069620689 bases, 4713620751 kmers +read 38100000 sequences, 7081124602 bases, 4718924664 kmers +read 38200000 sequences, 7092641574 bases, 4724241636 kmers +read 38300000 sequences, 7104173321 bases, 4729573383 kmers +read 38400000 sequences, 7115693749 bases, 4734893811 kmers +read 38500000 sequences, 7127223394 bases, 4740223456 kmers +read 38600000 sequences, 7138742801 bases, 4745542863 kmers +read 38700000 sequences, 7150287920 bases, 4750887982 kmers +read 38800000 sequences, 7161816661 bases, 4756216723 kmers +read 38900000 sequences, 7173324334 bases, 4761524396 kmers +read 39000000 sequences, 7184856265 bases, 4766856327 kmers +read 39100000 sequences, 7196427309 bases, 4772227371 kmers +read 39200000 sequences, 7207963095 bases, 4777563157 kmers +read 39300000 sequences, 7219512038 bases, 4782912100 kmers +read 39400000 sequences, 7231058926 bases, 4788258988 kmers +read 39500000 sequences, 7242615745 bases, 4793615807 kmers +read 39600000 sequences, 7254151997 bases, 4798952059 kmers +read 39700000 sequences, 7265709248 bases, 4804309310 kmers +read 39800000 sequences, 7277261549 bases, 4809661611 kmers +read 39900000 sequences, 7288795953 bases, 4814996015 kmers +read 40000000 sequences, 7300352386 bases, 4820352448 kmers +read 40100000 sequences, 7311909203 bases, 4825709265 kmers +read 40200000 sequences, 7323455080 bases, 4831055142 kmers +read 40300000 sequences, 7335021048 bases, 4836421110 kmers +read 40400000 sequences, 7346572779 bases, 4841772841 kmers +read 40500000 sequences, 7358141861 bases, 4847141923 kmers +read 40600000 sequences, 7369700966 bases, 4852501028 kmers +read 40700000 sequences, 7381268484 bases, 4857868546 kmers +read 40800000 sequences, 7392842850 bases, 4863242912 kmers +read 40900000 sequences, 7404426052 bases, 4868626114 kmers +read 41000000 sequences, 7415987087 bases, 4873987149 kmers +read 41100000 sequences, 7427574902 bases, 4879374964 kmers +read 41200000 sequences, 7439175505 bases, 4884775567 kmers +read 41300000 sequences, 7450739513 bases, 4890139575 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.13.bin'... +read 41400000 sequences, 7462313943 bases, 4895514005 kmers +read 41500000 sequences, 7473895566 bases, 4900895628 kmers +read 41600000 sequences, 7485498872 bases, 4906298934 kmers +read 41700000 sequences, 7497097591 bases, 4911697653 kmers +read 41800000 sequences, 7508699276 bases, 4917099338 kmers +read 41900000 sequences, 7520283386 bases, 4922483448 kmers +read 42000000 sequences, 7531875484 bases, 4927875546 kmers +read 42100000 sequences, 7543485183 bases, 4933285245 kmers +read 42200000 sequences, 7555088346 bases, 4938688408 kmers +read 42300000 sequences, 7566689709 bases, 4944089771 kmers +read 42400000 sequences, 7578300740 bases, 4949500802 kmers +read 42500000 sequences, 7589916966 bases, 4954917028 kmers +read 42600000 sequences, 7601521236 bases, 4960321298 kmers +read 42700000 sequences, 7613130580 bases, 4965730642 kmers +read 42800000 sequences, 7624734645 bases, 4971134707 kmers +read 42900000 sequences, 7636365632 bases, 4976565694 kmers +read 43000000 sequences, 7647987121 bases, 4981987183 kmers +read 43100000 sequences, 7659607327 bases, 4987407389 kmers +read 43200000 sequences, 7671221477 bases, 4992821539 kmers +read 43300000 sequences, 7682851013 bases, 4998251075 kmers +read 43400000 sequences, 7694478022 bases, 5003678084 kmers +read 43500000 sequences, 7706091680 bases, 5009091742 kmers +read 43600000 sequences, 7717739091 bases, 5014539153 kmers +read 43700000 sequences, 7729379970 bases, 5019980032 kmers +read 43800000 sequences, 7741005738 bases, 5025405800 kmers +read 43900000 sequences, 7752654757 bases, 5030854819 kmers +read 44000000 sequences, 7764325440 bases, 5036325502 kmers +read 44100000 sequences, 7775977254 bases, 5041777316 kmers +read 44200000 sequences, 7787629671 bases, 5047229733 kmers +read 44300000 sequences, 7799282350 bases, 5052682412 kmers +read 44400000 sequences, 7810951187 bases, 5058151249 kmers +read 44500000 sequences, 7822598421 bases, 5063598483 kmers +read 44600000 sequences, 7834244714 bases, 5069044776 kmers +read 44700000 sequences, 7845891240 bases, 5074491302 kmers +read 44800000 sequences, 7857565519 bases, 5079965581 kmers +read 44900000 sequences, 7869252351 bases, 5085452413 kmers +read 45000000 sequences, 7880919098 bases, 5090919160 kmers +read 45100000 sequences, 7892576949 bases, 5096377011 kmers +read 45200000 sequences, 7904241929 bases, 5101841991 kmers +read 45300000 sequences, 7915920658 bases, 5107320720 kmers +read 45400000 sequences, 7927605513 bases, 5112805575 kmers +read 45500000 sequences, 7939292816 bases, 5118292878 kmers +read 45600000 sequences, 7950975991 bases, 5123776053 kmers +read 45700000 sequences, 7962666759 bases, 5129266821 kmers +read 45800000 sequences, 7974341946 bases, 5134742008 kmers +read 45900000 sequences, 7986038612 bases, 5140238674 kmers +read 46000000 sequences, 7997748818 bases, 5145748880 kmers +read 46100000 sequences, 8009477725 bases, 5151277787 kmers +read 46200000 sequences, 8021166242 bases, 5156766304 kmers +read 46300000 sequences, 8032854170 bases, 5162254232 kmers +read 46400000 sequences, 8044555955 bases, 5167756017 kmers +read 46500000 sequences, 8056240494 bases, 5173240556 kmers +read 46600000 sequences, 8067931653 bases, 5178731715 kmers +read 46700000 sequences, 8079648908 bases, 5184248970 kmers +read 46800000 sequences, 8091384712 bases, 5189784774 kmers +read 46900000 sequences, 8103124079 bases, 5195324141 kmers +read 47000000 sequences, 8114852096 bases, 5200852158 kmers +read 47100000 sequences, 8126577432 bases, 5206377494 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.14.bin'... +read 47200000 sequences, 8138321107 bases, 5211921169 kmers +read 47300000 sequences, 8150082884 bases, 5217482946 kmers +read 47400000 sequences, 8161823368 bases, 5223023430 kmers +read 47500000 sequences, 8173558332 bases, 5228558394 kmers +read 47600000 sequences, 8185297180 bases, 5234097242 kmers +read 47700000 sequences, 8197020764 bases, 5239620826 kmers +read 47800000 sequences, 8208783838 bases, 5245183900 kmers +read 47900000 sequences, 8220547786 bases, 5250747848 kmers +read 48000000 sequences, 8232292674 bases, 5256292736 kmers +read 48100000 sequences, 8244054434 bases, 5261854496 kmers +read 48200000 sequences, 8255808686 bases, 5267408748 kmers +read 48300000 sequences, 8267574482 bases, 5272974544 kmers +read 48400000 sequences, 8279340872 bases, 5278540934 kmers +read 48500000 sequences, 8291110333 bases, 5284110395 kmers +read 48600000 sequences, 8302889275 bases, 5289689337 kmers +read 48700000 sequences, 8314648922 bases, 5295248984 kmers +read 48800000 sequences, 8326414162 bases, 5300814224 kmers +read 48900000 sequences, 8338207337 bases, 5306407399 kmers +read 49000000 sequences, 8349993258 bases, 5311993320 kmers +read 49100000 sequences, 8361791349 bases, 5317591411 kmers +read 49200000 sequences, 8373582804 bases, 5323182866 kmers +read 49300000 sequences, 8385394571 bases, 5328794633 kmers +read 49400000 sequences, 8397202995 bases, 5334403057 kmers +read 49500000 sequences, 8409020292 bases, 5340020354 kmers +read 49600000 sequences, 8420828815 bases, 5345628877 kmers +read 49700000 sequences, 8432643281 bases, 5351243343 kmers +read 49800000 sequences, 8444451677 bases, 5356851739 kmers +read 49900000 sequences, 8456260166 bases, 5362460228 kmers +read 50000000 sequences, 8468086036 bases, 5368086098 kmers +read 50100000 sequences, 8479897293 bases, 5373697355 kmers +read 50200000 sequences, 8491729262 bases, 5379329324 kmers +read 50300000 sequences, 8503563407 bases, 5384963469 kmers +read 50400000 sequences, 8515408110 bases, 5390608172 kmers +read 50500000 sequences, 8527226877 bases, 5396226939 kmers +read 50600000 sequences, 8539067669 bases, 5401867731 kmers +read 50700000 sequences, 8550899987 bases, 5407500049 kmers +read 50800000 sequences, 8562770507 bases, 5413170569 kmers +read 50900000 sequences, 8574595545 bases, 5418795607 kmers +read 51000000 sequences, 8586456412 bases, 5424456474 kmers +read 51100000 sequences, 8598316076 bases, 5430116138 kmers +read 51200000 sequences, 8610172262 bases, 5435772324 kmers +read 51300000 sequences, 8622055720 bases, 5441455782 kmers +read 51400000 sequences, 8633927263 bases, 5447127325 kmers +read 51500000 sequences, 8645823524 bases, 5452823586 kmers +read 51600000 sequences, 8657691355 bases, 5458491417 kmers +read 51700000 sequences, 8669585563 bases, 5464185625 kmers +read 51800000 sequences, 8681474258 bases, 5469874320 kmers +read 51900000 sequences, 8693381907 bases, 5475581969 kmers +read 52000000 sequences, 8705279756 bases, 5481279818 kmers +read 52100000 sequences, 8717209451 bases, 5487009513 kmers +read 52200000 sequences, 8729118869 bases, 5492718931 kmers +read 52300000 sequences, 8741023453 bases, 5498423515 kmers +read 52400000 sequences, 8752969676 bases, 5504169738 kmers +read 52500000 sequences, 8764903676 bases, 5509903738 kmers +read 52600000 sequences, 8776822814 bases, 5515622876 kmers +read 52700000 sequences, 8788751015 bases, 5521351077 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.15.bin'... +read 52800000 sequences, 8800669725 bases, 5527069787 kmers +read 52900000 sequences, 8812598349 bases, 5532798411 kmers +read 53000000 sequences, 8824571572 bases, 5538571634 kmers +read 53100000 sequences, 8836518883 bases, 5544318945 kmers +read 53200000 sequences, 8848466396 bases, 5550066458 kmers +read 53300000 sequences, 8860413169 bases, 5555813231 kmers +read 53400000 sequences, 8872384224 bases, 5561584286 kmers +read 53500000 sequences, 8884332155 bases, 5567332217 kmers +read 53600000 sequences, 8896284511 bases, 5573084573 kmers +read 53700000 sequences, 8908270586 bases, 5578870648 kmers +read 53800000 sequences, 8920267982 bases, 5584668044 kmers +read 53900000 sequences, 8932245973 bases, 5590446035 kmers +read 54000000 sequences, 8944259742 bases, 5596259804 kmers +read 54100000 sequences, 8956269308 bases, 5602069370 kmers +read 54200000 sequences, 8968276811 bases, 5607876873 kmers +read 54300000 sequences, 8980258845 bases, 5613658907 kmers +read 54400000 sequences, 8992247801 bases, 5619447863 kmers +read 54500000 sequences, 9004254133 bases, 5625254195 kmers +read 54600000 sequences, 9016278273 bases, 5631078335 kmers +read 54700000 sequences, 9028312029 bases, 5636912091 kmers +read 54800000 sequences, 9040331856 bases, 5642731918 kmers +read 54900000 sequences, 9052350704 bases, 5648550766 kmers +read 55000000 sequences, 9064361175 bases, 5654361237 kmers +read 55100000 sequences, 9076390694 bases, 5660190756 kmers +read 55200000 sequences, 9088446082 bases, 5666046144 kmers +read 55300000 sequences, 9100525786 bases, 5671925848 kmers +read 55400000 sequences, 9112587186 bases, 5677787248 kmers +read 55500000 sequences, 9124623681 bases, 5683623743 kmers +read 55600000 sequences, 9136715382 bases, 5689515444 kmers +read 55700000 sequences, 9148800729 bases, 5695400791 kmers +read 55800000 sequences, 9160843647 bases, 5701243709 kmers +read 55900000 sequences, 9172925217 bases, 5707125279 kmers +read 56000000 sequences, 9185024099 bases, 5713024161 kmers +read 56100000 sequences, 9197117041 bases, 5718917103 kmers +read 56200000 sequences, 9209230518 bases, 5724830580 kmers +read 56300000 sequences, 9221344370 bases, 5730744432 kmers +read 56400000 sequences, 9233465281 bases, 5736665343 kmers +read 56500000 sequences, 9245571873 bases, 5742571935 kmers +read 56600000 sequences, 9257641594 bases, 5748441656 kmers +read 56700000 sequences, 9269746121 bases, 5754346183 kmers +read 56800000 sequences, 9281862419 bases, 5760262481 kmers +read 56900000 sequences, 9294025235 bases, 5766225297 kmers +read 57000000 sequences, 9306137861 bases, 5772137923 kmers +read 57100000 sequences, 9318287515 bases, 5778087577 kmers +read 57200000 sequences, 9330445537 bases, 5784045599 kmers +read 57300000 sequences, 9342614929 bases, 5790014991 kmers +read 57400000 sequences, 9354790599 bases, 5795990661 kmers +read 57500000 sequences, 9366968184 bases, 5801968246 kmers +read 57600000 sequences, 9379136016 bases, 5807936078 kmers +read 57700000 sequences, 9391324284 bases, 5813924346 kmers +read 57800000 sequences, 9403502226 bases, 5819902288 kmers +read 57900000 sequences, 9415684578 bases, 5825884640 kmers +read 58000000 sequences, 9427875846 bases, 5831875908 kmers +read 58100000 sequences, 9440085310 bases, 5837885372 kmers +read 58200000 sequences, 9452280471 bases, 5843880533 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.16.bin'... +read 58300000 sequences, 9464471817 bases, 5849871879 kmers +read 58400000 sequences, 9476715907 bases, 5855915969 kmers +read 58500000 sequences, 9488919933 bases, 5861919995 kmers +read 58600000 sequences, 9501146085 bases, 5867946147 kmers +read 58700000 sequences, 9513406483 bases, 5874006545 kmers +read 58800000 sequences, 9525653213 bases, 5880053275 kmers +read 58900000 sequences, 9537897953 bases, 5886098015 kmers +read 59000000 sequences, 9550182056 bases, 5892182118 kmers +read 59100000 sequences, 9562418655 bases, 5898218717 kmers +read 59200000 sequences, 9574664926 bases, 5904264988 kmers +read 59300000 sequences, 9586958590 bases, 5910358652 kmers +read 59400000 sequences, 9599304698 bases, 5916504760 kmers +read 59500000 sequences, 9611572956 bases, 5922573018 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764283636241049811.minimizers.17.bin'... +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +num_super_kmers 507530068 +num_pieces 59568966 (+1.2463 [bits/kmer]) +=== step 1: 'parse_file' 1302.48 [sec] (219.761 [ns/kmer]) + == files to merge = 18 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 450000000 +num_written_tuples = 500000000 +num_written_tuples = 507530068 +num_minimizers 296127983 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 32.7983 [sec] (5.5339 [ns/kmer]) +bits_per_offset = ceil(log2(9620061362)) = 34 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764284972107626866.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764284972107626866.bucket_pairs.1.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764284972107626866.bucket_pairs.2.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764284972107626866.bucket_pairs.3.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764284972107626866.bucket_pairs.4.bin'... +num_singletons 209712929/296127983 (70.8183%) + == files to merge = 5 +num_written_pairs = 50000000 +num_written_pairs = 86415054 +=== step 3: 'build_index' 105.434 [sec] (17.7895 [ns/kmer]) +max_num_super_kmers_in_bucket 337356 +log2_max_num_super_kmers_in_bucket 19 +num_buckets_in_skew_index 171255/296127983 (0.0578314%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 91917727 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 81239918 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 73956430 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 64989870 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 53994155 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 44712864 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 337356: 118483803 +num_kmers_in_skew_index 529294767 (8.93055%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 91917727 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 91917727 keys; bits/key = 2.6615 + built positions[0] for 91917727 keys; bits/key = 7 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 81239918 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 81239918 keys; bits/key = 2.69372 + built positions[1] for 81239918 keys; bits/key = 8 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 73956430 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 73956430 keys; bits/key = 2.63856 + built positions[2] for 73956430 keys; bits/key = 9 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 64989870 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 64989870 keys; bits/key = 2.63839 + built positions[3] for 64989870 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 53994155 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 53994155 keys; bits/key = 2.68622 + built positions[4] for 53994155 keys; bits/key = 11 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 44712864 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 44712864 keys; bits/key = 2.73542 + built positions[5] for 44712864 keys; bits/key = 12 + lower 4096; upper 337356; num_bits_per_pos 19; keys_in_partition.size() 118483803 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 118483803 keys; bits/key = 2.59702 + built positions[6] for 118483803 keys; bits/key = 19 +num_bits_for_skew_index 7395671488(1.24784 [bits/kmer]) +=== step 4: 'build_skew_index' 112.318 [sec] (18.9508 [ns/kmer]) +=== total_time 1553.03 [sec] (262.035 [ns/kmer]) +total index size: 5749931032 [B] -- 5749.93 [MB] +SPACE BREAKDOWN: + minimizers: 0.135866 [bits/kmer] (2.71925 [bits/key]) -- 1.75056% + pieces: 0.105874 [bits/kmer] -- 1.36413% + num_super_kmers_before_bucket: 0.113871 [bits/kmer] -- 1.46717% + offsets: 2.91153 [bits/kmer] -- 37.5135% + strings: 3.2463 [bits/kmer] -- 41.8269% + skew_index: 1.24784 [bits/kmer] -- 16.0777% + weights: 2.48364e-07 [bits/kmer] -- 3.20004e-06% + weight_interval_values: 4.31937e-08 [bits/kmer] + weight_interval_lengths: 1.61977e-07 [bits/kmer] + weight_dictionary: 4.31937e-08 [bits/kmer] + -------------- + total: 7.76128 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 70.8183% +buckets with 2 super_kmers = 19.3879% +buckets with 3 super_kmers = 5.73771% +buckets with 4 super_kmers = 1.88619% +buckets with 5 super_kmers = 0.729827% +buckets with 6 super_kmers = 0.359355% +buckets with 7 super_kmers = 0.214283% +buckets with 8 super_kmers = 0.144866% +buckets with 9 super_kmers = 0.104897% +buckets with 10 super_kmers = 0.079962% +buckets with 11 super_kmers = 0.0625409% +buckets with 12 super_kmers = 0.0505312% +buckets with 13 super_kmers = 0.0411201% +buckets with 14 super_kmers = 0.0341018% +buckets with 15 super_kmers = 0.0289851% +buckets with 16 super_kmers = 0.0246778% +max_num_super_kmers_in_bucket 337356 +2025-11-28 00:13:10: saving data structure to disk... +2025-11-28 00:13:13: DONE diff --git a/benchmarks/results-27-11-25-v3/k63/canon-build.time.log b/benchmarks/results-27-11-25-v3/k63/canon-build.time.log new file mode 100644 index 0000000..a8632c5 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/canon-build.time.log @@ -0,0 +1,138 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/cod.k63.canon.sshash --canonical-parsing" + User time (seconds): 163.56 + System time (seconds): 2.97 + Percent of CPU this job got: 116% + Elapsed (wall clock) time (h:mm:ss or m:ss): 2:22.57 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1470924 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 855740 + Voluntary context switches: 784 + Involuntary context switches: 1258 + Swaps: 0 + File system inputs: 0 + File system outputs: 4177296 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/kestrel.k63.canon.sshash --canonical-parsing" + User time (seconds): 305.10 + System time (seconds): 5.21 + Percent of CPU this job got: 105% + Elapsed (wall clock) time (h:mm:ss or m:ss): 4:55.17 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 3198680 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1340855 + Voluntary context switches: 303 + Involuntary context switches: 1996 + Swaps: 0 + File system inputs: 0 + File system outputs: 8681744 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/human.k63.canon.sshash --canonical-parsing" + User time (seconds): 1148.22 + System time (seconds): 11.59 + Percent of CPU this job got: 159% + Elapsed (wall clock) time (h:mm:ss or m:ss): 12:06.11 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 7613392 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2855970 + Voluntary context switches: 409 + Involuntary context switches: 5671 + Swaps: 0 + File system inputs: 0 + File system outputs: 21390512 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/ncbi-virus.k63.canon.sshash --canonical-parsing" + User time (seconds): 107.35 + System time (seconds): 1.87 + Percent of CPU this job got: 103% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:45.21 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1507376 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 597495 + Voluntary context switches: 279 + Involuntary context switches: 742 + Swaps: 0 + File system inputs: 0 + File system outputs: 2184144 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/se.k63.canon.sshash --canonical-parsing" + User time (seconds): 872.27 + System time (seconds): 9.30 + Percent of CPU this job got: 228% + Elapsed (wall clock) time (h:mm:ss or m:ss): 6:26.35 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 6451140 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 3222933 + Voluntary context switches: 410 + Involuntary context switches: 3692 + Swaps: 0 + File system inputs: 0 + File system outputs: 14468456 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/hprc.k63.canon.sshash --canonical-parsing" + User time (seconds): 3760.19 + System time (seconds): 34.09 + Percent of CPU this job got: 243% + Elapsed (wall clock) time (h:mm:ss or m:ss): 25:57.25 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 16835436 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 9993840 + Voluntary context switches: 513 + Involuntary context switches: 13450 + Swaps: 0 + File system inputs: 0 + File system outputs: 59524008 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.log b/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.log new file mode 100644 index 0000000..3b8957a --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.log @@ -0,0 +1,48 @@ +2025-11-28 16:36:07: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-28 16:36:29: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_searches = 35527313/67275966 (52.8083%) +num_extensions = 31748653/67275966 (47.1917%) +elapsed = 22359.6 millisec / 22.3596 sec / 0.37266 min / 228.223 ns/kmer +2025-11-28 16:36:29: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-28 16:37:53: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_searches = 153492600/293470517 (52.3026%) +num_extensions = 139977917/293470517 (47.6974%) +elapsed = 83262.8 millisec / 83.2628 sec / 1.38771 min / 180.463 ns/kmer +2025-11-28 16:37:53: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 16:40:51: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406529529 (85.0803%) +num_searches = 222074093/406529529 (54.6268%) +num_extensions = 184455436/406529529 (45.3732%) +elapsed = 177318 millisec / 177.318 sec / 2.9553 min / 371.098 ns/kmer +2025-11-28 16:40:51: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-28 16:40:53: DONE +==== query report: +num_kmers = 10330949 +num_positive_kmers = 10230224 (99.025%) +num_searches = 5533278/10230224 (54.0876%) +num_extensions = 4696946/10230224 (45.9124%) +elapsed = 2363.11 millisec / 2.36311 sec / 0.0393851 min / 228.741 ns/kmer +2025-11-28 16:40:54: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-28 16:55:59: DONE +==== query report: +num_kmers = 541466405 +num_positive_kmers = 507202856 (93.6721%) +num_searches = 321345723/507202856 (63.3564%) +num_extensions = 185857133/507202856 (36.6436%) +elapsed = 905024 millisec / 905.024 sec / 15.0837 min / 1671.43 ns/kmer +2025-11-28 16:56:01: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 16:59:25: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 434532302 (90.9409%) +num_searches = 241384562/434532302 (55.5504%) +num_extensions = 193147740/434532302 (44.4496%) +elapsed = 203222 millisec / 203.222 sec / 3.38703 min / 425.312 ns/kmer diff --git a/benchmarks/results-27-11-25-v3/k63/regular-bench.json b/benchmarks/results-27-11-25-v3/k63/regular-bench.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-bench.log b/benchmarks/results-27-11-25-v3/k63/regular-bench.log new file mode 100644 index 0000000..ac63f79 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/regular-bench.log @@ -0,0 +1,108 @@ +avg_nanosec_per_positive_lookup 1176.24 +avg_nanosec_per_negative_lookup 1295.01 +avg_nanosec_per_positive_lookup_advanced 1170.72 +avg_nanosec_per_negative_lookup_advanced 1282.84 +avg_nanosec_per_access 309.049 +iterator: avg_nanosec_per_kmer 13.8023 +avg_nanosec_per_positive_lookup 1177.06 +avg_nanosec_per_negative_lookup 1317.47 +avg_nanosec_per_positive_lookup_advanced 1184 +avg_nanosec_per_negative_lookup_advanced 1286.57 +avg_nanosec_per_access 307.443 +iterator: avg_nanosec_per_kmer 14.1317 +avg_nanosec_per_positive_lookup 1183.02 +avg_nanosec_per_negative_lookup 1320.87 +avg_nanosec_per_positive_lookup_advanced 1183.52 +avg_nanosec_per_negative_lookup_advanced 1255.32 +avg_nanosec_per_access 306.267 +iterator: avg_nanosec_per_kmer 13.938 +avg_nanosec_per_positive_lookup 1000.99 +avg_nanosec_per_negative_lookup 1402.82 +avg_nanosec_per_positive_lookup_advanced 1015.78 +avg_nanosec_per_negative_lookup_advanced 1334.26 +avg_nanosec_per_access 268.359 +iterator: avg_nanosec_per_kmer 13.7447 +avg_nanosec_per_positive_lookup 997.474 +avg_nanosec_per_negative_lookup 1377.26 +avg_nanosec_per_positive_lookup_advanced 1028.81 +avg_nanosec_per_negative_lookup_advanced 1351.41 +avg_nanosec_per_access 270.65 +iterator: avg_nanosec_per_kmer 13.7468 +avg_nanosec_per_positive_lookup 1024.66 +avg_nanosec_per_negative_lookup 1378.64 +avg_nanosec_per_positive_lookup_advanced 1024.4 +avg_nanosec_per_negative_lookup_advanced 1358.3 +avg_nanosec_per_access 266.032 +iterator: avg_nanosec_per_kmer 14.2729 +avg_nanosec_per_positive_lookup 1554.36 +avg_nanosec_per_negative_lookup 1703.44 +avg_nanosec_per_positive_lookup_advanced 1523.25 +avg_nanosec_per_negative_lookup_advanced 1673.06 +avg_nanosec_per_access 355.779 +iterator: avg_nanosec_per_kmer 13.8737 +avg_nanosec_per_positive_lookup 1524.32 +avg_nanosec_per_negative_lookup 1722.17 +avg_nanosec_per_positive_lookup_advanced 1526.09 +avg_nanosec_per_negative_lookup_advanced 1685.69 +avg_nanosec_per_access 353.206 +iterator: avg_nanosec_per_kmer 13.8786 +avg_nanosec_per_positive_lookup 1541.9 +avg_nanosec_per_negative_lookup 1723.01 +avg_nanosec_per_positive_lookup_advanced 1533.71 +avg_nanosec_per_negative_lookup_advanced 1699.78 +avg_nanosec_per_access 358.16 +iterator: avg_nanosec_per_kmer 14.1515 +avg_nanosec_per_positive_lookup 938.321 +avg_nanosec_per_negative_lookup 1267.15 +avg_nanosec_per_positive_lookup_advanced 937.563 +avg_nanosec_per_negative_lookup_advanced 1251.9 +avg_nanosec_per_access 304.162 +iterator: avg_nanosec_per_kmer 14.1522 +avg_nanosec_per_positive_lookup 939.518 +avg_nanosec_per_negative_lookup 1280.11 +avg_nanosec_per_positive_lookup_advanced 943.774 +avg_nanosec_per_negative_lookup_advanced 1239.15 +avg_nanosec_per_access 300.735 +iterator: avg_nanosec_per_kmer 14.1745 +avg_nanosec_per_positive_lookup 942.911 +avg_nanosec_per_negative_lookup 1263.11 +avg_nanosec_per_positive_lookup_advanced 933 +avg_nanosec_per_negative_lookup_advanced 1248.72 +avg_nanosec_per_access 300.821 +iterator: avg_nanosec_per_kmer 13.8817 +avg_nanosec_per_positive_lookup 2832.14 +avg_nanosec_per_negative_lookup 2065.61 +avg_nanosec_per_positive_lookup_advanced 2812.98 +avg_nanosec_per_negative_lookup_advanced 2043.82 +avg_nanosec_per_access 435.503 +iterator: avg_nanosec_per_kmer 14.261 +avg_nanosec_per_positive_lookup 2828.23 +avg_nanosec_per_negative_lookup 2070.98 +avg_nanosec_per_positive_lookup_advanced 2829.25 +avg_nanosec_per_negative_lookup_advanced 2030.81 +avg_nanosec_per_access 432.514 +iterator: avg_nanosec_per_kmer 14.214 +avg_nanosec_per_positive_lookup 2853.67 +avg_nanosec_per_negative_lookup 2091.92 +avg_nanosec_per_positive_lookup_advanced 2860.96 +avg_nanosec_per_negative_lookup_advanced 2050.07 +avg_nanosec_per_access 435.452 +iterator: avg_nanosec_per_kmer 14.1743 +avg_nanosec_per_positive_lookup 2587.23 +avg_nanosec_per_negative_lookup 2629.75 +avg_nanosec_per_positive_lookup_advanced 2543.11 +avg_nanosec_per_negative_lookup_advanced 2579.34 +avg_nanosec_per_access 683.668 +iterator: avg_nanosec_per_kmer 14.493 +avg_nanosec_per_positive_lookup 2603.43 +avg_nanosec_per_negative_lookup 2622.83 +avg_nanosec_per_positive_lookup_advanced 2576.13 +avg_nanosec_per_negative_lookup_advanced 2602.66 +avg_nanosec_per_access 682.111 +iterator: avg_nanosec_per_kmer 14.1579 +avg_nanosec_per_positive_lookup 2565.77 +avg_nanosec_per_negative_lookup 2608.12 +avg_nanosec_per_positive_lookup_advanced 2554.08 +avg_nanosec_per_negative_lookup_advanced 2588.21 +avg_nanosec_per_access 680.79 +iterator: avg_nanosec_per_kmer 14.1209 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-build.json b/benchmarks/results-27-11-25-v3/k63/regular-build.json new file mode 100644 index 0000000..833ad3a --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/regular-build.json @@ -0,0 +1,6 @@ +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists +directory already exists diff --git a/benchmarks/results-27-11-25-v3/k63/regular-build.log b/benchmarks/results-27-11-25-v3/k63/regular-build.log new file mode 100644 index 0000000..96d31ef --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/regular-build.log @@ -0,0 +1,1428 @@ +k = 63, m = 24, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 61951098 bases, 55751160 kmers +read 200000 sequences, 122972836 bases, 110572898 kmers +read 300000 sequences, 183599791 bases, 164999853 kmers +read 400000 sequences, 245140055 bases, 220340117 kmers +read 500000 sequences, 306871655 bases, 275871717 kmers +read 600000 sequences, 368254748 bases, 331054810 kmers +read 700000 sequences, 430272349 bases, 386872411 kmers +read 800000 sequences, 496894402 bases, 447294464 kmers +read 900000 sequences, 580548812 bases, 524748874 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764279985214394756.minimizers.0.bin'... +read 954555 sequences, 615768068 bases, 556585658 kmers +num_kmers 556585658 +num_super_kmers 28019724 +num_pieces 954556 (+0.212663 [bits/kmer]) +=== step 1: 'parse_file' 82.1284 [sec] (147.557 [ns/kmer]) +num_minimizers 24561600 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 0.900406 [sec] (1.61773 [ns/kmer]) +bits_per_offset = ceil(log2(615768131)) = 30 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280068275170184.bucket_pairs.0.bin'... +num_singletons 23591216/24561600 (96.0492%) +=== step 3: 'build_index' 3.35811 [sec] (6.03341 [ns/kmer]) +max_num_super_kmers_in_bucket 19521 +log2_max_num_super_kmers_in_bucket 15 +num_buckets_in_skew_index 3503/24561600 (0.0142621%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 3715679 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 2564133 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 1403486 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 1115400 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 1042641 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 882051 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 19521: 1991148 +num_kmers_in_skew_index 12714538 (2.28438%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 3715679 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 3715679 keys; bits/key = 3.23769 + built positions[0] for 3715679 keys; bits/key = 7.0001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 2564133 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 2564133 keys; bits/key = 3.43225 + built positions[1] for 2564133 keys; bits/key = 8.00013 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 1403486 + building MPHF with 64 threads and 70 partitions... + built mphs[2] for 1403486 keys; bits/key = 3.07059 + built positions[2] for 1403486 keys; bits/key = 9.00026 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 1115400 + building MPHF with 64 threads and 55 partitions... + built mphs[3] for 1115400 keys; bits/key = 3.01221 + built positions[3] for 1115400 keys; bits/key = 10.0003 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 1042641 + building MPHF with 64 threads and 52 partitions... + built mphs[4] for 1042641 keys; bits/key = 3.00144 + built positions[4] for 1042641 keys; bits/key = 11.0003 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 882051 + building MPHF with 64 threads and 44 partitions... + built mphs[5] for 882051 keys; bits/key = 2.98863 + built positions[5] for 882051 keys; bits/key = 12.0004 + lower 4096; upper 19521; num_bits_per_pos 15; keys_in_partition.size() 1991148 + building MPHF with 64 threads and 99 partitions... + built mphs[6] for 1991148 keys; bits/key = 3.13438 + built positions[6] for 1991148 keys; bits/key = 15.0002 +num_bits_for_skew_index 162738608(0.292387 [bits/kmer]) +=== step 4: 'build_skew_index' 1.17985 [sec] (2.1198 [ns/kmer]) +=== total_time 87.5667 [sec] (157.328 [ns/kmer]) +total index size: 294488430 [B] -- 294.488 [MB] +SPACE BREAKDOWN: + minimizers: 0.120807 [bits/kmer] (2.73757 [bits/key]) -- 2.85407% + pieces: 0.0214933 [bits/kmer] -- 0.507781% + num_super_kmers_before_bucket: 0.0751667 [bits/kmer] -- 1.77582% + offsets: 1.51027 [bits/kmer] -- 35.6802% + strings: 2.21266 [bits/kmer] -- 52.2744% + skew_index: 0.292387 [bits/kmer] -- 6.90768% + weights: 2.6447e-06 [bits/kmer] -- 6.24812e-05% + weight_interval_values: 4.59947e-07 [bits/kmer] + weight_interval_lengths: 1.7248e-06 [bits/kmer] + weight_dictionary: 4.59947e-07 [bits/kmer] + -------------- + total: 4.23279 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 96.0492% +buckets with 2 super_kmers = 2.2644% +buckets with 3 super_kmers = 0.694128% +buckets with 4 super_kmers = 0.311437% +buckets with 5 super_kmers = 0.170913% +buckets with 6 super_kmers = 0.106434% +buckets with 7 super_kmers = 0.0716566% +buckets with 8 super_kmers = 0.0519307% +buckets with 9 super_kmers = 0.0388045% +buckets with 10 super_kmers = 0.0306698% +buckets with 11 super_kmers = 0.0247337% +buckets with 12 super_kmers = 0.0199865% +buckets with 13 super_kmers = 0.0164403% +buckets with 14 super_kmers = 0.0137857% +buckets with 15 super_kmers = 0.0117297% +buckets with 16 super_kmers = 0.0100197% +max_num_super_kmers_in_bucket 19521 +2025-11-27 22:47:52: saving data structure to disk... +2025-11-27 22:47:53: DONE +k = 63, m = 24, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280073158799178.minimizers.0.bin'... +read 100000 sequences, 726199521 bases, 719999583 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280073158799178.minimizers.1.bin'... +read 155784 sequences, 1164909275 bases, 1155250667 kmers +num_kmers 1155250667 +num_super_kmers 56506979 +num_pieces 155785 (+0.0167213 [bits/kmer]) +=== step 1: 'parse_file' 162.557 [sec] (140.712 [ns/kmer]) + == files to merge = 2 +num_written_tuples = 50000000 +num_written_tuples = 56506979 +num_minimizers 55965215 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 3.41297 [sec] (2.95432 [ns/kmer]) +bits_per_offset = ceil(log2(1164909338)) = 31 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280239191429978.bucket_pairs.0.bin'... +num_singletons 55755989/55965215 (99.6261%) +=== step 3: 'build_index' 9.03346 [sec] (7.81948 [ns/kmer]) +max_num_super_kmers_in_bucket 813 +log2_max_num_super_kmers_in_bucket 10 +num_buckets_in_skew_index 500/55965215 (0.000893412%) +num_partitions 4 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 589695 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 468254 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 205576 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 813: 80864 +num_kmers_in_skew_index 1344389 (0.116372%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 589695 + building MPHF with 64 threads and 29 partitions... + built mphs[0] for 589695 keys; bits/key = 2.963 + built positions[0] for 589695 keys; bits/key = 7.00055 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 468254 + building MPHF with 64 threads and 23 partitions... + built mphs[1] for 468254 keys; bits/key = 2.95604 + built positions[1] for 468254 keys; bits/key = 8.00072 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 205576 + building MPHF with 64 threads and 10 partitions... + built mphs[2] for 205576 keys; bits/key = 2.92423 + built positions[2] for 205576 keys; bits/key = 9.00183 + lower 512; upper 813; num_bits_per_pos 10; keys_in_partition.size() 80864 + building MPHF with 64 threads and 4 partitions... + built mphs[3] for 80864 keys; bits/key = 2.94796 + built positions[3] for 80864 keys; bits/key = 10.004 +num_bits_for_skew_index 14505248(0.0125559 [bits/kmer]) +=== step 4: 'build_skew_index' 0.345694 [sec] (0.299237 [ns/kmer]) +=== total_time 175.35 [sec] (151.785 [ns/kmer]) +total index size: 542513778 [B] -- 542.514 [MB] +SPACE BREAKDOWN: + minimizers: 0.13289 [bits/kmer] (2.74315 [bits/key]) -- 3.53726% + pieces: 0.00221454 [bits/kmer] -- 0.0589467% + num_super_kmers_before_bucket: 0.076164 [bits/kmer] -- 2.02733% + offsets: 1.51631 [bits/kmer] -- 40.3611% + strings: 2.01672 [bits/kmer] -- 53.6811% + skew_index: 0.0125559 [bits/kmer] -- 0.334214% + weights: 1.27418e-06 [bits/kmer] -- 3.39162e-05% + weight_interval_values: 2.21597e-07 [bits/kmer] + weight_interval_lengths: 8.30988e-07 [bits/kmer] + weight_dictionary: 2.21597e-07 [bits/kmer] + -------------- + total: 3.75686 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 99.6261% +buckets with 2 super_kmers = 0.251186% +buckets with 3 super_kmers = 0.0533975% +buckets with 4 super_kmers = 0.0222996% +buckets with 5 super_kmers = 0.0121754% +buckets with 6 super_kmers = 0.00769585% +buckets with 7 super_kmers = 0.00507994% +buckets with 8 super_kmers = 0.0035933% +buckets with 9 super_kmers = 0.00276243% +buckets with 10 super_kmers = 0.00200839% +buckets with 11 super_kmers = 0.00156704% +buckets with 12 super_kmers = 0.00133118% +buckets with 13 super_kmers = 0.00111498% +buckets with 14 super_kmers = 0.000980966% +buckets with 15 super_kmers = 0.000816579% +buckets with 16 super_kmers = 0.00071473% +max_num_super_kmers_in_bucket 813 +2025-11-27 22:50:48: saving data structure to disk... +2025-11-27 22:50:48: DONE +k = 63, m = 25, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 156072595 bases, 149872657 kmers +read 200000 sequences, 358422338 bases, 346022400 kmers +read 300000 sequences, 483978517 bases, 465378579 kmers +read 400000 sequences, 579661118 bases, 554861180 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280248970220538.minimizers.0.bin'... +read 500000 sequences, 676694662 bases, 645694724 kmers +read 600000 sequences, 771042496 bases, 733842558 kmers +read 700000 sequences, 867361949 bases, 823962011 kmers +read 800000 sequences, 963947999 bases, 914348061 kmers +read 900000 sequences, 1061593876 bases, 1005793938 kmers +read 1000000 sequences, 1159508767 bases, 1097508829 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280248970220538.minimizers.1.bin'... +read 1100000 sequences, 1258471359 bases, 1190271421 kmers +read 1200000 sequences, 1356700107 bases, 1282300169 kmers +read 1300000 sequences, 1455266386 bases, 1374666448 kmers +read 1400000 sequences, 1554765716 bases, 1467965778 kmers +read 1500000 sequences, 1655325517 bases, 1562325579 kmers +read 1600000 sequences, 1756677712 bases, 1657477774 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280248970220538.minimizers.2.bin'... +read 1700000 sequences, 1857972502 bases, 1752572564 kmers +read 1800000 sequences, 1959725889 bases, 1848125951 kmers +read 1900000 sequences, 2064608705 bases, 1946808767 kmers +read 2000000 sequences, 2171598469 bases, 2047598531 kmers +read 2100000 sequences, 2280349838 bases, 2150149900 kmers +read 2200000 sequences, 2390837388 bases, 2254437450 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280248970220538.minimizers.3.bin'... +read 2300000 sequences, 2504101994 bases, 2361502056 kmers +read 2400000 sequences, 2621983258 bases, 2473183320 kmers +read 2500000 sequences, 2745887962 bases, 2590888024 kmers +read 2600000 sequences, 2875578557 bases, 2714378619 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280248970220538.minimizers.4.bin'... +read 2642917 sequences, 2935176947 bases, 2771316093 kmers +num_kmers 2771316093 +num_super_kmers 141095110 +num_pieces 2642918 (+0.118255 [bits/kmer]) +=== step 1: 'parse_file' 385.783 [sec] (139.206 [ns/kmer]) + == files to merge = 5 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 141095110 +num_minimizers 123318771 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 8.58189 [sec] (3.09669 [ns/kmer]) +bits_per_offset = ceil(log2(2935177010)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280643492926440.bucket_pairs.0.bin'... +num_singletons 120176252/123318771 (97.4517%) +=== step 3: 'build_index' 27.4853 [sec] (9.91779 [ns/kmer]) +max_num_super_kmers_in_bucket 41894 +log2_max_num_super_kmers_in_bucket 16 +num_buckets_in_skew_index 28626/123318771 (0.023213%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 25290718 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 22959952 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 20403616 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 19208760 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 17090734 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 12440370 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 41894: 24078745 +num_kmers_in_skew_index 141472895 (5.1049%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 25290718 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 25290718 keys; bits/key = 2.78609 + built positions[0] for 25290718 keys; bits/key = 7.00001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 22959952 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 22959952 keys; bits/key = 2.81272 + built positions[1] for 22959952 keys; bits/key = 8.00001 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 20403616 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 20403616 keys; bits/key = 2.848 + built positions[2] for 20403616 keys; bits/key = 9.00002 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 19208760 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 19208760 keys; bits/key = 2.8638 + built positions[3] for 19208760 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 17090734 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 17090734 keys; bits/key = 2.90286 + built positions[4] for 17090734 keys; bits/key = 11 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 12440370 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 12440370 keys; bits/key = 2.99662 + built positions[5] for 12440370 keys; bits/key = 12 + lower 4096; upper 41894; num_bits_per_pos 16; keys_in_partition.size() 24078745 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 24078745 keys; bits/key = 2.79854 + built positions[6] for 24078745 keys; bits/key = 16 +num_bits_for_skew_index 1861418064(0.671673 [bits/kmer]) +=== step 4: 'build_skew_index' 17.6011 [sec] (6.35118 [ns/kmer]) +=== total_time 439.451 [sec] (158.571 [ns/kmer]) +total index size: 1602434288 [B] -- 1602.43 [MB] +SPACE BREAKDOWN: + minimizers: 0.11805 [bits/kmer] (2.65292 [bits/key]) -- 2.55202% + pieces: 0.0126433 [bits/kmer] -- 0.273323% + num_super_kmers_before_bucket: 0.0759434 [bits/kmer] -- 1.64174% + offsets: 1.62921 [bits/kmer] -- 35.2202% + strings: 2.11825 [bits/kmer] -- 45.7925% + skew_index: 0.671673 [bits/kmer] -- 14.5202% + weights: 5.31156e-07 [bits/kmer] -- 1.14825e-05% + weight_interval_values: 9.23749e-08 [bits/kmer] + weight_interval_lengths: 3.46406e-07 [bits/kmer] + weight_dictionary: 9.23749e-08 [bits/kmer] + -------------- + total: 4.62577 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 97.4517% +buckets with 2 super_kmers = 1.47013% +buckets with 3 super_kmers = 0.404837% +buckets with 4 super_kmers = 0.185024% +buckets with 5 super_kmers = 0.10586% +buckets with 6 super_kmers = 0.0683651% +buckets with 7 super_kmers = 0.0481184% +buckets with 8 super_kmers = 0.0354861% +buckets with 9 super_kmers = 0.0274881% +buckets with 10 super_kmers = 0.0217282% +buckets with 11 super_kmers = 0.0175805% +buckets with 12 super_kmers = 0.0146612% +buckets with 13 super_kmers = 0.0123679% +buckets with 14 super_kmers = 0.0106529% +buckets with 15 super_kmers = 0.00919244% +buckets with 16 super_kmers = 0.00788769% +max_num_super_kmers_in_bucket 41894 +2025-11-27 22:58:08: saving data structure to disk... +2025-11-27 22:58:09: DONE +k = 63, m = 23, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 48527990 bases, 42328052 kmers +read 200000 sequences, 101938174 bases, 89538236 kmers +read 300000 sequences, 171738001 bases, 153138063 kmers +read 400000 sequences, 279668649 bases, 254868711 kmers +read 500000 sequences, 322024377 bases, 291024439 kmers +read 600000 sequences, 367040069 bases, 329840131 kmers +read 700000 sequences, 412232472 bases, 368832534 kmers +read 800000 sequences, 457488794 bases, 407888856 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280689608027502.minimizers.0.bin'... +read 800231 sequences, 462130202 bases, 412515880 kmers +num_kmers 412515880 +num_super_kmers 20404397 +num_pieces 800232 (+0.240545 [bits/kmer]) +=== step 1: 'parse_file' 60.2141 [sec] (145.968 [ns/kmer]) +num_minimizers 18537049 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 0.674712 [sec] (1.6356 [ns/kmer]) +bits_per_offset = ceil(log2(462130265)) = 29 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280750526933329.bucket_pairs.0.bin'... +num_singletons 17320176/18537049 (93.4355%) +=== step 3: 'build_index' 2.42641 [sec] (5.88197 [ns/kmer]) +max_num_super_kmers_in_bucket 382 +log2_max_num_super_kmers_in_bucket 9 +num_buckets_in_skew_index 12/18537049 (6.47352e-05%) +num_partitions 3 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 19499 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 4829 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 382: 5558 +num_kmers_in_skew_index 29886 (0.00724481%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 19499 + building MPHF with 64 threads and 1 partitions... + built mphs[0] for 19499 keys; bits/key = 2.78578 + built positions[0] for 19499 keys; bits/key = 7.01739 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 4829 + building MPHF with 64 threads and 1 partitions... + built mphs[1] for 4829 keys; bits/key = 3.70429 + built positions[1] for 4829 keys; bits/key = 8.07124 + lower 256; upper 382; num_bits_per_pos 9; keys_in_partition.size() 5558 + building MPHF with 64 threads and 1 partitions... + built mphs[2] for 5558 keys; bits/key = 3.56963 + built positions[2] for 5558 keys; bits/key = 9.06225 +num_bits_for_skew_index 318416(0.000771888 [bits/kmer]) +=== step 4: 'build_skew_index' 0.104181 [sec] (0.25255 [ns/kmer]) +=== total_time 63.4194 [sec] (153.738 [ns/kmer]) +total index size: 200950900 [B] -- 200.951 [MB] +SPACE BREAKDOWN: + minimizers: 0.122667 [bits/kmer] (2.72979 [bits/key]) -- 3.14767% + pieces: 0.0239116 [bits/kmer] -- 0.613578% + num_super_kmers_before_bucket: 0.0747427 [bits/kmer] -- 1.91792% + offsets: 1.43444 [bits/kmer] -- 36.808% + strings: 2.24055 [bits/kmer] -- 57.4929% + skew_index: 0.000771888 [bits/kmer] -- 0.0198068% + weights: 3.56835e-06 [bits/kmer] -- 9.15647e-05% + weight_interval_values: 6.20582e-07 [bits/kmer] + weight_interval_lengths: 2.32718e-06 [bits/kmer] + weight_dictionary: 6.20582e-07 [bits/kmer] + -------------- + total: 3.89708 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 93.4355% +buckets with 2 super_kmers = 4.75754% +buckets with 3 super_kmers = 1.08068% +buckets with 4 super_kmers = 0.365285% +buckets with 5 super_kmers = 0.156853% +buckets with 6 super_kmers = 0.0795488% +buckets with 7 super_kmers = 0.0437664% +buckets with 8 super_kmers = 0.0260397% +buckets with 9 super_kmers = 0.0170469% +buckets with 10 super_kmers = 0.0111776% +buckets with 11 super_kmers = 0.00762797% +buckets with 12 super_kmers = 0.0052975% +buckets with 13 super_kmers = 0.00350649% +buckets with 14 super_kmers = 0.00244915% +buckets with 15 super_kmers = 0.00197442% +buckets with 16 super_kmers = 0.00134865% +max_num_super_kmers_in_bucket 382 +2025-11-27 22:59:13: saving data structure to disk... +2025-11-27 22:59:13: DONE +k = 63, m = 31, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 29016582 bases, 22816644 kmers +read 200000 sequences, 59512666 bases, 47112728 kmers +read 300000 sequences, 93672597 bases, 75072659 kmers +read 400000 sequences, 116504475 bases, 91704537 kmers +read 500000 sequences, 129640659 bases, 98640721 kmers +read 600000 sequences, 142888268 bases, 105688330 kmers +read 700000 sequences, 156121434 bases, 112721496 kmers +read 800000 sequences, 169296056 bases, 119696118 kmers +read 900000 sequences, 182473552 bases, 126673614 kmers +read 1000000 sequences, 195596530 bases, 133596592 kmers +read 1100000 sequences, 208767758 bases, 140567820 kmers +read 1200000 sequences, 222206136 bases, 147806198 kmers +read 1300000 sequences, 235298907 bases, 154698969 kmers +read 1400000 sequences, 248482551 bases, 161682613 kmers +read 1500000 sequences, 261588927 bases, 168588989 kmers +read 1600000 sequences, 275055123 bases, 175855185 kmers +read 1700000 sequences, 288035774 bases, 182635836 kmers +read 1800000 sequences, 301349714 bases, 189749776 kmers +read 1900000 sequences, 314875277 bases, 197075339 kmers +read 2000000 sequences, 328155322 bases, 204155384 kmers +read 2100000 sequences, 341368561 bases, 211168623 kmers +read 2200000 sequences, 354712477 bases, 218312539 kmers +read 2300000 sequences, 368071956 bases, 225472018 kmers +read 2400000 sequences, 381369058 bases, 232569120 kmers +read 2500000 sequences, 395076617 bases, 240076679 kmers +read 2600000 sequences, 408571137 bases, 247371199 kmers +read 2700000 sequences, 421770863 bases, 254370925 kmers +read 2800000 sequences, 434931009 bases, 261331071 kmers +read 2900000 sequences, 448298966 bases, 268499028 kmers +read 3000000 sequences, 461539188 bases, 275539250 kmers +read 3100000 sequences, 474884720 bases, 282684782 kmers +read 3200000 sequences, 488437755 bases, 290037817 kmers +read 3300000 sequences, 501681431 bases, 297081493 kmers +read 3400000 sequences, 514981599 bases, 304181661 kmers +read 3500000 sequences, 528308841 bases, 311308903 kmers +read 3600000 sequences, 541636881 bases, 318436943 kmers +read 3700000 sequences, 555162303 bases, 325762365 kmers +read 3800000 sequences, 568696721 bases, 333096783 kmers +read 3900000 sequences, 581917274 bases, 340117336 kmers +read 4000000 sequences, 595230685 bases, 347230747 kmers +read 4100000 sequences, 608987239 bases, 354787301 kmers +read 4200000 sequences, 622285126 bases, 361885188 kmers +read 4300000 sequences, 635647812 bases, 369047874 kmers +read 4400000 sequences, 648992570 bases, 376192632 kmers +read 4500000 sequences, 662513011 bases, 383513073 kmers +read 4600000 sequences, 675930610 bases, 390730672 kmers +read 4700000 sequences, 689630791 bases, 398230853 kmers +read 4800000 sequences, 702998442 bases, 405398504 kmers +read 4900000 sequences, 716508958 bases, 412709020 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280753237549641.minimizers.0.bin'... +read 5000000 sequences, 730213651 bases, 420213713 kmers +read 5100000 sequences, 743782088 bases, 427582150 kmers +read 5200000 sequences, 757644219 bases, 435244281 kmers +read 5300000 sequences, 771125055 bases, 442525117 kmers +read 5400000 sequences, 784690986 bases, 449891048 kmers +read 5500000 sequences, 798294730 bases, 457294792 kmers +read 5600000 sequences, 811868508 bases, 464668570 kmers +read 5700000 sequences, 825311135 bases, 471911197 kmers +read 5800000 sequences, 838965446 bases, 479365508 kmers +read 5900000 sequences, 852651285 bases, 486851347 kmers +read 6000000 sequences, 866286122 bases, 494286184 kmers +read 6100000 sequences, 879791056 bases, 501591118 kmers +read 6200000 sequences, 893568449 bases, 509168511 kmers +read 6300000 sequences, 907221007 bases, 516621069 kmers +read 6400000 sequences, 920850613 bases, 524050675 kmers +read 6500000 sequences, 934451411 bases, 531451473 kmers +read 6600000 sequences, 948058118 bases, 538858180 kmers +read 6700000 sequences, 961671957 bases, 546272019 kmers +read 6800000 sequences, 975396455 bases, 553796517 kmers +read 6900000 sequences, 989058845 bases, 561258907 kmers +read 7000000 sequences, 1002901429 bases, 568901491 kmers +read 7100000 sequences, 1016671629 bases, 576471691 kmers +read 7200000 sequences, 1030411544 bases, 584011606 kmers +read 7300000 sequences, 1044405065 bases, 591805127 kmers +read 7400000 sequences, 1058405891 bases, 599605953 kmers +read 7500000 sequences, 1072419133 bases, 607419195 kmers +read 7600000 sequences, 1086161468 bases, 614961530 kmers +read 7700000 sequences, 1100358314 bases, 622958376 kmers +read 7800000 sequences, 1114260927 bases, 630660989 kmers +read 7900000 sequences, 1128307710 bases, 638507772 kmers +read 8000000 sequences, 1142393895 bases, 646393957 kmers +read 8100000 sequences, 1156356962 bases, 654157024 kmers +read 8200000 sequences, 1170571834 bases, 662171896 kmers +read 8300000 sequences, 1184451092 bases, 669851154 kmers +read 8400000 sequences, 1198299201 bases, 677499263 kmers +read 8500000 sequences, 1212442291 bases, 685442353 kmers +read 8600000 sequences, 1226404988 bases, 693205050 kmers +read 8700000 sequences, 1240702863 bases, 701302925 kmers +read 8800000 sequences, 1254656858 bases, 709056920 kmers +read 8900000 sequences, 1268621255 bases, 716821317 kmers +read 9000000 sequences, 1282878920 bases, 724878982 kmers +read 9100000 sequences, 1297350483 bases, 733150545 kmers +read 9200000 sequences, 1311515942 bases, 741116004 kmers +read 9300000 sequences, 1325689602 bases, 749089664 kmers +read 9400000 sequences, 1339681841 bases, 756881903 kmers +read 9500000 sequences, 1353794253 bases, 764794315 kmers +read 9600000 sequences, 1368052405 bases, 772852467 kmers +read 9700000 sequences, 1382480965 bases, 781081027 kmers +read 9800000 sequences, 1397029040 bases, 789429102 kmers +read 9900000 sequences, 1411261749 bases, 797461811 kmers +read 10000000 sequences, 1425636281 bases, 805636343 kmers +read 10100000 sequences, 1439978068 bases, 813778130 kmers +read 10200000 sequences, 1454565939 bases, 822166001 kmers +read 10300000 sequences, 1469139911 bases, 830539973 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280753237549641.minimizers.1.bin'... +read 10400000 sequences, 1483590146 bases, 838790208 kmers +read 10500000 sequences, 1497966602 bases, 846966664 kmers +read 10600000 sequences, 1512656597 bases, 855456659 kmers +read 10700000 sequences, 1527179829 bases, 863779891 kmers +read 10800000 sequences, 1541782704 bases, 872182766 kmers +read 10900000 sequences, 1556446136 bases, 880646198 kmers +read 11000000 sequences, 1571132909 bases, 889132971 kmers +read 11100000 sequences, 1585816988 bases, 897617050 kmers +read 11200000 sequences, 1600557306 bases, 906157368 kmers +read 11300000 sequences, 1615262515 bases, 914662577 kmers +read 11400000 sequences, 1629999559 bases, 923199621 kmers +read 11500000 sequences, 1644860500 bases, 931860562 kmers +read 11600000 sequences, 1659779470 bases, 940579532 kmers +read 11700000 sequences, 1674792249 bases, 949392311 kmers +read 11800000 sequences, 1689736650 bases, 958136712 kmers +read 11900000 sequences, 1704892540 bases, 967092602 kmers +read 12000000 sequences, 1720028604 bases, 976028666 kmers +read 12100000 sequences, 1735135339 bases, 984935401 kmers +read 12200000 sequences, 1750296958 bases, 993897020 kmers +read 12300000 sequences, 1765691210 bases, 1003091272 kmers +read 12400000 sequences, 1781168535 bases, 1012368597 kmers +read 12500000 sequences, 1796591631 bases, 1021591693 kmers +read 12600000 sequences, 1811900898 bases, 1030700960 kmers +read 12700000 sequences, 1827876385 bases, 1040476447 kmers +read 12800000 sequences, 1843393661 bases, 1049793723 kmers +read 12900000 sequences, 1858842530 bases, 1059042592 kmers +read 13000000 sequences, 1874571274 bases, 1068571336 kmers +read 13100000 sequences, 1890244064 bases, 1078044126 kmers +read 13200000 sequences, 1905959037 bases, 1087559099 kmers +read 13300000 sequences, 1922228213 bases, 1097628275 kmers +read 13400000 sequences, 1938519944 bases, 1107720006 kmers +read 13500000 sequences, 1954664776 bases, 1117664838 kmers +read 13600000 sequences, 1970696460 bases, 1127496522 kmers +read 13700000 sequences, 1987164724 bases, 1137764786 kmers +read 13800000 sequences, 2003371237 bases, 1147771299 kmers +read 13900000 sequences, 2019649705 bases, 1157849767 kmers +read 14000000 sequences, 2036208623 bases, 1168208685 kmers +read 14100000 sequences, 2052985966 bases, 1178786028 kmers +read 14200000 sequences, 2069712096 bases, 1189312158 kmers +read 14300000 sequences, 2086760464 bases, 1200160526 kmers +read 14400000 sequences, 2103719550 bases, 1210919612 kmers +read 14500000 sequences, 2120768440 bases, 1221768502 kmers +read 14600000 sequences, 2137973451 bases, 1232773513 kmers +read 14700000 sequences, 2155333447 bases, 1243933509 kmers +read 14800000 sequences, 2173028894 bases, 1255428956 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280753237549641.minimizers.2.bin'... +read 14900000 sequences, 2190761817 bases, 1266961879 kmers +read 15000000 sequences, 2208992504 bases, 1278992566 kmers +read 15100000 sequences, 2226993777 bases, 1290793839 kmers +read 15200000 sequences, 2245240709 bases, 1302840771 kmers +read 15300000 sequences, 2264077653 bases, 1315477715 kmers +read 15400000 sequences, 2282789133 bases, 1327989195 kmers +read 15500000 sequences, 2301835592 bases, 1340835654 kmers +read 15600000 sequences, 2321337067 bases, 1354137129 kmers +read 15700000 sequences, 2341431050 bases, 1368031112 kmers +read 15800000 sequences, 2361547779 bases, 1381947841 kmers +read 15900000 sequences, 2382125643 bases, 1396325705 kmers +read 16000000 sequences, 2403497084 bases, 1411497146 kmers +read 16100000 sequences, 2424934249 bases, 1426734311 kmers +read 16200000 sequences, 2447209283 bases, 1442809345 kmers +read 16300000 sequences, 2470231701 bases, 1459631763 kmers +read 16400000 sequences, 2494280866 bases, 1477480928 kmers +read 16500000 sequences, 2519161479 bases, 1496161541 kmers +read 16600000 sequences, 2545406671 bases, 1516206733 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280753237549641.minimizers.3.bin'... +read 16636523 sequences, 2556368582 bases, 1524904156 kmers +num_kmers 1524904156 +num_super_kmers 105364487 +num_pieces 16636524 (+1.35283 [bits/kmer]) +=== step 1: 'parse_file' 203.245 [sec] (133.284 [ns/kmer]) + == files to merge = 4 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 105364487 +num_minimizers 61977146 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 5.40598 [sec] (3.54513 [ns/kmer]) +bits_per_offset = ceil(log2(2556368645)) = 32 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280962006872549.bucket_pairs.0.bin'... +num_singletons 51924477/61977146 (83.78%) +=== step 3: 'build_index' 13.1009 [sec] (8.59129 [ns/kmer]) +max_num_super_kmers_in_bucket 60556 +log2_max_num_super_kmers_in_bucket 16 +num_buckets_in_skew_index 36822/61977146 (0.0594122%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 32197643 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 16219357 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 8093770 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 3624950 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 3277017 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 2847802 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 60556: 8155619 +num_kmers_in_skew_index 74416158 (4.88005%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 32197643 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 32197643 keys; bits/key = 2.83246 + built positions[0] for 32197643 keys; bits/key = 7.00001 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 16219357 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 16219357 keys; bits/key = 2.91803 + built positions[1] for 16219357 keys; bits/key = 8.00002 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 8093770 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 8093770 keys; bits/key = 3.03812 + built positions[2] for 8093770 keys; bits/key = 9.00004 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 3624950 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 3624950 keys; bits/key = 3.24774 + built positions[3] for 3624950 keys; bits/key = 10.0001 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 3277017 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 3277017 keys; bits/key = 3.30128 + built positions[4] for 3277017 keys; bits/key = 11.0001 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 2847802 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 2847802 keys; bits/key = 3.37697 + built positions[5] for 2847802 keys; bits/key = 12.0001 + lower 4096; upper 60556; num_bits_per_pos 16; keys_in_partition.size() 8155619 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 8155619 keys; bits/key = 3.03513 + built positions[6] for 8155619 keys; bits/key = 16 +num_bits_for_skew_index 885023664(0.58038 [bits/kmer]) +=== step 4: 'build_skew_index' 9.1251 [sec] (5.98405 [ns/kmer]) +=== total_time 230.877 [sec] (151.405 [ns/kmer]) +total index size: 1231531808 [B] -- 1231.53 [MB] +SPACE BREAKDOWN: + minimizers: 0.110789 [bits/kmer] (2.72589 [bits/key]) -- 1.71476% + pieces: 0.113881 [bits/kmer] -- 1.76261% + num_super_kmers_before_bucket: 0.0919584 [bits/kmer] -- 1.42331% + offsets: 2.21107 [bits/kmer] -- 34.2223% + strings: 3.35283 [bits/kmer] -- 51.8941% + skew_index: 0.58038 [bits/kmer] -- 8.98296% + weights: 9.65307e-07 [bits/kmer] -- 1.49407e-05% + weight_interval_values: 1.67879e-07 [bits/kmer] + weight_interval_lengths: 6.29548e-07 [bits/kmer] + weight_dictionary: 1.67879e-07 [bits/kmer] + -------------- + total: 6.4609 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 83.78% +buckets with 2 super_kmers = 8.50293% +buckets with 3 super_kmers = 2.72349% +buckets with 4 super_kmers = 1.28045% +buckets with 5 super_kmers = 0.74659% +buckets with 6 super_kmers = 0.490636% +buckets with 7 super_kmers = 0.346841% +buckets with 8 super_kmers = 0.259701% +buckets with 9 super_kmers = 0.201973% +buckets with 10 super_kmers = 0.163723% +buckets with 11 super_kmers = 0.13585% +buckets with 12 super_kmers = 0.116798% +buckets with 13 super_kmers = 0.100644% +buckets with 14 super_kmers = 0.0880276% +buckets with 15 super_kmers = 0.0784838% +buckets with 16 super_kmers = 0.0713408% +max_num_super_kmers_in_bucket 60556 +2025-11-27 23:03:04: saving data structure to disk... +2025-11-27 23:03:04: DONE +k = 63, m = 31, seed = 1, l = 6, c = 3, canonical_parsing = false, weighted = false +reading file '/mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz'... +m_buffer_size 29411764 +read 100000 sequences, 12340428 bases, 6140490 kmers +read 200000 sequences, 24646464 bases, 12246526 kmers +read 300000 sequences, 37018030 bases, 18418092 kmers +read 400000 sequences, 49394989 bases, 24595051 kmers +read 500000 sequences, 61758753 bases, 30758815 kmers +read 600000 sequences, 74141065 bases, 36941127 kmers +read 700000 sequences, 86514469 bases, 43114531 kmers +read 800000 sequences, 98874419 bases, 49274481 kmers +read 900000 sequences, 111243104 bases, 55443166 kmers +read 1000000 sequences, 123617917 bases, 61617979 kmers +read 1100000 sequences, 136042481 bases, 67842543 kmers +read 1200000 sequences, 148420567 bases, 74020629 kmers +read 1300000 sequences, 160880986 bases, 80281048 kmers +read 1400000 sequences, 173296738 bases, 86496800 kmers +read 1500000 sequences, 185720015 bases, 92720077 kmers +read 1600000 sequences, 198143788 bases, 98943850 kmers +read 1700000 sequences, 210604030 bases, 105204092 kmers +read 1800000 sequences, 223058949 bases, 111459011 kmers +read 1900000 sequences, 235529393 bases, 117729455 kmers +read 2000000 sequences, 248006332 bases, 124006394 kmers +read 2100000 sequences, 260467827 bases, 130267889 kmers +read 2200000 sequences, 272924289 bases, 136524351 kmers +read 2300000 sequences, 285441228 bases, 142841290 kmers +read 2400000 sequences, 297932568 bases, 149132630 kmers +read 2500000 sequences, 310463939 bases, 155464001 kmers +read 2600000 sequences, 323014521 bases, 161814583 kmers +read 2700000 sequences, 335527696 bases, 168127758 kmers +read 2800000 sequences, 348042722 bases, 174442784 kmers +read 2900000 sequences, 360581821 bases, 180781883 kmers +read 3000000 sequences, 373165681 bases, 187165743 kmers +read 3100000 sequences, 385714108 bases, 193514170 kmers +read 3200000 sequences, 398280992 bases, 199881054 kmers +read 3300000 sequences, 410870862 bases, 206270924 kmers +read 3400000 sequences, 423449691 bases, 212649753 kmers +read 3500000 sequences, 436046745 bases, 219046807 kmers +read 3600000 sequences, 448679809 bases, 225479871 kmers +read 3700000 sequences, 461321374 bases, 231921436 kmers +read 3800000 sequences, 473931319 bases, 238331381 kmers +read 3900000 sequences, 486569329 bases, 244769391 kmers +read 4000000 sequences, 499216681 bases, 251216743 kmers +read 4100000 sequences, 511895744 bases, 257695806 kmers +read 4200000 sequences, 524602447 bases, 264202509 kmers +read 4300000 sequences, 537274929 bases, 270674991 kmers +read 4400000 sequences, 549984249 bases, 277184311 kmers +read 4500000 sequences, 562699936 bases, 283699998 kmers +read 4600000 sequences, 575434830 bases, 290234892 kmers +read 4700000 sequences, 588209883 bases, 296809945 kmers +read 4800000 sequences, 600967786 bases, 303367848 kmers +read 4900000 sequences, 613729111 bases, 309929173 kmers +read 5000000 sequences, 626504015 bases, 316504077 kmers +read 5100000 sequences, 639246673 bases, 323046735 kmers +read 5200000 sequences, 652025570 bases, 329625632 kmers +read 5300000 sequences, 664852185 bases, 336252247 kmers +read 5400000 sequences, 677687532 bases, 342887594 kmers +read 5500000 sequences, 690503191 bases, 349503253 kmers +read 5600000 sequences, 703329021 bases, 356129083 kmers +read 5700000 sequences, 716216575 bases, 362816637 kmers +read 5800000 sequences, 729051677 bases, 369451739 kmers +read 5900000 sequences, 741931929 bases, 376131991 kmers +read 6000000 sequences, 754844870 bases, 382844932 kmers +read 6100000 sequences, 767765015 bases, 389565077 kmers +read 6200000 sequences, 780677651 bases, 396277713 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.0.bin'... +read 6300000 sequences, 793620604 bases, 403020666 kmers +read 6400000 sequences, 806637866 bases, 409837928 kmers +read 6500000 sequences, 819598810 bases, 416598872 kmers +read 6600000 sequences, 832595190 bases, 423395252 kmers +read 6700000 sequences, 845581476 bases, 430181538 kmers +read 6800000 sequences, 858575752 bases, 436975814 kmers +read 6900000 sequences, 871622804 bases, 443822866 kmers +read 7000000 sequences, 884611433 bases, 450611495 kmers +read 7100000 sequences, 897672844 bases, 457472906 kmers +read 7200000 sequences, 910732890 bases, 464332952 kmers +read 7300000 sequences, 923812876 bases, 471212938 kmers +read 7400000 sequences, 936909486 bases, 478109548 kmers +read 7500000 sequences, 949997076 bases, 484997138 kmers +read 7600000 sequences, 963107948 bases, 491908010 kmers +read 7700000 sequences, 976263311 bases, 498863373 kmers +read 7800000 sequences, 989391312 bases, 505791374 kmers +read 7900000 sequences, 1002542416 bases, 512742478 kmers +read 8000000 sequences, 1015719792 bases, 519719854 kmers +read 8100000 sequences, 1028930102 bases, 526730164 kmers +read 8200000 sequences, 1042133340 bases, 533733402 kmers +read 8300000 sequences, 1055343002 bases, 540743064 kmers +read 8400000 sequences, 1068571302 bases, 547771364 kmers +read 8500000 sequences, 1081782071 bases, 554782133 kmers +read 8600000 sequences, 1095081331 bases, 561881393 kmers +read 8700000 sequences, 1108381691 bases, 568981753 kmers +read 8800000 sequences, 1121704459 bases, 576104521 kmers +read 8900000 sequences, 1135025716 bases, 583225778 kmers +read 9000000 sequences, 1148384003 bases, 590384065 kmers +read 9100000 sequences, 1161802419 bases, 597602481 kmers +read 9200000 sequences, 1175228269 bases, 604828331 kmers +read 9300000 sequences, 1188645635 bases, 612045697 kmers +read 9400000 sequences, 1202107172 bases, 619307234 kmers +read 9500000 sequences, 1215616855 bases, 626616917 kmers +read 9600000 sequences, 1229082244 bases, 633882306 kmers +read 9700000 sequences, 1242623466 bases, 641223528 kmers +read 9800000 sequences, 1256182360 bases, 648582422 kmers +read 9900000 sequences, 1269727590 bases, 655927652 kmers +read 10000000 sequences, 1283305118 bases, 663305180 kmers +read 10100000 sequences, 1296926048 bases, 670726110 kmers +read 10200000 sequences, 1310556982 bases, 678157044 kmers +read 10300000 sequences, 1324233550 bases, 685633612 kmers +read 10400000 sequences, 1337906859 bases, 693106921 kmers +read 10500000 sequences, 1351643168 bases, 700643230 kmers +read 10600000 sequences, 1365330951 bases, 708131013 kmers +read 10700000 sequences, 1379108463 bases, 715708525 kmers +read 10800000 sequences, 1392877680 bases, 723277742 kmers +read 10900000 sequences, 1406644001 bases, 730844063 kmers +read 11000000 sequences, 1420392493 bases, 738392555 kmers +read 11100000 sequences, 1434208255 bases, 746008317 kmers +read 11200000 sequences, 1448044904 bases, 753644966 kmers +read 11300000 sequences, 1461973739 bases, 761373801 kmers +read 11400000 sequences, 1475908384 bases, 769108446 kmers +read 11500000 sequences, 1489828655 bases, 776828717 kmers +read 11600000 sequences, 1503804136 bases, 784604198 kmers +read 11700000 sequences, 1517825110 bases, 792425172 kmers +read 11800000 sequences, 1531854849 bases, 800254911 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.1.bin'... +read 11900000 sequences, 1545912444 bases, 808112506 kmers +read 12000000 sequences, 1559904915 bases, 815904977 kmers +read 12100000 sequences, 1574126558 bases, 823926620 kmers +read 12200000 sequences, 1588253922 bases, 831853984 kmers +read 12300000 sequences, 1602371618 bases, 839771680 kmers +read 12400000 sequences, 1616537157 bases, 847737219 kmers +read 12500000 sequences, 1630788602 bases, 855788664 kmers +read 12600000 sequences, 1644978314 bases, 863778376 kmers +read 12700000 sequences, 1659241146 bases, 871841208 kmers +read 12800000 sequences, 1673584118 bases, 879984180 kmers +read 12900000 sequences, 1687940515 bases, 888140577 kmers +read 13000000 sequences, 1702343713 bases, 896343775 kmers +read 13100000 sequences, 1716759504 bases, 904559566 kmers +read 13200000 sequences, 1731228620 bases, 912828682 kmers +read 13300000 sequences, 1745703567 bases, 921103629 kmers +read 13400000 sequences, 1760203118 bases, 929403180 kmers +read 13500000 sequences, 1774792602 bases, 937792664 kmers +read 13600000 sequences, 1789438596 bases, 946238658 kmers +read 13700000 sequences, 1804059588 bases, 954659650 kmers +read 13800000 sequences, 1818743867 bases, 963143929 kmers +read 13900000 sequences, 1833395553 bases, 971595615 kmers +read 14000000 sequences, 1848153717 bases, 980153779 kmers +read 14100000 sequences, 1862998527 bases, 988798589 kmers +read 14200000 sequences, 1877911963 bases, 997512025 kmers +read 14300000 sequences, 1892816751 bases, 1006216813 kmers +read 14400000 sequences, 1907719813 bases, 1014919875 kmers +read 14500000 sequences, 1922766528 bases, 1023766590 kmers +read 14600000 sequences, 1937831250 bases, 1032631312 kmers +read 14700000 sequences, 1952937508 bases, 1041537570 kmers +read 14800000 sequences, 1968048267 bases, 1050448329 kmers +read 14900000 sequences, 1983251368 bases, 1059451430 kmers +read 15000000 sequences, 1998487486 bases, 1068487548 kmers +read 15100000 sequences, 2013788234 bases, 1077588296 kmers +read 15200000 sequences, 2029113702 bases, 1086713764 kmers +read 15300000 sequences, 2044464630 bases, 1095864692 kmers +read 15400000 sequences, 2059908322 bases, 1105108384 kmers +read 15500000 sequences, 2075402983 bases, 1114403045 kmers +read 15600000 sequences, 2090966187 bases, 1123766249 kmers +read 15700000 sequences, 2106543558 bases, 1133143620 kmers +read 15800000 sequences, 2122217022 bases, 1142617084 kmers +read 15900000 sequences, 2137840083 bases, 1152040145 kmers +read 16000000 sequences, 2153589344 bases, 1161589406 kmers +read 16100000 sequences, 2169260628 bases, 1171060690 kmers +read 16200000 sequences, 2185176930 bases, 1180776992 kmers +read 16300000 sequences, 2201140458 bases, 1190540520 kmers +read 16400000 sequences, 2217102473 bases, 1200302535 kmers +read 16500000 sequences, 2233154507 bases, 1210154569 kmers +read 16600000 sequences, 2249289162 bases, 1220089224 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.2.bin'... +read 16700000 sequences, 2265554961 bases, 1230155023 kmers +read 16800000 sequences, 2281740014 bases, 1240140076 kmers +read 16900000 sequences, 2298107838 bases, 1250307900 kmers +read 17000000 sequences, 2314472095 bases, 1260472157 kmers +read 17100000 sequences, 2331031176 bases, 1270831238 kmers +read 17200000 sequences, 2347660266 bases, 1281260328 kmers +read 17300000 sequences, 2364281388 bases, 1291681450 kmers +read 17400000 sequences, 2381150963 bases, 1302351025 kmers +read 17500000 sequences, 2398014863 bases, 1313014925 kmers +read 17600000 sequences, 2414848399 bases, 1323648461 kmers +read 17700000 sequences, 2431827698 bases, 1334427760 kmers +read 17800000 sequences, 2448880349 bases, 1345280411 kmers +read 17900000 sequences, 2466079400 bases, 1356279462 kmers +read 18000000 sequences, 2483330959 bases, 1367331021 kmers +read 18100000 sequences, 2500735710 bases, 1378535772 kmers +read 18200000 sequences, 2518182276 bases, 1389782338 kmers +read 18300000 sequences, 2535776920 bases, 1401176982 kmers +read 18400000 sequences, 2553420194 bases, 1412620256 kmers +read 18500000 sequences, 2571217426 bases, 1424217488 kmers +read 18600000 sequences, 2589036466 bases, 1435836528 kmers +read 18700000 sequences, 2607070465 bases, 1447670527 kmers +read 18800000 sequences, 2625276965 bases, 1459677027 kmers +read 18900000 sequences, 2643374208 bases, 1471574270 kmers +read 19000000 sequences, 2661730118 bases, 1483730180 kmers +read 19100000 sequences, 2680149690 bases, 1495949752 kmers +read 19200000 sequences, 2698694575 bases, 1508294637 kmers +read 19300000 sequences, 2717352858 bases, 1520752920 kmers +read 19400000 sequences, 2736256794 bases, 1533456856 kmers +read 19500000 sequences, 2755257099 bases, 1546257161 kmers +read 19600000 sequences, 2774351092 bases, 1559151154 kmers +read 19700000 sequences, 2793728147 bases, 1572328209 kmers +read 19800000 sequences, 2813220812 bases, 1585620874 kmers +read 19900000 sequences, 2832722318 bases, 1598922380 kmers +read 20000000 sequences, 2852409685 bases, 1612409747 kmers +read 20100000 sequences, 2872347441 bases, 1626147503 kmers +read 20200000 sequences, 2892389463 bases, 1639989525 kmers +read 20300000 sequences, 2912735330 bases, 1654135392 kmers +read 20400000 sequences, 2933385055 bases, 1668585117 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.3.bin'... +read 20500000 sequences, 2954091410 bases, 1683091472 kmers +read 20600000 sequences, 2974925213 bases, 1697725275 kmers +read 20700000 sequences, 2995915692 bases, 1712515754 kmers +read 20800000 sequences, 3017122624 bases, 1727522686 kmers +read 20900000 sequences, 3038531652 bases, 1742731714 kmers +read 21000000 sequences, 3060194460 bases, 1758194522 kmers +read 21100000 sequences, 3081907028 bases, 1773707090 kmers +read 21200000 sequences, 3104086626 bases, 1789686688 kmers +read 21300000 sequences, 3126473195 bases, 1805873257 kmers +read 21400000 sequences, 3149107906 bases, 1822307968 kmers +read 21500000 sequences, 3171928079 bases, 1838928141 kmers +read 21600000 sequences, 3194957971 bases, 1855758033 kmers +read 21700000 sequences, 3218340993 bases, 1872941055 kmers +read 21800000 sequences, 3241998343 bases, 1890398405 kmers +read 21900000 sequences, 3265867458 bases, 1908067520 kmers +read 22000000 sequences, 3290140116 bases, 1926140178 kmers +read 22100000 sequences, 3314773229 bases, 1944573291 kmers +read 22200000 sequences, 3339683134 bases, 1963283196 kmers +read 22300000 sequences, 3365026133 bases, 1982426195 kmers +read 22400000 sequences, 3390524791 bases, 2001724853 kmers +read 22500000 sequences, 3416602833 bases, 2021602895 kmers +read 22600000 sequences, 3443068690 bases, 2041868752 kmers +read 22700000 sequences, 3469843700 bases, 2062443762 kmers +read 22800000 sequences, 3496984478 bases, 2083384540 kmers +read 22900000 sequences, 3524534052 bases, 2104734114 kmers +read 23000000 sequences, 3552570866 bases, 2126570928 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.4.bin'... +read 23100000 sequences, 3581192297 bases, 2148992359 kmers +read 23200000 sequences, 3610381722 bases, 2171981784 kmers +read 23300000 sequences, 3639850904 bases, 2195250966 kmers +read 23400000 sequences, 3669893515 bases, 2219093577 kmers +read 23500000 sequences, 3700753180 bases, 2243753242 kmers +read 23600000 sequences, 3732004041 bases, 2268804103 kmers +read 23700000 sequences, 3763988485 bases, 2294588547 kmers +read 23800000 sequences, 3796342436 bases, 2320742498 kmers +read 23900000 sequences, 3829616775 bases, 2347816837 kmers +read 24000000 sequences, 3863888823 bases, 2375888885 kmers +read 24100000 sequences, 3898563459 bases, 2404363521 kmers +read 24200000 sequences, 3934104488 bases, 2433704550 kmers +read 24300000 sequences, 3970663407 bases, 2464063469 kmers +read 24400000 sequences, 4008289022 bases, 2495489084 kmers +read 24500000 sequences, 4046653033 bases, 2527653095 kmers +read 24600000 sequences, 4085473878 bases, 2560273940 kmers +read 24700000 sequences, 4125325829 bases, 2593925891 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.5.bin'... +read 24800000 sequences, 4166644355 bases, 2629044417 kmers +read 24900000 sequences, 4209155738 bases, 2665355800 kmers +read 25000000 sequences, 4253357779 bases, 2703357841 kmers +read 25100000 sequences, 4298305920 bases, 2742105982 kmers +read 25200000 sequences, 4345040766 bases, 2782640828 kmers +read 25300000 sequences, 4392930039 bases, 2824330101 kmers +read 25400000 sequences, 4442653000 bases, 2867853062 kmers +read 25500000 sequences, 4494210063 bases, 2913210125 kmers +read 25600000 sequences, 4547341577 bases, 2960141639 kmers +read 25700000 sequences, 4602288626 bases, 3008888688 kmers +read 25800000 sequences, 4659267065 bases, 3059667127 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.6.bin'... +read 25900000 sequences, 4718698709 bases, 3112898771 kmers +read 26000000 sequences, 4780487522 bases, 3168487584 kmers +read 26100000 sequences, 4845830481 bases, 3227630543 kmers +read 26200000 sequences, 4913892030 bases, 3289492092 kmers +read 26300000 sequences, 4985279649 bases, 3354679711 kmers +read 26400000 sequences, 5059257799 bases, 3422457861 kmers +read 26500000 sequences, 5137444349 bases, 3494444411 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.7.bin'... +read 26600000 sequences, 5220217341 bases, 3571017403 kmers +read 26700000 sequences, 5307644757 bases, 3652244819 kmers +read 26800000 sequences, 5400268538 bases, 3738668600 kmers +read 26900000 sequences, 5498820865 bases, 3831020927 kmers +read 27000000 sequences, 5604483878 bases, 3930483940 kmers +read 27100000 sequences, 5717045771 bases, 4036845833 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.8.bin'... +read 27200000 sequences, 5833610977 bases, 4147211039 kmers +read 27300000 sequences, 5846284831 bases, 4153684893 kmers +read 27400000 sequences, 5857666136 bases, 4158866198 kmers +read 27500000 sequences, 5869033199 bases, 4164033261 kmers +read 27600000 sequences, 5880411993 bases, 4169212055 kmers +read 27700000 sequences, 5891780011 bases, 4174380073 kmers +read 27800000 sequences, 5903175513 bases, 4179575575 kmers +read 27900000 sequences, 5914554374 bases, 4184754436 kmers +read 28000000 sequences, 5925952810 bases, 4189952872 kmers +read 28100000 sequences, 5937329908 bases, 4195129970 kmers +read 28200000 sequences, 5948710629 bases, 4200310691 kmers +read 28300000 sequences, 5960084042 bases, 4205484104 kmers +read 28400000 sequences, 5971480602 bases, 4210680664 kmers +read 28500000 sequences, 5982848841 bases, 4215848903 kmers +read 28600000 sequences, 5994224296 bases, 4221024358 kmers +read 28700000 sequences, 6005620451 bases, 4226220513 kmers +read 28800000 sequences, 6016990442 bases, 4231390504 kmers +read 28900000 sequences, 6028385648 bases, 4236585710 kmers +read 29000000 sequences, 6039783825 bases, 4241783887 kmers +read 29100000 sequences, 6051178683 bases, 4246978745 kmers +read 29200000 sequences, 6062557847 bases, 4252157909 kmers +read 29300000 sequences, 6073940813 bases, 4257340875 kmers +read 29400000 sequences, 6085331250 bases, 4262531312 kmers +read 29500000 sequences, 6096728346 bases, 4267728408 kmers +read 29600000 sequences, 6108102978 bases, 4272903040 kmers +read 29700000 sequences, 6119481358 bases, 4278081420 kmers +read 29800000 sequences, 6130856114 bases, 4283256176 kmers +read 29900000 sequences, 6142238297 bases, 4288438359 kmers +read 30000000 sequences, 6153634829 bases, 4293634891 kmers +read 30100000 sequences, 6165020049 bases, 4298820111 kmers +read 30200000 sequences, 6176433423 bases, 4304033485 kmers +read 30300000 sequences, 6187857491 bases, 4309257553 kmers +read 30400000 sequences, 6199252194 bases, 4314452256 kmers +read 30500000 sequences, 6210672548 bases, 4319672610 kmers +read 30600000 sequences, 6222091861 bases, 4324891923 kmers +read 30700000 sequences, 6233490435 bases, 4330090497 kmers +read 30800000 sequences, 6244878831 bases, 4335278893 kmers +read 30900000 sequences, 6256282376 bases, 4340482438 kmers +read 31000000 sequences, 6267683956 bases, 4345684018 kmers +read 31100000 sequences, 6279097813 bases, 4350897875 kmers +read 31200000 sequences, 6290508351 bases, 4356108413 kmers +read 31300000 sequences, 6301930261 bases, 4361330323 kmers +read 31400000 sequences, 6313323207 bases, 4366523269 kmers +read 31500000 sequences, 6324738619 bases, 4371738681 kmers +read 31600000 sequences, 6336131574 bases, 4376931636 kmers +read 31700000 sequences, 6347524494 bases, 4382124556 kmers +read 31800000 sequences, 6358957002 bases, 4387357064 kmers +read 31900000 sequences, 6370374986 bases, 4392575048 kmers +read 32000000 sequences, 6381788111 bases, 4397788173 kmers +read 32100000 sequences, 6393224920 bases, 4403024982 kmers +read 32200000 sequences, 6404645946 bases, 4408246008 kmers +read 32300000 sequences, 6416049834 bases, 4413449896 kmers +read 32400000 sequences, 6427468467 bases, 4418668529 kmers +read 32500000 sequences, 6438906136 bases, 4423906198 kmers +read 32600000 sequences, 6450334707 bases, 4429134769 kmers +read 32700000 sequences, 6461755008 bases, 4434355070 kmers +read 32800000 sequences, 6473195587 bases, 4439595649 kmers +read 32900000 sequences, 6484644167 bases, 4444844229 kmers +read 33000000 sequences, 6496092416 bases, 4450092478 kmers +read 33100000 sequences, 6507511441 bases, 4455311503 kmers +read 33200000 sequences, 6518945085 bases, 4460545147 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.9.bin'... +read 33300000 sequences, 6530384425 bases, 4465784487 kmers +read 33400000 sequences, 6541805219 bases, 4471005281 kmers +read 33500000 sequences, 6553237504 bases, 4476237566 kmers +read 33600000 sequences, 6564689101 bases, 4481489163 kmers +read 33700000 sequences, 6576122082 bases, 4486722144 kmers +read 33800000 sequences, 6587572222 bases, 4491972284 kmers +read 33900000 sequences, 6599018743 bases, 4497218805 kmers +read 34000000 sequences, 6610456706 bases, 4502456768 kmers +read 34100000 sequences, 6621897287 bases, 4507697349 kmers +read 34200000 sequences, 6633348561 bases, 4512948623 kmers +read 34300000 sequences, 6644796892 bases, 4518196954 kmers +read 34400000 sequences, 6656241823 bases, 4523441885 kmers +read 34500000 sequences, 6667691043 bases, 4528691105 kmers +read 34600000 sequences, 6679157213 bases, 4533957275 kmers +read 34700000 sequences, 6690642188 bases, 4539242250 kmers +read 34800000 sequences, 6702109473 bases, 4544509535 kmers +read 34900000 sequences, 6713569359 bases, 4549769421 kmers +read 35000000 sequences, 6725025515 bases, 4555025577 kmers +read 35100000 sequences, 6736483861 bases, 4560283923 kmers +read 35200000 sequences, 6747950533 bases, 4565550595 kmers +read 35300000 sequences, 6759386980 bases, 4570787042 kmers +read 35400000 sequences, 6770873467 bases, 4576073529 kmers +read 35500000 sequences, 6782328796 bases, 4581328858 kmers +read 35600000 sequences, 6793801566 bases, 4586601628 kmers +read 35700000 sequences, 6805288962 bases, 4591889024 kmers +read 35800000 sequences, 6816766599 bases, 4597166661 kmers +read 35900000 sequences, 6828221603 bases, 4602421665 kmers +read 36000000 sequences, 6839697263 bases, 4607697325 kmers +read 36100000 sequences, 6851167968 bases, 4612968030 kmers +read 36200000 sequences, 6862661069 bases, 4618261131 kmers +read 36300000 sequences, 6874122160 bases, 4623522222 kmers +read 36400000 sequences, 6885601876 bases, 4628801938 kmers +read 36500000 sequences, 6897090990 bases, 4634091052 kmers +read 36600000 sequences, 6908577092 bases, 4639377154 kmers +read 36700000 sequences, 6920070395 bases, 4644670457 kmers +read 36800000 sequences, 6931582953 bases, 4649983015 kmers +read 36900000 sequences, 6943074936 bases, 4655274998 kmers +read 37000000 sequences, 6954565924 bases, 4660565986 kmers +read 37100000 sequences, 6966070452 bases, 4665870514 kmers +read 37200000 sequences, 6977560415 bases, 4671160477 kmers +read 37300000 sequences, 6989066925 bases, 4676466987 kmers +read 37400000 sequences, 7000566400 bases, 4681766462 kmers +read 37500000 sequences, 7012064100 bases, 4687064162 kmers +read 37600000 sequences, 7023578971 bases, 4692379033 kmers +read 37700000 sequences, 7035113747 bases, 4697713809 kmers +read 37800000 sequences, 7046611117 bases, 4703011179 kmers +read 37900000 sequences, 7058112871 bases, 4708312933 kmers +read 38000000 sequences, 7069620689 bases, 4713620751 kmers +read 38100000 sequences, 7081124602 bases, 4718924664 kmers +read 38200000 sequences, 7092641574 bases, 4724241636 kmers +read 38300000 sequences, 7104173321 bases, 4729573383 kmers +read 38400000 sequences, 7115693749 bases, 4734893811 kmers +read 38500000 sequences, 7127223394 bases, 4740223456 kmers +read 38600000 sequences, 7138742801 bases, 4745542863 kmers +read 38700000 sequences, 7150287920 bases, 4750887982 kmers +read 38800000 sequences, 7161816661 bases, 4756216723 kmers +read 38900000 sequences, 7173324334 bases, 4761524396 kmers +read 39000000 sequences, 7184856265 bases, 4766856327 kmers +read 39100000 sequences, 7196427309 bases, 4772227371 kmers +read 39200000 sequences, 7207963095 bases, 4777563157 kmers +read 39300000 sequences, 7219512038 bases, 4782912100 kmers +read 39400000 sequences, 7231058926 bases, 4788258988 kmers +read 39500000 sequences, 7242615745 bases, 4793615807 kmers +read 39600000 sequences, 7254151997 bases, 4798952059 kmers +read 39700000 sequences, 7265709248 bases, 4804309310 kmers +read 39800000 sequences, 7277261549 bases, 4809661611 kmers +read 39900000 sequences, 7288795953 bases, 4814996015 kmers +read 40000000 sequences, 7300352386 bases, 4820352448 kmers +read 40100000 sequences, 7311909203 bases, 4825709265 kmers +read 40200000 sequences, 7323455080 bases, 4831055142 kmers +read 40300000 sequences, 7335021048 bases, 4836421110 kmers +read 40400000 sequences, 7346572779 bases, 4841772841 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.10.bin'... +read 40500000 sequences, 7358141861 bases, 4847141923 kmers +read 40600000 sequences, 7369700966 bases, 4852501028 kmers +read 40700000 sequences, 7381268484 bases, 4857868546 kmers +read 40800000 sequences, 7392842850 bases, 4863242912 kmers +read 40900000 sequences, 7404426052 bases, 4868626114 kmers +read 41000000 sequences, 7415987087 bases, 4873987149 kmers +read 41100000 sequences, 7427574902 bases, 4879374964 kmers +read 41200000 sequences, 7439175505 bases, 4884775567 kmers +read 41300000 sequences, 7450739513 bases, 4890139575 kmers +read 41400000 sequences, 7462313943 bases, 4895514005 kmers +read 41500000 sequences, 7473895566 bases, 4900895628 kmers +read 41600000 sequences, 7485498872 bases, 4906298934 kmers +read 41700000 sequences, 7497097591 bases, 4911697653 kmers +read 41800000 sequences, 7508699276 bases, 4917099338 kmers +read 41900000 sequences, 7520283386 bases, 4922483448 kmers +read 42000000 sequences, 7531875484 bases, 4927875546 kmers +read 42100000 sequences, 7543485183 bases, 4933285245 kmers +read 42200000 sequences, 7555088346 bases, 4938688408 kmers +read 42300000 sequences, 7566689709 bases, 4944089771 kmers +read 42400000 sequences, 7578300740 bases, 4949500802 kmers +read 42500000 sequences, 7589916966 bases, 4954917028 kmers +read 42600000 sequences, 7601521236 bases, 4960321298 kmers +read 42700000 sequences, 7613130580 bases, 4965730642 kmers +read 42800000 sequences, 7624734645 bases, 4971134707 kmers +read 42900000 sequences, 7636365632 bases, 4976565694 kmers +read 43000000 sequences, 7647987121 bases, 4981987183 kmers +read 43100000 sequences, 7659607327 bases, 4987407389 kmers +read 43200000 sequences, 7671221477 bases, 4992821539 kmers +read 43300000 sequences, 7682851013 bases, 4998251075 kmers +read 43400000 sequences, 7694478022 bases, 5003678084 kmers +read 43500000 sequences, 7706091680 bases, 5009091742 kmers +read 43600000 sequences, 7717739091 bases, 5014539153 kmers +read 43700000 sequences, 7729379970 bases, 5019980032 kmers +read 43800000 sequences, 7741005738 bases, 5025405800 kmers +read 43900000 sequences, 7752654757 bases, 5030854819 kmers +read 44000000 sequences, 7764325440 bases, 5036325502 kmers +read 44100000 sequences, 7775977254 bases, 5041777316 kmers +read 44200000 sequences, 7787629671 bases, 5047229733 kmers +read 44300000 sequences, 7799282350 bases, 5052682412 kmers +read 44400000 sequences, 7810951187 bases, 5058151249 kmers +read 44500000 sequences, 7822598421 bases, 5063598483 kmers +read 44600000 sequences, 7834244714 bases, 5069044776 kmers +read 44700000 sequences, 7845891240 bases, 5074491302 kmers +read 44800000 sequences, 7857565519 bases, 5079965581 kmers +read 44900000 sequences, 7869252351 bases, 5085452413 kmers +read 45000000 sequences, 7880919098 bases, 5090919160 kmers +read 45100000 sequences, 7892576949 bases, 5096377011 kmers +read 45200000 sequences, 7904241929 bases, 5101841991 kmers +read 45300000 sequences, 7915920658 bases, 5107320720 kmers +read 45400000 sequences, 7927605513 bases, 5112805575 kmers +read 45500000 sequences, 7939292816 bases, 5118292878 kmers +read 45600000 sequences, 7950975991 bases, 5123776053 kmers +read 45700000 sequences, 7962666759 bases, 5129266821 kmers +read 45800000 sequences, 7974341946 bases, 5134742008 kmers +read 45900000 sequences, 7986038612 bases, 5140238674 kmers +read 46000000 sequences, 7997748818 bases, 5145748880 kmers +read 46100000 sequences, 8009477725 bases, 5151277787 kmers +read 46200000 sequences, 8021166242 bases, 5156766304 kmers +read 46300000 sequences, 8032854170 bases, 5162254232 kmers +read 46400000 sequences, 8044555955 bases, 5167756017 kmers +read 46500000 sequences, 8056240494 bases, 5173240556 kmers +read 46600000 sequences, 8067931653 bases, 5178731715 kmers +read 46700000 sequences, 8079648908 bases, 5184248970 kmers +read 46800000 sequences, 8091384712 bases, 5189784774 kmers +read 46900000 sequences, 8103124079 bases, 5195324141 kmers +read 47000000 sequences, 8114852096 bases, 5200852158 kmers +read 47100000 sequences, 8126577432 bases, 5206377494 kmers +read 47200000 sequences, 8138321107 bases, 5211921169 kmers +read 47300000 sequences, 8150082884 bases, 5217482946 kmers +read 47400000 sequences, 8161823368 bases, 5223023430 kmers +read 47500000 sequences, 8173558332 bases, 5228558394 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.11.bin'... +read 47600000 sequences, 8185297180 bases, 5234097242 kmers +read 47700000 sequences, 8197020764 bases, 5239620826 kmers +read 47800000 sequences, 8208783838 bases, 5245183900 kmers +read 47900000 sequences, 8220547786 bases, 5250747848 kmers +read 48000000 sequences, 8232292674 bases, 5256292736 kmers +read 48100000 sequences, 8244054434 bases, 5261854496 kmers +read 48200000 sequences, 8255808686 bases, 5267408748 kmers +read 48300000 sequences, 8267574482 bases, 5272974544 kmers +read 48400000 sequences, 8279340872 bases, 5278540934 kmers +read 48500000 sequences, 8291110333 bases, 5284110395 kmers +read 48600000 sequences, 8302889275 bases, 5289689337 kmers +read 48700000 sequences, 8314648922 bases, 5295248984 kmers +read 48800000 sequences, 8326414162 bases, 5300814224 kmers +read 48900000 sequences, 8338207337 bases, 5306407399 kmers +read 49000000 sequences, 8349993258 bases, 5311993320 kmers +read 49100000 sequences, 8361791349 bases, 5317591411 kmers +read 49200000 sequences, 8373582804 bases, 5323182866 kmers +read 49300000 sequences, 8385394571 bases, 5328794633 kmers +read 49400000 sequences, 8397202995 bases, 5334403057 kmers +read 49500000 sequences, 8409020292 bases, 5340020354 kmers +read 49600000 sequences, 8420828815 bases, 5345628877 kmers +read 49700000 sequences, 8432643281 bases, 5351243343 kmers +read 49800000 sequences, 8444451677 bases, 5356851739 kmers +read 49900000 sequences, 8456260166 bases, 5362460228 kmers +read 50000000 sequences, 8468086036 bases, 5368086098 kmers +read 50100000 sequences, 8479897293 bases, 5373697355 kmers +read 50200000 sequences, 8491729262 bases, 5379329324 kmers +read 50300000 sequences, 8503563407 bases, 5384963469 kmers +read 50400000 sequences, 8515408110 bases, 5390608172 kmers +read 50500000 sequences, 8527226877 bases, 5396226939 kmers +read 50600000 sequences, 8539067669 bases, 5401867731 kmers +read 50700000 sequences, 8550899987 bases, 5407500049 kmers +read 50800000 sequences, 8562770507 bases, 5413170569 kmers +read 50900000 sequences, 8574595545 bases, 5418795607 kmers +read 51000000 sequences, 8586456412 bases, 5424456474 kmers +read 51100000 sequences, 8598316076 bases, 5430116138 kmers +read 51200000 sequences, 8610172262 bases, 5435772324 kmers +read 51300000 sequences, 8622055720 bases, 5441455782 kmers +read 51400000 sequences, 8633927263 bases, 5447127325 kmers +read 51500000 sequences, 8645823524 bases, 5452823586 kmers +read 51600000 sequences, 8657691355 bases, 5458491417 kmers +read 51700000 sequences, 8669585563 bases, 5464185625 kmers +read 51800000 sequences, 8681474258 bases, 5469874320 kmers +read 51900000 sequences, 8693381907 bases, 5475581969 kmers +read 52000000 sequences, 8705279756 bases, 5481279818 kmers +read 52100000 sequences, 8717209451 bases, 5487009513 kmers +read 52200000 sequences, 8729118869 bases, 5492718931 kmers +read 52300000 sequences, 8741023453 bases, 5498423515 kmers +read 52400000 sequences, 8752969676 bases, 5504169738 kmers +read 52500000 sequences, 8764903676 bases, 5509903738 kmers +read 52600000 sequences, 8776822814 bases, 5515622876 kmers +read 52700000 sequences, 8788751015 bases, 5521351077 kmers +read 52800000 sequences, 8800669725 bases, 5527069787 kmers +read 52900000 sequences, 8812598349 bases, 5532798411 kmers +read 53000000 sequences, 8824571572 bases, 5538571634 kmers +read 53100000 sequences, 8836518883 bases, 5544318945 kmers +read 53200000 sequences, 8848466396 bases, 5550066458 kmers +read 53300000 sequences, 8860413169 bases, 5555813231 kmers +read 53400000 sequences, 8872384224 bases, 5561584286 kmers +read 53500000 sequences, 8884332155 bases, 5567332217 kmers +read 53600000 sequences, 8896284511 bases, 5573084573 kmers +read 53700000 sequences, 8908270586 bases, 5578870648 kmers +read 53800000 sequences, 8920267982 bases, 5584668044 kmers +read 53900000 sequences, 8932245973 bases, 5590446035 kmers +read 54000000 sequences, 8944259742 bases, 5596259804 kmers +read 54100000 sequences, 8956269308 bases, 5602069370 kmers +read 54200000 sequences, 8968276811 bases, 5607876873 kmers +read 54300000 sequences, 8980258845 bases, 5613658907 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.12.bin'... +read 54400000 sequences, 8992247801 bases, 5619447863 kmers +read 54500000 sequences, 9004254133 bases, 5625254195 kmers +read 54600000 sequences, 9016278273 bases, 5631078335 kmers +read 54700000 sequences, 9028312029 bases, 5636912091 kmers +read 54800000 sequences, 9040331856 bases, 5642731918 kmers +read 54900000 sequences, 9052350704 bases, 5648550766 kmers +read 55000000 sequences, 9064361175 bases, 5654361237 kmers +read 55100000 sequences, 9076390694 bases, 5660190756 kmers +read 55200000 sequences, 9088446082 bases, 5666046144 kmers +read 55300000 sequences, 9100525786 bases, 5671925848 kmers +read 55400000 sequences, 9112587186 bases, 5677787248 kmers +read 55500000 sequences, 9124623681 bases, 5683623743 kmers +read 55600000 sequences, 9136715382 bases, 5689515444 kmers +read 55700000 sequences, 9148800729 bases, 5695400791 kmers +read 55800000 sequences, 9160843647 bases, 5701243709 kmers +read 55900000 sequences, 9172925217 bases, 5707125279 kmers +read 56000000 sequences, 9185024099 bases, 5713024161 kmers +read 56100000 sequences, 9197117041 bases, 5718917103 kmers +read 56200000 sequences, 9209230518 bases, 5724830580 kmers +read 56300000 sequences, 9221344370 bases, 5730744432 kmers +read 56400000 sequences, 9233465281 bases, 5736665343 kmers +read 56500000 sequences, 9245571873 bases, 5742571935 kmers +read 56600000 sequences, 9257641594 bases, 5748441656 kmers +read 56700000 sequences, 9269746121 bases, 5754346183 kmers +read 56800000 sequences, 9281862419 bases, 5760262481 kmers +read 56900000 sequences, 9294025235 bases, 5766225297 kmers +read 57000000 sequences, 9306137861 bases, 5772137923 kmers +read 57100000 sequences, 9318287515 bases, 5778087577 kmers +read 57200000 sequences, 9330445537 bases, 5784045599 kmers +read 57300000 sequences, 9342614929 bases, 5790014991 kmers +read 57400000 sequences, 9354790599 bases, 5795990661 kmers +read 57500000 sequences, 9366968184 bases, 5801968246 kmers +read 57600000 sequences, 9379136016 bases, 5807936078 kmers +read 57700000 sequences, 9391324284 bases, 5813924346 kmers +read 57800000 sequences, 9403502226 bases, 5819902288 kmers +read 57900000 sequences, 9415684578 bases, 5825884640 kmers +read 58000000 sequences, 9427875846 bases, 5831875908 kmers +read 58100000 sequences, 9440085310 bases, 5837885372 kmers +read 58200000 sequences, 9452280471 bases, 5843880533 kmers +read 58300000 sequences, 9464471817 bases, 5849871879 kmers +read 58400000 sequences, 9476715907 bases, 5855915969 kmers +read 58500000 sequences, 9488919933 bases, 5861919995 kmers +read 58600000 sequences, 9501146085 bases, 5867946147 kmers +read 58700000 sequences, 9513406483 bases, 5874006545 kmers +read 58800000 sequences, 9525653213 bases, 5880053275 kmers +read 58900000 sequences, 9537897953 bases, 5886098015 kmers +read 59000000 sequences, 9550182056 bases, 5892182118 kmers +read 59100000 sequences, 9562418655 bases, 5898218717 kmers +read 59200000 sequences, 9574664926 bases, 5904264988 kmers +read 59300000 sequences, 9586958590 bases, 5910358652 kmers +read 59400000 sequences, 9599304698 bases, 5916504760 kmers +read 59500000 sequences, 9611572956 bases, 5922573018 kmers +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764280985108358757.minimizers.13.bin'... +read 59568965 sequences, 9620061299 bases, 5926785469 kmers +num_kmers 5926785469 +num_super_kmers 405359784 +num_pieces 59568966 (+1.2463 [bits/kmer]) +=== step 1: 'parse_file' 786.287 [sec] (132.667 [ns/kmer]) + == files to merge = 14 +num_written_tuples = 50000000 +num_written_tuples = 100000000 +num_written_tuples = 150000000 +num_written_tuples = 200000000 +num_written_tuples = 250000000 +num_written_tuples = 300000000 +num_written_tuples = 350000000 +num_written_tuples = 400000000 +num_written_tuples = 405359784 +num_minimizers 274081508 +building minimizers MPHF with 64 threads and 256 partitions... +=== step 2: 'build_minimizers' 26.3309 [sec] (4.44269 [ns/kmer]) +bits_per_offset = ceil(log2(9620061362)) = 34 +m_buffer_size 20833333 +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764281798179498846.bucket_pairs.0.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764281798179498846.bucket_pairs.1.bin'... +sorting buffer... +saving to file '/mnt/hd2/pibiri/DNA/eulertigs/tmp_dir/sshash.tmp.run_1764281798179498846.bucket_pairs.2.bin'... +num_singletons 222713378/274081508 (81.2581%) + == files to merge = 3 +num_written_pairs = 50000000 +num_written_pairs = 51368130 +=== step 3: 'build_index' 88.5287 [sec] (14.9371 [ns/kmer]) +max_num_super_kmers_in_bucket 181286 +log2_max_num_super_kmers_in_bucket 18 +num_buckets_in_skew_index 131732/274081508 (0.0480631%) +num_partitions 7 +computing sizes of partitions... + partition_id = 0: num_kmers belonging to buckets of size > 64 and <= 128: 83511239 + partition_id = 1: num_kmers belonging to buckets of size > 128 and <= 256: 75062454 + partition_id = 2: num_kmers belonging to buckets of size > 256 and <= 512: 66750165 + partition_id = 3: num_kmers belonging to buckets of size > 512 and <= 1024: 56409346 + partition_id = 4: num_kmers belonging to buckets of size > 1024 and <= 2048: 47147744 + partition_id = 5: num_kmers belonging to buckets of size > 2048 and <= 4096: 37159719 + partition_id = 6: num_kmers belonging to buckets of size > 4096 and <= 181286: 90565466 +num_kmers_in_skew_index 456606133 (7.70411%) +building partitions... + lower 64; upper 128; num_bits_per_pos 7; keys_in_partition.size() 83511239 + building MPHF with 64 threads and 256 partitions... + built mphs[0] for 83511239 keys; bits/key = 2.68557 + built positions[0] for 83511239 keys; bits/key = 7 + lower 128; upper 256; num_bits_per_pos 8; keys_in_partition.size() 75062454 + building MPHF with 64 threads and 256 partitions... + built mphs[1] for 75062454 keys; bits/key = 2.63462 + built positions[1] for 75062454 keys; bits/key = 8 + lower 256; upper 512; num_bits_per_pos 9; keys_in_partition.size() 66750165 + building MPHF with 64 threads and 256 partitions... + built mphs[2] for 66750165 keys; bits/key = 2.63827 + built positions[2] for 66750165 keys; bits/key = 9 + lower 512; upper 1024; num_bits_per_pos 10; keys_in_partition.size() 56409346 + building MPHF with 64 threads and 256 partitions... + built mphs[3] for 56409346 keys; bits/key = 2.6742 + built positions[3] for 56409346 keys; bits/key = 10 + lower 1024; upper 2048; num_bits_per_pos 11; keys_in_partition.size() 47147744 + building MPHF with 64 threads and 256 partitions... + built mphs[4] for 47147744 keys; bits/key = 2.72151 + built positions[4] for 47147744 keys; bits/key = 11 + lower 2048; upper 4096; num_bits_per_pos 12; keys_in_partition.size() 37159719 + building MPHF with 64 threads and 256 partitions... + built mphs[5] for 37159719 keys; bits/key = 2.78763 + built positions[5] for 37159719 keys; bits/key = 12 + lower 4096; upper 181286; num_bits_per_pos 18; keys_in_partition.size() 90565466 + building MPHF with 64 threads and 256 partitions... + built mphs[6] for 90565466 keys; bits/key = 2.66514 + built positions[6] for 90565466 keys; bits/key = 18 +num_bits_for_skew_index 6166906640(1.04051 [bits/kmer]) +=== step 4: 'build_skew_index' 91.0231 [sec] (15.3579 [ns/kmer]) +=== total_time 992.17 [sec] (167.404 [ns/kmer]) +total index size: 5140629522 [B] -- 5140.63 [MB] +SPACE BREAKDOWN: + minimizers: 0.126222 [bits/kmer] (2.72945 [bits/key]) -- 1.81907% + pieces: 0.105874 [bits/kmer] -- 1.52582% + num_super_kmers_before_bucket: 0.0945179 [bits/kmer] -- 1.36216% + offsets: 2.32541 [bits/kmer] -- 33.513% + strings: 3.2463 [bits/kmer] -- 46.7845% + skew_index: 1.04051 [bits/kmer] -- 14.9955% + weights: 2.48364e-07 [bits/kmer] -- 3.57933e-06% + weight_interval_values: 4.31937e-08 [bits/kmer] + weight_interval_lengths: 1.61977e-07 [bits/kmer] + weight_dictionary: 4.31937e-08 [bits/kmer] + -------------- + total: 6.93884 [bits/kmer] + === bucket statistics (less) === +buckets with 1 super_kmers = 81.2581% +buckets with 2 super_kmers = 13.7215% +buckets with 3 super_kmers = 2.82286% +buckets with 4 super_kmers = 0.817497% +buckets with 5 super_kmers = 0.370932% +buckets with 6 super_kmers = 0.218227% +buckets with 7 super_kmers = 0.143864% +buckets with 8 super_kmers = 0.101593% +buckets with 9 super_kmers = 0.0752645% +buckets with 10 super_kmers = 0.0576569% +buckets with 11 super_kmers = 0.0455755% +buckets with 12 super_kmers = 0.0367424% +buckets with 13 super_kmers = 0.030229% +buckets with 14 super_kmers = 0.0255643% +buckets with 15 super_kmers = 0.0214462% +buckets with 16 super_kmers = 0.0185686% +max_num_super_kmers_in_bucket 181286 +2025-11-27 23:19:38: saving data structure to disk... +2025-11-27 23:19:40: DONE diff --git a/benchmarks/results-27-11-25-v3/k63/regular-build.time.log b/benchmarks/results-27-11-25-v3/k63/regular-build.time.log new file mode 100644 index 0000000..4315b46 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/regular-build.time.log @@ -0,0 +1,138 @@ + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/cod.k63.eulertigs.fa.gz -k 63 -m 24 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/cod.k63.sshash" + User time (seconds): 99.27 + System time (seconds): 2.19 + Percent of CPU this job got: 115% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:27.94 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1670584 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 731917 + Voluntary context switches: 534 + Involuntary context switches: 899 + Swaps: 0 + File system inputs: 349872 + File system outputs: 2415768 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/kestrel.k63.eulertigs.fa.gz -k 63 -m 24 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/kestrel.k63.sshash" + User time (seconds): 183.09 + System time (seconds): 4.30 + Percent of CPU this job got: 106% + Elapsed (wall clock) time (h:mm:ss or m:ss): 2:55.80 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 2564996 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 1145242 + Voluntary context switches: 350 + Involuntary context switches: 1238 + Swaps: 0 + File system inputs: 658000 + File system outputs: 6827400 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/human.k63.eulertigs.fa.gz -k 63 -m 25 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/human.k63.sshash" + User time (seconds): 778.51 + System time (seconds): 10.43 + Percent of CPU this job got: 179% + Elapsed (wall clock) time (h:mm:ss or m:ss): 7:20.63 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 6080120 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 3108786 + Voluntary context switches: 396 + Involuntary context switches: 3918 + Swaps: 0 + File system inputs: 1667248 + File system outputs: 16982200 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/ncbi-virus.k63.eulertigs.fa.gz -k 63 -m 23 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/ncbi-virus.k63.sshash" + User time (seconds): 64.18 + System time (seconds): 1.69 + Percent of CPU this job got: 103% + Elapsed (wall clock) time (h:mm:ss or m:ss): 1:03.62 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 1222564 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 515716 + Voluntary context switches: 296 + Involuntary context switches: 426 + Swaps: 0 + File system inputs: 274400 + File system outputs: 1771104 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/se.k63.eulertigs.fa.gz -k 63 -m 31 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/se.k63.sshash" + User time (seconds): 392.76 + System time (seconds): 7.69 + Percent of CPU this job got: 172% + Elapsed (wall clock) time (h:mm:ss or m:ss): 3:51.84 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 4006940 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 2276076 + Voluntary context switches: 520 + Involuntary context switches: 2346 + Swaps: 0 + File system inputs: 1679744 + File system outputs: 11863104 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 + Command being timed: "./sshash build -i /mnt/hd2/pibiri/DNA/eulertigs/hprc.k63.eulertigs.fa.gz -k 63 -m 31 -t 64 --verbose -d /mnt/hd2/pibiri/DNA/eulertigs/tmp_dir -o /mnt/hd2/pibiri/DNA/sshash-v3-indexes/hprc.k63.sshash" + User time (seconds): 2760.73 + System time (seconds): 29.78 + Percent of CPU this job got: 280% + Elapsed (wall clock) time (h:mm:ss or m:ss): 16:35.70 + Average shared text size (kbytes): 0 + Average unshared data size (kbytes): 0 + Average stack size (kbytes): 0 + Average total size (kbytes): 0 + Maximum resident set size (kbytes): 14452508 + Average resident set size (kbytes): 0 + Major (requiring I/O) page faults: 0 + Minor (reclaiming a frame) page faults: 9026810 + Voluntary context switches: 565 + Involuntary context switches: 9053 + Swaps: 0 + File system inputs: 5973656 + File system outputs: 49125104 + Socket messages sent: 0 + Socket messages received: 0 + Signals delivered: 0 + Page size (bytes): 4096 + Exit status: 0 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json new file mode 100644 index 0000000..e69de29 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.log b/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.log new file mode 100644 index 0000000..3c13b59 --- /dev/null +++ b/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.log @@ -0,0 +1,48 @@ +2025-11-28 16:06:31: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR12858649.fastq.gz'... +2025-11-28 16:07:06: DONE +==== query report: +num_kmers = 97972416 +num_positive_kmers = 67275966 (68.6683%) +num_searches = 36382603/67275966 (54.0796%) +num_extensions = 30893363/67275966 (45.9204%) +elapsed = 35596.4 millisec / 35.5964 sec / 0.593273 min / 363.331 ns/kmer +2025-11-28 16:07:07: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR11449743_1.fastq.gz'... +2025-11-28 16:09:39: DONE +==== query report: +num_kmers = 461383839 +num_positive_kmers = 293470517 (63.6066%) +num_searches = 156910447/293470517 (53.4672%) +num_extensions = 136560070/293470517 (46.5328%) +elapsed = 151854 millisec / 151.854 sec / 2.5309 min / 329.128 ns/kmer +2025-11-28 16:09:39: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 16:13:20: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 406529529 (85.0803%) +num_searches = 229260476/406529529 (56.3945%) +num_extensions = 177269053/406529529 (43.6055%) +elapsed = 220627 millisec / 220.627 sec / 3.67711 min / 461.737 ns/kmer +2025-11-28 16:13:20: performing queries from file '/mnt/hd2/pibiri/DNA/queries/ncbi-queries.fastq.gz'... +2025-11-28 16:13:22: DONE +==== query report: +num_kmers = 10330949 +num_positive_kmers = 10230224 (99.025%) +num_searches = 5660421/10230224 (55.3304%) +num_extensions = 4569803/10230224 (44.6696%) +elapsed = 1903.3 millisec / 1.9033 sec / 0.0317216 min / 184.233 ns/kmer +2025-11-28 16:13:23: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR27871075_1.fastq.gz'... +2025-11-28 16:32:11: DONE +==== query report: +num_kmers = 541466405 +num_positive_kmers = 507202856 (93.6721%) +num_searches = 330216562/507202856 (65.1054%) +num_extensions = 176986294/507202856 (34.8946%) +elapsed = 1.12818e+06 millisec / 1128.18 sec / 18.8029 min / 2083.56 ns/kmer +2025-11-28 16:32:13: performing queries from file '/mnt/hd2/pibiri/DNA/queries/SRR5833294.fastq.gz'... +2025-11-28 16:36:06: DONE +==== query report: +num_kmers = 477818474 +num_positive_kmers = 434532302 (90.9409%) +num_searches = 250405853/434532302 (57.6265%) +num_extensions = 184126449/434532302 (42.3735%) +elapsed = 233571 millisec / 233.571 sec / 3.89284 min / 488.827 ns/kmer From b59a3e4a88f0c17cc2ab06c02500588cfb22b14a Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Mon, 8 Dec 2025 18:03:03 +0100 Subject: [PATCH 106/112] removed empty json files --- benchmarks/results-27-11-25-v3/k31/canon-bench.json | 0 benchmarks/results-27-11-25-v3/k31/canon-build.json | 6 ------ .../k31/canon-streaming-queries-high-hit.json | 0 benchmarks/results-27-11-25-v3/k31/regular-bench.json | 0 benchmarks/results-27-11-25-v3/k31/regular-build.json | 5 ----- .../k31/regular-streaming-queries-high-hit.json | 0 benchmarks/results-27-11-25-v3/k63/canon-bench.json | 0 benchmarks/results-27-11-25-v3/k63/canon-build.json | 6 ------ .../k63/canon-streaming-queries-high-hit.json | 0 benchmarks/results-27-11-25-v3/k63/regular-bench.json | 0 benchmarks/results-27-11-25-v3/k63/regular-build.json | 6 ------ .../k63/regular-streaming-queries-high-hit.json | 0 12 files changed, 23 deletions(-) delete mode 100644 benchmarks/results-27-11-25-v3/k31/canon-bench.json delete mode 100644 benchmarks/results-27-11-25-v3/k31/canon-build.json delete mode 100644 benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json delete mode 100644 benchmarks/results-27-11-25-v3/k31/regular-bench.json delete mode 100644 benchmarks/results-27-11-25-v3/k31/regular-build.json delete mode 100644 benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/canon-bench.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/canon-build.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/regular-bench.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/regular-build.json delete mode 100644 benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json diff --git a/benchmarks/results-27-11-25-v3/k31/canon-bench.json b/benchmarks/results-27-11-25-v3/k31/canon-bench.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k31/canon-build.json b/benchmarks/results-27-11-25-v3/k31/canon-build.json deleted file mode 100644 index 833ad3a..0000000 --- a/benchmarks/results-27-11-25-v3/k31/canon-build.json +++ /dev/null @@ -1,6 +0,0 @@ -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists diff --git a/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k31/canon-streaming-queries-high-hit.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-bench.json b/benchmarks/results-27-11-25-v3/k31/regular-bench.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k31/regular-build.json b/benchmarks/results-27-11-25-v3/k31/regular-build.json deleted file mode 100644 index 2a7aca3..0000000 --- a/benchmarks/results-27-11-25-v3/k31/regular-build.json +++ /dev/null @@ -1,5 +0,0 @@ -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists diff --git a/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k31/regular-streaming-queries-high-hit.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-bench.json b/benchmarks/results-27-11-25-v3/k63/canon-bench.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k63/canon-build.json b/benchmarks/results-27-11-25-v3/k63/canon-build.json deleted file mode 100644 index 833ad3a..0000000 --- a/benchmarks/results-27-11-25-v3/k63/canon-build.json +++ /dev/null @@ -1,6 +0,0 @@ -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists diff --git a/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k63/canon-streaming-queries-high-hit.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-bench.json b/benchmarks/results-27-11-25-v3/k63/regular-bench.json deleted file mode 100644 index e69de29..0000000 diff --git a/benchmarks/results-27-11-25-v3/k63/regular-build.json b/benchmarks/results-27-11-25-v3/k63/regular-build.json deleted file mode 100644 index 833ad3a..0000000 --- a/benchmarks/results-27-11-25-v3/k63/regular-build.json +++ /dev/null @@ -1,6 +0,0 @@ -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists -directory already exists diff --git a/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json b/benchmarks/results-27-11-25-v3/k63/regular-streaming-queries-high-hit.json deleted file mode 100644 index e69de29..0000000 From 32fd5104547c9a01c5ac84c25243cde56ee3192b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 18 Dec 2025 10:56:41 +0100 Subject: [PATCH 107/112] minor name cleanup --- include/dictionary.hpp | 12 ++++---- include/streaming_query.hpp | 12 ++++---- src/dictionary.cpp | 58 +++++++++++++++---------------------- 3 files changed, 35 insertions(+), 47 deletions(-) diff --git a/include/dictionary.hpp b/include/dictionary.hpp index a73d2f6..b46a215 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -39,7 +39,7 @@ struct dictionary // /* Lookup queries. */ lookup_result lookup(char const* string_kmer, bool check_reverse_complement = true) const; - lookup_result lookup_uint(Kmer uint_kmer, bool check_reverse_complement = true) const; + lookup_result lookup(Kmer uint_kmer, bool check_reverse_complement = true) const; /* Return the number of kmers in string. Since strings do not have duplicates, the length of the string is always size + k - 1. */ @@ -163,12 +163,12 @@ struct dictionary // weights m_weights; - lookup_result lookup_uint_regular(Kmer uint_kmer) const; - lookup_result lookup_uint_regular(Kmer uint_kmer, minimizer_info mini_info) const; + lookup_result lookup_regular(Kmer uint_kmer) const; + lookup_result lookup_regular(Kmer uint_kmer, minimizer_info mini_info) const; - lookup_result lookup_uint_canonical(Kmer uint_kmer) const; - lookup_result lookup_uint_canonical(Kmer uint_kmer, Kmer uint_kmer_rc, - minimizer_info mini_info) const; + lookup_result lookup_canonical(Kmer uint_kmer) const; + lookup_result lookup_canonical(Kmer uint_kmer, Kmer uint_kmer_rc, + minimizer_info mini_info) const; void forward_neighbours(Kmer suffix, neighbourhood& res, bool check_reverse_complement) const; diff --git a/include/streaming_query.hpp b/include/streaming_query.hpp index 8b4d63d..3f1e1ab 100644 --- a/include/streaming_query.hpp +++ b/include/streaming_query.hpp @@ -158,21 +158,21 @@ struct streaming_query // if constexpr (canonical) { if (m_curr_mini_info.minimizer < m_curr_mini_info_rc.minimizer) { - m_res = m_dict->lookup_uint_canonical(m_kmer, m_kmer_rc, m_curr_mini_info); + m_res = m_dict->lookup_canonical(m_kmer, m_kmer_rc, m_curr_mini_info); } else if (m_curr_mini_info_rc.minimizer < m_curr_mini_info.minimizer) { - m_res = m_dict->lookup_uint_canonical(m_kmer, m_kmer_rc, m_curr_mini_info_rc); + m_res = m_dict->lookup_canonical(m_kmer, m_kmer_rc, m_curr_mini_info_rc); } else { - m_res = m_dict->lookup_uint_canonical(m_kmer, m_kmer_rc, m_curr_mini_info); + m_res = m_dict->lookup_canonical(m_kmer, m_kmer_rc, m_curr_mini_info); if (m_res.kmer_id == constants::invalid_uint64) { - m_res = m_dict->lookup_uint_canonical(m_kmer, m_kmer_rc, m_curr_mini_info_rc); + m_res = m_dict->lookup_canonical(m_kmer, m_kmer_rc, m_curr_mini_info_rc); } } } else { - m_res = m_dict->lookup_uint_regular(m_kmer, m_curr_mini_info); + m_res = m_dict->lookup_regular(m_kmer, m_curr_mini_info); bool minimizer_found = m_res.minimizer_found; if (m_res.kmer_id == constants::invalid_uint64) { assert(m_res.kmer_orientation == constants::forward_orientation); - m_res = m_dict->lookup_uint_regular(m_kmer_rc, m_curr_mini_info_rc); + m_res = m_dict->lookup_regular(m_kmer_rc, m_curr_mini_info_rc); m_res.kmer_orientation = constants::backward_orientation; bool minimizer_rc_found = m_res.minimizer_found; m_res.minimizer_found = minimizer_rc_found or minimizer_found; diff --git a/src/dictionary.cpp b/src/dictionary.cpp index 5c52cab..f197e09 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -5,15 +5,14 @@ namespace sshash { template -lookup_result dictionary::lookup_uint_regular(const Kmer uint_kmer) const { +lookup_result dictionary::lookup_regular(const Kmer uint_kmer) const { auto mini_info = util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher); - return lookup_uint_regular(uint_kmer, mini_info); + return lookup_regular(uint_kmer, mini_info); } template -lookup_result dictionary::lookup_uint_regular( - const Kmer uint_kmer, // - const minimizer_info mini_info) const // +lookup_result dictionary::lookup_regular(const Kmer uint_kmer, // + const minimizer_info mini_info) const // { assert(minimizer_info(mini_info.minimizer, mini_info.pos_in_kmer) == util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher)); @@ -23,30 +22,29 @@ lookup_result dictionary::lookup_uint_regular( } template -lookup_result dictionary::lookup_uint_canonical(Kmer uint_kmer) const // +lookup_result dictionary::lookup_canonical(Kmer uint_kmer) const // { Kmer uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(m_k); auto mini_info = util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher); auto mini_info_rc = util::compute_minimizer(uint_kmer_rc, m_k, m_m, m_hasher); if (mini_info.minimizer < mini_info_rc.minimizer) { - return lookup_uint_canonical(uint_kmer, uint_kmer_rc, mini_info); + return lookup_canonical(uint_kmer, uint_kmer_rc, mini_info); } else if (mini_info_rc.minimizer < mini_info.minimizer) { - return lookup_uint_canonical(uint_kmer, uint_kmer_rc, mini_info_rc); + return lookup_canonical(uint_kmer, uint_kmer_rc, mini_info_rc); } else { - auto res = lookup_uint_canonical(uint_kmer, uint_kmer_rc, mini_info); + auto res = lookup_canonical(uint_kmer, uint_kmer_rc, mini_info); if (res.kmer_id == constants::invalid_uint64) { - res = lookup_uint_canonical(uint_kmer, uint_kmer_rc, mini_info_rc); + res = lookup_canonical(uint_kmer, uint_kmer_rc, mini_info_rc); } return res; } } template -lookup_result dictionary::lookup_uint_canonical( - const Kmer uint_kmer, // - const Kmer uint_kmer_rc, // - const minimizer_info mini_info) const // +lookup_result dictionary::lookup_canonical(const Kmer uint_kmer, // + const Kmer uint_kmer_rc, // + const minimizer_info mini_info) const // { assert(mini_info.minimizer == std::min(util::compute_minimizer(uint_kmer, m_k, m_m, m_hasher).minimizer, @@ -61,29 +59,19 @@ template lookup_result dictionary::lookup(char const* string_kmer, bool check_reverse_complement) const { Kmer uint_kmer = util::string_to_uint_kmer(string_kmer, m_k); - /* - SIMD here does not help, as expected, because it is only used at the - beginning of each query. To be useful, we would need to process a - batch of random lookup queries and execute this preliminary step - for all queries in a first pass, then invoke - `lookup_uint(uint_kmer, check_reverse_complement)` directly. - */ - // __m256i v = _mm256_loadu_si256(reinterpret_cast<__m256i const*>(string_kmer)); - // uint64_t word = pack2bits_shift1(v); - // Kmer uint_kmer(word); - return lookup_uint(uint_kmer, check_reverse_complement); -} -template -lookup_result dictionary::lookup_uint(Kmer uint_kmer, - bool check_reverse_complement) const // + return lookup(uint_kmer, check_reverse_complement); +} +template +lookup_result dictionary::lookup(Kmer uint_kmer, + bool check_reverse_complement) const // { - if (m_canonical) return lookup_uint_canonical(uint_kmer); - auto res = lookup_uint_regular(uint_kmer); + if (m_canonical) return lookup_canonical(uint_kmer); + auto res = lookup_regular(uint_kmer); assert(res.kmer_orientation == constants::forward_orientation); if (check_reverse_complement and res.kmer_id == constants::invalid_uint64) { Kmer uint_kmer_rc = uint_kmer; uint_kmer_rc.reverse_complement_inplace(m_k); - res = lookup_uint_regular(uint_kmer_rc); + res = lookup_regular(uint_kmer_rc); res.kmer_orientation = constants::backward_orientation; } return res; @@ -97,7 +85,7 @@ bool dictionary::is_member(char const* string_kmer, template bool dictionary::is_member_uint(Kmer uint_kmer, bool check_reverse_complement) const { - return lookup_uint(uint_kmer, check_reverse_complement) != constants::invalid_uint64; + return lookup(uint_kmer, check_reverse_complement) != constants::invalid_uint64; } template @@ -127,7 +115,7 @@ void dictionary::forward_neighbours(Kmer suffix, neighbourhood @@ -136,7 +124,7 @@ void dictionary::backward_neighbours(Kmer prefix, neighbourhood Date: Thu, 18 Dec 2025 11:02:20 +0100 Subject: [PATCH 108/112] minor name cleanup --- include/dictionary.hpp | 2 +- src/dictionary.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/dictionary.hpp b/include/dictionary.hpp index b46a215..32ad3a1 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -70,7 +70,7 @@ struct dictionary // /* Membership queries. */ bool is_member(char const* string_kmer, bool check_reverse_complement = true) const; - bool is_member_uint(Kmer uint_kmer, bool check_reverse_complement = true) const; + bool is_member(Kmer uint_kmer, bool check_reverse_complement = true) const; template friend struct streaming_query; diff --git a/src/dictionary.cpp b/src/dictionary.cpp index f197e09..d0838c9 100644 --- a/src/dictionary.cpp +++ b/src/dictionary.cpp @@ -83,8 +83,7 @@ bool dictionary::is_member(char const* string_kmer, return lookup(string_kmer, check_reverse_complement) != constants::invalid_uint64; } template -bool dictionary::is_member_uint(Kmer uint_kmer, - bool check_reverse_complement) const { +bool dictionary::is_member(Kmer uint_kmer, bool check_reverse_complement) const { return lookup(uint_kmer, check_reverse_complement) != constants::invalid_uint64; } From ad0cac9360eba1a5e476740ad6d3b8c5fc7c98a6 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 18 Dec 2025 11:19:11 +0100 Subject: [PATCH 109/112] removed some old comments --- include/dictionary.hpp | 5 ----- include/util.hpp | 30 ------------------------------ 2 files changed, 35 deletions(-) diff --git a/include/dictionary.hpp b/include/dictionary.hpp index 32ad3a1..d0fa3db 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -115,11 +115,6 @@ struct dictionary // return iterator(this, begin_kmer_id, end_kmer_id); } - // FIXME: are they needed by our users? - // bits::bit_vector const& get_strings() const { return m_buckets.strings; } - // buckets const& get_buckets() const { return m_buckets; } - // minimizers const& get_minimizers() const { return m_minimizers; } - uint64_t num_bits() const; void print_info() const; void print_space_breakdown() const; diff --git a/include/util.hpp b/include/util.hpp index c7a2662..bf9bebd 100644 --- a/include/util.hpp +++ b/include/util.hpp @@ -207,38 +207,8 @@ static inline uint64_t get_seed_for_hash_function(build_configuration const& bui template [[maybe_unused]] static kmer_t string_to_uint_kmer(char const* str, uint64_t k) { assert(k <= kmer_t::max_k); - kmer_t x = 0; for (uint64_t i = 0; i != k; ++i) x.set(i, kmer_t::char_to_uint(str[i])); - - // /* manual loop-unrolling and limiting dependencies do not seem to help much...*/ - // assert(k >= 8); - // uint64_t i = 0; - // uint64_t w = 0; - // for (uint64_t iter = 0; i + 8 <= k; i += 8, ++iter) { - // uint64_t w0 = kmer_t::char_to_uint(str[i + 0]) << (0 * kmer_t::bits_per_char); - // uint64_t w1 = kmer_t::char_to_uint(str[i + 1]) << (1 * kmer_t::bits_per_char); - // uint64_t w2 = kmer_t::char_to_uint(str[i + 2]) << (2 * kmer_t::bits_per_char); - // uint64_t w3 = kmer_t::char_to_uint(str[i + 3]) << (3 * kmer_t::bits_per_char); - // uint64_t w4 = kmer_t::char_to_uint(str[i + 4]) << (4 * kmer_t::bits_per_char); - // uint64_t w5 = kmer_t::char_to_uint(str[i + 5]) << (5 * kmer_t::bits_per_char); - // uint64_t w6 = kmer_t::char_to_uint(str[i + 6]) << (6 * kmer_t::bits_per_char); - // uint64_t w7 = kmer_t::char_to_uint(str[i + 7]) << (7 * kmer_t::bits_per_char); - // w |= (w0 | w1 | w2 | w3 | w4 | w5 | w6 | w7) << (iter * 8 * kmer_t::bits_per_char); - // } - - // /* this does not seem to help...*/ - // // if (i + 4 <= k) { - // // uint64_t w0 = kmer_t::char_to_uint(str[i + 0]) << (0 * kmer_t::bits_per_char); - // // uint64_t w1 = kmer_t::char_to_uint(str[i + 1]) << (1 * kmer_t::bits_per_char); - // // uint64_t w2 = kmer_t::char_to_uint(str[i + 2]) << (2 * kmer_t::bits_per_char); - // // uint64_t w3 = kmer_t::char_to_uint(str[i + 3]) << (3 * kmer_t::bits_per_char); - // // w |= (w0 | w1 | w2 | w3) << (iter * 8 * kmer_t::bits_per_char); - // // } - - // kmer_t x = w; - // for (; i != k; ++i) x.set(i, kmer_t::char_to_uint(str[i])); - return x; } From 1fbb593ce01ae81eb4c3c96c0181299f396b7be0 Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Thu, 18 Dec 2025 12:13:09 +0100 Subject: [PATCH 110/112] README UPDATED --- README.md | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c7dd506..513934c 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,8 @@ The data structure is described in the following papers: For a dictionary of n k-mers, two basic queries are supported: -- i = **Lookup**(g), where i is in [0,n) if the k-mer g is found in the dictionary or i = -1 otherwise; -- g = **Access**(i), where g is the k-mer associated to the identifier i. +- i = **Lookup**(x), where i is in [0,n) if the k-mer x is found in the dictionary or i = -1 otherwise; +- x = **Access**(i), where x is the k-mer associated to the identifier i. If also the weights of the k-mers (their frequency counts) are stored in the dictionary, then the dictionary is said to be *weighted* and it also supports: @@ -37,9 +37,9 @@ Other supported queries are: - **Membership Queries**: determine if a given k-mer is present in the dictionary or not. - **Streaming Queries**: stream through all k-mers of a given DNA file (.fasta or .fastq formats) to determine their membership to the dictionary. -- **Navigational Queries**: given a k-mer g[1..k] determine if g[2..k]+x is present (forward neighbourhood) and if x+g[1..k-1] is present (backward neighbourhood), for x = A, C, G, T ('+' here means string concatenation). -SSHash internally stores a set of strings, called *contigs* in the following, each associated to a distinct identifier. -If a contig identifier is specified for a navigational query (rather than a k-mer), then the backward neighbourhood of the first k-mer and the forward neighbourhood of the last k-mer in the contig are returned. +- **Navigational Queries**: given a k-mer x[1..k] determine if x[2..k]+c is present (forward neighbourhood) and if c+x[1..k-1] is present (backward neighbourhood), for c in {A,C,G,T} ('+' here means string concatenation). +SSHash internally stores a set of strings, each associated to a distinct identifier. +If a string identifier is specified for a navigational query (rather than a k-mer), then the backward neighbourhood of the first k-mer and the forward neighbourhood of the last k-mer in the string are returned. If you are interested in a **membership-only** version of SSHash, have a look at [SSHash-Lite](https://github.com/jermp/sshash-lite). It also works for input files with duplicate k-mers (e.g., [matchtigs](https://github.com/algbio/matchtigs) [4]). For a query sequence S and a given coverage threshold E in [0,1], the sequence is considered to be present in the dictionary if at least E*(|S|-k+1) of the k-mers of S are positive. @@ -76,6 +76,8 @@ To compile the code for a release environment (see file `CMakeLists.txt` for the cmake .. make -j +**NOTE**: For best performance on `x86` architectures, the option `-D SSHASH_USE_ARCH_NATIVE` can be specified as well. + For a testing environment, use the following instead: mkdir debug_build @@ -250,34 +252,24 @@ Input Files SSHash is meant to index k-mers from collections that **do not contain duplicates nor invalid k-mers** (strings containing symbols different from {A,C,G,T}). -These collections can be obtained, for example, by extracting the maximal unitigs of a de Bruijn graph. - -To do so, we can use the tool [BCALM2](https://github.com/GATB/bcalm). -This tool builds a compacted de Bruijn graph and outputs its maximal unitigs. -From the output of BCALM2, we can then *stitch* (i.e., glue) some unitigs to reduce the number of nucleotides. The stitiching process is carried out using the [UST](https://github.com/jermp/UST) tool. +These collections can be obtained, for example, by extracting the maximal unitigs of a de Bruijn graph, or eulertigs, using the [GGCAT](https://github.com/algbio/ggcat) algorithm. **NOTE**: Input files are expected to have **one DNA sequence per line**. If a sequence spans multiple lines (e.g., multi-fasta), the lines should be concatenated before indexing. -Below we provide a complete example (assuming both BCALM2 and UST are installed correctly) that downloads the Human (GRCh38) Chromosome 13 and extracts the maximal stitiched unitigs for k = 31. - - mkdir DNA_datasets - wget http://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz -O DNA_datasets/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz - ~/bcalm/build/bcalm -in ~/DNA_datasets/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz -kmer-size 31 -abundance-min 1 -nb-cores 8 - ~/UST/ust -k 31 -i ~/Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa - gzip Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa.ust.fa - rm ~/Homo_sapiens.GRCh38.dna.chromosome.13.fa.unitigs.fa - #### Datasets -The script `scripts/download_and_preprocess_datasets.sh` +The script `scripts/download_and_preprocess_datasets.sh` of [this release](https://github.com/jermp/sshash/releases/tag/v3.0.0) contains all the needed steps to download and pre-process the datasets that we used in [1]. -For the experiments in [2] and [3], we used the datasets available on [Zenodo](https://doi.org/10.5281/zenodo.7772316). +For the experiments in [2] and [3], we used the datasets available at [https://doi.org/10.5281/zenodo.7772316](https://doi.org/10.5281/zenodo.7772316). + +For the latest benchmarks maintained in [this other repository](https://github.com/jermp/kmer_sets_benchmark) +we used the datasets described at [https://zenodo.org/records/17582116](https://zenodo.org/records/17582116). #### Weights -Using the option `-all-abundance-counts` of BCALM2, it is possible to also include the abundance counts of the k-mers in the BCALM2 output. Then, use the option `-a 1` of UST to include such counts in the stitched unitigs. +Using the option `-all-abundance-counts` of [BCALM2](https://github.com/GATB/bcalm), it is possible to also include the abundance counts of the k-mers in the BCALM2 output. Then, use the option `-a 1` of [UST](https://github.com/jermp/UST) to include such counts in the stitched unitigs. Create a New Release -------------------- From 63f5927cb7d5230d3a201eada8033d50530f5e4b Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 19 Dec 2025 10:02:08 +0100 Subject: [PATCH 111/112] resolved some conflicts for merging into master --- CMakeLists.txt | 13 +--- include/dictionary.hpp | 3 - include/kmer.hpp | 17 ----- src/build.cpp | 161 ----------------------------------------- src/info.cpp | 41 ----------- tools/build.cpp | 9 --- 6 files changed, 1 insertion(+), 243 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4576ac6..327d025 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,17 +76,6 @@ set(SSHASH_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include ) -set(SSHASH_INCLUDE_DIRS - external/pthash/include - external/pthash/external/bits/include - external/pthash/external/fastmod - external/pthash/external/bits/external/essentials/include - external/pthash/external/xxHash - external/pthash/external/mm_file/include - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include -) - # Create a static lib add_library(sshash_static STATIC ${Z_LIB_SOURCES} @@ -118,4 +107,4 @@ if (CONDA_BUILD) install(TARGETS sshash RUNTIME DESTINATION bin ) -endif() \ No newline at end of file +endif() diff --git a/include/dictionary.hpp b/include/dictionary.hpp index cfd837b..d0fa3db 100644 --- a/include/dictionary.hpp +++ b/include/dictionary.hpp @@ -129,9 +129,6 @@ struct dictionary // visit_impl(visitor, *this); } - const buckets& data() const { return m_buckets; } - const minimizers& get_minimizers() const { return m_minimizers; } - private: template static void visit_impl(Visitor& visitor, T&& t) { diff --git a/include/kmer.hpp b/include/kmer.hpp index de58426..6fe1520 100644 --- a/include/kmer.hpp +++ b/include/kmer.hpp @@ -16,12 +16,7 @@ namespace sshash { template struct uint_kmer_t { -<<<<<<< HEAD Kmer bits = 0; -======= - using uint_t = Kmer; - Kmer kmer = 0; ->>>>>>> master uint_kmer_t() {} uint_kmer_t(uint64_t bits) : bits(bits) {} @@ -288,7 +283,6 @@ struct aa_uint_kmer_t : alpha_kmer_t { // For proteins, there's no reverse complement, so map each character to itself // This allows streaming_query to work with protein alphabets static constexpr char canonicalize_basepair_reverse_map[256] = { -<<<<<<< HEAD 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -304,17 +298,6 @@ struct aa_uint_kmer_t : alpha_kmer_t { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -======= - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0, 0, 0, 0, 0, - 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; ->>>>>>> master }; // also supports bitpack<__uint128_t, 1>, std::bitset<256>, etc diff --git a/src/build.cpp b/src/build.cpp index bd6920c..4962bc1 100644 --- a/src/build.cpp +++ b/src/build.cpp @@ -22,170 +22,9 @@ void dictionary::build(std::string const& filename, " but got m = " + std::to_string(build_config.m)); } if (build_config.m > build_config.k) throw std::runtime_error("m must be <= k"); -<<<<<<< HEAD dictionary_builder builder(build_config); builder.build(*this, filename); -======= - if (build_config.l >= constants::max_l) { - throw std::runtime_error("l must be < " + std::to_string(constants::max_l)); - } - - m_k = build_config.k; - m_m = build_config.m; - m_canonical = build_config.canonical; - m_skew_index.min_log2 = build_config.l; - m_hasher.seed(build_config.seed); - - std::vector timings; - timings.reserve(7); - essentials::timer_type timer; - - /* step 1: parse the input file, encode sequences (1.1), and compute minimizer tuples (1.2) ***/ - timer.start(); - parse_data data(build_config); - parse_file(filename, data, build_config); - m_size = data.num_kmers; - if (build_config.weighted) { - essentials::timer_type timer; - timer.start(); - data.weights_builder.build(m_weights); - timer.stop(); - print_time(timer.elapsed(), data.num_kmers, "step 1.3: 'build_weights'"); - if (build_config.verbose) { - double entropy_weights = data.weights_builder.print_info(data.num_kmers); - double avg_bits_per_weight = static_cast(m_weights.num_bits()) / data.num_kmers; - std::cout << "weights: " << avg_bits_per_weight << " [bits/kmer]" << std::endl; - std::cout << " (" << entropy_weights / avg_bits_per_weight - << "x smaller than the empirical entropy)" << std::endl; - } - } - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 1: 'parse_file'"); - timer.reset(); - /******/ - - /* step 2: merge minimizer tuples and build MPHF ***/ - { - timer.start(); - data.minimizers.merge(); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.1: 'merging_minimizers_tuples'"); - - timer.reset(); - - timer.start(); - const uint64_t num_minimizers = data.minimizers.num_minimizers(); - mm::file_source input(data.minimizers.get_minimizers_filename(), - mm::advice::sequential); - minimizers_tuples_iterator iterator(input.data(), input.data() + input.size()); - m_minimizers.build(iterator, num_minimizers, build_config); - input.close(); - assert(m_minimizers.size() == num_minimizers); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.2: 'build_minimizers_mphf'"); - - timer.reset(); - } - - { - if (build_config.verbose) std::cout << "re-sorting minimizer tuples..." << std::endl; - - timer.start(); - - std::string filename = data.minimizers.get_minimizers_filename(); - std::ifstream input(filename, std::ifstream::binary); - - auto const& f = m_minimizers; - const uint64_t num_threads = build_config.num_threads; - const uint64_t num_files_to_merge = data.minimizers.num_files_to_merge(); - - data.minimizers.init(); - - const uint64_t num_super_kmers = data.minimizers.num_super_kmers(); - const uint64_t buffer_size = num_files_to_merge == 1 - ? num_super_kmers - : ((build_config.ram_limit_in_GiB * essentials::GiB) / - (2 * sizeof(minimizer_tuple))); - const uint64_t num_blocks = (num_super_kmers + buffer_size - 1) / buffer_size; - assert(num_super_kmers > (num_blocks - 1) * buffer_size); - - std::vector threads; - threads.reserve(num_threads); - - std::vector buffer; - for (uint64_t i = 0; i != num_blocks; ++i) { - const uint64_t n = (i == num_blocks - 1) - ? num_super_kmers - (num_blocks - 1) * buffer_size - : buffer_size; - buffer.resize(n); - input.read(reinterpret_cast(buffer.data()), - buffer.size() * sizeof(minimizer_tuple)); - const uint64_t chunk_size = (n + num_threads - 1) / num_threads; - for (uint64_t t = 0; t * chunk_size < n; ++t) { - uint64_t begin = t * chunk_size; - uint64_t end = std::min(n, begin + chunk_size); - threads.emplace_back([begin, end, &buffer, &f]() { - for (uint64_t i = begin; i < end; ++i) { - buffer[i].minimizer = f.lookup(buffer[i].minimizer); - } - }); - } - for (auto& t : threads) { - if (t.joinable()) t.join(); - } - threads.clear(); - data.minimizers.sort_and_flush(buffer); - } - assert(buffer.empty()); - - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, - "step 2.3: 'replacing minimizer values with MPHF hashes'"); - timer.reset(); - - timer.start(); - data.minimizers.merge(); - input.close(); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 2.4: 'merging_minimizers_tuples '"); - timer.reset(); - } - /******/ - - /* step 3: build sparse index ***/ - timer.start(); - auto buckets_stats = build_sparse_index(data, m_buckets, build_config); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 3: 'build_sparse_index'"); - timer.reset(); - /******/ - - /* step 4: build skew index ***/ - timer.start(); - build_skew_index(m_skew_index, data, m_buckets, build_config, buckets_stats); - timer.stop(); - timings.push_back(timer.elapsed()); - print_time(timings.back(), data.num_kmers, "step 4: 'build_skew_index'"); - timer.reset(); - /******/ - - assert(timings.size() == 7); - double total_time = std::accumulate(timings.begin(), timings.end(), 0.0); - print_time(total_time, data.num_kmers, "total_time"); - - print_space_breakdown(); - - if (build_config.verbose) buckets_stats.print_less(); - - data.minimizers.remove_tmp_file(); ->>>>>>> master } } // namespace sshash diff --git a/src/info.cpp b/src/info.cpp index 8e30289..cf214fc 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -2,49 +2,8 @@ namespace sshash { -<<<<<<< HEAD template void dictionary::print_space_breakdown() const { -======= -[[maybe_unused]] -static inline double bits_per_kmer_formula(uint64_t k, /* kmer length */ - uint64_t m, /* minimizer length */ - uint64_t n, /* num. kmers */ - uint64_t M) /* num. strings in SPSS */ -{ - /* - Caveats: - 1. we assume an alphabet of size 4 - 2. this assumes a random minimizer scheme, so num. super-kmers is ~ 2n/(k-m+2) - 3. we neglect lower order terms and skew index space - 4. not canonical - */ - - assert(k > 0); - assert(k >= m); - - const uint64_t N = n + M * (k - 1); // num. characters in SPSS - - /* summing (M-1) provides an upper bound to the num. of super-kmers */ - double Z = (2.0 * n) / (k - m + 2) + (M - 1); - - /* A cache line is 64 B = 512 bits --> - max window_size that fits in a cache line is 512/2 = 256 - assuming a 2-bit encoded stream. */ - const uint64_t window_size = 1; /* 256; */ - - double num_bits = - 2 * N + Z * (5.0 + std::ceil(std::log2(std::ceil(static_cast(N) / window_size)))) + - M * (2.0 + std::ceil(std::log2(static_cast(N) / M))); - - return num_bits / n; -} - -inline double perc(uint64_t amount, uint64_t total) { return (amount * 100.0) / total; } - -template -void dictionary::print_space_breakdown() const { ->>>>>>> master const uint64_t num_bytes = (num_bits() + 7) / 8; auto perc = [](uint64_t amount, uint64_t total) -> double { return (amount * 100.0) / total; }; diff --git a/tools/build.cpp b/tools/build.cpp index 68e3030..f0dab7e 100644 --- a/tools/build.cpp +++ b/tools/build.cpp @@ -22,15 +22,6 @@ int build(int argc, char** argv) { "Seed for construction (default is " + std::to_string(constants::seed) + ").", "-s", false); parser.add("t", "Number of threads (default is 1).", "-t", false); -<<<<<<< HEAD -======= - parser.add("l", - "A (integer) constant that controls the space/time trade-off of the dictionary. " - "A reasonable values lies in [2.." + - std::to_string(constants::max_l) + "). The default value is " + - std::to_string(constants::min_l) + ".", - "-l", false); ->>>>>>> master parser.add("lambda", "A (floating point) constant that trades construction speed for space effectiveness " "of minimal perfect hashing. " From aa95d7f54156601e475dd9b507d4c1a17409ca5d Mon Sep 17 00:00:00 2001 From: Giulio Ermanno Pibiri Date: Fri, 19 Dec 2025 10:05:43 +0100 Subject: [PATCH 112/112] removed some old comments --- tools/perf.hpp | 166 ----------------------------------------------- tools/sshash.cpp | 2 - 2 files changed, 168 deletions(-) diff --git a/tools/perf.hpp b/tools/perf.hpp index 5bf7fec..7eabb4e 100644 --- a/tools/perf.hpp +++ b/tools/perf.hpp @@ -23,76 +23,6 @@ void perf_test_iterator(Dict const& dict, essentials::json_lines& perf_stats) { perf_stats.add("iterator (avg_nanosec_per_kmer)", avg_nanosec); } -// template -// void perf_test_lookup_by_list_size(Dict const& dict) { -// constexpr uint64_t num_queries = 1'000'000; -// constexpr uint64_t runs = 5; -// const uint64_t k = dict.k(); - -// const uint64_t min_size = 1ULL << constants::min_l; -// std::vector> lookup_queries(min_size + 2); -// for (auto& v : lookup_queries) v.reserve(num_queries); -// { -// uint64_t i = 0; -// auto it = dict.begin(); -// while (it.has_next()) { -// auto [_, kmer] = it.next(); -// auto res = dict.lookup_advanced(kmer.c_str()); -// if (res.list_size == constants::invalid_uint64) { -// if (lookup_queries[res.list_size + 1].size() < num_queries) { -// lookup_queries[res.list_size + 1].push_back(kmer); -// } -// } else { -// assert(res.list_size > 0 and res.list_size <= min_size); -// if (lookup_queries[res.list_size].size() < num_queries) { -// lookup_queries[res.list_size].push_back(kmer); -// } -// } -// ++i; -// if (i % 100000000 == 0) std::cout << i << " kmers" << std::endl; -// if (i == 1000000000) break; -// } -// } - -// { -// std::string kmer_rc(k, 0); -// for (auto& v : lookup_queries) { -// std::mt19937 g(essentials::get_random_seed()); -// std::shuffle(v.begin(), v.end(), g); -// assert(v.size() <= num_queries); -// // if (v.size() > num_queries) v.resize(num_queries); -// for (uint64_t i = 1; i < v.size(); i += 2) { -// /* transform 50% of the kmers into their reverse complements */ -// kmer_t::compute_reverse_complement(v[i].data(), kmer_rc.data(), k); -// v[i] = kmer_rc; -// } -// } -// } - -// for (uint64_t list_size = 1; list_size <= min_size + 1; ++list_size) { -// if (lookup_queries[list_size].empty()) continue; -// perf::timer_type t; -// t.start(); -// for (uint64_t r = 0; r != runs; ++r) { -// for (auto const& string : lookup_queries[list_size]) { -// auto res = dict.lookup(string.c_str()); -// essentials::do_not_optimize_away(res.kmer_id); -// } -// } -// t.stop(); -// double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries[list_size].size()); -// std::cout << "list_size "; -// if (list_size <= min_size) { -// std::cout << "= " << list_size; -// } else { -// std::cout << "> " << min_size; -// } -// std::cout << ": avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; -// std::cout << " (avg. among " << lookup_queries[list_size].size() << " queries)" -// << std::endl; -// } -// } - template void perf_test_lookup_access(Dict const& dict, essentials::json_lines& perf_stats) // { @@ -102,13 +32,10 @@ void perf_test_lookup_access(Dict const& dict, essentials::json_lines& perf_stat essentials::uniform_int_rng distr(0, dict.num_kmers() - 1, essentials::get_random_seed()); const uint64_t k = dict.k(); - // const uint64_t m = dict.m(); std::string kmer(k, 0); std::string kmer_rc(k, 0); - // std::string kmers; { - // perf test positive lookup, using a std::vector std::vector lookup_queries; lookup_queries.reserve(num_queries); for (uint64_t i = 0; i != num_queries; ++i) { @@ -135,100 +62,7 @@ void perf_test_lookup_access(Dict const& dict, essentials::json_lines& perf_stat double nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); std::cout << "positive lookup (avg_nanosec_per_kmer) = " << nanosec_per_lookup << std::endl; perf_stats.add("positive lookup (avg_nanosec_per_kmer)", nanosec_per_lookup); - - // std::vector lookup_queries_uint; - // lookup_queries_uint.reserve(num_queries); - // for (auto const& kmer : lookup_queries) { - // kmer_t uint_kmer = util::string_to_uint_kmer(kmer.c_str(), k); - // lookup_queries_uint.push_back(uint_kmer); - // } - // t.reset(); - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto uint_kmer : lookup_queries_uint) { - // auto id = dict.lookup_uint(uint_kmer); - // essentials::do_not_optimize_away(id); - // } - // } - // t.stop(); - // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "lookup_uint: avg_nanosec_per_positive_lookup " << nanosec_per_lookup - // << std::endl; - - // std::vector> lookup_queries_uint_minimizer; - // lookup_queries_uint_minimizer.reserve(num_queries); - // for (auto uint_kmer : lookup_queries_uint) { - // lookup_queries_uint_minimizer.push_back( - // {uint_kmer, util::compute_minimizer(uint_kmer, k, m, dict.hasher())}); - // } - // t.reset(); - // t.start(); - // for (uint64_t r = 0; r != runs; ++r) { - // for (auto [uint_kmer, mini_info] : lookup_queries_uint_minimizer) { - // auto res = dict.lookup_uint_regular(uint_kmer, mini_info); - // essentials::do_not_optimize_away(res.kmer_id); - // } - // } - // t.stop(); - // nanosec_per_lookup = t.elapsed() / (runs * lookup_queries.size()); - // std::cout << "lookup_uint no-minimizer: avg_nanosec_per_positive_lookup " - // << nanosec_per_lookup << std::endl; - - // kmers.resize(num_queries * k); - // uint64_t pos = 0; - // for (auto const& string : lookup_queries) { - // kmers.replace(pos, k, string); - // pos += k; - // } } - // { - // perf test positive lookup, using a single std::string with all kmers contatenated - // perf::timer_type t; - // t.start(); - // uint64_t pos = 0; - // for (uint64_t r = 0; r != runs; ++r) { - // for (uint64_t i = 0; i != num_queries; ++i, pos += k) { - // auto id = dict.lookup(kmers.data() + pos); - // essentials::do_not_optimize_away(id); - // } - // pos = 0; - - // /* - // loop-unrolling - // */ - // for (uint64_t i = 0; i < num_queries; i += 8) { - // auto id0 = dict.lookup(kmers.data() + pos + 8 * 0); - // essentials::do_not_optimize_away(id0); - - // auto id1 = dict.lookup(kmers.data() + pos + 8 * 1); - // essentials::do_not_optimize_away(id1); - - // auto id2 = dict.lookup(kmers.data() + pos + 8 * 2); - // essentials::do_not_optimize_away(id2); - - // auto id3 = dict.lookup(kmers.data() + pos + 8 * 3); - // essentials::do_not_optimize_away(id3); - - // auto id4 = dict.lookup(kmers.data() + pos + 8 * 4); - // essentials::do_not_optimize_away(id4); - - // auto id5 = dict.lookup(kmers.data() + pos + 8 * 5); - // essentials::do_not_optimize_away(id5); - - // auto id6 = dict.lookup(kmers.data() + pos + 8 * 6); - // essentials::do_not_optimize_away(id6); - - // auto id7 = dict.lookup(kmers.data() + pos + 8 * 7); - // essentials::do_not_optimize_away(id7); - - // pos += 8 * 8; - // } - // pos = 0; - // } - // t.stop(); - // double nanosec_per_lookup = t.elapsed() / (runs * num_queries); - // std::cout << "2. avg_nanosec_per_positive_lookup " << nanosec_per_lookup << std::endl; - // } { // perf test negative lookup diff --git a/tools/sshash.cpp b/tools/sshash.cpp index d5a43b0..446d974 100644 --- a/tools/sshash.cpp +++ b/tools/sshash.cpp @@ -49,8 +49,6 @@ int bench(int argc, char** argv) { perf_stats.add("m", dict.m()); perf_stats.add("canonical", dict.canonical() ? "true" : "false"); - // perf_test_lookup_by_list_size(dict); - perf_test_lookup_access(dict, perf_stats); if (dict.weighted()) perf_test_lookup_weight(dict, perf_stats); perf_test_iterator(dict, perf_stats);

      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