{"record":{"id":"d2982dee8b977493","repo":"tracel-ai/burn","slug":"the-sequential-scheduler-step-counter-overflowed","errorCode":null,"errorMessage":"The sequential scheduler step counter overflowed","messagePattern":"The sequential scheduler step counter overflowed","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-optim/src/lr_scheduler/sequential.rs","lineNumber":110,"sourceCode":"    schedulers: Vec<DynLrScheduler>,\n    milestones: Vec<usize>,\n    step: usize,\n}\n\nimpl SequentialLrScheduler {\n    fn active_scheduler(&self) -> usize {\n        self.milestones.partition_point(|&m| self.step >= m)\n    }\n}\n\nimpl LrScheduler for SequentialLrScheduler {\n    fn step(&mut self) -> LearningRate {\n        let index = self.active_scheduler();\n        let lr = self.schedulers[index].step();\n        self.step = self\n            .step\n            .checked_add(1)\n            .expect(\"The sequential scheduler step counter overflowed\");\n        lr\n    }\n\n    fn to_record(&self) -> LrSchedulerRecord {\n        let mut record =\n            LrSchedulerRecord::from_state(&SequentialLrSchedulerState { step: self.step });\n        for (index, scheduler) in self.schedulers.iter().enumerate() {\n            record = record.with_record(&index.to_string(), scheduler.to_record());\n        }\n        record\n    }\n\n    fn load_record(&mut self, record: LrSchedulerRecord) {\n        if let Some(state) = record.into_state::<SequentialLrSchedulerState>() {\n            self.step = state.step;\n        }\n\n        let schedulers = core::mem::take(&mut self.schedulers);","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-optim/src/lr_scheduler/sequential.rs#L92-L128","documentation":"Overflow guard in `SequentialLrScheduler::step`: the internal step counter (usize) is incremented with `checked_add` on every scheduler step; after ~2^64 steps it would wrap, so the scheduler panics instead of silently corrupting milestone selection.","triggerScenarios":"Thrown at crates/burn-optim/src/lr_scheduler/sequential.rs:110 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Practically unreachable; only occurs with billions of scheduler steps","Reset the scheduler state via its record if running extremely long trainings","Reduce milestone/step frequency if step counts are artificially high"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"d16f7ba2ed0d41408189384044cc886fb4c8f957","analyzedAt":"2026-09-05T13:19:14.260Z","contentChangedAt":"2026-09-05T13:19:14.260Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}