KoopmanGraph
Topology-aware Koopman autoencoders for forecasting and analyzing networked dynamics
Documentation | Tutorials | API | Contributing | Citation
KoopmanGraph is an open-source PyTorch Geometric library for learning topology-aware Koopman autoencoders on graphs. GNN encoders lift node features into a latent space, a learned linear operator advances those states, and a matching decoder reconstructs physical node features for multi-step forecasting and spectral analysis.
It is aimed at researchers studying networked dynamical systems—smart grids, traffic networks, epidemic contact graphs, and similar domains—who want an inspectable linear latent operator instead of a flat-vector Koopman model or a purely nonlinear GNN forecaster.
Why KoopmanGraph?
Koopman theory maps nonlinear dynamics into a linear latent domain where multi-step forecasting and spectral analysis are natural. Existing deep Koopman packages typically ignore graph structure, while spatiotemporal GNN forecasters usually lack an explicit linear latent operator.
KoopmanGraph bridges that gap with GNN lifting/decoding, an inspectable Koopman matrix K, row-state latent advance $z \leftarrow z K^{\top}$, and a PyTorch Geometric-native fit / predict workflow.
The library sits in the consistent Koopman autoencoder lineage and is not claimed as a new theoretical contribution; it packages topology-aware lifting, linear latent evolution, and analysis tooling for networked dynamical systems.
Highlights
- Topology-aware learning — GCN/GAT/hypergraph encoders and decoders, delay embeddings, dynamic topology, optional self-adaptive edges, and edge weights
- Flexible dynamics — discrete, continuous-time, networked (
koopman="graph"), hypergraph, multiplex / typed hetero (koopman="hetero_graph"with RelGraph), global/local, and continuous-graph operators, with soft or structural stability modes - Forecasting stack — multi-step rollout, consistency losses, temporal evaluation metrics, and checkpointing
- Spectral analysis — eigendecomposition, mode shapes, dynamical similarity, anomaly helpers, SINDy, and spectral clustering
- Control and adaptation — additive/bilinear control, Koopman-MPC (
[mpc]), online RLS adaptation, Kalman observation, and a Gymnasium RL wrapper - Research tooling — classical DMD-family baselines, lightweight GNN teaching baselines, conformal UQ, and reproducible graph benchmarks
- Optional distributed trainers — native DDP /
torchrun, Lightning Fabric, and Ray ensemble helpers underkoopman_graph.distributed(power-user; compose with homo or hetero models; see installation extraslightning/ray/distributed)
Full inventory: Capabilities · Architecture
Scope. KoopmanGraph targets topology-aware Koopman autoencoders on graphs and hypergraphs, not traffic-forecasting leaderboards, simplicial/Hodge layers, or molecular-dynamics MSM toolchains. Measured limits (transfer, factorization cost, residual diagnostics, UQ assumptions) are consolidated in Scope and limitations.
Installation
Requires Python 3.10+, PyTorch, and PyTorch Geometric. Install those first, then:
pip install koopman-graph
# or: uv pip install koopman-graph
See the installation guide for editable installs, uv workflows, docs builds, and platform-specific wheels. Release notes: CHANGELOG.md.
Quickstart
import torch
from koopman_graph import GNNDecoder, GNNEncoder, GraphKoopmanModel
from koopman_graph.datasets import SyntheticDynamicGraphBenchmark
data_sequence = SyntheticDynamicGraphBenchmark.generate(
num_nodes=20,
num_timesteps=30,
in_channels=3,
seed=42,
noise_std=0.01,
)
encoder = GNNEncoder(3, 64, 64)
decoder = GNNDecoder(64, 64, 3)
model = GraphKoopmanModel(
encoder=encoder,
decoder=decoder,
latent_dim=64,
time_step=0.1,
)
torch.manual_seed(0)
history = model.fit(data_sequence, epochs=20, lr=1e-3)
future_graphs = model.predict(data_sequence[0], steps=5)
spectrum = model.spectrum()
print(f"Final loss: {history.loss[-1]:.6f}")
print(f"Predicted {len(future_graphs)} snapshots, shape: {future_graphs[0].x.shape}")
print(f"K eigenvalues: {tuple(spectrum.eigenvalues.shape)}")
print(f"Top |λ|: {spectrum.magnitudes[:3].tolist()}")
Expected output:
Final loss: <float>
Predicted 5 snapshots, shape: torch.Size([20, 3])
K eigenvalues: (64,)
Top |λ|: [<float>, <float>, <float>]
More detail: Quickstart guide · API reference
See it in action
SIR epidemic on a ring: truth vs forecast from examples/06_epidemic_ring.ipynb.
METR-LA aggregate RMSE vs in-repo STGCN / DCRNN / Graph WaveNet teaching baselines (not dedicated-library SOTA) from examples/22_gnn_forecaster_comparison.ipynb.
Featured tutorials: 01 synthetic · 03 traffic · 06 epidemic · 22 GNN baselines · 39 hetero RelGraph · full gallery
Learn more
- Quickstart — train / predict walkthrough
- Capabilities — feature inventory and datasets
- Scope and limitations — when not to use; measured boundaries
- Architecture — public vs power-user API layers
- FAQ / troubleshooting — install, imports, checkpoints
- Installation — dependencies and install paths
- What’s new in 0.9.0: heterogeneous / multiplex RelGraph +
koopman="hetero_graph", composed with 0.8 DDP / Fabric / Lightning / Ray trainers — see CHANGELOG.md.
Related software
- PyKoopman and DLKoopman target vector-valued Koopman / deep-Koopman workflows; they treat the state as a flat vector rather than propagating information along graph edges.
- PyTorch Geometric provides mature GNN infrastructure on irregular graphs; KoopmanGraph adds an explicit linear latent operator, consistency losses, and a documented
fit/predictforecasting stack on that substrate. - Spatiotemporal GNN forecasters such as STGCN, DCRNN, and Graph WaveNet typically learn nonlinear convolutional or recurrent maps on graphs; KoopmanGraph instead advances an inspectable linear Koopman matrix K (see in-repo teaching baselines in examples/22).
Community and citation
- Contribute, report issues, or seek support: CONTRIBUTING.md · Support · Code of Conduct
- Install / runtime troubleshooting: FAQ
- Security vulnerabilities (private): SECURITY.md
- Development checks and release process: CONTRIBUTING.md
If you use KoopmanGraph in research, please cite:
@software{koopmangraph2026,
author = {Travis Kessler},
title = {KoopmanGraph: Topology-Aware Koopman Autoencoders for Networked Dynamics},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.21711185},
url = {https://github.com/tjkessler/KoopmanGraph},
version = {0.9.0},
}
License
KoopmanGraph is released under the Apache License 2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file koopman_graph-0.10.0.tar.gz.
File metadata
- Download URL: koopman_graph-0.10.0.tar.gz
- Upload date:
- Size: 877.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33c06d1cf7cdb0313a8e3c98c28269c7724f375bef7d929d943f3dcf24e6728c
|
|
| MD5 |
f5c6aad4aed69be46690beb51cc58c97
|
|
| BLAKE2b-256 |
f1d7068e1c2dddd6a85298d02e585f6f14946427fbbecdb1a344e98043ca03f2
|
Provenance
The following attestation bundles were made for koopman_graph-0.10.0.tar.gz:
Publisher:
release.yml on tjkessler/KoopmanGraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
koopman_graph-0.10.0.tar.gz -
Subject digest:
33c06d1cf7cdb0313a8e3c98c28269c7724f375bef7d929d943f3dcf24e6728c - Sigstore transparency entry: 2316438324
- Sigstore integration time:
-
Permalink:
tjkessler/KoopmanGraph@16bbcb753d98eab1c22037614b3235dfe79a070e -
Branch / Tag:
refs/tags/0.10.0 - Owner: https://github.com/tjkessler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@16bbcb753d98eab1c22037614b3235dfe79a070e -
Trigger Event:
release
-
Statement type:
File details
Details for the file koopman_graph-0.10.0-py3-none-any.whl.
File metadata
- Download URL: koopman_graph-0.10.0-py3-none-any.whl
- Upload date:
- Size: 643.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6942f7884cd9e5a8976936b3ea7280cf2e75ba9c6eb3f175030870e0320f645e
|
|
| MD5 |
75bf6aff56215fd38458c7d9a7ed284e
|
|
| BLAKE2b-256 |
339e3c3c6b12abf001a39df9b6a1753208ede09c5517c6a61151ca5a80d1f3b6
|
Provenance
The following attestation bundles were made for koopman_graph-0.10.0-py3-none-any.whl:
Publisher:
release.yml on tjkessler/KoopmanGraph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
koopman_graph-0.10.0-py3-none-any.whl -
Subject digest:
6942f7884cd9e5a8976936b3ea7280cf2e75ba9c6eb3f175030870e0320f645e - Sigstore transparency entry: 2316438374
- Sigstore integration time:
-
Permalink:
tjkessler/KoopmanGraph@16bbcb753d98eab1c22037614b3235dfe79a070e -
Branch / Tag:
refs/tags/0.10.0 - Owner: https://github.com/tjkessler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@16bbcb753d98eab1c22037614b3235dfe79a070e -
Trigger Event:
release
-
Statement type: