{"record":{"id":"a613ff0f910d5ac7","repo":"tracel-ai/burn","slug":"asymmetric-padding-should-be-handled-via-calculate","errorCode":null,"errorMessage":"Asymmetric padding should be handled via calculate_padding_2d_pairs()","messagePattern":"Asymmetric padding should be handled via calculate_padding_2d_pairs\\(\\)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-nn/src/padding.rs","lineNumber":98,"sourceCode":"            }\n            Self::Explicit(top, left, bottom, right) => ((*top, *bottom), (*left, *right)),\n        }\n    }\n\n    /// Calculate symmetric padding for 2D operations.\n    /// Returns padding values [height, width] (same for both sides).\n    /// Panics if asymmetric padding is detected.\n    pub(crate) fn calculate_padding_2d(\n        &self,\n        height: usize,\n        width: usize,\n        kernel_size: &[usize; 2],\n        stride: &[usize; 2],\n    ) -> [usize; 2] {\n        let ((top, bottom), (left, right)) =\n            self.calculate_padding_2d_pairs(height, width, kernel_size, stride);\n        if top != bottom || left != right {\n            panic!(\"Asymmetric padding should be handled via calculate_padding_2d_pairs()\")\n        }\n        [top, left]\n    }\n}\n\n/// Padding configuration for 3D operators.\n#[derive(Config, Debug, PartialEq)]\npub enum PaddingConfig3d {\n    /// Dynamically calculates padding to preserve input dimensions in output.\n    Same,\n    /// No padding applied.\n    Valid,\n    /// Applies explicit symmetric padding values.\n    /// Format: (depth, height, width) — same padding on both sides of each dimension.\n    Explicit(usize, usize, usize),\n}\n\nimpl PaddingConfig3d {","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-nn/src/padding.rs#L80-L116","documentation":"PaddingConfig2d::calculate_padding_2d only supports symmetric padding. When the computed top/bottom (or left/right) paddings differ, it panics and directs you to calculate_padding_2d_pairs, which returns all four sides. This happens because 'Same' padding with an even kernel size cannot be split evenly across both sides of an axis.","triggerScenarios":"Calling PaddingConfig2d::Same.calculate_padding_2d(height, width, kernel_size, stride) where kernel_size[0] or kernel_size[1] is even (e.g. [2, 2]), making calculate_same_padding return unequal pairs.","commonSituations":"Configuring a conv/pool layer with an even kernel size and Same padding; porting a PyTorch model that used even kernels; writing tests (like test_padding_config_2d_calculate_symmetric_asymmetric_panics) that exercise the panic path.","solutions":["Use calculate_padding_2d_pairs to get the full [top, bottom, left, right] padding and pass it to the asymmetric-padding kernel API.","Switch to an odd kernel size (e.g. 3) so Same padding stays symmetric.","Use PaddingConfig2d::Valid and handle padding yourself."],"exampleFix":"// before\nlet [pad_h, pad_w] = PaddingConfig2d::Same.calculate_padding_2d(h, w, &[2, 2], &[1, 1]); // panics\n// after\nlet ((top, bottom), (left, right)) = PaddingConfig2d::Same\n    .calculate_padding_2d_pairs(h, w, &[2, 2], &[1, 1]);","handlingStrategy":"validation","validationCode":"fn symmetric_same_padding_ok(kernel_size: [usize; 2]) -> bool {\n    kernel_size.iter().all(|k| k % 2 == 1) // odd kernels keep 'Same' padding symmetric\n}","typeGuard":null,"tryCatchPattern":"// burn panics instead of returning Result; guard before constructing the config\nif !symmetric_same_padding_ok(kernel_size) {\n    let ((t, b), (l, r)) = PaddingConfig2d::Same.calculate_padding_2d_pairs(h, w, &kernel_size, &stride);\n    // use (t, b, l, r) with an asymmetric-padding API\n} else {\n    let [ph, pw] = PaddingConfig2d::Same.calculate_padding_2d(h, w, &kernel_size, &stride);\n}","preventionTips":["Prefer odd kernel sizes (1, 3, 5) whenever PaddingConfig2d::Same is used.","Call calculate_padding_2d_pairs by default and ignore symmetry when you can consume 4-side padding.","When porting PyTorch configs, check every conv/pool kernel for even sizes before enabling Same padding."],"tags":["rust","panic","padding","conv2d","asymmetric-padding"],"backgroundTag":"asymmetric-padding-unsupported","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"}