How to perform experiments with damast

How to perform experiments with damast#

One of the main motivation of this library is to facilitate the development and evaluation of Machine-Learning models. Hence, ‘damast’ offers a mini-framework and API to simplify the development of machine learning models. This requires a ‘hopefully’ minimal set of constraints - as what is envisioned by the authors of this library - so that researchers and ML-starters have lower entry barrier into running machine learning.

That being said, we give an example here on a minimal experiment.

!pip install 'damast[ml]'
Requirement already satisfied: damast[ml] in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (0.1.8)
Requirement already satisfied: astropy in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (6.1.7)
Requirement already satisfied: cloudpickle in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (3.1.1)
Requirement already satisfied: keras>=3.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (3.10.0)
Requirement already satisfied: matplotlib in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (3.10.3)
Requirement already satisfied: numba in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (0.61.2)
Requirement already satisfied: numpy>=2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (2.2.6)
Requirement already satisfied: polars>=1.20 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (1.30.0)
Requirement already satisfied: psutil in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (7.0.0)
Requirement already satisfied: pyais in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (2.9.4)
Requirement already satisfied: pyarrow in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (20.0.0)
Requirement already satisfied: pydantic>=2.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (2.11.6)
Requirement already satisfied: ratarmount in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (1.0.0)
Requirement already satisfied: scikit-learn in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (1.7.0)
Requirement already satisfied: tables in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (3.10.1)
Requirement already satisfied: torch in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (2.7.1)
Requirement already satisfied: tqdm in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from damast[ml]) (4.67.1)
Collecting jax[cpu] (from damast[ml])
  Downloading jax-0.6.1-py3-none-any.whl.metadata (13 kB)
Collecting tensorflow (from damast[ml])
  Downloading tensorflow-2.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.1 kB)
Requirement already satisfied: absl-py in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (2.3.0)
Requirement already satisfied: rich in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (14.0.0)
Requirement already satisfied: namex in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (0.1.0)
Requirement already satisfied: h5py in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (3.14.0)
Requirement already satisfied: optree in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (0.16.0)
Requirement already satisfied: ml-dtypes in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (0.5.1)
Requirement already satisfied: packaging in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from keras>=3.0->damast[ml]) (25.0)
Requirement already satisfied: annotated-types>=0.6.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pydantic>=2.0->damast[ml]) (0.7.0)
Requirement already satisfied: pydantic-core==2.33.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pydantic>=2.0->damast[ml]) (2.33.2)
Requirement already satisfied: typing-extensions>=4.12.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pydantic>=2.0->damast[ml]) (4.14.0)
Requirement already satisfied: typing-inspection>=0.4.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pydantic>=2.0->damast[ml]) (0.4.1)
Requirement already satisfied: pyerfa>=2.0.1.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from astropy->damast[ml]) (2.0.1.5)
Requirement already satisfied: astropy-iers-data>=0.2024.10.28.0.34.7 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from astropy->damast[ml]) (0.2025.6.9.14.9.37)
Requirement already satisfied: PyYAML>=3.13 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from astropy->damast[ml]) (6.0.2)
Collecting jaxlib<=0.6.1,>=0.6.1 (from jax[cpu]; extra == "ml"->damast[ml])
  Downloading jaxlib-0.6.1-cp310-cp310-manylinux2014_x86_64.whl.metadata (1.2 kB)
Collecting opt_einsum (from jax[cpu]; extra == "ml"->damast[ml])
  Downloading opt_einsum-3.4.0-py3-none-any.whl.metadata (6.3 kB)
Requirement already satisfied: scipy>=1.11.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from jax[cpu]; extra == "ml"->damast[ml]) (1.15.3)
Requirement already satisfied: contourpy>=1.0.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (4.58.2)
Requirement already satisfied: kiwisolver>=1.3.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (1.4.8)
Requirement already satisfied: pillow>=8 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (11.2.1)
Requirement already satisfied: pyparsing>=2.3.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from matplotlib->damast[ml]) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib->damast[ml]) (1.17.0)
Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from numba->damast[ml]) (0.44.0)
Requirement already satisfied: bitarray in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pyais->damast[ml]) (3.4.2)
Requirement already satisfied: attrs in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pyais->damast[ml]) (25.3.0)
Requirement already satisfied: ratarmountcore~=0.8.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (0.8.2)
Requirement already satisfied: python-xz~=0.4.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (0.4.0)
Requirement already satisfied: rarfile~=4.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (4.2)
Requirement already satisfied: pyfatfs~=1.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.1.0)
Requirement already satisfied: rapidgzip>=0.13.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (0.14.3)
Requirement already satisfied: indexed_zstd<2.0,>=1.2.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.6.1)
Requirement already satisfied: fast_zip_decryption in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (3.0.0)
Requirement already satisfied: indexed_gzip<2.0,>=1.6.3 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.9.5)
Requirement already satisfied: libarchive-c<6.0,~=5.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (5.3)
Requirement already satisfied: pygit2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.18.0)
Requirement already satisfied: fs~=2.4 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pyfatfs~=1.0->ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (2.4.16)
Requirement already satisfied: appdirs~=1.4.3 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from fs~=2.4->pyfatfs~=1.0->ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.4.4)
Requirement already satisfied: setuptools in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from fs~=2.4->pyfatfs~=1.0->ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (80.3.1)
Requirement already satisfied: cffi>=1.17.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from pygit2->ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (1.17.1)
Requirement already satisfied: pycparser in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from cffi>=1.17.0->pygit2->ratarmountcore[7z,bzip2,fat,git,gzip,rar,xz,zip,zstd]~=0.8.0->ratarmount->damast[ml]) (2.22)
Requirement already satisfied: markdown-it-py>=2.2.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from rich->keras>=3.0->damast[ml]) (3.0.0)
Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from rich->keras>=3.0->damast[ml]) (2.19.1)
Requirement already satisfied: mdurl~=0.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.0->damast[ml]) (0.1.2)
Requirement already satisfied: joblib>=1.2.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from scikit-learn->damast[ml]) (1.5.1)
Requirement already satisfied: threadpoolctl>=3.1.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from scikit-learn->damast[ml]) (3.6.0)
Requirement already satisfied: numexpr>=2.6.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from tables->damast[ml]) (2.11.0)
Requirement already satisfied: py-cpuinfo in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from tables->damast[ml]) (9.0.0)
Requirement already satisfied: blosc2>=2.3.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from tables->damast[ml]) (3.3.4)
Requirement already satisfied: ndindex in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from blosc2>=2.3.0->tables->damast[ml]) (1.10.0)
Requirement already satisfied: msgpack in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from blosc2>=2.3.0->tables->damast[ml]) (1.1.1)
Requirement already satisfied: platformdirs in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from blosc2>=2.3.0->tables->damast[ml]) (4.3.8)
Requirement already satisfied: requests in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from blosc2>=2.3.0->tables->damast[ml]) (2.32.4)
Requirement already satisfied: charset_normalizer<4,>=2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from requests->blosc2>=2.3.0->tables->damast[ml]) (3.4.2)
Requirement already satisfied: idna<4,>=2.5 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from requests->blosc2>=2.3.0->tables->damast[ml]) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from requests->blosc2>=2.3.0->tables->damast[ml]) (2.4.0)
Requirement already satisfied: certifi>=2017.4.17 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from requests->blosc2>=2.3.0->tables->damast[ml]) (2025.4.26)
Collecting astunparse>=1.6.0 (from tensorflow->damast[ml])
  Downloading astunparse-1.6.3-py2.py3-none-any.whl.metadata (4.4 kB)
Collecting flatbuffers>=24.3.25 (from tensorflow->damast[ml])
  Downloading flatbuffers-25.2.10-py2.py3-none-any.whl.metadata (875 bytes)
Collecting gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 (from tensorflow->damast[ml])
  Downloading gast-0.6.0-py3-none-any.whl.metadata (1.3 kB)
Collecting google-pasta>=0.1.1 (from tensorflow->damast[ml])
  Downloading google_pasta-0.2.0-py3-none-any.whl.metadata (814 bytes)
Collecting libclang>=13.0.0 (from tensorflow->damast[ml])
  Downloading libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl.metadata (5.2 kB)
Collecting protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 (from tensorflow->damast[ml])
  Downloading protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl.metadata (592 bytes)
Collecting termcolor>=1.1.0 (from tensorflow->damast[ml])
  Downloading termcolor-3.1.0-py3-none-any.whl.metadata (6.4 kB)
Requirement already satisfied: wrapt>=1.11.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from tensorflow->damast[ml]) (1.17.2)
Collecting grpcio<2.0,>=1.24.3 (from tensorflow->damast[ml])
  Downloading grpcio-1.73.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.8 kB)
Collecting tensorboard~=2.19.0 (from tensorflow->damast[ml])
  Downloading tensorboard-2.19.0-py3-none-any.whl.metadata (1.8 kB)
Collecting numpy>=2 (from damast[ml])
  Downloading numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (62 kB)
Collecting tensorflow-io-gcs-filesystem>=0.23.1 (from tensorflow->damast[ml])
  Downloading tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (14 kB)
Collecting markdown>=2.6.8 (from tensorboard~=2.19.0->tensorflow->damast[ml])
  Downloading markdown-3.8-py3-none-any.whl.metadata (5.1 kB)
Collecting tensorboard-data-server<0.8.0,>=0.7.0 (from tensorboard~=2.19.0->tensorflow->damast[ml])
  Downloading tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl.metadata (1.1 kB)
Collecting werkzeug>=1.0.1 (from tensorboard~=2.19.0->tensorflow->damast[ml])
  Downloading werkzeug-3.1.3-py3-none-any.whl.metadata (3.7 kB)
Requirement already satisfied: wheel<1.0,>=0.23.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from astunparse>=1.6.0->tensorflow->damast[ml]) (0.45.1)
Requirement already satisfied: MarkupSafe>=2.1.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow->damast[ml]) (3.0.2)
Requirement already satisfied: filelock in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (3.18.0)
Requirement already satisfied: sympy>=1.13.3 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (1.14.0)
Requirement already satisfied: networkx in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (3.4.2)
Requirement already satisfied: jinja2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (3.1.6)
Requirement already satisfied: fsspec in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (2025.5.1)
Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.77)
Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.77)
Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.80)
Requirement already satisfied: nvidia-cudnn-cu12==9.5.1.17 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (9.5.1.17)
Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.4.1)
Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (11.3.0.4)
Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (10.3.7.77)
Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (11.7.1.2)
Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.5.4.2)
Requirement already satisfied: nvidia-cusparselt-cu12==0.6.3 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (0.6.3)
Requirement already satisfied: nvidia-nccl-cu12==2.26.2 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (2.26.2)
Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.77)
Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (12.6.85)
Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (1.11.1.6)
Requirement already satisfied: triton==3.3.1 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from torch->damast[ml]) (3.3.1)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages (from sympy>=1.13.3->torch->damast[ml]) (1.3.0)
Downloading jax-0.6.1-py3-none-any.whl (2.4 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/2.4 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 147.8 MB/s eta 0:00:00
?25hDownloading jaxlib-0.6.1-cp310-cp310-manylinux2014_x86_64.whl (89.0 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/89.0 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━ 59.8/89.0 MB 300.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 88.9/89.0 MB 305.1 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.0/89.0 MB 198.0 MB/s eta 0:00:00
?25hDownloading opt_einsum-3.4.0-py3-none-any.whl (71 kB)
Downloading tensorflow-2.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (644.8 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/644.8 MB ? eta -:--:--
   ━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 71.8/644.8 MB 359.9 MB/s eta 0:00:02
   ━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 148.4/644.8 MB 369.7 MB/s eta 0:00:02
   ━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━ 225.2/644.8 MB 373.2 MB/s eta 0:00:02
   ━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━ 299.1/644.8 MB 373.4 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━ 375.4/644.8 MB 374.6 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━ 450.4/644.8 MB 372.6 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━ 518.8/644.8 MB 363.7 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━ 586.7/644.8 MB 354.1 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸ 644.6/644.8 MB 357.0 MB/s eta 0:00:01
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 644.8/644.8 MB 85.7 MB/s eta 0:00:00
?25hDownloading grpcio-1.73.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.0 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/6.0 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.0/6.0 MB 204.4 MB/s eta 0:00:00
?25hDownloading numpy-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.3 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/16.3 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.3/16.3 MB 211.9 MB/s eta 0:00:00
?25hDownloading protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl (319 kB)
Downloading tensorboard-2.19.0-py3-none-any.whl (5.5 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/5.5 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.5/5.5 MB 205.8 MB/s eta 0:00:00
?25hDownloading tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl (6.6 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/6.6 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.6/6.6 MB 216.4 MB/s eta 0:00:00
?25hDownloading astunparse-1.6.3-py2.py3-none-any.whl (12 kB)
Downloading flatbuffers-25.2.10-py2.py3-none-any.whl (30 kB)
Downloading gast-0.6.0-py3-none-any.whl (21 kB)
Downloading google_pasta-0.2.0-py3-none-any.whl (57 kB)
Downloading libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl (24.5 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/24.5 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 24.5/24.5 MB 218.0 MB/s eta 0:00:00
?25hDownloading markdown-3.8-py3-none-any.whl (106 kB)
Downloading tensorflow_io_gcs_filesystem-0.37.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB)
?25l   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0/5.1 MB ? eta -:--:--
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.1/5.1 MB 189.0 MB/s eta 0:00:00
?25hDownloading termcolor-3.1.0-py3-none-any.whl (7.7 kB)
Downloading werkzeug-3.1.3-py3-none-any.whl (224 kB)
Installing collected packages: libclang, flatbuffers, werkzeug, termcolor, tensorflow-io-gcs-filesystem, tensorboard-data-server, protobuf, opt_einsum, numpy, markdown, grpcio, google-pasta, gast, astunparse, tensorboard, jaxlib, tensorflow, jax
?25l
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  0/18 [libclang]
   ━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  2/18 [werkzeug]
   ━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  4/18 [tensorflow-io-gcs-filesystem]
   ━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━  6/18 [protobuf]
  Attempting uninstall: numpy
   ━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━  6/18 [protobuf]
    Found existing installation: numpy 2.2.6
   ━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━  6/18 [protobuf]
    Uninstalling numpy-2.2.6:
   ━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━  6/18 [protobuf]
      Successfully uninstalled numpy-2.2.6
   ━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━  6/18 [protobuf]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━  8/18 [numpy]
   ━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━  9/18 [markdown]
   ━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━ 11/18 [google-pasta]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━ 14/18 [tensorboard]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━ 14/18 [tensorboard]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━ 15/18 [jaxlib]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━ 16/18 [tensorflow]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━ 17/18 [jax]
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18/18 [jax]
?25h
Successfully installed astunparse-1.6.3 flatbuffers-25.2.10 gast-0.6.0 google-pasta-0.2.0 grpcio-1.73.0 jax-0.6.1 jaxlib-0.6.1 libclang-18.1.1 markdown-3.8 numpy-2.1.3 opt_einsum-3.4.0 protobuf-5.29.5 tensorboard-2.19.0 tensorboard-data-server-0.7.2 tensorflow-2.19.0 tensorflow-io-gcs-filesystem-0.37.1 termcolor-3.1.0 werkzeug-3.1.3
# The list of modules used for this example
from collections import OrderedDict
from typing import List, Optional
from pathlib import Path

# For performance reasons the underlying data handling library is 'polars'
import polars

# The current development has focused on a keras+tensorflow based Machine Learning setup
import tensorflow as tf
import keras

import damast
from damast.core.transformations import CycleTransformer
# You can define custom units to annotate data, but otherwise astropy units will be used
from damast.core.units import units
# Data ranges can be defined as list, or marked with a lower-bound (min), upper-bound (max)
from damast.core.data_description import MinMax, CyclicMinMax
# The AnnotatedDataFrame combines a data specification and actual 'numeric' data
from damast.core.dataframe import AnnotatedDataFrame
# An AnnotatedDataFrame contains MetaData to describe the data
from damast.core.metadata import MetaData

# Data processing is centered around a DataProcessingPipeline which consists of multiple PipelineElement being run
# in sequence
from damast.core.dataprocessing import DataProcessingPipeline, PipelineElement


# To allow the machine learning process to be simplified, we offer a 'BaseModel' that should be inherited from
from damast.ml.models.base import BaseModel

# The experiment setup
from damast.ml.experiments import Experiment, LearningTask, ForecastTask, ModelInstanceDescription, TrainingParameters

# Allow to generate data for this particular example that uses data from the maritime domain
from damast.domains.maritime.ais.data_generator import AISTestData, AISTestDataSpec
2025-06-13 09:29:54.308159: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:467] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1749806994.322246    3412 cuda_dnn.cc:8579] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered
E0000 00:00:1749806994.326563    3412 cuda_blas.cc:1407] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
W0000 00:00:1749806994.338169    3412 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1749806994.338180    3412 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1749806994.338182    3412 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
W0000 00:00:1749806994.338183    3412 computation_placer.cc:177] computation placer already registered. Please check linkage and avoid linking the same target more than once.
2025-06-13 09:29:54.342430: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2025-06-13 09:29:58.127110: E external/local_xla/xla/stream_executor/cuda/cuda_platform.cc:51] failed call to cuInit: INTERNAL: CUDA error: Failed call to cuInit: UNKNOWN ERROR (303)

To illustrate a full experiment, we require a data processing pipeline to be set up. This pipeline will extract all those features, that are necessary to train the Machine Learning model(s). The pipeline will run transformations on the data, as provided here by a LatLonTransformer.

class LatLonTransformer(PipelineElement):
    """
    The LatLonTransformer will consume a lat(itude) and a lon(gitude) column and perform
    cyclic normalization. It will add four columns to a dataframe, namely lat_x, lat_y, lon_x, lon_y.
    """
    @damast.core.describe("Lat/Lon cyclic transformation")
    @damast.core.input({
        "lat": {"unit": units.deg},
        "lon": {"unit": units.deg}
    })
    @damast.core.output({
        "lat_x": {"value_range": MinMax(-1.0, 1.0)},
        "lat_y": {"value_range": MinMax(-1.0, 1.0)},
        "lon_x": {"value_range": MinMax(-1.0, 1.0)},
        "lon_y": {"value_range": MinMax(-1.0, 1.0)}
    })
    def transform(self, df: AnnotatedDataFrame) -> AnnotatedDataFrame:        
        lat_cyclic_transformer = CycleTransformer(features=["lat"], n=180.0)
        lon_cyclic_transformer = CycleTransformer(features=["lon"], n=360.0)

        _df = lat_cyclic_transformer.fit_transform(df=df)
        _df = lon_cyclic_transformer.fit_transform(df=_df)
        df._dataframe = _df
        return df

The selected example model here, will require the above listed features as input - and provide a likewise-shaped output (for illustration purposes).

class Baseline(BaseModel):
    """
    This is a placeholder ML model that illustrates the minimal
    requirements.
    """
    input_specs = OrderedDict({
        "lat_x": {"length": 1},
        "lat_y": {"length": 1},
        "lon_x": {"length": 1},
        "lon_y": {"length": 1}
    })

    output_specs = OrderedDict({
        "lat_x": {"length": 1},
        "lat_y": {"length": 1},
        "lon_x": {"length": 1},
        "lon_y": {"length": 1}
    })

    def __init__(self,
                 name: str,
                 features: List[str],
                 timeline_length: int,
                 output_dir: Path,
                 targets: Optional[List[str]] = None):
        self.timeline_length = timeline_length

        super().__init__(name=name,
                         output_dir=output_dir,
                         features=features,
                         targets=targets)

    def _init_model(self):
        features_width = len(self.features)
        targets_width = len(self.targets)

        self.model = tf.keras.models.Sequential([
            keras.layers.Flatten(input_shape=[self.timeline_length, features_width]),
            keras.layers.Dense(targets_width)
        ])


class BaselineA(Baseline):
    """Placeholder Model to illustrate the use of multiple models"""
    pass


class BaselineB(Baseline):
    """Placeholder Model to illustrate the use of multiple models"""
    pass

This example operates with synthetic, i.e. automatically generated data which is specific to the maritime domain. You will see a previous of the first 10 columns when running the following cell.

import tempfile
import shutil

tmp_path = Path(tempfile.gettempdir()) / "test-output-ais_preparation"
if tmp_path.exists():
    shutil.rmtree(tmp_path)
tmp_path.mkdir(parents=True)

pipeline = DataProcessingPipeline(name="ais_preparation",
                                  base_dir=tmp_path) \
    .add("cyclic", LatLonTransformer())
features = ["lat_x", "lat_y", "lon_x", "lon_y"]

data = AISTestData(1000)
adf = AnnotatedDataFrame(dataframe=data.dataframe,
                         metadata=MetaData.from_dict(data=AISTestDataSpec.copy()))
dataset_filename = tmp_path / "test.hdf5"
adf.save(filename=dataset_filename)

adf.head(10)
/home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages/damast/core/polars_dataframe.py:394: PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block2_values] [items->Index(['date_time_utc', 'source'], dtype='object')]

  pandas_df.to_hdf(path, key=DAMAST_HDF5_ROOT)
naive plan: (run LazyFrame.explain(optimized=True) to see the optimized plan)

SLICE[offset: 0, len: 10]

DF ["mmsi", "lon", "lat", "date_time_utc", ...]; PROJECT */11 COLUMNS

A central idea to the experiment framework lies in providing a means for a consistent input and output to perform experiments. Hence, define a LearningTask (here: ForecastTask) that collects the learning parameters that define this task.

forecast_task = ForecastTask(
    label="forecast-ais-short-sequence",
    pipeline=pipeline, features=features,
    models=[ModelInstanceDescription(BaselineA, {}),
            ModelInstanceDescription(BaselineB, {}),
            ],
    group_column="mmsi",
    sequence_length=5,
    forecast_length=1,
    training_parameters=TrainingParameters(epochs=1,
                                           validation_steps=1)
)

The actual experimentation takes a single LearningTask as input and it will output

experiment = Experiment(learning_task=forecast_task,
                        input_data=dataset_filename,
                        output_directory=tmp_path)
report = experiment.run()
    
with open(report, "r") as f:
    print(f.read())        
INFO:damast.core.dataframe:Loading hdf: files=[PosixPath('/tmp/test-output-ais_preparation/test.hdf5')]
INFO:damast.core.dataframe:No metadata provided or found in files - searching now for an existing spec file
INFO:damast.core.dataframe:Found metadata: ['/tmp/test-output-ais_preparation/test.spec.yaml']
INFO:damast:Recommended steps_per_epoch=np.float64(52504.0)
INFO:damast:Recommended steps_per_epoch=np.float64(52504.0)
You must install graphviz (see instructions at https://graphviz.gitlab.io/download/) for `plot_model` to work.
/home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages/keras/src/layers/reshaping/flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ flatten (Flatten)               │ (None, 20)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense)                   │ (None, 4)              │            84 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84 (336.00 B)
 Trainable params: 84 (336.00 B)
 Non-trainable params: 0 (0.00 B)
 1/10 ━━━━━━━━━━━━━━━━━━━━ 4s 534ms/step - loss: 3.3830e-05 - mse: 3.3830e-05

 2/10 ━━━━━━━━━━━━━━━━━━━━ 2s 250ms/step - loss: 2.9888e-05 - mse: 2.9888e-05

 3/10 ━━━━━━━━━━━━━━━━━━━━ 1s 257ms/step - loss: 2.8309e-05 - mse: 2.8309e-05

 4/10 ━━━━━━━━━━━━━━━━━━━━ 1s 258ms/step - loss: 2.6798e-05 - mse: 2.6798e-05

 5/10 ━━━━━━━━━━━━━━━━━━━━ 1s 259ms/step - loss: 2.5475e-05 - mse: 2.5475e-05

 6/10 ━━━━━━━━━━━━━━━━━━━━ 1s 259ms/step - loss: 2.4746e-05 - mse: 2.4746e-05

 7/10 ━━━━━━━━━━━━━━━━━━━━ 0s 256ms/step - loss: 2.4472e-05 - mse: 2.4472e-05

 8/10 ━━━━━━━━━━━━━━━━━━━━ 0s 254ms/step - loss: 2.4047e-05 - mse: 2.4047e-05

 9/10 ━━━━━━━━━━━━━━━━━━━━ 0s 252ms/step - loss: 2.3547e-05 - mse: 2.3547e-05

10/10 ━━━━━━━━━━━━━━━━━━━━ 0s 251ms/step - loss: 2.3621e-05 - mse: 2.3621e-05

10/10 ━━━━━━━━━━━━━━━━━━━━ 3s 273ms/step - loss: 2.3682e-05 - mse: 2.3682e-05 - val_loss: 1.6861e-05 - val_mse: 1.6861e-05
/home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py:171: DeprecationWarning: __array__ implementation doesn't accept a copy keyword, so passing copy=False failed. __array__ must implement 'dtype' and 'copy' keyword arguments.
  return np.array(x)
WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. 
INFO:damast:Recommended steps_per_epoch=np.float64(52504.0)
INFO:damast:Recommended steps_per_epoch=np.float64(52504.0)
You must install graphviz (see instructions at https://graphviz.gitlab.io/download/) for `plot_model` to work.
/home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages/keras/src/layers/reshaping/flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                     Output Shape                  Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ flatten_1 (Flatten)             │ (None, 20)             │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 4)              │            84 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 84 (336.00 B)
 Trainable params: 84 (336.00 B)
 Non-trainable params: 0 (0.00 B)
 1/10 ━━━━━━━━━━━━━━━━━━━━ 3s 432ms/step - loss: 1.7705e-05 - mse: 1.7705e-05

 2/10 ━━━━━━━━━━━━━━━━━━━━ 1s 233ms/step - loss: 1.8819e-05 - mse: 1.8819e-05

 3/10 ━━━━━━━━━━━━━━━━━━━━ 1s 241ms/step - loss: 1.8095e-05 - mse: 1.8095e-05

 4/10 ━━━━━━━━━━━━━━━━━━━━ 1s 241ms/step - loss: 1.8366e-05 - mse: 1.8366e-05

 5/10 ━━━━━━━━━━━━━━━━━━━━ 1s 240ms/step - loss: 1.8589e-05 - mse: 1.8589e-05

 6/10 ━━━━━━━━━━━━━━━━━━━━ 0s 240ms/step - loss: 1.8623e-05 - mse: 1.8623e-05

 7/10 ━━━━━━━━━━━━━━━━━━━━ 0s 240ms/step - loss: 1.8448e-05 - mse: 1.8448e-05

 8/10 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - loss: 1.8492e-05 - mse: 1.8492e-05

 9/10 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - loss: 1.8612e-05 - mse: 1.8612e-05

10/10 ━━━━━━━━━━━━━━━━━━━━ 0s 241ms/step - loss: 1.8769e-05 - mse: 1.8769e-05

10/10 ━━━━━━━━━━━━━━━━━━━━ 3s 260ms/step - loss: 1.8897e-05 - mse: 1.8897e-05 - val_loss: 1.9936e-05 - val_mse: 1.9936e-05
/home/runner/work/damast/damast/.tox/build_docs/lib/python3.10/site-packages/keras/src/backend/tensorflow/core.py:171: DeprecationWarning: __array__ implementation doesn't accept a copy keyword, so passing copy=False failed. __array__ must implement 'dtype' and 'copy' keyword arguments.
  return np.array(x)
WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. 
INFO:damast:Recommended steps_per_epoch=np.float64(52504.0)
batch_size: 2
evaluation:
  BaselineA-forecast-ais-short-sequence:
    loss: 1.8865348465624265e-05
    mse: 1.886535028461367e-05
  BaselineB-forecast-ais-short-sequence:
    loss: 2.2347860067384318e-05
    mse: 2.2347860067384318e-05
evaluation_steps: 1
input_data: /tmp/test-output-ais_preparation/test.hdf5
label: damast-ml-experiment
learning_task:
  class_name: ForecastTask
  features: &id001
  - lat_x
  - lat_y
  - lon_x
  - lon_y
  forecast_length: 1
  group_column: mmsi
  label: forecast-ais-short-sequence
  models:
  - class_name: BaselineA
    module_name: __main__
    parameters: {}
  - class_name: BaselineB
    module_name: __main__
    parameters: {}
  module_name: damast.ml.experiments
  pipeline:
    base_dir: /tmp/test-output-ais_preparation
    meta:
      damast_version: 0.1.8
    name: ais_preparation
    steps:
    - - cyclic
      - class_name: LatLonTransformer
        module_name: __main__
        name_mappings: {}
        parameters: {}
  sequence_length: 5
  targets: *id001
  training_parameters:
    epochs: 1
    learning_rate: 0.1
    loss_function: mse
    steps_per_epoch: 10
    validation_steps: 1
output_directory: /tmp/test-output-ais_preparation
split_data_ratios:
- 1.6
- 0.2
- 0.2
timestamp: 20250613-093007

The outputs of an experiment are collected inside a dedicated (timestamped) folder. This folder will also contain a subfolder for each of the parametrized models that defines a LearningTask.

last_experiments = sorted([str(f) for f in Path(experiment.output_directory).glob(pattern="*") if f.is_dir()])
print("Last experiment in: ", last_experiments[-1])

experiment_folder = sorted([str(f) for f in Path(last_experiments[-1]).glob(pattern="*")])
file_listing = '\n'.join(experiment_folder)
print("Contents:\n")
print(file_listing)
Last experiment in:  /tmp/test-output-ais_preparation/20250613-093001-damast-ml-experiment
Contents:

/tmp/test-output-ais_preparation/20250613-093001-damast-ml-experiment/.damast_experiment
/tmp/test-output-ais_preparation/20250613-093001-damast-ml-experiment/BaselineA-forecast-ais-short-sequence
/tmp/test-output-ais_preparation/20250613-093001-damast-ml-experiment/BaselineB-forecast-ais-short-sequence
/tmp/test-output-ais_preparation/20250613-093001-damast-ml-experiment/experiment-report.yaml

Once the training is running it can be monitored using tensorboard:

    tensorboard --logdir=<experiments-directory>