{"record":{"id":"675bda0def171f27","repo":"tracel-ai/burn","slug":"can-t-differentiate-linear-weight-backward","errorCode":null,"errorMessage":"Can't differentiate linear_weight_backward.","messagePattern":"Can't differentiate linear_weight_backward\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-autodiff/src/ops/module.rs","lineNumber":190,"sourceCode":"                OpsKind::UnTracked(prep) => {\n                    prep.finish(B::linear(x.primitive, weight.primitive, None))\n                }\n            },\n        }\n    }\n\n    fn linear_x_backward(\n        _weight: AutodiffTensor<B>,\n        _output_grad: AutodiffTensor<B>,\n    ) -> AutodiffTensor<B> {\n        panic!(\"Can't differentiate linear_x_backward.\");\n    }\n\n    fn linear_weight_backward(\n        _x: AutodiffTensor<B>,\n        _output_grad: AutodiffTensor<B>,\n    ) -> AutodiffTensor<B> {\n        panic!(\"Can't differentiate linear_weight_backward.\");\n    }\n\n    fn linear_bias_backward(_output_grad: AutodiffTensor<B>) -> AutodiffTensor<B> {\n        panic!(\"Can't differentiate linear_bias_backward.\");\n    }\n\n    fn conv1d(\n        x: AutodiffTensor<B>,\n        weight: AutodiffTensor<B>,\n        bias: Option<AutodiffTensor<B>>,\n        options: ConvOptions<1>,\n    ) -> AutodiffTensor<B> {\n        #[derive(Debug)]\n        struct Conv1DWithBias;\n        #[derive(Debug)]\n        struct Conv1DNoBias;\n\n        impl<B: Backend> Backward<B, 3> for Conv1DWithBias {","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-autodiff/src/ops/module.rs#L172-L208","documentation":"Dead-code sentinel: `linear_weight_backward` is declared but never invoked by the autodiff engine, since the weight gradient for a linear layer is produced together with the input gradient in `linear_backward`. Hitting this panic means the op dispatcher tried to run a backward step that the linear implementation explicitly does not define.","triggerScenarios":"Calling quantize_dynamic on a float tensor whose backend is BackendRouter — e.g. dynamic quantization of activations/weights at runtime on a routed backend.","commonSituations":"Dynamic quantization pipelines run under the router; generic Backend-trait code resolving to BackendRouter; quantization support not yet routed.","solutions":["Perform dynamic quantization on a concrete backend that implements it.","Restructure so quantization happens outside the routed portion of the graph.","Track upstream burn-router work for quantized op routing."],"exampleFix":"// before\nlet q = BackendRouter::<R>::quantize_dynamic(tensor, &scheme); // panics\n// after\nlet q = ConcreteBackend::quantize_dynamic(concrete_tensor, &scheme);","handlingStrategy":"fallback","validationCode":"fn ensure_dynamic_quant_backend<B: Backend>() -> Result<(), &'static str> {\n    Err(\"quantize_dynamic is not implemented for BackendRouter; use a concrete backend\")\n}","typeGuard":"fn is_router_backend_marker<B: Backend>() -> bool {\n    std::any::TypeName::<B>().contains(\"BackendRouter\")\n}","tryCatchPattern":"let q = std::panic::catch_unwind(|| tensor.clone().quantize_dynamic(&scheme))\n    .map_err(|_| anyhow::anyhow!(\"router dynamic quantization is a stub\"))?;","preventionTips":["Run dynamic quantization on the concrete compute backend.","Keep quantization outside routed graph sections.","Document backend requirements wherever QTensorOps APIs are used.","Test quantization pipelines with the exact backend trait object you ship."],"tags":["rust","burn-router","quantization","unimplemented"],"backgroundTag":"unimplemented-api-stub","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"}