One array shape everywhere. Signals are (N, L, T). Metrics receive raw arrays
(dataset.data), not ECGDataset objects, so they can be used on any NumPy data.
Unpaired comparison. Metrics compare sets; real and synth may have different N
but must have the same L.
Uniform result type. Every metric returns a MetricResult with score,
per_lead_scores, extra and higher_is_better. Reports and plots rely only on this
interface.
Registry. Metrics are discovered through AVAILABLE_METRICS; the CLI's --metrics
choices and list-metrics are generated from it.
Optional dependencies are imported lazily inside functions, with an ImportError
fallback or an explicit install hint. Importing ecgen_eval never requires SciPy, WFDB,
NeuroKit2 or PyTorch.
Deterministic by default. Subsampling and random pairing use fixed seeds.