Skip to content

Project Structure

pip install -e . installs one package, ecgen (src/ecgen/), plus the ecgen command. It holds the model families, datasets, the training runner and the published generation/plotting helpers. The research packages at the repository root (training, evaluation, visualization) are not installed; run code that uses them from the repo root. The old models, data, utils, training/callbacks and training/trainers packages were removed in 1.2 (see below).

Directory layout

ECGEN/
├── src/ecgen/                      # the installed package
│   ├── cli.py, __main__.py         # `ecgen train ...`, `ecgen list`, `python -m ecgen`
│   ├── registry.py                 # Registry, FAMILIES, DATASETS, CALLBACKS, load_builtins
│   ├── types.py                    # ECGBatch, ConditionOutput, get_signal
│   ├── families/                   # one sub-package per model family
│   │   ├── base.py                 #   GenerativeModule, Capabilities
│   │   ├── vae/                    #   config.py, vae_1d.py, vae_lightning.py, losses.py
│   │   ├── vqvae/                  #   config.py, vector_quantizer.py, vqvae_1d.py, vqvae_lightning.py,
│   │   │                           #   pixelcnn_prior.py, prior_lightning.py, losses.py
│   │   └── gan/                    #   pulse2pulse.py, losses.py
│   ├── nn/                         # blocks.py (ResidualBlock1D), encoders.py, decoders.py
│   ├── data/
│   │   ├── datasets/               #   base.py (BaseECGDataset), mimic.py (MIMICIVECG), synthetic.py
│   │   ├── datamodule.py           #   ECGDataModule (generic LightningDataModule)
│   │   ├── collate.py              #   ECGCollate -> ECGBatch
│   │   ├── leads.py                #   STANDARD_12, INDEPENDENT_8, resolve_leads
│   │   ├── normalizers.py          #   FeatureNormalizer
│   │   └── mimic_dataset.py, pulse2pulse_mimic.py   # legacy loaders (tuple / GAN datamodule)
│   ├── training/
│   │   ├── runner.py               #   YAML-driven training for every family
│   │   ├── callbacks/              #   visualization.py, checkpointing.py, logging.py (placeholders)
│   │   └── train.py                #   deprecated `--config` wrapper around the runner
│   ├── utils/                      # config.py, seed.py, io.py, logging.py, metadata.py
│   ├── generate.py, plot.py        # ecgen.generate, ecgen.plot_ecg
│   ├── f/                          # Hugging Face upload helpers
│   └── models/                     # deprecated alias of ecgen.families (warns; removed in 2.0)
│
├── training/
│   ├── losses/                     # common.py (mse_loss, l1_loss)
│   └── metrics/                    # reconstruction.py, generation.py, clinical.py
├── evaluation/
│   ├── metrics/                    # fidelity.py, diversity.py, signal_quality.py
│   ├── benchmark.py                # ModelBenchmark
│   └── visualize.py                # plot_evaluation_results, plot_comparison_matrix
├── visualization/                  # ecg_plots.py, latent_space.py, training_curves.py
│
├── configs/
│   ├── experiments/                # vae_mimic, vqvae_mimic, prior_mimic, pulse2pulse_mimic (.yaml)
│   ├── model/                      # vae/, vqvae/, gan/, imn.yaml  (reference fragments, not loaded)
│   ├── dataset/                    # mimic.yaml, ptbxl.yaml        (reference fragments, not loaded)
│   └── training/                   # default.yaml (empty), fast_dev.yaml, production.yaml
│
├── scripts/
│   ├── train/                      # train_template.py (points at the runner)
│   ├── shell/                      # run_train_*.sh wrappers around `python -m ecgen train`, run_sweep.sh
│   ├── generate/                   # generate_pulse2pulse.py, generate_vae.py (stub)
│   ├── evaluate/                   # evaluate_model.py, benchmark_models.py
│   ├── data/                       # prepare_mimic.py, validate_dataset.py (stubs)
│   └── utils/                      # test_models_only.py, test_pulse2pulse_setup.py
│
├── single_file/                    # self-contained VQ-VAE: train_vqvae_standalone.py, run_train_vqvae.sh
├── tests/                          # test_models/, test_data/, test_training/
├── docs/                           # this documentation (MkDocs)
├── runs/                           # training outputs (git-ignored)
└── pyproject.toml

Module responsibilities

Module Contents
ecgen.families nn.Modules and their GenerativeModule (Lightning) wrappers, configs and losses; one sub-package per family. See Architecture.
ecgen.data BaseECGDataset dict contract, MIMICIVECG and SyntheticECG, ECGDataModule, lead handling and normalizers. See MIMIC-IV-ECG and Adding a dataset.
ecgen.training The runner (ecgen train) and callbacks. See Training with ecgen train.
ecgen.registry Name → class registries used to build components from YAML.
training (root) Training-time metrics, losses/common.py, placeholder trainers.
evaluation Metrics and benchmarking for generated ECGs. See Evaluation metrics.
visualization Matplotlib helpers for ECGs, latents and curves. See Visualization.
ecgen.utils set_global_seed, YAML/JSON I/O (read_yaml, write_yaml, write_json), get_logger, collect_run_metadata, resolve_config.

Import patterns

from ecgen.families.vae import VAE1D, VAELightning, VAEConfig, vae_loss
from ecgen.families.vqvae import VQVAELightning, PriorLightning, VQVAEConfig, PriorConfig
from ecgen.families.gan import Pulse2PulseGAN, Pulse2PulseConfig
from ecgen.nn import ResidualBlock1D, Encoder1D, Decoder1D

from ecgen.data.datasets import BaseECGDataset, MIMICIVECG, SyntheticECG
from ecgen.data.datamodule import ECGDataModule
from ecgen.types import ECGBatch, get_signal

from ecgen.training.callbacks import VAEVisualizationCallback, ECGVisualizationCallback, GeneratedSamplesCallback
from ecgen.training.runner import train_from_file
from ecgen.registry import FAMILIES, DATASETS, CALLBACKS
from ecgen.utils.seed import set_global_seed

from visualization import plot_ecg_leads, plot_latent_space_2d   # from the repo root

Removed import paths

These paths re-exported the moved modules in 1.1.0 and were removed in 1.2. ecgen.models is still importable but emits a DeprecationWarning and will be removed in 2.0.

Old import New import
models.vae, models.vqvae ecgen.families.vae, ecgen.families.vqvae
models.gan.pulse2pulse, ecgen.models.pulse2pulse ecgen.families.gan.pulse2pulse
ecgen.models.vae ecgen.families.vae
models.components ecgen.nn
training.callbacks ecgen.training.callbacks
training.losses.{vae,vqvae,gan}_losses ecgen.families.{vae,vqvae,gan}.losses
utils.{config,io,logging,metadata,seed} ecgen.utils.*
data.datasets.base ecgen.data.datasets.base
data.datasets.mimic.dataset, data.datasets.mimic.pulse2pulse_datamodule legacy ecgen.data.mimic_dataset, ecgen.data.pulse2pulse_mimic

training/trainers/gan_trainer.py was removed; python -m ecgen.training.train --config is a deprecated wrapper around the runner.

Run outputs

runs/<experiment.name>/seed_<seed>/
├── config_resolved.yaml
├── metadata.json
├── checkpoints/          # epochNNN-stepNNNNNN.ckpt + last.ckpt
├── samples/              # visualization output
├── metrics/              # train_val_metrics.json
└── tb/                   # TensorBoard logs

Quick reference

Where is ...?

Component Location
Training runner / CLI src/ecgen/training/runner.py, src/ecgen/cli.py
Shared conv blocks src/ecgen/nn/
VAE src/ecgen/families/vae/
VQ-VAE and prior src/ecgen/families/vqvae/
Pulse2Pulse src/ecgen/families/gan/pulse2pulse.py
MIMIC dataset src/ecgen/data/datasets/mimic.py
Callbacks src/ecgen/training/callbacks/visualization.py
Losses src/ecgen/families/*/losses.py
Experiment configs configs/experiments/
Standalone VQ-VAE single_file/

How do I ...?

Task Command
Train the VAE ecgen train configs/experiments/vae_mimic.yaml
Train the VQ-VAE (stage 1) ecgen train configs/experiments/vqvae_mimic.yaml
Train the prior (stage 2) ecgen train configs/experiments/prior_mimic.yaml model.params.vqvae_checkpoint=<vqvae.ckpt>
Train Pulse2Pulse ecgen train configs/experiments/pulse2pulse_mimic.yaml
Smoke-test without data add data.dataset.name=synthetic 'data.dataset.params={num_samples: 64}'
List registered components ecgen list
View TensorBoard tensorboard --logdir runs/<exp>/seed_<seed>/tb
Check reconstruction plots ls runs/<exp>/seed_<seed>/samples/
Run tests pytest tests/

Adding new components

  • Model family: new sub-package under src/ecgen/families/ (config dataclass + nn.Module + GenerativeModule wrapper + losses.py), registered with @FAMILIES.register("<name>"). See Architecture.
  • Dataset: subclass BaseECGDataset and register it with @DATASETS.register("<name>"), or reference it with target:. See Adding a dataset.
  • Callback: add it to src/ecgen/training/callbacks/ and register a name in its __init__.py, or reference it with target:. See Callbacks.
  • Experiment: a YAML under configs/experiments/; no training script is needed. See Training with ecgen train.