{"record":{"id":"ecf0cd0af09fec5b","repo":"tracel-ai/burn","slug":"invalid-dimensionality","errorCode":null,"errorMessage":"Invalid dimensionality","messagePattern":"Invalid dimensionality","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/burn-cubecl/src/kernel/conv/backward_data/fallback.rs","lineNumber":117,"sourceCode":"            None,\n            ConvTransposeOptions::new(\n                [options.stride[0], options.stride[1], options.stride[2]],\n                [\n                    options.padding_begin()[0],\n                    options.padding_begin()[1],\n                    options.padding_begin()[2],\n                ],\n                [padding_out[0], padding_out[1], padding_out[2]],\n                [\n                    options.dilation[0],\n                    options.dilation[1],\n                    options.dilation[2],\n                ],\n                options.groups,\n            ),\n        )\n        .unwrap()),\n        _ => unimplemented!(\"Invalid dimensionality\"),\n    }?;\n    Ok(permute_nchw_to_nhwc(in_grad))\n}\n\nfn conv_transpose1d_from_conv_transpose2d(\n    x: CubeTensor,\n    weight: CubeTensor,\n    options: ConvTransposeOptions<1>,\n) -> Result<CubeTensor, ConvSetupError> {\n    let [channels_in, channels_out, kernel_size] = weight.shape().dims();\n    let [batch_size, _channels_in, length_in] = x.shape().dims();\n\n    let weight = reshape(\n        weight,\n        Shape::new([channels_in, channels_out, kernel_size, 1]),\n    );\n    let x = reshape(x, Shape::new([batch_size, channels_in, length_in, 1]));\n","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/tracel-ai/burn/blob/d16f7ba2ed0d41408189384044cc886fb4c8f957/crates/burn-cubecl/src/kernel/conv/backward_data/fallback.rs#L99-L135","documentation":"conv_data_backward_fallback implements the data-gradient of convolution by rewriting it as a transposed convolution over an unpermuted layout. It only handles 1D, 2D and 3D convolutions; for any other dimensionality it hits the catch-all arm and panics with this unimplemented!.","triggerScenarios":"Calling backward on a convolution whose options.rank is not 1, 2 or 3 (e.g. 4D/5D convolution) on the CubeCL backend, or constructing ConvOptions with a mismatched rank vector so the match falls through.","commonSituations":"Implementing a custom 4D convolution layer and calling backward on GPU; porting models from frameworks that allow N-d convolution; misconfigured ConvOptions rank after refactoring.","solutions":["Restrict the model to 1D/2D/3D convolutions when using the CubeCL backend","Compute the weight/gradient path manually or on a backend that supports N-d conv backward","Upgrade burn — check if higher-rank conv backward support was added","Wrap higher-rank conv as multiple lower-rank ops (e.g. loop over extra dims)"],"exampleFix":"// before\nlet grad = conv4d_backward(x, weight, options); // panics: Invalid dimensionality\n// after\nlet grad = conv2d_backward(x, weight, ConvOptions::new(stride2d, pad2d, dil2d, groups)); // supported rank","handlingStrategy":"validation","validationCode":"fn assert_supported_conv_rank(rank: usize) {\n    assert!((1..=3).contains(&rank), \"CubeCL conv backward supports rank 1-3, got {rank}\");\n}","typeGuard":"fn is_conv_backward_supported(options: &ConvOptions) -> bool {\n    matches!(options.rank, 1 | 2 | 3)\n}","tryCatchPattern":"// Panic-based; guard instead:\nif options.rank <= 3 { conv_data_backward(x, weight, options) } else { /* manual or CPU fallback */ }","preventionTips":["Stick to 1D/2D/3D convolutions on GPU backends","Validate ConvOptions.rank at layer construction","Test backward passes of custom conv layers early"],"tags":["convolution","backward","gpu","unimplemented"],"backgroundTag":"invalid-dimensionality","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"}