diff --git a/.github/workflows/build-wheels.yml b/.github/workflows/build-wheels.yml index 16ed75626..ca77610d0 100644 --- a/.github/workflows/build-wheels.yml +++ b/.github/workflows/build-wheels.yml @@ -365,9 +365,9 @@ jobs: - name: setup libmetatensor run: | - curl --location -O https://github.com/metatensor/metatensor/releases/download/metatensor-core-v0.2.3/metatensor-core-cxx-0.2.3.tar.gz - tar xf metatensor-core-cxx-0.2.3.tar.gz - cmake -B build-metatensor -S metatensor-core-cxx-0.2.3 \ + curl --location -O https://github.com/metatensor/metatensor/releases/download/metatensor-core-v0.2.4/metatensor-core-cxx-0.2.4.tar.gz + tar xf metatensor-core-cxx-0.2.4.tar.gz + cmake -B build-metatensor -S metatensor-core-cxx-0.2.4 \ -DMETATENSOR_INSTALL_BOTH_STATIC_SHARED=OFF \ -DCMAKE_INSTALL_PREFIX=$CMAKE_PREFIX_PATH \ -DCMAKE_BUILD_TYPE=Debug diff --git a/.github/workflows/rust-tests.yml b/.github/workflows/rust-tests.yml index 36eb59bff..5951f68bc 100644 --- a/.github/workflows/rust-tests.yml +++ b/.github/workflows/rust-tests.yml @@ -107,6 +107,7 @@ jobs: - name: install valgrind if: matrix.do-valgrind run: | + sudo apt-get update sudo apt-get install -y valgrind - name: Setup sccache diff --git a/.github/workflows/torch-tests.yml b/.github/workflows/torch-tests.yml index d9dd09dc3..38bc2a8f9 100644 --- a/.github/workflows/torch-tests.yml +++ b/.github/workflows/torch-tests.yml @@ -73,6 +73,7 @@ jobs: - name: install valgrind if: matrix.do-valgrind run: | + sudo apt-get update sudo apt-get install -y valgrind - name: Setup sccache diff --git a/metatomic-core/CMakeLists.txt b/metatomic-core/CMakeLists.txt index e7dd396a7..0eb97f20f 100644 --- a/metatomic-core/CMakeLists.txt +++ b/metatomic-core/CMakeLists.txt @@ -106,7 +106,7 @@ function(check_compatible_versions _actual_ _requested_) endfunction() -set(REQUIRED_METATENSOR_VERSION "0.2.0") +set(REQUIRED_METATENSOR_VERSION "0.2.4") # Either metatensor is built as part of the same CMake project, or we try to # find the corresponding CMake package if (TARGET metatensor) diff --git a/metatomic-core/Cargo.toml b/metatomic-core/Cargo.toml index db3482f68..071e97b34 100644 --- a/metatomic-core/Cargo.toml +++ b/metatomic-core/Cargo.toml @@ -14,7 +14,7 @@ name = "metatomic" bench = false [dependencies] -metatensor = { version = "0.5.0" } +metatensor = { version = "0.5.1" } dlpk = { version = "0.4", features = ["ndarray"]} json = "0.12" libloading = "0.9" diff --git a/metatomic-core/tests/cxx/system.cpp b/metatomic-core/tests/cxx/system.cpp index d21715ae2..79532d16a 100644 --- a/metatomic-core/tests/cxx/system.cpp +++ b/metatomic-core/tests/cxx/system.cpp @@ -71,20 +71,14 @@ static metatomic::DLPackTensor cell_tensor() { } static metatomic::DLPackTensor pbc_tensor() { - // `SimpleDataArray` does not compile (`std::vector` has no - // `data()` method), so we use `uint8_t` and patch the dtype code to - // `kDLBool`. - auto array = std::make_unique>( + auto array = std::make_unique>( std::vector{3}, std::vector{1, 0, 1} ); auto mts = metatensor::DataArrayBase::to_mts_array(std::move(array)); DLDevice cpu = {kDLCPU, 0}; DLPackVersion version = {DLPACK_MAJOR_VERSION, DLPACK_MINOR_VERSION}; - auto* tensor = mts.as_dlpack(cpu, nullptr, version); - tensor->dl_tensor.dtype.code = DLDataTypeCode::kDLBool; - - return metatomic::DLPackTensor(tensor); + return metatomic::DLPackTensor(mts.as_dlpack(cpu, nullptr, version)); } static metatomic::System test_system(size_t n_atoms = 4) { diff --git a/metatomic-core/tests/system.cpp b/metatomic-core/tests/system.cpp index 37a4a66db..2686e6ce7 100644 --- a/metatomic-core/tests/system.cpp +++ b/metatomic-core/tests/system.cpp @@ -72,24 +72,18 @@ template static DLManagedTensorVersioned* pbc_tensor() { return mts.as_dlpack(cpu, nullptr, version); } - -/// SimpleDataArray doesn't compile (std::vector has no data() -/// method). We use SimpleDataArray and patch the dtype code -/// from kDLUInt to kDLBool. +/// `SimpleDataArray` stores data as `uint8_t` internally, so the data +/// vector must use `uint8_t` as well. template <> DLManagedTensorVersioned* pbc_tensor() { std::vector pbc_data = {1, 0, 1}; - auto array = std::make_unique>( + auto array = std::make_unique>( std::vector{3}, std::move(pbc_data) ); auto mts = metatensor::DataArrayBase::to_mts_array(std::move(array)); DLDevice cpu = {kDLCPU, 0}; DLPackVersion version = {DLPACK_MAJOR_VERSION, DLPACK_MINOR_VERSION}; - auto* tensor = mts.as_dlpack(cpu, nullptr, version); - - tensor->dl_tensor.dtype.code = DLDataTypeCode::kDLBool; - - return tensor; + return mts.as_dlpack(cpu, nullptr, version); } static mts_block_t* pair_block() { @@ -716,56 +710,6 @@ static void check_full_system_data(const mta_system_t* system) { CHECK(retrieved != nullptr); } -/// `DataArrayBase` storing boolean data as `uint8_t` (since -/// `std::vector` has no `data()` method, `SimpleDataArray` can not -/// be used). This class reports its dtype as `kDLBool` so that the metatensor -/// serialization code correctly handles it. -class BoolDataArray: public metatensor::SimpleDataArray { -public: - using SimpleDataArray::SimpleDataArray; - - DLDataType dtype() const override { - DLDataType dtype; - dtype.code = DLDataTypeCode::kDLBool; - dtype.bits = 8; - dtype.lanes = 1; - return dtype; - } - - DLManagedTensorVersioned* as_dlpack( - DLDevice device, - const int64_t* stream, - DLPackVersion max_version - ) override { - auto* managed = SimpleDataArray::as_dlpack(device, stream, max_version); - managed->dl_tensor.dtype.code = DLDataTypeCode::kDLBool; - return managed; - } - - std::unique_ptr copy(DLDevice device) const override { - if (device.device_type != kDLCPU) { - throw metatensor::Error("BoolDataArray only supports copying to CPU"); - } - return std::unique_ptr(new BoolDataArray(*this)); - } - - std::unique_ptr create( - std::vector shape, - metatensor::MtsArray fill_value - ) const override { - DLDevice cpu_device = {kDLCPU, 0}; - DLPackVersion version = {DLPACK_MAJOR_VERSION, DLPACK_MINOR_VERSION}; - auto fill_dlpack = fill_value.as_dlpack_array(cpu_device, nullptr, version); - - if (!fill_dlpack.shape().empty()) { - throw metatensor::Error("`fill_value` must be a single scalar"); - } - - auto scalar = fill_dlpack.data()[0]; - return std::unique_ptr(new BoolDataArray(std::move(shape), scalar)); - } -}; - /// `mts_realloc_buffer_t` callback backed by a `std::vector`. static uint8_t* vector_realloc(void* user_data, uint8_t* /*ptr*/, uintptr_t new_size) { auto* buffer = static_cast*>(user_data); @@ -773,30 +717,6 @@ static uint8_t* vector_realloc(void* user_data, uint8_t* /*ptr*/, uintptr_t new_ return buffer->data(); } -/// `mts_create_array_callback_t` that delegates to -/// `metatensor::details::default_create_array`, but handles `kDLBool` by -/// creating a `BoolDataArray` (`SimpleDataArray` does not compile since -/// `std::vector` has no `data()` method). Can be removed once -/// https://github.com/metatensor/metatensor/pull/1164 is released. -static mts_status_t create_array_with_bool( - const uintptr_t* shape_ptr, - uintptr_t shape_count, - DLDataType dtype, - mts_array_t* array -) { - if (dtype.code == kDLBool && dtype.bits == 8 && dtype.lanes == 1) { - auto shape = std::vector(); - for (uintptr_t i = 0; i < shape_count; i++) { - shape.push_back(shape_ptr[i]); - } - auto cxx_array = std::make_unique(shape); - *array = metatensor::DataArrayBase::to_mts_array(std::move(cxx_array)).release(); - return MTS_SUCCESS; - } - - return metatensor::details::default_create_array(shape_ptr, shape_count, dtype, array); -} - TEST_CASE("system serialization") { SECTION("save and load to a file") { auto* system = full_test_system(); @@ -808,7 +728,7 @@ TEST_CASE("system serialization") { mta_system_t* loaded = nullptr; auto status = mta_load( path.c_str(), - create_array_with_bool, + metatensor::details::default_create_array, &loaded ); CHECK(status == MTA_SUCCESS); @@ -837,7 +757,7 @@ TEST_CASE("system serialization") { mta_system_t* loaded = nullptr; status = mta_load_buffer( buffer.data(), buffer.size(), - create_array_with_bool, + metatensor::details::default_create_array, &loaded ); CHECK(status == MTA_SUCCESS); diff --git a/metatomic-core/tests/utils/mod.rs b/metatomic-core/tests/utils/mod.rs index 7a22f5e67..ff2ae89ff 100644 --- a/metatomic-core/tests/utils/mod.rs +++ b/metatomic-core/tests/utils/mod.rs @@ -245,7 +245,7 @@ pub fn setup_torch_pip(python: &Path) -> PathBuf { /// Install metatensor in a Python virtualenv with pip, and return the /// CMAKE_PREFIX_PATH for the installed libmetatensor. pub fn setup_metatensor_pip(python: &Path) -> PathBuf { - pip_install(python, &["metatensor-core >=0.2.2,<0.3"], PipInstallOptions::default()); + pip_install(python, &["metatensor-core >=0.2.4,<0.3"], PipInstallOptions::default()); let mut cmd = Command::new(python); cmd.arg("-c"); diff --git a/python/metatomic_core/pyproject.toml b/python/metatomic_core/pyproject.toml index 62e501ba9..b2320ca33 100644 --- a/python/metatomic_core/pyproject.toml +++ b/python/metatomic_core/pyproject.toml @@ -36,7 +36,7 @@ requires = [ "setuptools >=77", "packaging >=26", "cmake", - "metatensor-core >=0.2.2,<0.3", + "metatensor-core >=0.2.4,<0.3", ] build-backend = "setuptools.build_meta"