From 6a356d53313a8d63223e6f8281d76d6652bd1cd0 Mon Sep 17 00:00:00 2001 From: uwumarogie Date: Thu, 4 Jun 2026 03:23:23 +0200 Subject: [PATCH] Fix SOFIE convolution dilation codegen --- tmva/sofie/inc/TMVA/ROperator_Conv.hxx | 16 +++++++--------- tmva/sofie/test/TestCustomModelsFromONNX.cxx | 17 +++++++++++++++++ .../test/input_models/ConvWithDilation.onnx | Bin 0 -> 262 bytes .../references/ConvWithDilation.ref.hxx | 3 +++ 4 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 tmva/sofie/test/input_models/ConvWithDilation.onnx create mode 100644 tmva/sofie/test/input_models/references/ConvWithDilation.ref.hxx diff --git a/tmva/sofie/inc/TMVA/ROperator_Conv.hxx b/tmva/sofie/inc/TMVA/ROperator_Conv.hxx index 78c1dcebc8030..be18559fddc69 100644 --- a/tmva/sofie/inc/TMVA/ROperator_Conv.hxx +++ b/tmva/sofie/inc/TMVA/ROperator_Conv.hxx @@ -454,6 +454,7 @@ public: // trick for speed is using caffe im2col and output a matrix which contains filtered values as rows. // By doing this one has consecutive memory reads and writes // Resulting matrix op_xcol is (input channels * filter_h * filter_w , output_h * output_w) + // The generated filter tensor is already expanded for fAttrDilations, so Im2col scans it contiguously. if (fDim ==1) { if (fAttrPads[0] != fAttrPads[1] ) { std::cout << "TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding " @@ -493,11 +494,10 @@ public: << fShapeW[1] << "," << iHeight << "," << iWidth << ","; if (fDim == 1) out << "1, " << fAttrKernelShape[0] << ",0," << fAttrPads[0] << ",1," << fAttrStrides[0] << ",1," - << fAttrDilations[0]; + << 1; else // dim ==2 out << fAttrKernelShape[0] << "," << fAttrKernelShape[1] << "," << fAttrPads[0] << "," << fAttrPads[1] - << "," << fAttrStrides[0] << "," << fAttrStrides[1] << "," << fAttrDilations[0] << "," - << fAttrDilations[1]; + << "," << fAttrStrides[0] << "," << fAttrStrides[1] << ",1,1"; out << "," << "tensor_" < input(49); + std::iota(input.begin(), input.end(), 0.0f); + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithDilation", input); + + EXPECT_EQ(output.size(), std::size(ConvWithDilation_ExpectedOutput::outputs)); + + float *correct = ConvWithDilation_ExpectedOutput::outputs; + + for (size_t i = 0; i < output.size(); ++i) { + EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); + } +} TEST(ONNX, ConvWithAutopadSameLower) { diff --git a/tmva/sofie/test/input_models/ConvWithDilation.onnx b/tmva/sofie/test/input_models/ConvWithDilation.onnx new file mode 100644 index 0000000000000000000000000000000000000000..e32e0b7aedff8d5f35cab813891ccc95445c0ced GIT binary patch literal 262 zcmd;J7ve0+&o9v}Ni8n1`ozeU&&3$Q#TYKc7%3&-oS#<~o>`LNl9`iOl9`{U!~zo0 z66NB_PA$qy&51A0NGwQoVq#`qz{sv8z{Or%Qk0pJTI|Hc$OsbQ=VB>HOeuC^VE_V< zfDjjF3e+s1A|@uFn2=C1(9HO9pf&L@IW0pj7Dh&9W&uVem9uBg*q%M(V>fH&OgkXk z4rr47teKMb#>U3>KymxDv^0As#_%X literal 0 HcmV?d00001 diff --git a/tmva/sofie/test/input_models/references/ConvWithDilation.ref.hxx b/tmva/sofie/test/input_models/references/ConvWithDilation.ref.hxx new file mode 100644 index 0000000000000..c343b99b7c7eb --- /dev/null +++ b/tmva/sofie/test/input_models/references/ConvWithDilation.ref.hxx @@ -0,0 +1,3 @@ +namespace ConvWithDilation_ExpectedOutput { +float outputs[] = {98.4f, 102.9f, 107.4f, 129.9f, 134.4f, 138.9f, 161.4f, 165.9f, 170.4f}; +} // namespace ConvWithDilation_ExpectedOutput