diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 94369de6..e6d9d107 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12", "gcc-11", "intel"] + compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12", "intel"] container: image: ghcr.io/seqan/${{ matrix.compiler }} volumes: diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index cf582456..6590ed93 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -32,7 +32,7 @@ jobs: strategy: fail-fast: false matrix: - compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12", "gcc-11"] + compiler: ["clang-18", "clang-17", "gcc-14", "gcc-13", "gcc-12"] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/ci_misc.yml b/.github/workflows/ci_misc.yml index 8143bc46..80de671c 100644 --- a/.github/workflows/ci_misc.yml +++ b/.github/workflows/ci_misc.yml @@ -40,8 +40,8 @@ jobs: use_include_dependencies: "OFF" cxx_flags: "-stdlib=libc++" - - name: "Snippet gcc11" - compiler: "gcc-11" + - name: "Snippet gcc12" + compiler: "gcc-12" build: snippet build_type: Release use_include_dependencies: "OFF" @@ -53,8 +53,8 @@ jobs: use_include_dependencies: "OFF" cxx_flags: "-stdlib=libc++" - - name: "Performance gcc11" - compiler: "gcc-11" + - name: "Performance gcc12" + compiler: "gcc-12" build: performance build_type: Release use_include_dependencies: "OFF" @@ -72,8 +72,8 @@ jobs: build_type: Release use_include_dependencies: "OFF" - - name: "Header gcc11" - compiler: "gcc-11" + - name: "Header gcc12" + compiler: "gcc-12" build: header build_type: Release use_include_dependencies: "OFF" @@ -85,7 +85,7 @@ jobs: use_include_dependencies: "ON" - name: "Tutorial" - compiler: "gcc-11" + compiler: "gcc-12" build: tutorial build_type: Debug use_include_dependencies: "OFF" diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index f3d79185..8f72e924 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -2,8 +2,8 @@ # # SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors -set (CPM_DOWNLOAD_VERSION 0.38.6) -set (CPM_HASH_SUM "11c3fa5f1ba14f15d31c2fb63dbc8628ee133d81c8d764caad9a8db9e0bacb07") +set (CPM_DOWNLOAD_VERSION 0.40.2) +set (CPM_HASH_SUM "c8cdc32c03816538ce22781ed72964dc864b2a34a310d3b7104812a5ca2d835d") if (CPM_SOURCE_CACHE) set (CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") diff --git a/cmake/configuration.cmake b/cmake/configuration.cmake index a04a565e..62281c98 100644 --- a/cmake/configuration.cmake +++ b/cmake/configuration.cmake @@ -79,43 +79,42 @@ include ("${HIBF_SOURCE_DIR}/test/cmake/hibf_require_ccache.cmake") hibf_require_ccache () # ---------------------------------------------------------------------------- -# Require C++20 +# Require C++23 # ---------------------------------------------------------------------------- set (CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) set (CXXSTD_TEST_SOURCE - "#if !defined (__cplusplus) || (__cplusplus < 202002) - #error NOCXX20 + "#if !defined (__cplusplus) || (__cplusplus < 202100) + #error NOCXX23 #endif int main() {}") -set (HIBF_FEATURE_CPP20_FLAG_BUILTIN "") -set (HIBF_FEATURE_CPP20_FLAG_STD20 "-std=c++20") -set (HIBF_FEATURE_CPP20_FLAG_STD2a "-std=c++2a") +set (HIBF_FEATURE_CPP23_FLAG_BUILTIN "") +set (HIBF_FEATURE_CPP23_FLAG_STD23 "-std=c++23") -set (HIBF_CPP20_FLAG "") +set (HIBF_CPP23_FLAG "") -foreach (_FLAG BUILTIN STD20 STD2a) - set (CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} ${HIBF_FEATURE_CPP20_FLAG_${_FLAG}}") +foreach (_FLAG BUILTIN STD23) + set (CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS_SAVE} ${HIBF_FEATURE_CPP23_FLAG_${_FLAG}}") - check_cxx_source_compiles ("${CXXSTD_TEST_SOURCE}" CPP20_FLAG_${_FLAG}) + check_cxx_source_compiles ("${CXXSTD_TEST_SOURCE}" CPP23_FLAG_${_FLAG}) - if (CPP20_FLAG_${_FLAG}) - set (HIBF_CPP20_FLAG ${_FLAG}) + if (CPP23_FLAG_${_FLAG}) + set (HIBF_CPP23_FLAG ${_FLAG}) break () endif () endforeach () set (CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) -if (HIBF_CPP20_FLAG STREQUAL "BUILTIN") - hibf_config_print ("C++ Standard-20 support: builtin") -elseif (HIBF_CPP20_FLAG) - set (HIBF_CXX_FLAGS "${HIBF_CXX_FLAGS} ${HIBF_FEATURE_CPP20_FLAG_${HIBF_CPP20_FLAG}}") - hibf_config_print ("C++ Standard-20 support: via ${HIBF_FEATURE_CPP20_FLAG_${HIBF_CPP20_FLAG}}") +if (HIBF_CPP23_FLAG STREQUAL "BUILTIN") + hibf_config_print ("C++ Standard-23 support: builtin") +elseif (HIBF_CPP23_FLAG) + set (HIBF_CXX_FLAGS "${HIBF_CXX_FLAGS} ${HIBF_FEATURE_CPP23_FLAG_${HIBF_CPP23_FLAG}}") + hibf_config_print ("C++ Standard-23 support: via ${HIBF_FEATURE_CPP23_FLAG_${HIBF_CPP23_FLAG}}") else () - hibf_config_error ("HIBF requires C++20, but your compiler does not support it.") + hibf_config_error ("HIBF requires C++23, but your compiler does not support it.") endif () # ---------------------------------------------------------------------------- diff --git a/cmake/package-lock.cmake b/cmake/package-lock.cmake index 1f5fad30..a26f93c4 100644 --- a/cmake/package-lock.cmake +++ b/cmake/package-lock.cmake @@ -31,7 +31,7 @@ CPMDeclarePackage (benchmark # googletest set (HIBF_GOOGLETEST_VERSION 1.14.0) CPMDeclarePackage (googletest - NAME GTest + NAME googletest VERSION ${HIBF_GOOGLETEST_VERSION} GITHUB_REPOSITORY google/googletest SYSTEM TRUE diff --git a/include/hibf/hierarchical_interleaved_bloom_filter.hpp b/include/hibf/hierarchical_interleaved_bloom_filter.hpp index 37cba1bb..8ee9b601 100644 --- a/include/hibf/hierarchical_interleaved_bloom_filter.hpp +++ b/include/hibf/hierarchical_interleaved_bloom_filter.hpp @@ -21,8 +21,9 @@ #include // for interleaved_bloom_filter #include // for layout #include // for counting_vector -#include // for concurrent_timer -#include // for HIBF_CONSTEXPR_VECTOR +#include +#include // for concurrent_timer +#include // for HIBF_CONSTEXPR_VECTOR namespace seqan::hibf { @@ -202,7 +203,7 @@ class hierarchical_interleaved_bloom_filter * If `j != i` is returned, there is a lower level IBF, bin `b` is a merged bin, and `j` is the ID of the lower * level IBF in ibf_vector. */ - std::vector> next_ibf_id; + md_vector next_ibf_id; /*!\brief Stores for each bin in each IBF of the HIBF the user bin ID. * \details @@ -211,7 +212,7 @@ class hierarchical_interleaved_bloom_filter * lower level IBF. * Otherwise, the returned value `j` is the corresponding user bin ID. */ - std::vector> ibf_bin_to_user_bin_id{}; + md_vector ibf_bin_to_user_bin_id{}; //!\brief Returns a membership_agent to be used for counting. membership_agent_type membership_agent() const; @@ -280,16 +281,16 @@ class hierarchical_interleaved_bloom_filter::membership_agent_type { sum += result[bin]; - auto const current_filename_index = hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx][bin]; + auto const current_filename_index = hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx, bin]; if (current_filename_index < 0) // merged bin { if (sum >= threshold) - membership_for_impl(values, hibf_ptr->next_ibf_id[ibf_idx][bin], threshold); + membership_for_impl(values, hibf_ptr->next_ibf_id[ibf_idx, bin], threshold); sum = 0u; } else if (bin + 1u == result.size() || // last bin - current_filename_index != hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx][bin + 1]) // end of split bin + current_filename_index != hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx, bin + 1]) // end of split bin { if (sum >= threshold) result_buffer.emplace_back(current_filename_index); @@ -415,16 +416,16 @@ class hierarchical_interleaved_bloom_filter::counting_agent_type for (size_t bin{}; bin < result.size(); ++bin) { sum += result[bin]; - auto const current_filename_index = hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx][bin]; + auto const current_filename_index = hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx, bin]; if (current_filename_index < 0) // merged bin { if (sum >= threshold) - bulk_count_impl(values, hibf_ptr->next_ibf_id[ibf_idx][bin], threshold); + bulk_count_impl(values, hibf_ptr->next_ibf_id[ibf_idx, bin], threshold); sum = 0u; } else if (bin + 1u == result.size() || // last bin - current_filename_index != hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx][bin + 1]) // end of split bin + current_filename_index != hibf_ptr->ibf_bin_to_user_bin_id[ibf_idx, bin + 1]) // end of split bin { if (sum >= threshold) result_buffer[current_filename_index] = sum; diff --git a/include/hibf/layout/hierarchical_binning.hpp b/include/hibf/layout/hierarchical_binning.hpp index 652f7f27..24d80bdc 100644 --- a/include/hibf/layout/hierarchical_binning.hpp +++ b/include/hibf/layout/hierarchical_binning.hpp @@ -13,7 +13,8 @@ #include // for bin_size_in_bits #include // for config #include // for data_store -#include // for HIBF_WORKAROUND_GCC_BOGUS_MEMCPY +#include +#include // for HIBF_WORKAROUND_GCC_BOGUS_MEMCPY namespace seqan::hibf::layout { @@ -140,9 +141,9 @@ class hierarchical_binning * * \image html hierarchical_dp_init.png */ - void initialization(std::vector> & matrix, - std::vector> & ll_matrix, - std::vector>> & trace); + void initialization(md_vector & matrix, + md_vector & ll_matrix, + md_vector> & trace); /*!\brief Performs the recursion. * @@ -182,9 +183,8 @@ class hierarchical_binning * this algorithm. It would be too computational intensive to compute the splitting for every possibility. * */ - void recursion(std::vector> & matrix, - std::vector> & ll_matrix, - std::vector>> & trace); + void + recursion(md_vector & matrix, md_vector & ll_matrix, md_vector> & trace); void backtrack_merged_bin(size_t trace_j, size_t const next_j, @@ -198,7 +198,7 @@ class hierarchical_binning maximum_bin_tracker & max_tracker); //!\brief Backtracks the trace matrix and writes the resulting binning into the output file. - size_t backtracking(std::vector>> const & trace); + size_t backtracking(md_vector> const & trace); data_store initialise_libf_data(size_t const trace_j) const; diff --git a/include/hibf/misc/md_vector.hpp b/include/hibf/misc/md_vector.hpp new file mode 100644 index 00000000..d33da1a8 --- /dev/null +++ b/include/hibf/misc/md_vector.hpp @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2006-2024, Knut Reinert & Freie Universität Berlin +// SPDX-FileCopyrightText: 2016-2024, Knut Reinert & MPI für molekulare Genetik +// SPDX-License-Identifier: BSD-3-Clause + +/*!\file + * \brief Provides seqan::hibf::md_vector. + * \author Enrico Seiler + */ + +#pragma once + +#include // for vector + +#include + +namespace seqan::hibf +{ + +template +struct md_vector : public std::vector> +{ + using base_t = std::vector>; + using base_t::base_t; + using base_t::operator[]; +#if defined(__cpp_explicit_this_parameter) && __cpp_explicit_this_parameter >= 202110L + decltype(auto) operator[](this auto & self, size_t const x, size_t const y) + { + return self[x][y]; + } +#else + value_t & operator[](size_t const x, size_t const y) + { + return (*this)[x][y]; + } + value_t const & operator[](size_t const x, size_t const y) const + { + return (*this)[x][y]; + } +#endif +}; + +} // namespace seqan::hibf diff --git a/include/hibf/platform.hpp b/include/hibf/platform.hpp index 2eb9c25b..ea752bba 100644 --- a/include/hibf/platform.hpp +++ b/include/hibf/platform.hpp @@ -66,13 +66,9 @@ // ============================================================================ #if HIBF_COMPILER_IS_GCC -# if (__GNUC__ < 11) -# error "At least GCC 11 is needed." -# endif // (__GNUC__ < 11) - -# if (__GNUC__ == 11 && __GNUC_MINOR__ <= 3) -# pragma warning "Be aware that GCC < 11.4 might have bugs that cause compile failure." -# endif // (__GNUC__ == 11 && __GNUC_MINOR__ <= 3) +# if (__GNUC__ < 12) +# error "At least GCC 12 is needed." +# endif // (__GNUC__ < 12) # if (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) # pragma warning "Be aware that GCC < 12.3 might have bugs that cause compile failure." @@ -100,10 +96,9 @@ #endif // C++ standard [required] -// Note: gcc10 -std=c++20 still defines __cplusplus=201709 #ifdef __cplusplus -# if (__cplusplus < 201709) -# error "C++20 is required, make sure that you have set -std=c++20." +# if (__cplusplus < 202100) +# error "C++23 is required, make sure that you have set -std=c++23." # endif #else # error "This is not a C++ compiler." diff --git a/include/hibf/sketch/minhashes.hpp b/include/hibf/sketch/minhashes.hpp index e5ef8405..4cb8135e 100644 --- a/include/hibf/sketch/minhashes.hpp +++ b/include/hibf/sketch/minhashes.hpp @@ -17,6 +17,7 @@ #include // for access #include // for make_nvp, CEREAL_NVP +#include #include namespace seqan::hibf::sketch @@ -39,7 +40,7 @@ struct minhashes static constexpr size_t sketch_size{40}; //!\brief A table of sketches. For LSH we need multiple sketches, stored in a table. - std::vector> table{}; // Each element (vector) is a minhash. + md_vector table{}; // Each element (vector) is a minhash. /*!\name Constructors, destructor and assignment * \{ diff --git a/src/layout/hierarchical_binning.cpp b/src/layout/hierarchical_binning.cpp index 0c588c32..2f45b0ea 100644 --- a/src/layout/hierarchical_binning.cpp +++ b/src/layout/hierarchical_binning.cpp @@ -54,13 +54,13 @@ size_t hierarchical_binning::execute() } // technical bins (outer) = rows; user bins (inner) = columns - std::vector> matrix(num_technical_bins, std::vector(num_user_bins, max_size_t)); + md_vector matrix(num_technical_bins, std::vector(num_user_bins, max_size_t)); // technical bins (outer) = rows; user bins (inner) = columns - std::vector> ll_matrix(num_technical_bins, std::vector(num_user_bins, 0u)); + md_vector ll_matrix(num_technical_bins, std::vector(num_user_bins, 0u)); // technical bins (outer) = rows; user bins (inner) = columns - std::vector>> trace( + md_vector> trace( num_technical_bins, std::vector>(num_user_bins, {max_size_t, max_size_t})); @@ -87,9 +87,9 @@ size_t hierarchical_binning::execute() return static_cast(std::ceil(levels)); } -void hierarchical_binning::initialization(std::vector> & matrix, - std::vector> & ll_matrix, - std::vector>> & trace) +void hierarchical_binning::initialization(md_vector & matrix, + md_vector & ll_matrix, + md_vector> & trace) { assert(data != nullptr); @@ -99,8 +99,8 @@ void hierarchical_binning::initialization(std::vector> & mat for (size_t i = 0; i < num_technical_bins; ++i) { size_t const corrected_ub_cardinality = static_cast(ub_cardinality * data->fpr_correction[i + 1]); - matrix[i][0] = divide_and_ceil(corrected_ub_cardinality, i + 1u); - trace[i][0] = {0u, 0u}; // unnecessary? + matrix[i, 0] = divide_and_ceil(corrected_ub_cardinality, i + 1u); + trace[i, 0] = {0u, 0u}; // unnecessary? } // initialize first row @@ -118,9 +118,9 @@ void hierarchical_binning::initialization(std::vector> & mat for (size_t j = 1; j < num_user_bins; ++j) { sum += (*data->kmer_counts)[data->positions[j]]; - matrix[0][j] = data->union_estimates[j]; - ll_matrix[0][j] = max_merge_levels(j + 1) * sum; - trace[0][j] = {0u, j - 1}; // unnecessary? + matrix[0, j] = data->union_estimates[j]; + ll_matrix[0, j] = max_merge_levels(j + 1) * sum; + trace[0, j] = {0u, j - 1}; // unnecessary? } } else @@ -130,16 +130,16 @@ void hierarchical_binning::initialization(std::vector> & mat assert(j < data->positions.size()); assert(data->positions[j] < data->kmer_counts->size()); sum += (*data->kmer_counts)[data->positions[j]]; - matrix[0][j] = sum; - ll_matrix[0][j] = max_merge_levels(j + 1) * sum; - trace[0][j] = {0u, j - 1}; // unnecessary? + matrix[0, j] = sum; + ll_matrix[0, j] = max_merge_levels(j + 1) * sum; + trace[0, j] = {0u, j - 1}; // unnecessary? } } } -void hierarchical_binning::recursion(std::vector> & matrix, - std::vector> & ll_matrix, - std::vector>> & trace) +void hierarchical_binning::recursion(md_vector & matrix, + md_vector & ll_matrix, + md_vector> & trace) { assert(data != nullptr); @@ -182,8 +182,8 @@ void hierarchical_binning::recursion(std::vector> & matrix, size_t const corrected_ub_cardinality = static_cast(ub_cardinality * data->fpr_correction[(i - i_prime)]); size_t score = - std::max(divide_and_ceil(corrected_ub_cardinality, i - i_prime), matrix[i_prime][j - 1]); - size_t full_score = score * (i + 1) /*#TBs*/ + config.alpha * ll_matrix[i_prime][j - 1]; + std::max(divide_and_ceil(corrected_ub_cardinality, i - i_prime), matrix[i_prime, j - 1]); + size_t full_score = score * (i + 1) /*#TBs*/ + config.alpha * ll_matrix[i_prime, j - 1]; // std::cout << " ++ j:" << j << " i:" << i << " i':" << i_prime << " score:" << score << std::endl; @@ -191,14 +191,14 @@ void hierarchical_binning::recursion(std::vector> & matrix, { minimum = score; full_minimum = full_score; - trace[i][j] = {i_prime, j - 1}; - ll_matrix[i][j] = ll_matrix[i_prime][j - 1]; + trace[i, j] = {i_prime, j - 1}; + ll_matrix[i, j] = ll_matrix[i_prime, j - 1]; } } // seqan3::debug_stream << "current vertical minimum of " << "j:" << j << " i:" << i // << " -> score:" << full_minimum << " (M_ij=" << minimum << ")" - // << " trace:" << trace[i][j] + // << " trace:" << trace[i, j] // << std::endl; // check horizontal cells @@ -216,7 +216,7 @@ void hierarchical_binning::recursion(std::vector> & matrix, // if the user bin j-1 was not split into multiple technical bins! // I may merge the current user bin j into the former - while (j_prime != 0 && ((i - trace[i][j_prime].first) < 2) && get_weight() < minimum) + while (j_prime != 0 && ((i - trace[i, j_prime].first) < 2) && get_weight() < minimum) { weight += (*data->kmer_counts)[data->positions[j_prime]]; --j_prime; @@ -224,8 +224,8 @@ void hierarchical_binning::recursion(std::vector> & matrix, // score: The current maximum technical bin size for the high-level IBF (score for the matrix M) // ll_kmers: estimate for the number of k-mers that have to be resolved on lower levels // full_score: The score to minimize -> score * #TB-high_level + low_level_memory footprint - size_t const score = std::max(matrix[i - 1][j_prime], get_weight()); - size_t const ll_kmers = ll_matrix[i - 1][j_prime] + max_merge_levels(j - j_prime) * weight; + size_t const score = std::max(matrix[i - 1, j_prime], get_weight()); + size_t const ll_kmers = ll_matrix[i - 1, j_prime] + max_merge_levels(j - j_prime) * weight; size_t const full_score = score * (i + 1) /*#TBs*/ + config.alpha * ll_kmers; // seqan3::debug_stream << " -- " << "j_prime:" << j_prime @@ -236,12 +236,12 @@ void hierarchical_binning::recursion(std::vector> & matrix, { minimum = score; full_minimum = full_score; - trace[i][j] = {i - 1, j_prime}; - ll_matrix[i][j] = ll_kmers; + trace[i, j] = {i - 1, j_prime}; + ll_matrix[i, j] = ll_kmers; } } - matrix[i][j] = minimum; + matrix[i, j] = minimum; } } } @@ -307,7 +307,7 @@ void hierarchical_binning::backtrack_split_bin(size_t trace_j, // std::cout << "split " << trace_j << " into " << number_of_bins << ": " << cardinality_per_bin << std::endl; } -size_t hierarchical_binning::backtracking(std::vector>> const & trace) +size_t hierarchical_binning::backtracking(md_vector> const & trace) { assert(data != nullptr); @@ -323,8 +323,8 @@ size_t hierarchical_binning::backtracking(std::vector 0u && trace_i > 0u) { // std::cout << "\t I am now at " << trace_i << "," << trace_j << std::endl; - size_t next_i = trace[trace_i][trace_j].first; - size_t next_j = trace[trace_i][trace_j].second; + size_t next_i = trace[trace_i, trace_j].first; + size_t next_j = trace[trace_i, trace_j].second; size_t number_of_bins = (trace_i - next_i); @@ -339,7 +339,7 @@ size_t hierarchical_binning::backtracking(std::vector // for layout #include // for simple_binning #include // for divide_and_ceil +#include namespace seqan::hibf::layout { @@ -22,11 +23,11 @@ size_t simple_binning::execute() assert(num_technical_bins > 0u); assert(num_user_bins > 0u); - std::vector> matrix(num_technical_bins); // rows + md_vector matrix(num_technical_bins); // rows for (auto & v : matrix) v.resize(num_user_bins, std::numeric_limits::max()); // columns - std::vector> trace(num_technical_bins); // rows + md_vector trace(num_technical_bins); // rows for (auto & v : trace) v.resize(num_user_bins, std::numeric_limits::max()); // columns @@ -37,7 +38,7 @@ size_t simple_binning::execute() for (size_t i = 0; i < extra_bins; ++i) { size_t const corrected_ub_cardinality = static_cast(ub_cardinality * data->fpr_correction[i + 1]); - matrix[i][0] = divide_and_ceil(corrected_ub_cardinality, i + 1u); + matrix[i, 0] = divide_and_ceil(corrected_ub_cardinality, i + 1u); } // we must iterate column wise @@ -54,14 +55,14 @@ size_t simple_binning::execute() size_t const corrected_ub_cardinality = static_cast(ub_cardinality * data->fpr_correction[(i - i_prime)]); size_t score = - std::max(divide_and_ceil(corrected_ub_cardinality, i - i_prime), matrix[i_prime][j - 1]); + std::max(divide_and_ceil(corrected_ub_cardinality, i - i_prime), matrix[i_prime, j - 1]); // std::cout << "j:" << j << " i:" << i << " i':" << i_prime << " score:" << score << std::endl; - minimum = (score < minimum) ? (trace[i][j] = i_prime, score) : minimum; + minimum = (score < minimum) ? (trace[i, j] = i_prime, score) : minimum; } - matrix[i][j] = minimum; + matrix[i, j] = minimum; } } @@ -79,7 +80,7 @@ size_t simple_binning::execute() while (trace_j > 0) { - size_t next_i = trace[trace_i][trace_j]; + size_t next_i = trace[trace_i, trace_j]; size_t const number_of_bins = (trace_i - next_i); size_t const cardinality = (*data->kmer_counts)[data->positions[trace_j]]; size_t const corrected_cardinality = static_cast(cardinality * data->fpr_correction[number_of_bins]); @@ -98,7 +99,7 @@ size_t simple_binning::execute() bin_id += number_of_bins; - trace_i = trace[trace_i][trace_j]; + trace_i = trace[trace_i, trace_j]; --trace_j; } ++trace_i; // because we want the length not the index. Now trace_i == number_of_bins diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index 49a46ad8..6e019afc 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -16,15 +16,12 @@ add_subdirectory ("${HIBF_ROOT_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/hibf_lib") # Dependency: Sharg include (FetchContent) +option (SHARG_NO_TDL "" ON) FetchContent_Declare ( sharg - URL "https://github.com/seqan/sharg-parser/releases/download/1.1.1/sharg-1.1.1-Source.tar.xz" - URL_HASH SHA256=7330f06501718e7871e55e5fd70d0e41472cc8b34bd0e3519f8c5547510c671c - PATCH_COMMAND curl https://github.com/seqan/sharg-parser/commit/bbbfca65333b00317b3e99a35e64f44a5c3224d6.patch | - patch --strip=1 --force) -FetchContent_Populate (sharg) -list (APPEND CMAKE_PREFIX_PATH "${sharg_SOURCE_DIR}/build_system") -find_package (sharg 1.0 REQUIRED) + GIT_REPOSITORY https://github.com/seqan/sharg-parser + GIT_TAG 7534545c5f5dca3876ca3d3b07c369131b185f92) +FetchContent_MakeAvailable (sharg) add_executable (fpr_correction_check fpr_correction_check.cpp) -target_link_libraries (fpr_correction_check seqan::hibf sharg::sharg) +target_link_libraries (fpr_correction_check sharg::sharg seqan::hibf)