@@ -607,3 +607,123 @@ TEST(ConvolutionalLayerTest, Conv4DSTLViaConvolutionalLayer) {
607607 ASSERT_NEAR (result[i], expected_value, 1e-5f );
608608 }
609609}
610+
611+ TEST (ConvolutionalLayerTest, Conv4DLegacyFloatBasic) {
612+ std::vector<float > image (48 , 1 .0f );
613+ Shape input_shape ({1 , 3 , 4 , 4 });
614+ Tensor input = make_tensor (image, input_shape);
615+
616+ std::vector<float > kernelvec (54 , 1 .0f );
617+ Shape kernel_shape ({3 , 3 , 3 , 2 });
618+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
619+
620+ std::vector<float > biasvec = {0 .5f , 1 .0f };
621+ Tensor bias = make_tensor (biasvec, Shape ({2 }));
622+
623+ size_t out_height = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
624+ size_t out_width = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
625+ Shape output_shape ({1 , 2 , out_height, out_width});
626+ std::vector<float > output_vec (8 , 0 .0f );
627+ Tensor output = make_tensor (output_vec, output_shape);
628+
629+ Conv4D_Legacy<float >(input, kernel, bias, output, 1 , 0 , 1 );
630+
631+ std::vector<float > result = *output.as <float >();
632+
633+ float expected_value_ch1 = 27 .0f + 0 .5f ;
634+ float expected_value_ch2 = 27 .0f + 1 .0f ;
635+
636+ ASSERT_EQ (result.size (), 8 );
637+ ASSERT_NEAR (result[0 ], expected_value_ch1, 1e-5f );
638+ ASSERT_NEAR (result[1 ], expected_value_ch1, 1e-5f );
639+ ASSERT_NEAR (result[4 ], expected_value_ch2, 1e-5f );
640+ ASSERT_NEAR (result[5 ], expected_value_ch2, 1e-5f );
641+ }
642+
643+ TEST (ConvolutionalLayerTest, Conv4DLegacyFloatMultiOutput) {
644+ std::vector<float > image (32 , 1 .0f );
645+ Shape input_shape ({1 , 2 , 4 , 4 });
646+ Tensor input = make_tensor (image, input_shape);
647+
648+ std::vector<float > kernelvec (72 , 0 .5f );
649+ Shape kernel_shape ({3 , 3 , 2 , 4 });
650+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
651+
652+ std::vector<float > biasvec = {0 .1f , 0 .2f , 0 .3f , 0 .4f };
653+ Tensor bias = make_tensor (biasvec, Shape ({4 }));
654+
655+ size_t out_height = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
656+ size_t out_width = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
657+ Shape output_shape ({1 , 4 , out_height, out_width});
658+ std::vector<float > output_vec (16 , 0 .0f );
659+ Tensor output = make_tensor (output_vec, output_shape);
660+
661+ Conv4D_Legacy<float >(input, kernel, bias, output, 1 , 0 , 1 );
662+
663+ std::vector<float > result = *output.as <float >();
664+
665+ ASSERT_EQ (result.size (), 16 );
666+ ASSERT_NEAR (result[0 ], 9 .0f + 0 .1f , 1e-5f );
667+ ASSERT_NEAR (result[4 ], 9 .0f + 0 .2f , 1e-5f );
668+ ASSERT_NEAR (result[8 ], 9 .0f + 0 .3f , 1e-5f );
669+ ASSERT_NEAR (result[12 ], 9 .0f + 0 .4f , 1e-5f );
670+ }
671+
672+ TEST (ConvolutionalLayerTest, Conv4DLegacyViaConvolutionalLayer) {
673+ std::vector<float > image (48 , 1 .0f );
674+ Shape input_shape ({1 , 3 , 4 , 4 });
675+ Tensor input = make_tensor (image, input_shape);
676+
677+ std::vector<float > kernelvec (54 , 1 .0f );
678+ Shape kernel_shape ({3 , 3 , 3 , 2 });
679+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
680+
681+ size_t out_height = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
682+ size_t out_width = (4 + 2 * 0 - 1 * (3 - 1 ) - 1 ) / 1 + 1 ;
683+ Shape output_shape ({1 , 2 , out_height, out_width});
684+ std::vector<float > output_vec (8 , 0 .0f );
685+ Tensor output = make_tensor (output_vec, output_shape);
686+
687+ ConvolutionalLayer layer (1 , 0 , 1 , kernel, Tensor (), kDefault , 1 , true );
688+ std::vector<Tensor> in{input};
689+ std::vector<Tensor> out{output};
690+
691+ layer.run (in, out);
692+
693+ std::vector<float > result = *out[0 ].as <float >();
694+
695+ ASSERT_EQ (result.size (), 8 );
696+ float expected_value = 27 .0f ;
697+ for (size_t i = 0 ; i < result.size (); ++i) {
698+ ASSERT_NEAR (result[i], expected_value, 1e-5f );
699+ }
700+ }
701+
702+ TEST (ConvolutionalLayerTest, Conv4DLegacyFloatEdgeCase) {
703+ std::vector<float > image = {1 .0f , 2 .0f , 3 .0f , 4 .0f };
704+ Shape input_shape ({1 , 1 , 2 , 2 });
705+ Tensor input = make_tensor (image, input_shape);
706+
707+ std::vector<float > kernelvec = {0 .5f };
708+ Shape kernel_shape ({1 , 1 , 1 , 1 });
709+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
710+
711+ std::vector<float > biasvec = {1 .0f };
712+ Tensor bias = make_tensor (biasvec, Shape ({1 }));
713+
714+ size_t out_height = (2 + 2 * 0 - 1 * (1 - 1 ) - 1 ) / 1 + 1 ;
715+ size_t out_width = (2 + 2 * 0 - 1 * (1 - 1 ) - 1 ) / 1 + 1 ;
716+ Shape output_shape ({1 , 1 , out_height, out_width});
717+ std::vector<float > output_vec (4 , 0 .0f );
718+ Tensor output = make_tensor (output_vec, output_shape);
719+
720+ Conv4D_Legacy<float >(input, kernel, bias, output, 1 , 0 , 1 );
721+
722+ std::vector<float > result = *output.as <float >();
723+
724+ ASSERT_EQ (result.size (), 4 );
725+ ASSERT_NEAR (result[0 ], 1 .0f * 0 .5f + 1 .0f , 1e-5f );
726+ ASSERT_NEAR (result[1 ], 2 .0f * 0 .5f + 1 .0f , 1e-5f );
727+ ASSERT_NEAR (result[2 ], 3 .0f * 0 .5f + 1 .0f , 1e-5f );
728+ ASSERT_NEAR (result[3 ], 4 .0f * 0 .5f + 1 .0f , 1e-5f );
729+ }
0 commit comments