Under Construction
Supported systems: Lorenz 96 (L96) — see branches l63, ks, kolmogorov-2d for other experiments.
Supported training objectives: Fixed Optimal Transport, Learnable OT - Sinkhorn, Learnable OT - WGAN, baseline (L2).
Requires Python ≥ 3.11 and uv.
curl -LsSf https://astral.sh/uv/install.sh | sh # install uv if needed
uv syncGPU note:
pyproject.tomldefaults to PyTorch cu118. Adjust the[[tool.uv.index]]URL to match your CUDA version (e.g.cu121,cu124) before runninguv syncon your cluster.
cd l96_data_x
python generate_data.py # full: 2000 train / 100 val / 200 test
# Quick local test:
python generate_data.py --num_of_sample 100 --val_size 100 --test_size 100 --n_workers 8
cd ..python dataloader/dataloader_l96.pyOptimal Transport (Sinkhorn)
bash experiments/OT_l96/srun.shKey hyperparameters: --lambda_geomloss 3, --blur 0.02, --with_geomloss_kd 0.
bash experiments/OT_l96/eval.sh
bash experiments/CL_l96/eval.shAdd --eval_LE to also compute the leading Lyapunov exponent (~2 hrs for 200 test instances).
Ground-truth LLEs: python eval_scripts/LE_l96.py
Compare results: python eval_scripts/read_LE.py
bash experiments/prepare_l63_data.shbash experiments/run_l63_three_methods.sh # all methods
METHOD=baseline bash experiments/run_train_l63_once.sh
METHOD=fixed_ot bash experiments/run_train_l63_once.sh
METHOD=wgan bash experiments/run_train_l63_once.sh
METHOD=baseline bash experiments/run_eval_l63_once.shbash ks_data_x_single_traj/generate.sh
python dataloader/dataloader_ks.py \
--data_path ks_data_x_single_traj/ks_single_traj_train \
--data_path ks_data_x_single_traj/ks_single_traj_val \
--data_path ks_data_x_single_traj/ks_single_traj_test \
--noisy_scale 0.3METHOD=fixed_ot bash experiments/run_train_ks_once.sh
bash experiments/submit_all_ks.sh # full sweepconfiguration.py — argument parser (all systems share one parser)
utils.py — distributed-training helpers
scripts/
main.py — unified training entry point (--l96 | --kse | --l63)
train_utils.py — loss, LR schedule, rollout helpers
OT_utils.py — Sinkhorn / fixed-OT loss wrapper
CL_utils.py — contrastive learning utilities
summary.py / summary_ks.py — learnable summary nets and WGAN critic
dataloader_init.py — system-agnostic dataloader factory
log.py — output-folder creation / checkpoint naming
cal_stats_{l96,l63,ks}.py — per-system OT feature extraction
models/
fno_1d_new.py — FNO operator (L96, KS)
mlp_l63.py — MLP operator (L63)
dataloader/
dataloader_l96.py / dataloader_l63.py / dataloader_ks.py
eval_scripts/
eval_l96.py / eval_l63.py / eval_ks.py
l96_data_x/ — L96 ODE solver + data generation
l63_data_x/ — L63 ODE solver + data generation
ks_data_x_single_traj/ — KS PDE solver + single-trajectory dataset utilities
experiments/ — SLURM job scripts per system and method
This codebase builds on roxie62/neural_operators_for_chaos. We thank the authors for open-sourcing their implementation.
@article{melo2026learning,
title={Learning to Emulate Chaos: Adversarial Optimal Transport Regularization},
author={Melo, Gabriel and Santiago, Leonardo and Lu, Peter Y},
journal={arXiv preprint arXiv:2604.21097},
year={2026}
}