Code organization#
The code is organized in multiple modules, each in a separate directory:
metatensor-core/
contains the core library, implemented in Rust and exposed to the outside world through a C API. This is also where the C++ API lives, implemented as a header-only library inmetatensor.hpp
.metatensor-torch/
contains a TorchScript extension, written in C++, using the C++ API of metatensor; as well as the corresponding tests and examples.metatensor/
contains the Rust interface to metatensor, using the C API defined inmetatensor-core
, as well as the corresponding tests and examples.python/metatensor-core/
contains the Python interface to the core metatensor types, and the corresponding tests;python/metatensor-operations/
contains a set of pure Python functions to manipulate data in metatensor format, and the corresponding tests;python/metatensor-learn/
contains pure Python helpers to define machine learning models, with API inspired by scikit-learn and PyTorch;python/metatensor-torch/
contains the Python interface for the TorchScript version of metatensor, and the corresponding tests;python/metatensor/
contains a small Python package re-exporting everything frommetatensor-core
andmetatensor-operations
. This is the main package users should interact with.julia/
contains the Julia bindings to metatensor, which are currently in very early alpha stage;
Finally, docs/
contains the documentation for everything related to
metatensor.
metatensor-core
#
This sub-project should be built by cmake. When building it, a shared library
libmetatensor.so
(libmetatensor.dylib
on macOS/metatensor.dll
on
Windows) and metatensor.h
will be produced for consumption by other
modules/the end users.
metatensor.h
is automatically generated by cbindgen when building the
code. All functions marked #[no_mangle] pub extern fn
in the rust code will
automatically be translated to the corresponding C function declaration.
The C++ API in metatensor.hpp
is manually written as a header-only library,
exposing the functions from metatensor.h
with a cleaner C++11 interface.
metatensor-torch
#
This sub-project is a typical C++ project, built by cmake. It contains the
TorchScript version of all metatensor core types, built using the C++ API.
This sub-project depends on both the C++ API of metatensor-core; and
libtorch
(the C++ part of PyTorch). All the code in this sub-project is
manually written.
metatensor
rust crate#
This is built by cargo, like a normal Rust project, and re-export a native Rust
interface built on top of the C API. This is a separate module from
metatensor-core
so that in complex projects with multiple users of metatensor
there can be a single authoritative version of the metatensor C API.
When publishing to crates.io, metatensor-core is included as a tarball of the
metatensor-core/
folder (using the .crate
file created by cargo
package). This file should be generated before publishing using
./scripts/package-core.sh
. The Rust declarations corresponding to the C API
(./metatensor/src/c_api.rs
) are also automatically generated using using
bindgen, and should be updated with ./scripts/update-declarations.sh
.
Python packages#
The Python API for metatensor is split into different distributions, which
when installed will correspond to different sub-module of metatensor
:
the
metatensor
distribution does not install any module, but has dependencies onmetatensor-core
andmetatensor-operations
. It is mainly here for user convenience, allowing to have a single install command;the
metatensor-core
distribution contains themetatensor
module;the
metatensor-operations
distribution contains themetatensor.operations
module; which depends onmetatensor-core
;the
metatensor-learn
distribution contains themetatensor.learn
module; which depends onmetatensor-operations
;the
metatensor-torch
distribution contains themetatensor.torch
module. This module re-exportsmetatensor-operations
andmetatensor-learn
asmetatensor.torch.operations
andmetatensor.torch.learn
respectively;
All the Python sub-projects are built by setuptools, and fully compatible with pip and other standard Python tools.
metatensor-core
#
This Python module re-export a native Python interface built on top of the C
API. The C API is accessed using the standard Python ctypes module. The
functions declaration in python/metatensor-core/metatensor/core/_c_api.py
are generated from the metatensor.h
header when running
./scripts/update-declarations.sh
.
metatensor-operations
#
This Python package contains the code for the operations acting on TensorMap
, and provides building
blocks for machine learning models on top of the metatensor data structures.
By default, the operations uses the types from metatensor-core
, and can act
on either numpy or torch data. The code in _dispatch.py
is here to use the
right function depending on the type of arrays stored by metatensor.
At the same time, this code is also used from metatensor-torch
, using the
metatensor types exposed in this module and operating only on torch data. This
is achieved by re-importing the code from metatensor-operations
in a new
module metatensor.torch.operations
. See the comments in
python/metatensor-torch/metatensor/torch/operations.py
for more information.
metatensor-learn
#
This Python package contains the code for the machine learning helpers tools and other facilities to define new models based on metatensor data format.
Similarly to metatensor-operations
, it uses types and functionalities from
metatensor-core
by default, and is re-exported in metatensor-torch
using
types and functions from there instead.
metatensor-torch
#
This Python package exposes to Python the types defined in the C++
metatensor-torch
sub-project. It should be used to define models that are
then exported using TorchScript and run without a Python interpreter.
As mentioned above, this package also re-export the code from
metatensor-operations
and metatensor-learn
in a way compatible with
TorchScript.
Finally this package also contains facilities to define atomistic machine learning models. Refer to the corresponding documentation for more information.
metatensor
#
This is a small wrapper package for user convenience, re-exporting all types
from metatensor-core
and all functions from metatensor-operations
.