This is the official codebase of the paper
Self-Supervised Evolution Operator Learning for High-Dimensional Dynamical Systems, ICLR 2026 OpenReview
Authors: Giacomo Turri, Luigi Bonati, Kai Zhu, Massimiliano Pontil, Pietro Novelli
Affiliations: Istituto Italiano di Tecnologia, Zhejiang University, University College London
Resources: Project Page · GitHub · HF Models (CSML-IIT) · HF Models (pnovelli) · HF Datasets (pnovelli)
We introduce an end-to-end approach to learn the evolution operators of large-scale non-linear dynamical systems, such as those describing complex natural phenomena. Evolution operators are particularly well-suited for analyzing systems that exhibit spatio-temporal patterns and have become a key analytical tool across various scientific communities. As terabyte-scale weather datasets and simulation tools capable of running millions of molecular dynamics steps per day are becoming commodities, our approach provides an effective tool to make sense of them from a data-driven perspective. The core of it lies in a remarkable connection between self-supervised representation learning methods and the recently established learning theory of evolution operators.
We deploy the approach across multiple scientific domains, including the folding dynamics of small proteins, the binding process of drug-like molecules in host sites, and autonomous pattern discovery in climate data. This repository exposes the corresponding training code and analysis notebooks.
We use uv for environment management.
uv sync --no-install-package torch-scatter
uv sync --no-build-isolationCreate a default dataset location if you want the trainers to read DATA_PATH automatically:
cp .env.example .envThe current defaults in src.configs.Configs are:
offline=Trueaccelerator="auto"num_devices=1
This makes local runs account-free by default. For larger jobs you will usually override the accelerator, number of devices, batch size, or data path.
Published checkpoints are available on Hugging Face:
- Models:
CSML-IIT/encoderops - Models:
pnovelli/encoderops
The analysis notebooks now load Hugging Face checkpoints by default through a small checkpoint-selection cell near the top of each notebook. To use your own trained checkpoints instead, set:
checkpoint_source = "local"
local_checkpoint_root = Path("/path/to/your/checkpoints")Representative checkpoint paths used in the notebooks include:
- ENSO:
ENSO/EvOp_CESM.pt - Calixarene G2:
calixarene-G2/checkpoints/last.ckpt - Calixarene G1+3:
calixarene-G1+3/checkpoints/last.ckpt - TRP-Cage:
encoderops-2J0F/checkpoints/last.ckpt - Lorenz63 families:
lorenz63/EvolutionOperator_dataopt,lorenz63/VAMPNets,lorenz63/DPNets,lorenz63/DAE,lorenz63/CAE
The released datasets are hosted on Hugging Face:
- Full public dataset release:
pnovelli/encoderops - SST files are also mirrored under
CSML-IIT/encoderops
Datasets used by the code include:
SST/sst_monthly.ncSST/cesm_sst_regridded_1.5deg_850-2005.nclorenz63/lorenz63_dataset.nccalixarene/...
For TRP-Cage, raw DESRES trajectories are not redistributed as part of the easy public setup. To retrain from raw data, request the original data from DESRES and preprocess it as described below.
The trainer entry points are the public interface for reproduction and extension.
uv run --env-file=.env -- python -m exps.ENSO.trainer ENSO_ORAS5 --help
uv run --env-file=.env -- python -m exps.ENSO.trainer ENSO_CESM --help
uv run --env-file=.env -- python -m exps.calixarene.trainer G2 --help
uv run --env-file=.env -- python -m exps.calixarene.trainer G13 --help
uv run --env-file=.env -- python -m exps.trpcage.trainer trp-cage --help
uv run --env-file=.env -- python -m exps.lorenz63.trainer l63 --helpRun the same commands without --help:
uv run --env-file=.env -- python -m exps.ENSO.trainer ENSO_ORAS5
uv run --env-file=.env -- python -m exps.ENSO.trainer ENSO_CESM
uv run --env-file=.env -- python -m exps.calixarene.trainer G2
uv run --env-file=.env -- python -m exps.calixarene.trainer G13
uv run --env-file=.env -- python -m exps.trpcage.trainer trp-cage
uv run --env-file=.env -- python -m exps.lorenz63.trainer l63If you prefer Python over CLI overrides:
from exps.ENSO.trainer import main
from src.configs import defaults
cfg = defaults["ENSO_ORAS5"][1]
cfg.data_args.data_path = "/path/to/datasets"
cfg.offline = False
cfg.accelerator = "cuda"
cfg.num_devices = 1
main(cfg)The same pattern works for the other experiments by importing the corresponding main() function and selecting the relevant preset from src.configs.defaults.
Before training TRP-Cage from raw data:
- request the trajectory data from the DESRES distribution page;
- extract
DESRES-Trajectory_2JOF-0-protein.tar.xzinside your dataset root; - copy
exps/trpcage/2JOF-0-protein.pdbtoDATA_PATH/DESRES-Trajectory_2JOF-0-protein/2JOF-0-protein/2JOF-0-protein.pdb; - preprocess the LMDB dataset:
uv run --env-file=.env -- python -m scripts.to_lmdb --protein-id 2JOFThe notebooks are retained for analysis and figure reproduction:
exps/ENSO/analysis.ipynbexps/calixarene/analysis.ipynbexps/trpcage/analysis.ipynbexps/lorenz63/analysis.ipynb
These notebooks:
- default to published Hugging Face checkpoints;
- can switch to local checkpoints through the top configuration cell;
- are secondary to the trainer entry points for actual reproduction.
Launch them with:
uv run -- jupyter labsrc/: shared configs, models, losses, data modules, checkpoint helpers, utilitiesexps/: experiment-specific trainers and analysis notebooksscripts/: preprocessing and cluster-launch helpersassets/: small curated images used by the README
If you find this codebase useful in your research, please cite the following paper:
@inproceedings{turri2026selfsupervised,
title={Self-Supervised Evolution Operator Learning for High-Dimensional Dynamical Systems},
author={Turri, Giacomo and Bonati, Luigi and Zhu, Kai and Pontil, Massimiliano and Novelli, Pietro},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026},
url={https://openreview.net/forum?id=Ku3kLJle7Q}
}This repository is released under the MIT License. See LICENSE.
