Summary
val_metrics is only assigned inside if epoch % self.config.validation_frequency == 0. The periodic checkpoint branch references val_metrics in a ternary. When checkpoint_frequency < validation_frequency, the first checkpoint epoch will raise UnboundLocalError: local variable 'val_metrics' referenced before assignment, crashing training.
Evidence
src/training/trainer.py line 356: val_metrics = self.validate(...) — only assigned on validation epochs.
src/training/trainer.py line 398:
self.save_checkpoint(f'checkpoint_epoch_{epoch}.pth', epoch,
val_metrics if epoch % self.config.validation_frequency == 0 else None)
val_metrics in the ternary condition is unbound on any epoch that is a checkpoint epoch but not a validation epoch.
Fix
Initialize val_metrics = None before the training loop, or inline the condition: always pass None as metrics unless this epoch also ran validation.
Summary
val_metricsis only assigned insideif epoch % self.config.validation_frequency == 0. The periodic checkpoint branch referencesval_metricsin a ternary. Whencheckpoint_frequency < validation_frequency, the first checkpoint epoch will raiseUnboundLocalError: local variable 'val_metrics' referenced before assignment, crashing training.Evidence
src/training/trainer.pyline 356:val_metrics = self.validate(...)— only assigned on validation epochs.src/training/trainer.pyline 398:val_metricsin the ternary condition is unbound on any epoch that is a checkpoint epoch but not a validation epoch.Fix
Initialize
val_metrics = Nonebefore the training loop, or inline the condition: always passNoneas metrics unless this epoch also ran validation.