From c00ad525dcf2b66de95f6591d7526a071b6c8863 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:15:55 +0200 Subject: [PATCH 01/21] Bump deps in conanfile.py --- conanfile.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/conanfile.py b/conanfile.py index 895224521..d5fbf8cae 100644 --- a/conanfile.py +++ b/conanfile.py @@ -35,25 +35,25 @@ def _min_cppstd(self): return 17 def requirements(self): - self.requires("arrow/16.1.0#f484da4c4c27c1eb3ead5d61b70635cd") - self.requires("boost/1.85.0#d9ae7996a5b917e0cfd4b738aa976dee", force=True) + self.requires("arrow/17.0.0#81be2aa6c49800df8cc163adf4b99e9f") + self.requires("boost/1.86.0#eda761979eec4c0fb143027ed15123a2", force=True) self.requires("bshoshany-thread-pool/4.1.0#be1802a8768416a6c9b1393cf0ce5e9c") self.requires("bzip2/1.0.8#d00dac990f08d991998d624be81a9526") - self.requires("catch2/3.6.0#819bc5a82c2cb626916fc18ee1dbc45f") + self.requires("catch2/3.7.1#431d772165ed0bc5adaabaa44a9f53ca") self.requires("cli11/2.4.2#1b431bda2fb2cd3efed633899abcd8cc") self.requires("concurrentqueue/1.0.4#1e48e1c712bcfd892087c9c622a51502") self.requires("eigen/3.4.0#2e192482a8acff96fe34766adca2b24c") - self.requires("fast_float/6.1.1#e29acaa3d0543dee343abe3f6815346e") - self.requires("fmt/10.2.1#9199a7a0611866dea5c8849a77467b25") - self.requires("hdf5/1.14.3#31ccd8d4de83844f5db48471df1944a1") - self.requires("highfive/2.9.0#c57477beed8b0110fadeb6da8f48bcc5") - self.requires("libarchive/3.7.4#db39e5a5cddfd3a1884daaab4b7942fb") - self.requires("libdeflate/1.20#3bd86e0160becf992346aa68b4938c40") + self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") + self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3", force=True) + self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4", force=True) + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") + self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") + self.requires("libdeflate/1.21#7be662d433b8a5d0c7debfe8240ffa09") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) self.requires("lzo/2.10#5725914235423c771cb1c6b607109b45") self.requires("nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d") - self.requires("parallel-hashmap/1.3.12#dc7755096d8a1fac7792fdd85760b6ca") - self.requires("pybind11/2.13.4#632601fe4e53c3046d616961ccee2c7b") + self.requires("parallel-hashmap/1.4.0#36ac84df77219748440cdb0f23624d56") + self.requires("pybind11/2.13.6#7d301b76bc1a308a51b506dd2de145b0") self.requires("readerwriterqueue/1.0.6#aaa5ff6fac60c2aee591e9e51b063b83") self.requires("span-lite/0.11.0#519fd49fff711674cfed8cd17d4ed422") self.requires("spdlog/1.14.1#972bbf70be1da4bc57ea589af0efde03") @@ -85,6 +85,7 @@ def configure(self): self.options["boost"].without_atomic = False self.options["boost"].without_charconv = True self.options["boost"].without_chrono = True + self.options["boost"].without_cobalt = True self.options["boost"].without_container = True self.options["boost"].without_context = True self.options["boost"].without_contract = True @@ -102,6 +103,7 @@ def configure(self): self.options["boost"].without_math = True self.options["boost"].without_mpi = True self.options["boost"].without_nowide = True + self.options["boost"].without_process = False self.options["boost"].without_program_options = True self.options["boost"].without_python = True self.options["boost"].without_random = True From 17cbf92282a3a42d97bc995d396ca0b335ebd8fe Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:24:34 +0200 Subject: [PATCH 02/21] Bump Conan version used by CI --- .github/workflows/macos-ci.yml | 10 ++--- .github/workflows/ubuntu-ci.yml | 76 ++++++++++++++++---------------- .github/workflows/windows-ci.yml | 4 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index 9464786e2..6ca604a7f 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -64,11 +64,11 @@ jobs: var includes = [] - includes.push({ compiler_name: 'apple-clang', compiler_version: '14', os: 'macos-12', conan: '2.4.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.4.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.4.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.4.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.4.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '14', os: 'macos-12', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) return { include: includes } diff --git a/.github/workflows/ubuntu-ci.yml b/.github/workflows/ubuntu-ci.yml index 1f7c7b116..55fb2a35f 100644 --- a/.github/workflows/ubuntu-ci.yml +++ b/.github/workflows/ubuntu-ci.yml @@ -73,57 +73,57 @@ jobs: var includes = [] // Debug builds (short CI) - includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'ON' }) - includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'ON' }) + includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) // Release builds (short CI) - includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'ON' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'ON' }) + includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) if (ci_short) { return { include: includes } } // Debug builds (long CI) - includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) // Release builds (long CI) - includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with CMake 3.25 - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.25.2', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.25.2', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with make - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.29.*', conan: '2.4.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) return { include: includes } diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 0cc31b74f..9b4295738 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -58,9 +58,9 @@ jobs: matrix: include: # prettier-ignore - - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.4.*', cmake-ver: '3.29.*', build_type: Debug, developer_mode: OFF } + - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.29.*', build_type: Debug, developer_mode: OFF } # prettier-ignore - - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.4.*', cmake-ver: '3.29.*', build_type: Release, developer_mode: OFF } + - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.29.*', build_type: Release, developer_mode: OFF } steps: - uses: actions/checkout@v4 From bc69eee7698d9911f9c708c0e84c9894066d4cfa Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:25:08 +0200 Subject: [PATCH 03/21] Bump CMake version used by CI --- .github/workflows/macos-ci.yml | 10 ++--- .github/workflows/ubuntu-ci.yml | 74 ++++++++++++++++---------------- .github/workflows/windows-ci.yml | 4 +- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index 6ca604a7f..1d47fbf54 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -64,11 +64,11 @@ jobs: var includes = [] - includes.push({ compiler_name: 'apple-clang', compiler_version: '14', os: 'macos-12', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.29.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.29.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '14', os: 'macos-12', conan: '2.7.*', cmake: '3.30.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.30.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.30.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-13', conan: '2.7.*', cmake: '3.30.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler_name: 'apple-clang', compiler_version: '15', os: 'macos-14', conan: '2.7.*', cmake: '3.30.*', build_type: 'Debug', developer_mode: 'OFF' }) return { include: includes } diff --git a/.github/workflows/ubuntu-ci.yml b/.github/workflows/ubuntu-ci.yml index 55fb2a35f..f7a953a44 100644 --- a/.github/workflows/ubuntu-ci.yml +++ b/.github/workflows/ubuntu-ci.yml @@ -73,57 +73,57 @@ jobs: var includes = [] // Debug builds (short CI) - includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) - includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) + includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) // Release builds (short CI) - includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) + includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) if (ci_short) { return { include: includes } } // Debug builds (long CI) - includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) // Release builds (long CI) - includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-9', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-10', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-11', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-12', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'gcc-13', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-9', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-10', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-11', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-12', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-13', os: 'ubuntu-22.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with CMake 3.25 includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.25.2', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with make - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.29.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) return { include: includes } diff --git a/.github/workflows/windows-ci.yml b/.github/workflows/windows-ci.yml index 9b4295738..edfa378ea 100644 --- a/.github/workflows/windows-ci.yml +++ b/.github/workflows/windows-ci.yml @@ -58,9 +58,9 @@ jobs: matrix: include: # prettier-ignore - - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.29.*', build_type: Debug, developer_mode: OFF } + - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.30.*', build_type: Debug, developer_mode: OFF } # prettier-ignore - - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.29.*', build_type: Release, developer_mode: OFF } + - { compiler-name: msvc, os: 'windows-2022', conan-ver: '2.7.*', cmake-ver: '3.30.*', build_type: Release, developer_mode: OFF } steps: - uses: actions/checkout@v4 From 33eeb8437ad1d189fcd340bb00833cc53c8c9a80 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:30:40 +0200 Subject: [PATCH 04/21] Make compatible with Arrow v17.0.0 --- .../hictk/transformers/impl/to_dataframe_impl.hpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp b/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp index 9a0892f5e..001ccd228 100644 --- a/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp +++ b/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp @@ -138,7 +138,7 @@ inline std::shared_ptr ToDataFrame::bg2_schema(bool with fields.emplace_back(arrow::field("bin2_id", arrow::uint64(), false)); } - auto chrom_dict = dictionary(arrow::uint32(), arrow::utf8(), true); + auto chrom_dict = dictionary(arrow::int32(), arrow::utf8(), true); fields.emplace_back(arrow::field("chrom1", chrom_dict, false)); fields.emplace_back(arrow::field("start1", arrow::uint32(), false)); @@ -361,6 +361,7 @@ inline std::shared_ptr ToDataFrame::make_coo_table() { auto table = arrow::Table::Make(coo_schema(), {std::make_shared(_bin1_id), std::make_shared(_bin2_id), std::make_shared(_count)}); + assert(table->ValidateFull().ok()); _bin1_id.clear(); _bin2_id.clear(); @@ -419,6 +420,7 @@ inline std::shared_ptr ToDataFrame::make_bg2_table() { std::make_shared(_count)}); // clang-format on } + assert(table->ValidateFull().ok()); _bin1_id.clear(); _bin2_id.clear(); @@ -447,6 +449,7 @@ inline std::shared_ptr ToDataFrame::make_bg2_table() { throw std::runtime_error(result.status().ToString()); } table = result.MoveValueUnsafe(); + assert(table->ValidateFull().ok()); } } @@ -549,8 +552,10 @@ std::shared_ptr ToDataFrame::sort_table( if constexpr (ndebug_not_defined()) { return arrow::compute::Take(vtable, *arg_sorter)->table(); } else { - return arrow::compute::Take(vtable, *arg_sorter, arrow::compute::TakeOptions::NoBoundsCheck()) - ->table(); + table = arrow::compute::Take(vtable, *arg_sorter, arrow::compute::TakeOptions::NoBoundsCheck()) + ->table(); + assert(table->ValidateFull().ok()); + return table; } } From 7b427586533998d0d04b3d2356d0e601a614466d Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 24 Sep 2024 19:30:47 +0200 Subject: [PATCH 05/21] Fix setup_conan_environments.sh --- setup_conan_environments.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup_conan_environments.sh b/setup_conan_environments.sh index 07e28328c..6b54a05e6 100755 --- a/setup_conan_environments.sh +++ b/setup_conan_environments.sh @@ -38,7 +38,7 @@ for compiler in gcc clang; do -pr "$profile" \ -s compiler.cppstd=17 \ -s build_type="$build_type" \ - --output-folder="$outdir" \ + --output-folder="$outdir/static" \ "$conanfile" conan install \ @@ -47,8 +47,8 @@ for compiler in gcc clang; do -pr "$profile" \ -s compiler.cppstd=17 \ -s build_type="$build_type" \ - -o shared=True \ - --output-folder="$outdir" \ + -o '*/*:shared=True' \ + --output-folder="$outdir/shared" \ "$conanfile" done done From f1a05655a8a84ad1fcfdc6fec46528f84c624093 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:50:38 +0200 Subject: [PATCH 06/21] Update doc deps --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 568bf799b..3e09d82f8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,5 @@ -furo==2024.5.6 -sphinx==7.3.7 +furo==2024.8.6 +sphinx==8.0.2 sphinx-copybutton==0.5.2 sphinxcontrib-moderncmakedomain==3.29.0 -sphinxcontrib-svg2pdfconverter==1.2.2 +sphinxcontrib-svg2pdfconverter==1.2.3 From 1dcce902da8d805108197c8ce9f5be44acefb152 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:53:31 +0200 Subject: [PATCH 07/21] Add clang-19 to CI --- .github/workflows/fuzzy-testing.yml | 2 +- .github/workflows/packaging.yml | 6 +++--- .github/workflows/run-clang-tidy.yml | 2 +- .github/workflows/ubuntu-ci.yml | 10 ++++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/fuzzy-testing.yml b/.github/workflows/fuzzy-testing.yml index ea43fb1c0..63626e3d9 100644 --- a/.github/workflows/fuzzy-testing.yml +++ b/.github/workflows/fuzzy-testing.yml @@ -115,7 +115,7 @@ jobs: } container: - image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-18 + image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-19 options: "--user=root" env: diff --git a/.github/workflows/packaging.yml b/.github/workflows/packaging.yml index 2f45d2462..d13d22de5 100644 --- a/.github/workflows/packaging.yml +++ b/.github/workflows/packaging.yml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest name: Build dependencies container: - image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-18 + image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-19 options: "--user=root" outputs: @@ -110,7 +110,7 @@ jobs: name: Test find_package() needs: [build-deps] container: - image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-18 + image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-19 options: "--user=root" steps: @@ -175,7 +175,7 @@ jobs: name: Test add_subdirectory() needs: [build-deps] container: - image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-18 + image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-19 options: "--user=root" steps: diff --git a/.github/workflows/run-clang-tidy.yml b/.github/workflows/run-clang-tidy.yml index a18287b89..8d5db99f2 100644 --- a/.github/workflows/run-clang-tidy.yml +++ b/.github/workflows/run-clang-tidy.yml @@ -51,7 +51,7 @@ jobs: run-clang-tidy: runs-on: ubuntu-latest container: - image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-18 + image: ghcr.io/paulsengroup/ci-docker-images/ubuntu-24.04-cxx-clang-19 options: "--user=root" steps: diff --git a/.github/workflows/ubuntu-ci.yml b/.github/workflows/ubuntu-ci.yml index f7a953a44..04d82646c 100644 --- a/.github/workflows/ubuntu-ci.yml +++ b/.github/workflows/ubuntu-ci.yml @@ -76,11 +76,11 @@ jobs: includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) includes.push({ compiler: 'clang-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-19', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'ON' }) // Release builds (short CI) includes.push({ compiler: 'gcc-14', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) + includes.push({ compiler: 'clang-19', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'ON' }) if (ci_short) { return { include: includes } @@ -101,6 +101,7 @@ jobs: includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Debug', developer_mode: 'OFF' }) // Release builds (long CI) includes.push({ compiler: 'gcc-8', os: 'ubuntu-20.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) @@ -119,11 +120,12 @@ jobs: includes.push({ compiler: 'clang-15', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) includes.push({ compiler: 'clang-16', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) includes.push({ compiler: 'clang-17', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with CMake 3.25 - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.25.2', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-19', os: 'ubuntu-24.04', generator: 'Ninja', cmake: '3.25.2', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) // Make sure project builds with make - includes.push({ compiler: 'clang-18', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) + includes.push({ compiler: 'clang-19', os: 'ubuntu-24.04', generator: 'Unix Makefiles', cmake: '3.30.*', conan: '2.7.*', build_type: 'Release', developer_mode: 'OFF' }) return { include: includes } From 26fcc4368ef1a3278f6db8542df89a29a5dfc619 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:55:35 +0200 Subject: [PATCH 08/21] Bump clang-format used by pre-commit --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d979769a0..b3330f73d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: types_or: [c, c++] language: python args: ["-i"] - additional_dependencies: ["clang-format==18.1.8"] + additional_dependencies: ["clang-format==19.1.0"] - id: cmake-format name: cmake-format entry: cmake-format From 355071f270444ae63c440f9b164b37785a28e48b Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Wed, 25 Sep 2024 00:57:46 +0200 Subject: [PATCH 09/21] pre-commit run --all --- .../balancing/include/hictk/balancing/ice.hpp | 37 +++++++----- .../include/hictk/balancing/impl/ice_impl.hpp | 59 +++++++++++-------- .../hictk/balancing/impl/scale_impl.hpp | 8 +-- .../include/hictk/balancing/weights.hpp | 12 ++-- .../bin_table/include/hictk/bin_table.hpp | 10 ++-- .../include/hictk/bin_table_fixed.hpp | 10 ++-- .../include/hictk/bin_table_variable.hpp | 10 ++-- .../include/hictk/impl/bin_table_impl.hpp | 10 ++-- .../cooler/include/hictk/cooler/cooler.hpp | 12 ++-- .../cooler/include/hictk/cooler/dataset.hpp | 8 +-- .../hictk/cooler/impl/attribute_impl.hpp | 4 +- .../hictk/cooler/impl/dataset_impl.hpp | 4 +- .../cooler/impl/dataset_iterator_impl.hpp | 4 +- .../hictk/cooler/impl/dataset_read_impl.hpp | 4 +- .../hictk/cooler/impl/file_read_impl.hpp | 8 +-- .../hictk/cooler/impl/pixel_selector_impl.hpp | 10 ++-- .../hictk/cooler/impl/validation_impl.hpp | 12 ++-- .../cooler/include/hictk/cooler/index.hpp | 4 +- .../include/hictk/cooler/validation.hpp | 8 +-- src/libhictk/hic/include/hictk/hic/cache.hpp | 8 +-- .../hic/include/hictk/hic/file_writer.hpp | 13 ++-- .../hictk/hic/impl/block_cache_impl.hpp | 4 +- .../hictk/hic/impl/file_writer_impl.hpp | 17 +++--- .../hic/include/hictk/hic/impl/index_impl.hpp | 4 +- .../impl/interaction_to_block_mapper_impl.hpp | 8 ++- src/libhictk/hic/include/hictk/hic/index.hpp | 4 +- .../hictk/hic/interaction_to_block_mapper.hpp | 4 +- .../pixel/include/hictk/impl/pixel_impl.hpp | 4 +- src/libhictk/pixel/include/hictk/pixel.hpp | 20 +++---- .../include/hictk/impl/reference_impl.hpp | 4 +- .../hictk/transformers/impl/coarsen_impl.hpp | 7 ++- .../impl/join_genomic_coords_impl.hpp | 5 +- test/units/cooler/file_bins_test.cpp | 4 +- 33 files changed, 188 insertions(+), 152 deletions(-) diff --git a/src/libhictk/balancing/include/hictk/balancing/ice.hpp b/src/libhictk/balancing/include/hictk/balancing/ice.hpp index 8f2d9dfbe..dedb7956d 100644 --- a/src/libhictk/balancing/include/hictk/balancing/ice.hpp +++ b/src/libhictk/balancing/include/hictk/balancing/ice.hpp @@ -79,36 +79,43 @@ class ICE { BS::thread_pool* tpool); template - [[nodiscard]] static auto construct_sparse_matrix( - const File& f, Type type, std::size_t num_masked_diags) -> internal::SparseMatrixChunked; + [[nodiscard]] static auto construct_sparse_matrix(const File& f, Type type, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked; template [[nodiscard]] static auto construct_sparse_matrix_gw(const File& f, std::size_t num_masked_diags) -> internal::SparseMatrixChunked; template - [[nodiscard]] static auto construct_sparse_matrix_cis( - const File& f, const Chromosome& chrom, std::size_t bin_offset, - std::size_t num_masked_diags) -> internal::SparseMatrixChunked; + [[nodiscard]] static auto construct_sparse_matrix_cis(const File& f, const Chromosome& chrom, + std::size_t bin_offset, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked; template [[nodiscard]] static auto construct_sparse_matrix_cis(const File& f, std::size_t num_masked_diags) -> internal::SparseMatrixChunked; template - [[nodiscard]] static auto construct_sparse_matrix_trans( - const File& f, std::size_t num_masked_diags) -> internal::SparseMatrixChunked; + [[nodiscard]] static auto construct_sparse_matrix_trans(const File& f, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked; template - [[nodiscard]] static auto construct_sparse_matrix_chunked( - const File& f, Type type, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix; + [[nodiscard]] static auto construct_sparse_matrix_chunked(const File& f, Type type, + std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix; template - [[nodiscard]] static auto construct_sparse_matrix_chunked_gw( - const File& f, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix; + [[nodiscard]] static auto construct_sparse_matrix_chunked_gw(const File& f, + std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix; template [[nodiscard]] static auto construct_sparse_matrix_chunked_cis( const File& f, const Chromosome& chrom, std::size_t bin_offset, std::size_t num_masked_diags, - const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix; + const std::filesystem::path& tmpfile, std::size_t chunk_size) + -> internal::FileBackedSparseMatrix; template [[nodiscard]] static auto construct_sparse_matrix_chunked_cis( const File& f, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, diff --git a/src/libhictk/balancing/include/hictk/balancing/impl/ice_impl.hpp b/src/libhictk/balancing/include/hictk/balancing/impl/ice_impl.hpp index 0b9dbebbf..91a210b04 100644 --- a/src/libhictk/balancing/include/hictk/balancing/impl/ice_impl.hpp +++ b/src/libhictk/balancing/include/hictk/balancing/impl/ice_impl.hpp @@ -179,8 +179,8 @@ inline void ICE::balance_cis(const MatrixT& matrix, const Chromosome& chrom, std } template -auto ICE::construct_sparse_matrix(const File& f, Type type, - std::size_t num_masked_diags) -> internal::SparseMatrixChunked { +auto ICE::construct_sparse_matrix(const File& f, Type type, std::size_t num_masked_diags) + -> internal::SparseMatrixChunked { SPDLOG_INFO(FMT_STRING("Reading interactions into memory...")); if (type == Type::cis) { return construct_sparse_matrix_cis(f, num_masked_diags); @@ -206,9 +206,10 @@ inline auto ICE::construct_sparse_matrix_gw(const File& f, std::size_t num_maske } template -[[nodiscard]] inline auto ICE::construct_sparse_matrix_cis( - const File& f, const Chromosome& chrom, std::size_t bin_offset, - std::size_t num_masked_diags) -> internal::SparseMatrixChunked { +[[nodiscard]] inline auto ICE::construct_sparse_matrix_cis(const File& f, const Chromosome& chrom, + std::size_t bin_offset, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked { internal::SparseMatrixChunked m{}; const auto sel = f.fetch(chrom.name()); @@ -224,8 +225,9 @@ template } template -[[nodiscard]] inline auto ICE::construct_sparse_matrix_cis( - const File& f, std::size_t num_masked_diags) -> internal::SparseMatrixChunked { +[[nodiscard]] inline auto ICE::construct_sparse_matrix_cis(const File& f, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked { internal::SparseMatrixChunked m{}; for (const auto& chrom : f.chromosomes()) { @@ -246,8 +248,9 @@ template } template -[[nodiscard]] inline auto ICE::construct_sparse_matrix_trans( - const File& f, std::size_t num_masked_diags) -> internal::SparseMatrixChunked { +[[nodiscard]] inline auto ICE::construct_sparse_matrix_trans(const File& f, + std::size_t num_masked_diags) + -> internal::SparseMatrixChunked { using SelectorT = decltype(f.fetch("chr1", "chr2")); using PixelIt = decltype(f.fetch("chr1", "chr2").template begin()); @@ -298,9 +301,10 @@ template } template -auto ICE::construct_sparse_matrix_chunked( - const File& f, Type type, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix { +auto ICE::construct_sparse_matrix_chunked(const File& f, Type type, std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix { SPDLOG_INFO(FMT_STRING("Writing interactions to temporary file {}..."), tmpfile); if (type == Type::cis) { return construct_sparse_matrix_chunked_cis(f, num_masked_diags, tmpfile, chunk_size); @@ -309,9 +313,10 @@ auto ICE::construct_sparse_matrix_chunked( } template -inline auto ICE::construct_sparse_matrix_chunked_gw( - const File& f, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix { +inline auto ICE::construct_sparse_matrix_chunked_gw(const File& f, std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix { internal::FileBackedSparseMatrix m(tmpfile, chunk_size); const auto sel = f.fetch(); @@ -326,10 +331,12 @@ inline auto ICE::construct_sparse_matrix_chunked_gw( } template -inline auto ICE::construct_sparse_matrix_chunked_cis( - const File& f, const Chromosome& chrom, std::size_t bin_offset, std::size_t num_masked_diags, - const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix { +inline auto ICE::construct_sparse_matrix_chunked_cis(const File& f, const Chromosome& chrom, + std::size_t bin_offset, + std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix { internal::FileBackedSparseMatrix m(tmpfile, chunk_size); const auto sel = f.fetch(chrom.name()); @@ -344,9 +351,10 @@ inline auto ICE::construct_sparse_matrix_chunked_cis( } template -inline auto ICE::construct_sparse_matrix_chunked_cis( - const File& f, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix { +inline auto ICE::construct_sparse_matrix_chunked_cis(const File& f, std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix { internal::FileBackedSparseMatrix m(tmpfile, chunk_size); for (const Chromosome& chrom : f.chromosomes()) { @@ -366,9 +374,10 @@ inline auto ICE::construct_sparse_matrix_chunked_cis( } template -inline auto ICE::construct_sparse_matrix_chunked_trans( - const File& f, std::size_t num_masked_diags, const std::filesystem::path& tmpfile, - std::size_t chunk_size) -> internal::FileBackedSparseMatrix { +inline auto ICE::construct_sparse_matrix_chunked_trans(const File& f, std::size_t num_masked_diags, + const std::filesystem::path& tmpfile, + std::size_t chunk_size) + -> internal::FileBackedSparseMatrix { using SelectorT = decltype(f.fetch("chr1", "chr2")); using PixelIt = decltype(f.fetch("chr1", "chr2").template begin()); diff --git a/src/libhictk/balancing/include/hictk/balancing/impl/scale_impl.hpp b/src/libhictk/balancing/include/hictk/balancing/impl/scale_impl.hpp index e50b51e20..33b1143d1 100644 --- a/src/libhictk/balancing/include/hictk/balancing/impl/scale_impl.hpp +++ b/src/libhictk/balancing/include/hictk/balancing/impl/scale_impl.hpp @@ -219,8 +219,8 @@ inline balancing::Weights SCALE::get_weights(bool rescale) const { inline const std::vector& SCALE::get_scale() const noexcept { return _scale; } template -inline auto SCALE::compute_cis(const File& f, - const hictk::balancing::SCALE::Params& params) -> Result { +inline auto SCALE::compute_cis(const File& f, const hictk::balancing::SCALE::Params& params) + -> Result { std::vector offsets{}; std::vector scales{}; std::vector weights{}; @@ -475,8 +475,8 @@ inline auto SCALE::handle_convergenece(const Matrix& m, std::vector& dr, template inline auto SCALE::handle_almost_converged(const Matrix& m, const std::vector& b0, std::vector& dr, std::vector& dc, - internal::VectorOfAtomicDecimals& row, - double tolerance) -> ControlFlow { + internal::VectorOfAtomicDecimals& row, double tolerance) + -> ControlFlow { for (std::size_t i = 0; i < size(); ++i) { if (_bad[i]) { continue; diff --git a/src/libhictk/balancing/include/hictk/balancing/weights.hpp b/src/libhictk/balancing/include/hictk/balancing/weights.hpp index fc7fb9294..d9f7de0d4 100644 --- a/src/libhictk/balancing/include/hictk/balancing/weights.hpp +++ b/src/libhictk/balancing/include/hictk/balancing/weights.hpp @@ -95,16 +95,16 @@ class Weights { constexpr auto operator++() noexcept(ndebug_defined()) -> ConstIt &; [[nodiscard]] constexpr auto operator++(int) noexcept(ndebug_defined()) -> ConstIt; constexpr auto operator+=(std::ptrdiff_t i_) noexcept(ndebug_defined()) -> ConstIt &; - [[nodiscard]] constexpr auto operator+(std::ptrdiff_t i_) const - noexcept(ndebug_defined()) -> ConstIt; + [[nodiscard]] constexpr auto operator+(std::ptrdiff_t i_) const noexcept(ndebug_defined()) + -> ConstIt; constexpr auto operator--() noexcept(ndebug_defined()) -> ConstIt &; [[nodiscard]] constexpr auto operator--(int) noexcept(ndebug_defined()) -> ConstIt; constexpr auto operator-=(std::ptrdiff_t i_) noexcept(ndebug_defined()) -> ConstIt &; - [[nodiscard]] constexpr auto operator-(std::ptrdiff_t i_) const - noexcept(ndebug_defined()) -> ConstIt; - [[nodiscard]] constexpr auto operator-(const ConstIt &other) const - noexcept(ndebug_defined()) -> std::ptrdiff_t; + [[nodiscard]] constexpr auto operator-(std::ptrdiff_t i_) const noexcept(ndebug_defined()) + -> ConstIt; + [[nodiscard]] constexpr auto operator-(const ConstIt &other) const noexcept(ndebug_defined()) + -> std::ptrdiff_t; private: constexpr void bound_check(std::ptrdiff_t offset, bool end_ok = true) const; diff --git a/src/libhictk/bin_table/include/hictk/bin_table.hpp b/src/libhictk/bin_table/include/hictk/bin_table.hpp index 37646523a..e7cb9d7fd 100644 --- a/src/libhictk/bin_table/include/hictk/bin_table.hpp +++ b/src/libhictk/bin_table/include/hictk/bin_table.hpp @@ -65,13 +65,15 @@ class BinTable { [[nodiscard]] auto find_overlap(const GenomicInterval &query) const -> std::pair; - [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, + std::uint32_t end) const + -> std::pair; [[nodiscard]] auto find_overlap(std::string_view chrom_name, std::uint32_t start, std::uint32_t end) const -> std::pair; - [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, + std::uint32_t end) const + -> std::pair; // Map bin_id to Bin [[nodiscard]] Bin at(std::uint64_t bin_id) const; diff --git a/src/libhictk/bin_table/include/hictk/bin_table_fixed.hpp b/src/libhictk/bin_table/include/hictk/bin_table_fixed.hpp index ce115478f..09b9b02e1 100644 --- a/src/libhictk/bin_table/include/hictk/bin_table_fixed.hpp +++ b/src/libhictk/bin_table/include/hictk/bin_table_fixed.hpp @@ -54,13 +54,15 @@ class BinTableFixed { [[nodiscard]] auto find_overlap(const GenomicInterval &query) const -> std::pair; - [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, + std::uint32_t end) const + -> std::pair; [[nodiscard]] auto find_overlap(std::string_view chrom_name, std::uint32_t start, std::uint32_t end) const -> std::pair; - [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, + std::uint32_t end) const + -> std::pair; // Map bin_id to Bin [[nodiscard]] Bin at(std::uint64_t bin_id) const; diff --git a/src/libhictk/bin_table/include/hictk/bin_table_variable.hpp b/src/libhictk/bin_table/include/hictk/bin_table_variable.hpp index 04daacf6c..5b7fc2f0d 100644 --- a/src/libhictk/bin_table/include/hictk/bin_table_variable.hpp +++ b/src/libhictk/bin_table/include/hictk/bin_table_variable.hpp @@ -49,13 +49,15 @@ class BinTableVariable { [[nodiscard]] auto find_overlap(const GenomicInterval &query) const -> std::pair; - [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(const Chromosome &chrom, std::uint32_t start, + std::uint32_t end) const + -> std::pair; [[nodiscard]] auto find_overlap(std::string_view chrom_name, std::uint32_t start, std::uint32_t end) const -> std::pair; - [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, std::uint32_t end) - const -> std::pair; + [[nodiscard]] auto find_overlap(std::uint32_t chrom_id, std::uint32_t start, + std::uint32_t end) const + -> std::pair; // Map bin_id to Bin [[nodiscard]] Bin at(std::uint64_t bin_id) const; diff --git a/src/libhictk/bin_table/include/hictk/impl/bin_table_impl.hpp b/src/libhictk/bin_table/include/hictk/impl/bin_table_impl.hpp index 51df0e1ff..00f7c954d 100644 --- a/src/libhictk/bin_table/include/hictk/impl/bin_table_impl.hpp +++ b/src/libhictk/bin_table/include/hictk/impl/bin_table_impl.hpp @@ -109,8 +109,9 @@ inline auto BinTable::find_overlap(const GenomicInterval &query) const _table); } -inline auto BinTable::find_overlap(const Chromosome &chrom, std::uint32_t start, std::uint32_t end) - const -> std::pair { +inline auto BinTable::find_overlap(const Chromosome &chrom, std::uint32_t start, + std::uint32_t end) const + -> std::pair { return find_overlap(GenomicInterval{chrom, start, end}); } @@ -120,8 +121,9 @@ inline auto BinTable::find_overlap(std::string_view chrom_name, std::uint32_t st return find_overlap(chromosomes().at(chrom_name), start, end); } -inline auto BinTable::find_overlap(std::uint32_t chrom_id, std::uint32_t start, std::uint32_t end) - const -> std::pair { +inline auto BinTable::find_overlap(std::uint32_t chrom_id, std::uint32_t start, + std::uint32_t end) const + -> std::pair { return find_overlap(chromosomes().at(chrom_id), start, end); } diff --git a/src/libhictk/cooler/include/hictk/cooler/cooler.hpp b/src/libhictk/cooler/include/hictk/cooler/cooler.hpp index b581c317d..eca519265 100644 --- a/src/libhictk/cooler/include/hictk/cooler/cooler.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/cooler.hpp @@ -319,12 +319,12 @@ class File { [[nodiscard]] static HighFive::File open_file(std::string_view uri, unsigned int mode, bool validate); - [[nodiscard]] static auto open_or_create_root_group(HighFive::File f, - std::string_view uri) -> RootGroup; + [[nodiscard]] static auto open_or_create_root_group(HighFive::File f, std::string_view uri) + -> RootGroup; // Open/read groups, datasets and attributes - [[nodiscard]] static auto open_root_group(const HighFive::File &f, - std::string_view uri) -> RootGroup; + [[nodiscard]] static auto open_root_group(const HighFive::File &f, std::string_view uri) + -> RootGroup; [[nodiscard]] static auto open_groups(const RootGroup &root_grp) -> GroupMap; [[nodiscard]] static auto open_datasets(const RootGroup &root_grp, std::size_t cache_size_bytes, double w0) -> DatasetMap; @@ -335,8 +335,8 @@ class File { [[nodiscard]] static auto create_root_group(HighFive::File &f, std::string_view uri, bool write_sentinel_attr = true) -> RootGroup; [[nodiscard]] static auto create_groups(RootGroup &root_grp) -> GroupMap; - [[nodiscard]] static auto create_groups(RootGroup &root_grp, Group chroms_grp, - Group bins_grp) -> GroupMap; + [[nodiscard]] static auto create_groups(RootGroup &root_grp, Group chroms_grp, Group bins_grp) + -> GroupMap; template [[nodiscard]] static auto create_datasets(RootGroup &root_grp, const Reference &chroms, std::size_t cache_size_bytes, diff --git a/src/libhictk/cooler/include/hictk/cooler/dataset.hpp b/src/libhictk/cooler/include/hictk/cooler/dataset.hpp index 2bd4450d3..86cee6e24 100644 --- a/src/libhictk/cooler/include/hictk/cooler/dataset.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/dataset.hpp @@ -195,8 +195,8 @@ class Dataset { template [[nodiscard]] T read_attribute(std::string_view key) const; - [[nodiscard]] auto read_attribute(std::string_view key, - bool missing_ok = false) const -> Attribute::AttributeVar; + [[nodiscard]] auto read_attribute(std::string_view key, bool missing_ok = false) const + -> Attribute::AttributeVar; template void read_attribute(std::string_view key, std::vector &buff) const; @@ -214,8 +214,8 @@ class Dataset { [[nodiscard]] auto cend(std::size_t chunk_size = 0) const -> iterator; template - [[nodiscard]] auto make_iterator_at_offset(std::size_t offset, - std::size_t chunk_size = 0) const -> iterator; + [[nodiscard]] auto make_iterator_at_offset(std::size_t offset, std::size_t chunk_size = 0) const + -> iterator; [[nodiscard]] static std::pair parse_uri(std::string_view uri); diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/attribute_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/attribute_impl.hpp index 823d950d4..578337591 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/attribute_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/attribute_impl.hpp @@ -76,8 +76,8 @@ inline T Attribute::read(const ParentObj& h5obj, std::string_view key) { } template -inline auto Attribute::read(const ParentObj& h5obj, std::string_view key, - bool missing_ok) -> AttributeVar { +inline auto Attribute::read(const ParentObj& h5obj, std::string_view key, bool missing_ok) + -> AttributeVar { [[maybe_unused]] HighFive::SilenceHDF5 silencer{}; // NOLINT if (missing_ok && !Attribute::exists(h5obj, key)) { diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_impl.hpp index dae8dbc9c..4b36051ef 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_impl.hpp @@ -168,8 +168,8 @@ inline void Dataset::throw_out_of_range_excp(std::size_t offset, std::size_t n) } template -inline auto Dataset::make_iterator_at_offset(std::size_t offset, - std::size_t chunk_size) const -> iterator { +inline auto Dataset::make_iterator_at_offset(std::size_t offset, std::size_t chunk_size) const + -> iterator { return iterator(*this, chunk_size, offset); } diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_iterator_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_iterator_impl.hpp index 5916e68f0..016aac978 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_iterator_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_iterator_impl.hpp @@ -307,8 +307,8 @@ inline void Dataset::iterator::read_chunk_at_offset(std::size_t new_offset) c } template -inline auto Dataset::iterator::make_end_iterator(Dataset dset, - std::size_t chunk_size) -> iterator { +inline auto Dataset::iterator::make_end_iterator(Dataset dset, std::size_t chunk_size) + -> iterator { return iterator::make_end_iterator(std::make_shared(std::move(dset)), chunk_size); } diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_read_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_read_impl.hpp index c3dc0455a..3c3655a37 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/dataset_read_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/dataset_read_impl.hpp @@ -222,8 +222,8 @@ inline void Dataset::read_attribute(std::string_view key, std::vector &buff) Attribute::read_vector(_dataset, key, buff); } -inline auto Dataset::read_attribute(std::string_view key, - bool missing_ok) const -> Attribute::AttributeVar { +inline auto Dataset::read_attribute(std::string_view key, bool missing_ok) const + -> Attribute::AttributeVar { return Attribute::read(_dataset, key, missing_ok); } diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/file_read_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/file_read_impl.hpp index 9dd9abeba..3f873cb9c 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/file_read_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/file_read_impl.hpp @@ -397,8 +397,8 @@ inline auto File::open_groups(const RootGroup &root_grp) -> GroupMap { return groups; } -inline auto File::open_datasets(const RootGroup &root_grp, std::size_t cache_size_bytes, - double w0) -> DatasetMap { +inline auto File::open_datasets(const RootGroup &root_grp, std::size_t cache_size_bytes, double w0) + -> DatasetMap { DatasetMap datasets(MANDATORY_DATASET_NAMES.size()); const std::size_t num_pixel_datasets = 3; @@ -488,8 +488,8 @@ bool read_sum_optional(const RootGroup &root_grp, std::string_view key, N &buff, HICTK_DISABLE_WARNING_PUSH HICTK_DISABLE_WARNING_UNREACHABLE_CODE -inline auto File::read_standard_attributes(const RootGroup &root_grp, - bool initialize_missing) -> Attributes { +inline auto File::read_standard_attributes(const RootGroup &root_grp, bool initialize_missing) + -> Attributes { auto attrs = initialize_missing ? Attributes::init(0) : Attributes::init_empty(); [[maybe_unused]] HighFive::SilenceHDF5 silencer{}; // NOLINT diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/pixel_selector_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/pixel_selector_impl.hpp index 82ff56030..902e61d71 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/pixel_selector_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/pixel_selector_impl.hpp @@ -225,10 +225,12 @@ inline PixelSelector::iterator::iterator( } template -inline auto PixelSelector::iterator::at_end( - std::shared_ptr index, const Dataset &pixels_bin1_id, - const Dataset &pixels_bin2_id, const Dataset &pixels_count, - std::shared_ptr weights) -> iterator { +inline auto PixelSelector::iterator::at_end(std::shared_ptr index, + const Dataset &pixels_bin1_id, + const Dataset &pixels_bin2_id, + const Dataset &pixels_count, + std::shared_ptr weights) + -> iterator { iterator it{}; it._index = std::move(index); it._bin1_id_it = pixels_bin1_id.end(0); diff --git a/src/libhictk/cooler/include/hictk/cooler/impl/validation_impl.hpp b/src/libhictk/cooler/include/hictk/cooler/impl/validation_impl.hpp index aa29cb21f..819cbb509 100644 --- a/src/libhictk/cooler/include/hictk/cooler/impl/validation_impl.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/impl/validation_impl.hpp @@ -401,8 +401,8 @@ constexpr auto fmt::formatter::par } inline auto fmt::formatter::format( - const hictk::cooler::utils::ValidationStatusCooler &s, - format_context &ctx) -> decltype(ctx.out()) { + const hictk::cooler::utils::ValidationStatusCooler &s, format_context &ctx) + -> decltype(ctx.out()) { // clang-format off return fmt::format_to( ctx.out(), @@ -434,8 +434,8 @@ constexpr auto fmt::formatter::format( - const hictk::cooler::utils::ValidationStatusMultiresCooler &s, - format_context &ctx) -> decltype(ctx.out()) { + const hictk::cooler::utils::ValidationStatusMultiresCooler &s, format_context &ctx) + -> decltype(ctx.out()) { // clang-format off return fmt::format_to( ctx.out(), @@ -470,8 +470,8 @@ constexpr auto fmt::formatter::pars } inline auto fmt::formatter::format( - const hictk::cooler::utils::ValidationStatusScool &s, - format_context &ctx) -> decltype(ctx.out()) { + const hictk::cooler::utils::ValidationStatusScool &s, format_context &ctx) + -> decltype(ctx.out()) { // clang-format off return fmt::format_to( ctx.out(), diff --git a/src/libhictk/cooler/include/hictk/cooler/index.hpp b/src/libhictk/cooler/include/hictk/cooler/index.hpp index 3ed56b1a2..b755bd4c5 100644 --- a/src/libhictk/cooler/include/hictk/cooler/index.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/index.hpp @@ -114,8 +114,8 @@ class Index { [[nodiscard]] auto at(std::uint32_t chrom_id) -> mapped_type&; [[nodiscard]] static auto init(const Reference& chroms, const BinTable& bins, - const std::vector& chrom_offsets, - bool allocate) -> MapT; + const std::vector& chrom_offsets, bool allocate) + -> MapT; public: class iterator { diff --git a/src/libhictk/cooler/include/hictk/cooler/validation.hpp b/src/libhictk/cooler/include/hictk/cooler/validation.hpp index 13c3a2176..9e4f50d9c 100644 --- a/src/libhictk/cooler/include/hictk/cooler/validation.hpp +++ b/src/libhictk/cooler/include/hictk/cooler/validation.hpp @@ -92,8 +92,8 @@ template <> struct formatter { static constexpr auto parse(format_parse_context& ctx) -> format_parse_context::iterator; - static auto format(const hictk::cooler::utils::ValidationStatusCooler& s, - format_context& ctx) -> format_context::iterator; + static auto format(const hictk::cooler::utils::ValidationStatusCooler& s, format_context& ctx) + -> format_context::iterator; }; template <> @@ -108,8 +108,8 @@ template <> struct formatter { static constexpr auto parse(format_parse_context& ctx) -> format_parse_context::iterator; - static auto format(const hictk::cooler::utils::ValidationStatusScool& s, - format_context& ctx) -> format_context::iterator; + static auto format(const hictk::cooler::utils::ValidationStatusScool& s, format_context& ctx) + -> format_context::iterator; }; } // namespace fmt diff --git a/src/libhictk/hic/include/hictk/hic/cache.hpp b/src/libhictk/hic/include/hictk/hic/cache.hpp index a2ec7e5d7..5f36c8473 100644 --- a/src/libhictk/hic/include/hictk/hic/cache.hpp +++ b/src/libhictk/hic/include/hictk/hic/cache.hpp @@ -54,11 +54,11 @@ class BlockCache { BlockCache() = delete; explicit BlockCache(std::size_t capacity_bytes); - [[nodiscard]] auto find(std::size_t chrom1_id, std::size_t chrom2_id, - std::size_t block_id) -> Value; + [[nodiscard]] auto find(std::size_t chrom1_id, std::size_t chrom2_id, std::size_t block_id) + -> Value; - auto emplace(std::size_t chrom1_id, std::size_t chrom2_id, std::size_t block_id, - Value block) -> Value; + auto emplace(std::size_t chrom1_id, std::size_t chrom2_id, std::size_t block_id, Value block) + -> Value; auto emplace(std::size_t chrom1_id, std::size_t chrom2_id, std::size_t block_id, InteractionBlock&& block) -> Value; diff --git a/src/libhictk/hic/include/hictk/hic/file_writer.hpp b/src/libhictk/hic/include/hictk/hic/file_writer.hpp index a34afe558..81c12b4ff 100644 --- a/src/libhictk/hic/include/hictk/hic/file_writer.hpp +++ b/src/libhictk/hic/include/hictk/hic/file_writer.hpp @@ -79,8 +79,8 @@ class MatrixBodyMetadataTank { MatrixBodyMetadataTank() = default; [[nodiscard]] bool contains(const Chromosome& chrom1, const Chromosome& chrom2) const noexcept; - [[nodiscard]] auto at(const Chromosome& chrom1, - const Chromosome& chrom2) const -> const MatrixBodyMetadata&; + [[nodiscard]] auto at(const Chromosome& chrom1, const Chromosome& chrom2) const + -> const MatrixBodyMetadata&; [[nodiscard]] HiCSectionOffsets offset(const Chromosome& chrom1, const Chromosome& chrom2) const; void insert(const Chromosome& chrom1, const Chromosome& chrom2, MatrixMetadata matrix_metadata, @@ -180,8 +180,9 @@ class HiCFileWriter { std::vector resolutions, std::string_view assembly, bool skip_all_vs_all_matrix); - [[nodiscard]] static auto init_bin_tables( - const Reference& chromosomes, const std::vector& resolutions) -> BinTables; + [[nodiscard]] static auto init_bin_tables(const Reference& chromosomes, + const std::vector& resolutions) + -> BinTables; [[nodiscard]] static auto init_interaction_block_mappers(const std::filesystem::path& root_folder, const BinTables& bin_tables, std::size_t chunk_size, @@ -196,8 +197,8 @@ class HiCFileWriter { // Write pixels void write_pixels(bool skip_all_vs_all_matrix); auto write_pixels(const Chromosome& chrom1, const Chromosome& chrom2) -> HiCSectionOffsets; - auto write_pixels(const Chromosome& chrom1, const Chromosome& chrom2, - std::uint32_t resolution) -> HiCSectionOffsets; + auto write_pixels(const Chromosome& chrom1, const Chromosome& chrom2, std::uint32_t resolution) + -> HiCSectionOffsets; void write_all_matrix(std::uint32_t target_num_bins = 500); auto write_interaction_block(std::uint64_t block_id, const Chromosome& chrom1, diff --git a/src/libhictk/hic/include/hictk/hic/impl/block_cache_impl.hpp b/src/libhictk/hic/include/hictk/hic/impl/block_cache_impl.hpp index 97d20b7d4..58218a9d4 100644 --- a/src/libhictk/hic/include/hictk/hic/impl/block_cache_impl.hpp +++ b/src/libhictk/hic/include/hictk/hic/impl/block_cache_impl.hpp @@ -20,8 +20,8 @@ constexpr bool BlockID::operator==(const BlockID &other) const noexcept { inline BlockCache::BlockCache(std::size_t capacity_bytes) : _capacity(capacity_bytes / sizeof(ThinPixel)) {} -inline auto BlockCache::find(std::size_t chrom1_id, std::size_t chrom2_id, - std::size_t block_id) -> Value { +inline auto BlockCache::find(std::size_t chrom1_id, std::size_t chrom2_id, std::size_t block_id) + -> Value { auto match = _map.find({chrom1_id, chrom2_id, block_id}); if (match != _map.end()) { ++_hits; diff --git a/src/libhictk/hic/include/hictk/hic/impl/file_writer_impl.hpp b/src/libhictk/hic/include/hictk/hic/impl/file_writer_impl.hpp index b93fd2242..66b0ed7f8 100644 --- a/src/libhictk/hic/include/hictk/hic/impl/file_writer_impl.hpp +++ b/src/libhictk/hic/include/hictk/hic/impl/file_writer_impl.hpp @@ -427,8 +427,8 @@ inline void HiCFileWriter::write_all_matrix(std::uint32_t target_num_bins) { } } -inline auto HiCFileWriter::write_pixels(const Chromosome &chrom1, - const Chromosome &chrom2) -> HiCSectionOffsets { +inline auto HiCFileWriter::write_pixels(const Chromosome &chrom1, const Chromosome &chrom2) + -> HiCSectionOffsets { try { write_pixels(chrom1, chrom2, resolutions().front()); add_body_metadata(resolutions().front(), chrom1, chrom2); @@ -1052,8 +1052,9 @@ inline HiCHeader HiCFileWriter::init_header(std::string_view path, Reference chr }; } -inline auto HiCFileWriter::init_bin_tables( - const Reference &chromosomes, const std::vector &resolutions) -> BinTables { +inline auto HiCFileWriter::init_bin_tables(const Reference &chromosomes, + const std::vector &resolutions) + -> BinTables { BinTables bin_tables(resolutions.size()); for (const auto &res : resolutions) { bin_tables.emplace(res, std::make_shared(chromosomes, res)); @@ -1217,9 +1218,11 @@ inline auto HiCFileWriter::write_interaction_blocks(const Chromosome &chrom1, } } -inline auto HiCFileWriter::write_interaction_block( - std::uint64_t block_id, const Chromosome &chrom1, const Chromosome &chrom2, - std::uint32_t resolution, const MatrixInteractionBlock &blk) -> HiCSectionOffsets { +inline auto HiCFileWriter::write_interaction_block(std::uint64_t block_id, const Chromosome &chrom1, + const Chromosome &chrom2, + std::uint32_t resolution, + const MatrixInteractionBlock &blk) + -> HiCSectionOffsets { const auto offset = _fs.tellp(); std::ignore = blk.serialize(_bbuffer, *_compressor, _compression_buffer); diff --git a/src/libhictk/hic/include/hictk/hic/impl/index_impl.hpp b/src/libhictk/hic/include/hictk/hic/impl/index_impl.hpp index 3be85bad4..9c852ab37 100644 --- a/src/libhictk/hic/include/hictk/hic/impl/index_impl.hpp +++ b/src/libhictk/hic/include/hictk/hic/impl/index_impl.hpp @@ -178,8 +178,8 @@ inline auto Index::generate_block_list(std::size_t bin1, std::size_t bin2, std:: } inline auto Index::generate_block_list_intra_v9plus(std::size_t bin1, std::size_t bin2, - std::size_t bin3, - std::size_t bin4) const -> Overlap { + std::size_t bin3, std::size_t bin4) const + -> Overlap { // When fetching large regions (especially regions where one dimension is much bigger than the // other) the approach outlined here is too conservative (as in, it computes a bound box that is // much larger than the actual query, thus returning many blocks not overlapping the query): diff --git a/src/libhictk/hic/include/hictk/hic/impl/interaction_to_block_mapper_impl.hpp b/src/libhictk/hic/include/hictk/hic/impl/interaction_to_block_mapper_impl.hpp index 5aea9e525..3ecdda69b 100644 --- a/src/libhictk/hic/include/hictk/hic/impl/interaction_to_block_mapper_impl.hpp +++ b/src/libhictk/hic/include/hictk/hic/impl/interaction_to_block_mapper_impl.hpp @@ -300,9 +300,11 @@ inline auto HiCInteractionToBlockMapper::merge_blocks(const BlockID &bid) return merge_blocks(bid, _bbuffer, *_zstd_dctx, _compression_buffer, dummy_mtx); } -inline auto HiCInteractionToBlockMapper::merge_blocks( - const BlockID &bid, BinaryBuffer &bbuffer, ZSTD_DCtx_s &zstd_dctx, - std::string &compression_buffer, std::mutex &mtx) -> MatrixInteractionBlock { +inline auto HiCInteractionToBlockMapper::merge_blocks(const BlockID &bid, BinaryBuffer &bbuffer, + ZSTD_DCtx_s &zstd_dctx, + std::string &compression_buffer, + std::mutex &mtx) + -> MatrixInteractionBlock { MatrixInteractionBlock blk{}; for (auto &&pixel : fetch_pixels(bid, bbuffer, zstd_dctx, compression_buffer, mtx)) { blk.emplace_back(std::move(pixel)); diff --git a/src/libhictk/hic/include/hictk/hic/index.hpp b/src/libhictk/hic/include/hictk/hic/index.hpp index 5c9276c58..d5d4c4ef6 100644 --- a/src/libhictk/hic/include/hictk/hic/index.hpp +++ b/src/libhictk/hic/include/hictk/hic/index.hpp @@ -111,8 +111,8 @@ class Index { [[nodiscard]] auto generate_block_list(std::size_t bin1, std::size_t bin2, std::size_t bin3, std::size_t bin4) const -> Overlap; [[nodiscard]] auto generate_block_list_intra_v9plus(std::size_t bin1, std::size_t bin2, - std::size_t bin3, - std::size_t bin4) const -> Overlap; + std::size_t bin3, std::size_t bin4) const + -> Overlap; void generate_block_list_intra_v9plus(std::size_t bin1, std::size_t bin2, std::size_t bin3, std::size_t bin4, phmap::flat_hash_set& buffer) const; diff --git a/src/libhictk/hic/include/hictk/hic/interaction_to_block_mapper.hpp b/src/libhictk/hic/include/hictk/hic/interaction_to_block_mapper.hpp index 2df4c9f35..3eb50986d 100644 --- a/src/libhictk/hic/include/hictk/hic/interaction_to_block_mapper.hpp +++ b/src/libhictk/hic/include/hictk/hic/interaction_to_block_mapper.hpp @@ -142,8 +142,8 @@ class HiCInteractionToBlockMapper { [[nodiscard]] auto chromosome_index() const noexcept -> const ChromosomeIndexMap&; [[nodiscard]] auto merge_blocks(const BlockID& bid) -> MatrixInteractionBlock; [[nodiscard]] auto merge_blocks(const BlockID& bid, BinaryBuffer& bbuffer, ZSTD_DCtx_s& zstd_dctx, - std::string& compression_buffer, - std::mutex& mtx) -> MatrixInteractionBlock; + std::string& compression_buffer, std::mutex& mtx) + -> MatrixInteractionBlock; [[nodiscard]] float pixel_sum(const Chromosome& chrom1, const Chromosome& chrom2) const; [[nodiscard]] float pixel_sum() const; diff --git a/src/libhictk/pixel/include/hictk/impl/pixel_impl.hpp b/src/libhictk/pixel/include/hictk/impl/pixel_impl.hpp index e07f60968..227e4c05c 100644 --- a/src/libhictk/pixel/include/hictk/impl/pixel_impl.hpp +++ b/src/libhictk/pixel/include/hictk/impl/pixel_impl.hpp @@ -130,8 +130,8 @@ inline bool ThinPixel::operator>=(const ThinPixel &other) const noexcept { } template -inline auto ThinPixel::from_coo(const BinTable &bins, std::string_view line, - std::int64_t offset) -> ThinPixel { +inline auto ThinPixel::from_coo(const BinTable &bins, std::string_view line, std::int64_t offset) + -> ThinPixel { try { const auto toks = internal::tokenize_n<3>(line); diff --git a/src/libhictk/pixel/include/hictk/pixel.hpp b/src/libhictk/pixel/include/hictk/pixel.hpp index 69e054104..aea7a4025 100644 --- a/src/libhictk/pixel/include/hictk/pixel.hpp +++ b/src/libhictk/pixel/include/hictk/pixel.hpp @@ -35,8 +35,8 @@ struct ThinPixel { [[nodiscard]] bool operator>=(const ThinPixel &other) const noexcept; static auto from_coo(std::string_view line, std::int64_t offset = 0) -> ThinPixel; - static auto from_coo(const BinTable &bins, std::string_view line, - std::int64_t offset = 0) -> ThinPixel; + static auto from_coo(const BinTable &bins, std::string_view line, std::int64_t offset = 0) + -> ThinPixel; }; struct PixelCoordinates { @@ -89,14 +89,14 @@ struct Pixel { [[nodiscard]] bool operator>=(const Pixel &other) const noexcept; [[nodiscard]] ThinPixel to_thin() const noexcept; - static auto from_coo(const BinTable &bins, std::string_view line, - std::int64_t offset = 0) -> Pixel; - static auto from_bg2(const BinTable &bins, std::string_view line, - std::int64_t offset = 0) -> Pixel; - static auto from_validpair(const BinTable &bins, std::string_view line, - std::int64_t offset = 0) -> Pixel; - static auto from_4dn_pairs(const BinTable &bins, std::string_view line, - std::int64_t offset = 0) -> Pixel; + static auto from_coo(const BinTable &bins, std::string_view line, std::int64_t offset = 0) + -> Pixel; + static auto from_bg2(const BinTable &bins, std::string_view line, std::int64_t offset = 0) + -> Pixel; + static auto from_validpair(const BinTable &bins, std::string_view line, std::int64_t offset = 0) + -> Pixel; + static auto from_4dn_pairs(const BinTable &bins, std::string_view line, std::int64_t offset = 0) + -> Pixel; }; } // namespace hictk diff --git a/src/libhictk/reference/include/hictk/impl/reference_impl.hpp b/src/libhictk/reference/include/hictk/impl/reference_impl.hpp index 15df09094..9e864c25b 100644 --- a/src/libhictk/reference/include/hictk/impl/reference_impl.hpp +++ b/src/libhictk/reference/include/hictk/impl/reference_impl.hpp @@ -227,8 +227,8 @@ inline auto Reference::construct_chrom_buffer(ChromosomeNameIt first_chrom_name, } template -inline auto Reference::construct_chrom_buffer(ChromosomeIt first_chrom, - ChromosomeIt last_chrom) -> ChromBuff { +inline auto Reference::construct_chrom_buffer(ChromosomeIt first_chrom, ChromosomeIt last_chrom) + -> ChromBuff { std::vector chrom_names{}; std::vector chrom_sizes{}; diff --git a/src/libhictk/transformers/include/hictk/transformers/impl/coarsen_impl.hpp b/src/libhictk/transformers/include/hictk/transformers/impl/coarsen_impl.hpp index c455f125e..747ba852d 100644 --- a/src/libhictk/transformers/include/hictk/transformers/impl/coarsen_impl.hpp +++ b/src/libhictk/transformers/include/hictk/transformers/impl/coarsen_impl.hpp @@ -99,9 +99,10 @@ inline CoarsenPixels::iterator::iterator(PixelIt first, PixelIt last, } template -inline auto CoarsenPixels::iterator::at_end( - PixelIt last, std::shared_ptr src_bins, - std::shared_ptr dest_bins) -> iterator { +inline auto CoarsenPixels::iterator::at_end(PixelIt last, + std::shared_ptr src_bins, + std::shared_ptr dest_bins) + -> iterator { iterator it{}; it._pixel_it = last; it._pixel_last = last; diff --git a/src/libhictk/transformers/include/hictk/transformers/impl/join_genomic_coords_impl.hpp b/src/libhictk/transformers/include/hictk/transformers/impl/join_genomic_coords_impl.hpp index 07ad25635..63e2b4e08 100644 --- a/src/libhictk/transformers/include/hictk/transformers/impl/join_genomic_coords_impl.hpp +++ b/src/libhictk/transformers/include/hictk/transformers/impl/join_genomic_coords_impl.hpp @@ -58,8 +58,9 @@ inline JoinGenomicCoords::iterator::iterator(PixelIt it, : _it(std::move(it)), _bins(std::move(bins)) {} template -inline auto JoinGenomicCoords::iterator::at_end( - PixelIt it, std::shared_ptr bins) -> iterator { +inline auto JoinGenomicCoords::iterator::at_end(PixelIt it, + std::shared_ptr bins) + -> iterator { iterator it_{}; it_._it = std::move(it); it_._bins = std::move(bins); diff --git a/test/units/cooler/file_bins_test.cpp b/test/units/cooler/file_bins_test.cpp index 042e6448a..b0786d801 100644 --- a/test/units/cooler/file_bins_test.cpp +++ b/test/units/cooler/file_bins_test.cpp @@ -24,7 +24,9 @@ TEST_CASE("Cooler: read/write bin table", "[cooler][short]") { constexpr std::uint32_t bin_size = 5000; const BinTable table(chroms, bin_size); - { auto f = File::create(path, chroms, bin_size, true); } + { + auto f = File::create(path, chroms, bin_size, true); + } File f(path); From 8fa54672275886b8277aec1c45f8744ec5de1cc0 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Wed, 25 Sep 2024 01:01:38 +0200 Subject: [PATCH 10/21] Update version range used in cmake_policy() --- CMakeLists.txt | 2 +- docs/quickstart_api.rst | 2 +- test/packaging/test_add_subdirectory/CMakeLists.txt | 2 +- test/packaging/test_find_package/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fce815b1c..5c459bdcb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT cmake_minimum_required(VERSION 3.25) -cmake_policy(VERSION 3.25...3.28) +cmake_policy(VERSION 3.25...3.30) set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) diff --git a/docs/quickstart_api.rst b/docs/quickstart_api.rst index c1d4db2e3..d17912c35 100644 --- a/docs/quickstart_api.rst +++ b/docs/quickstart_api.rst @@ -54,7 +54,7 @@ To install and configure hictk using `FetchContent Date: Wed, 25 Sep 2024 01:22:06 +0200 Subject: [PATCH 11/21] Bump project_options --- .github/workflows/codecov.yml | 4 ++++ .github/workflows/run-clang-tidy.yml | 4 ++++ CMakeLists.txt | 24 ++++++++++++++---------- external/project_options-v0.33.0.tar.xz | Bin 51144 -> 0 bytes external/project_options-v0.36.4.tar.xz | Bin 0 -> 54928 bytes 5 files changed, 22 insertions(+), 10 deletions(-) delete mode 100644 external/project_options-v0.33.0.tar.xz create mode 100644 external/project_options-v0.36.4.tar.xz diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index c3f4ec2da..cb16df5c9 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -131,7 +131,11 @@ jobs: -DENABLE_DEVELOPER_MODE=ON \ -DOPT_ENABLE_COVERAGE=ON \ -DOPT_ENABLE_SANITIZER_ADDRESS=OFF \ + -DOPT_ENABLE_SANITIZER_LEAK=OFF \ + -DOPT_ENABLE_SANITIZER_POINTER_COMPARE=OFF \ + -DOPT_ENABLE_SANITIZER_POINTER_SUBTRACT=OFF \ -DOPT_ENABLE_SANITIZER_UNDEFINED_BEHAVIOR=OFF \ + -DOPT_ENABLE_CPPCHECK=OFF \ -DOPT_ENABLE_CLANG_TIDY=OFF \ -DHICTK_BUILD_EXAMPLES=OFF \ -DHICTK_ENABLE_TESTING=ON \ diff --git a/.github/workflows/run-clang-tidy.yml b/.github/workflows/run-clang-tidy.yml index 8d5db99f2..0ed40baf8 100644 --- a/.github/workflows/run-clang-tidy.yml +++ b/.github/workflows/run-clang-tidy.yml @@ -127,7 +127,11 @@ jobs: -DCMAKE_PREFIX_PATH="$PWD/build" \ -DENABLE_DEVELOPER_MODE=ON \ -DOPT_ENABLE_SANITIZER_ADDRESS=OFF \ + -DOPT_ENABLE_SANITIZER_LEAK=OFF \ + -DOPT_ENABLE_SANITIZER_POINTER_COMPARE=OFF \ + -DOPT_ENABLE_SANITIZER_POINTER_SUBTRACT=OFF \ -DOPT_ENABLE_SANITIZER_UNDEFINED_BEHAVIOR=OFF \ + -DOPT_ENABLE_CPPCHECK=OFF \ -DOPT_ENABLE_CLANG_TIDY=ON \ -DHICTK_BUILD_EXAMPLES=ON \ -DHICTK_ENABLE_TESTING=ON \ diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c459bdcb..9013704e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,8 @@ project( include(FetchContent) FetchContent_Declare( _hictk_project_options - URL "${CMAKE_CURRENT_SOURCE_DIR}/external/project_options-v0.33.0.tar.xz" - URL_HASH SHA256=b55dddd6c8af37c35b0bdd90d78088ef05beb423d6a56a55850e33fa3d464675 + URL "${CMAKE_CURRENT_SOURCE_DIR}/external/project_options-v0.36.4.tar.xz" + URL_HASH SHA256=9cf0b39bccd3d77044a19df45113e657dbb14e6be55a8b606a6dcf375d4c3136 SYSTEM) FetchContent_MakeAvailable(_hictk_project_options) @@ -78,18 +78,22 @@ set(ENABLE_CACHE_DEFAULT ON) set(ENABLE_COMPILE_COMMANDS_SYMLINK_DEFAULT OFF) set(ENABLE_CONAN_DEFAULT OFF) set(ENABLE_CPPCHECK_DEFAULT OFF) -set(ENABLE_DOXYGEN_USER OFF) -set(ENABLE_DOXYGEN_DEVELOPER ON) +set(ENABLE_DOXYGEN_USER_DEFAULT OFF) +set(ENABLE_DOXYGEN_DEVELOPER_DEFAULT ON) set(ENABLE_INTERPROCEDURAL_OPTIMIZATION_DEFAULT ON) set(ENABLE_NATIVE_OPTIMIZATION_DEFAULT OFF) set(ENABLE_PCH_DEFAULT OFF) -set(ENABLE_SANITIZER_ADDRESS_USER OFF) -set(ENABLE_SANITIZER_ADDRESS_DEVELOPER ON) -set(ENABLE_SANITIZER_LEAK_USER OFF) -set(ENABLE_SANITIZER_LEAK_DEVELOPER ON) -set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_USER OFF) -set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_DEVELOPER ON) +set(ENABLE_SANITIZER_ADDRESS_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_ADDRESS_DEVELOPER_DEFAULT ON) +set(ENABLE_SANITIZER_LEAK_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_LEAK_DEVELOPER_DEFAULT ON) +set(ENABLE_SANITIZER_POINTER_COMPARE_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_POINTER_COMPARE_DEVELOPER_DEFAULT OFF) +set(ENABLE_SANITIZER_POINTER_SUBTRACT_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_POINTER_SUBTRACT_DEVELOPER_DEFAULT ON) +set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_DEVELOPER_DEFAULT ON) dynamic_project_options( PREFIX diff --git a/external/project_options-v0.33.0.tar.xz b/external/project_options-v0.33.0.tar.xz deleted file mode 100644 index 2c14fded760aa3a36d1ee3f57808bf1f2125f2fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51144 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� 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 Date: Tue, 8 Oct 2024 15:52:15 +0200 Subject: [PATCH 12/21] Add script to aid deps bumping in conanfile.py --- utils/devel/update_conan_deps.py | 158 +++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 utils/devel/update_conan_deps.py diff --git a/utils/devel/update_conan_deps.py b/utils/devel/update_conan_deps.py new file mode 100755 index 000000000..79226c592 --- /dev/null +++ b/utils/devel/update_conan_deps.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2024 Roberto Rossini +# +# SPDX-License-Identifier: MIT + +import argparse +import functools +import importlib +import inspect +import json +import pathlib +import re +import shutil +import subprocess as sp +import sys +from typing import Any, List, Tuple + +from packaging.version import Version + + +def make_cli() -> argparse.ArgumentParser: + cli = argparse.ArgumentParser() + + def existing_file(arg): + if (path := pathlib.Path(arg)).exists(): + return path + + raise FileNotFoundError(f'File "{arg}" does not exists') + + cli.add_argument( + "conanfile", + type=existing_file, + help="Path to the conanfile.py to use as input.", + ) + + return cli + + +@functools.cache +def get_conan() -> pathlib.Path: + conan = shutil.which("conan") + if not conan: + raise RuntimeError("Unable to find Conan in your path") + + return pathlib.Path(conan) + + +def import_from_path(file_path: pathlib.Path, module_name="conanfile"): + spec = importlib.util.spec_from_file_location(module_name, file_path) + module = importlib.util.module_from_spec(spec) + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module + + +def extract_requirements(conanfile: pathlib.Path) -> List[Tuple[str, Any, Any, str]]: + conanfile = import_from_path(conanfile, conanfile.stem) + source = inspect.getsource(conanfile.HictkConan.requirements) + + pattern = re.compile(r"^\"([\w\-_]+)/([\w.\-_]+)#(\w+)\"(.*)$") + + requirements = [] + for line in source.split("\n"): + line = line.strip() + if not line.startswith("self.requires("): + continue + + line = line.removeprefix("self.requires(") + + matches = pattern.search(line).groups() + if len(matches) == 0: + raise RuntimeError(f'Failed to parse requirements from line "{line}"') + + name = matches[0] + version = None + revision = None + suffix = None + if len(matches) > 1: + version = matches[1] + + if len(matches) > 2: + revision = matches[2] + + if len(matches) > 3: + suffix = matches[3] + + requirements.append((name, version, revision, suffix)) + + return requirements + + +def get_last_version(package: str, remotes: str) -> Tuple[str, str]: + query = f"{package}/*" + + res = sp.run([get_conan(), "list", "--remote", remotes, query, "--format", "json"], stdout=sp.PIPE, stderr=sp.PIPE) + if res.returncode != 0: + raise RuntimeError(res.stderr.decode("utf-8")) + + version = None + for _, versions in json.loads(res.stdout.decode("utf-8")).items(): + for pkg in versions.keys(): + found_ver = Version(pkg.partition("/")[-1]) + if version is None: + version = found_ver + continue + version = max(found_ver, version) + + if version is None: + raise RuntimeError(f'Unable to find any version for "{package}" using "{remotes}" as remote(s)') + + return package, str(version) + + +def get_last_revision(package: str, version: str, remotes: str) -> Tuple[str, str, str]: + query = f"{package}/{version}#*" + + res = sp.run([get_conan(), "list", "--remote", remotes, query, "--format", "json"], stdout=sp.PIPE, stderr=sp.PIPE) + if res.returncode != 0: + raise RuntimeError(res.stderr.decode("utf-8")) + + revision = None + timestamp = None + for _, versions in json.loads(res.stdout.decode("utf-8")).items(): + assert len(versions) == 1 + _, versions = versions.popitem() + for rev, metadata in versions["revisions"].items(): + if revision is None: + revision = rev + timestamp = metadata["timestamp"] + continue + if metadata["timestamp"] > timestamp: + revision = rev + timestamp = metadata["timestamp"] + + if revision is None: + raise RuntimeError(f'Unable to find any revision for "{package}/{version}" using "{remotes}" as remote(s)') + + return package, version, revision + + +def get_last_recipe(package: str, remotes: str) -> Tuple[str, str, str]: + _, ver = get_last_version(package, remotes) + _, _, rev = get_last_revision(package, ver, remotes) + + return package, ver, rev + + +def main(): + args = vars(make_cli().parse_args()) + + for package, _, _, suffix in extract_requirements(args["conanfile"]): + package, version, revision = get_last_recipe(package, "*") + print(f'self.requires("{package}/{version}#{revision}"{suffix}') + + +if __name__ == "__main__": + main() From 6321195e2b7e78bf75c64a889ca9b4fc63289eaf Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:54:16 +0200 Subject: [PATCH 13/21] Bump deps in conanfile*.py --- conanfile.Dockerfile.py | 14 +++++++------- conanfile.py | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/conanfile.Dockerfile.py b/conanfile.Dockerfile.py index 47c053d7a..d63b94bf5 100644 --- a/conanfile.Dockerfile.py +++ b/conanfile.Dockerfile.py @@ -39,16 +39,16 @@ def requirements(self): self.requires("bzip2/1.0.8#d00dac990f08d991998d624be81a9526") self.requires("cli11/2.4.2#1b431bda2fb2cd3efed633899abcd8cc") self.requires("concurrentqueue/1.0.4#1e48e1c712bcfd892087c9c622a51502") - self.requires("fast_float/6.1.1#e29acaa3d0543dee343abe3f6815346e") - self.requires("fmt/10.2.1#9199a7a0611866dea5c8849a77467b25") - self.requires("hdf5/1.14.3#31ccd8d4de83844f5db48471df1944a1") - self.requires("highfive/2.9.0#c57477beed8b0110fadeb6da8f48bcc5") - self.requires("libarchive/3.7.4#db39e5a5cddfd3a1884daaab4b7942fb") - self.requires("libdeflate/1.20#3bd86e0160becf992346aa68b4938c40") + self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") + self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3") + self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4") + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") + self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") + self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) self.requires("lzo/2.10#5725914235423c771cb1c6b607109b45") self.requires("nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d") - self.requires("parallel-hashmap/1.3.12#dc7755096d8a1fac7792fdd85760b6ca") + self.requires("parallel-hashmap/1.37#ad1feb0b318d094645b696b7cbb0657e") self.requires("readerwriterqueue/1.0.6#aaa5ff6fac60c2aee591e9e51b063b83") self.requires("span-lite/0.11.0#519fd49fff711674cfed8cd17d4ed422") self.requires("spdlog/1.14.1#972bbf70be1da4bc57ea589af0efde03") diff --git a/conanfile.py b/conanfile.py index e48d03f82..3c87102d9 100644 --- a/conanfile.py +++ b/conanfile.py @@ -36,7 +36,7 @@ def _min_cppstd(self): def requirements(self): self.requires("arrow/17.0.0#81be2aa6c49800df8cc163adf4b99e9f") - self.requires("boost/1.86.0#eda761979eec4c0fb143027ed15123a2", force=True) + self.requires("boost/1.86.0#cd839a2082585255010f9e82eea94c7f", force=True) self.requires("bshoshany-thread-pool/4.1.0#be1802a8768416a6c9b1393cf0ce5e9c") self.requires("bzip2/1.0.8#d00dac990f08d991998d624be81a9526") self.requires("catch2/3.7.1#431d772165ed0bc5adaabaa44a9f53ca") @@ -48,11 +48,11 @@ def requirements(self): self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4", force=True) self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") - self.requires("libdeflate/1.21#7be662d433b8a5d0c7debfe8240ffa09") + self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) self.requires("lzo/2.10#5725914235423c771cb1c6b607109b45") self.requires("nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d") - self.requires("parallel-hashmap/1.4.0#36ac84df77219748440cdb0f23624d56") + self.requires("parallel-hashmap/1.37#36ac84df77219748440cdb0f23624d56") self.requires("pybind11/2.13.6#7d301b76bc1a308a51b506dd2de145b0") self.requires("readerwriterqueue/1.0.6#aaa5ff6fac60c2aee591e9e51b063b83") self.requires("span-lite/0.11.0#519fd49fff711674cfed8cd17d4ed422") From 59b17e4f31cdb254afd667ffd1eee1d30260fea7 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:12:45 +0200 Subject: [PATCH 14/21] Fix version conflict --- conanfile.Dockerfile.py | 2 +- conanfile.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.Dockerfile.py b/conanfile.Dockerfile.py index d63b94bf5..2a5f2564d 100644 --- a/conanfile.Dockerfile.py +++ b/conanfile.Dockerfile.py @@ -42,7 +42,7 @@ def requirements(self): self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3") self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4") - self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528", force=True) self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) diff --git a/conanfile.py b/conanfile.py index 3c87102d9..d070612c2 100644 --- a/conanfile.py +++ b/conanfile.py @@ -46,7 +46,7 @@ def requirements(self): self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3", force=True) self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4", force=True) - self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528", force=True) self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) From 04b596ea9eb7a70f6e41277f01377b143da58740 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 16:29:58 +0200 Subject: [PATCH 15/21] Whoops --- conanfile.Dockerfile.py | 2 +- conanfile.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conanfile.Dockerfile.py b/conanfile.Dockerfile.py index 2a5f2564d..310065687 100644 --- a/conanfile.Dockerfile.py +++ b/conanfile.Dockerfile.py @@ -48,7 +48,7 @@ def requirements(self): self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) self.requires("lzo/2.10#5725914235423c771cb1c6b607109b45") self.requires("nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d") - self.requires("parallel-hashmap/1.37#ad1feb0b318d094645b696b7cbb0657e") + self.requires("parallel-hashmap/1.4.0#36ac84df77219748440cdb0f23624d56") self.requires("readerwriterqueue/1.0.6#aaa5ff6fac60c2aee591e9e51b063b83") self.requires("span-lite/0.11.0#519fd49fff711674cfed8cd17d4ed422") self.requires("spdlog/1.14.1#972bbf70be1da4bc57ea589af0efde03") diff --git a/conanfile.py b/conanfile.py index d070612c2..a5f47009d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -52,7 +52,7 @@ def requirements(self): self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) self.requires("lzo/2.10#5725914235423c771cb1c6b607109b45") self.requires("nlohmann_json/3.11.3#45828be26eb619a2e04ca517bb7b828d") - self.requires("parallel-hashmap/1.37#36ac84df77219748440cdb0f23624d56") + self.requires("parallel-hashmap/1.4.0#36ac84df77219748440cdb0f23624d56") self.requires("pybind11/2.13.6#7d301b76bc1a308a51b506dd2de145b0") self.requires("readerwriterqueue/1.0.6#aaa5ff6fac60c2aee591e9e51b063b83") self.requires("span-lite/0.11.0#519fd49fff711674cfed8cd17d4ed422") From 4e2b932610902476ea6758b54d3e1af92e65b8a9 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 17:56:44 +0200 Subject: [PATCH 16/21] Fix version conflict for real --- conanfile.Dockerfile.py | 6 +++--- conanfile.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/conanfile.Dockerfile.py b/conanfile.Dockerfile.py index 310065687..680a7d963 100644 --- a/conanfile.Dockerfile.py +++ b/conanfile.Dockerfile.py @@ -40,9 +40,9 @@ def requirements(self): self.requires("cli11/2.4.2#1b431bda2fb2cd3efed633899abcd8cc") self.requires("concurrentqueue/1.0.4#1e48e1c712bcfd892087c9c622a51502") self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") - self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3") - self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4") - self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528", force=True) + self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3", force=True) + self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4", force=True) + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) diff --git a/conanfile.py b/conanfile.py index a5f47009d..8c4cff7fd 100644 --- a/conanfile.py +++ b/conanfile.py @@ -46,7 +46,7 @@ def requirements(self): self.requires("fast_float/6.1.5#e067b96a6271d1b4c255858ca9805bdd") self.requires("fmt/11.0.2#5c7438ef4d5d69ab106a41e460ce11f3", force=True) self.requires("hdf5/1.14.4.3#df1467d7374938c231edbe10e83f2bb4", force=True) - self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528", force=True) + self.requires("highfive/2.10.0#3d1bd25944a57fa1bc30a0a22923d528") self.requires("libarchive/3.7.6#f45e4a7fca516510284cecb8cf5fab81") self.requires("libdeflate/1.22#f95aebe763153ccbc4cc76c023e42e5a") self.requires("lz4/1.10.0#68a01ece147a441b463d8cefea68d555", force=True) From 31ca17215f59781054e8ddac30cda9821c6f037c Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:45:04 +0200 Subject: [PATCH 17/21] Bump project_option one more time to fix sanitizers --- CMakeLists.txt | 4 ++-- external/project_options-v0.36.4.tar.xz | Bin 54928 -> 0 bytes external/project_options-v0.36.6.tar.xz | Bin 0 -> 55096 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 external/project_options-v0.36.4.tar.xz create mode 100644 external/project_options-v0.36.6.tar.xz diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ae3ec722..3127cf6f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,8 +37,8 @@ project( include(FetchContent) FetchContent_Declare( _hictk_project_options - URL "${CMAKE_CURRENT_SOURCE_DIR}/external/project_options-v0.36.4.tar.xz" - URL_HASH SHA256=9cf0b39bccd3d77044a19df45113e657dbb14e6be55a8b606a6dcf375d4c3136 + URL "${CMAKE_CURRENT_SOURCE_DIR}/external/project_options-v0.36.6.tar.xz" + URL_HASH SHA256=b4df2a4107847248d4711ee48477cdf93c1a1c7d51a931937759eb9ffba67af8 SYSTEM) FetchContent_MakeAvailable(_hictk_project_options) diff --git a/external/project_options-v0.36.4.tar.xz b/external/project_options-v0.36.4.tar.xz deleted file mode 100644 index 3ad0097a085bb26c867f48f1ddbcba3ed2b91fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54928 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 i+vBddq~FYxU5Qi=(ycJb?K7TV2!Dn!|w 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 BhJpY9 literal 0 HcmV?d00001 From 28eef499e4e429a58f2d69b5e38283acb7b86d13 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:47:10 +0200 Subject: [PATCH 18/21] Address deprecation warnings --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3127cf6f1..88431ae08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,8 +92,8 @@ set(ENABLE_SANITIZER_POINTER_COMPARE_USER_DEFAULT OFF) set(ENABLE_SANITIZER_POINTER_COMPARE_DEVELOPER_DEFAULT OFF) set(ENABLE_SANITIZER_POINTER_SUBTRACT_USER_DEFAULT OFF) set(ENABLE_SANITIZER_POINTER_SUBTRACT_DEVELOPER_DEFAULT ON) -set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_USER_DEFAULT OFF) -set(ENABLE_SANITIZER_UNDEFINED_BEHAVIOR_DEVELOPER_DEFAULT ON) +set(ENABLE_SANITIZER_UNDEFINED_USER_DEFAULT OFF) +set(ENABLE_SANITIZER_UNDEFINED_DEVELOPER_DEFAULT ON) dynamic_project_options( PREFIX From 28583196fd4b2b6f187988cc99fef4b90f5b7ac0 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:55:59 +0200 Subject: [PATCH 19/21] Bump pre-commit hooks --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d77e30264..997335847 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ default_language_version: exclude: ^test/data repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: check-added-large-files - id: check-case-conflict @@ -23,7 +23,7 @@ repos: - id: trailing-whitespace # Formatters should be run late so that they can re-format any prior changes. - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.8.0 + rev: 24.10.0 hooks: - id: black args: ["--line-length", "120", "--target-version", "py311"] @@ -46,7 +46,7 @@ repos: types_or: [c, c++] language: python args: ["-i"] - additional_dependencies: ["clang-format==19.1.0"] + additional_dependencies: ["clang-format==19.1.1"] - id: cmake-format name: cmake-format entry: cmake-format From adbdc5260535528e1a9451c8d00e922de9b720d2 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:19:35 +0200 Subject: [PATCH 20/21] Disable Doxygen even when -DENABLE_DEVELOPER_MODE=ON --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94b1a4044..f036c2205 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,8 +85,7 @@ set(ENABLE_CACHE_DEFAULT ON) set(ENABLE_COMPILE_COMMANDS_SYMLINK_DEFAULT OFF) set(ENABLE_CONAN_DEFAULT OFF) set(ENABLE_CPPCHECK_DEFAULT OFF) -set(ENABLE_DOXYGEN_USER_DEFAULT OFF) -set(ENABLE_DOXYGEN_DEVELOPER_DEFAULT ON) +set(ENABLE_DOXYGEN_DEFAULT OFF) set(ENABLE_INTERPROCEDURAL_OPTIMIZATION_DEFAULT ON) set(ENABLE_NATIVE_OPTIMIZATION_DEFAULT OFF) set(ENABLE_PCH_DEFAULT OFF) From 8c3347371f65e111187437707f85449fae6bb4b7 Mon Sep 17 00:00:00 2001 From: Roberto Rossini <71787608+robomics@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:36:31 +0200 Subject: [PATCH 21/21] Bugfix --- .../include/hictk/transformers/impl/to_dataframe_impl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp b/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp index 21e344153..fd343102d 100644 --- a/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp +++ b/src/libhictk/transformers/include/hictk/transformers/impl/to_dataframe_impl.hpp @@ -145,7 +145,7 @@ inline std::shared_ptr ToDataFrame::bg2_schema(bool with fields.emplace_back(arrow::field("bin2_id", arrow::uint64(), false)); } - auto chrom_dict = dictionary(arrow::int32(), arrow::utf8(), true); + auto chrom_dict = dictionary(arrow::int32(), arrow::utf8()); fields.emplace_back(arrow::field("chrom1", chrom_dict, false)); fields.emplace_back(arrow::field("start1", arrow::uint32(), false));