{"record":{"id":"9475e8ad290160eb","repo":"tracel-ai/burn","slug":"optimizer-record-tensors-should-carry-a-parameter","errorCode":null,"errorMessage":"Optimizer record tensors should carry a parameter id.","messagePattern":"Optimizer record tensors should carry a parameter id\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-optim/src/optim/module/module_optimizer.rs","lineNumber":277,"sourceCode":"                ranks.insert(id, rank);\n            }\n        }\n\n        for (name, path) in record.paths.iter() {\n            if let Ok(id) = name.parse::<u64>() {\n                paths.insert(id, path.to_string());\n            }\n        }\n\n        let mut source = StateSource::new(record.scalars);\n\n        for tensor in record.tensors {\n            let RecordTensor {\n                name,\n                param_id,\n                data,\n            } = tensor;\n            let id = param_id.expect(\"Optimizer record tensors should carry a parameter id.\");\n            // Fall back to inferring rank from a tensor shape if no `__rank` scalar was present.\n            ranks.entry(id).or_insert(data.shape.len());\n            source.insert_tensor(name, data);\n        }\n\n        let mut states = HashMap::new();\n        for (id, rank) in ranks {\n            let prefix = id.to_string();\n            let path = paths.get(&id);\n            let (optim, grad_clipping) =\n                self.optim_from_param(id.into(), path.map(|path| path.as_str()));\n            // Skip parameters whose state can't be reconstructed (truncated/foreign record); they\n            // are re-initialized lazily on the next step rather than aborting the load.\n            if let Some(state) = optim.state_unflatten(rank, &prefix, &mut source, &device) {\n                states.insert(\n                    ParamId::from(id),\n                    OptimizationContext {\n                        optim: optim.clone(),","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-optim/src/optim/module/module_optimizer.rs#L259-L295","documentation":"When loading an optimizer record, each `RecordTensor` must carry a `param_id` so its state can be re-attached to the right parameter. `param_id.expect(\"Optimizer record tensors should carry a parameter id.\")` panics when a tensor in the record has no id. This guards against hand-crafted or legacy/malformed `OptimizerRecord` data where the id field was never set.","triggerScenarios":"Calling `load_record` with an `OptimizerRecord` whose `tensors` contain a `RecordTensor` with `param_id: None` — e.g. a record built manually, produced by an older/other serialization format, or corrupted during storage.","commonSituations":"Deserializing a checkpoint from an older burn version before `param_id` was added; hand-assembling `OptimizerRecord` in tests/tools and forgetting to set `param_id`; truncated or corrupted checkpoint files that deserialize but lack ids.","solutions":["Regenerate the checkpoint with the current burn version so every tensor carries a `param_id`.","If building `OptimizerRecord` manually, set `param_id` on every `RecordTensor` before `load_record`.","Write a migration that infers/assigns ids from tensor names for old checkpoints.","Validate the record (all tensors have Some(param_id)) before calling `load_record`."],"exampleFix":"// before\nRecordTensor { name: \"momentum\", param_id: None, data }\n// after\nRecordTensor { name: \"momentum\", param_id: Some(param_id.clone()), data }","handlingStrategy":"validation","validationCode":"fn validate_record(record: &OptimizerRecord) -> Result<(), String> {\n    if record.tensors.iter().any(|t| t.param_id.is_none()) {\n        return Err(\"record contains tensors without param_id\".into());\n    }\n    Ok(())\n}\nvalidate_record(&record)?;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set param_id when hand-building RecordTensor","Migrate old checkpoints to the current record format before load","Validate deserialized records before load_record"],"tags":["rust","panic","record","deserialization","checkpoint"],"backgroundTag":"malformed-checkpoint-record","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"}