@@ -727,3 +727,112 @@ TEST(ConvolutionalLayerTest, Conv4DLegacyFloatEdgeCase) {
727727 ASSERT_NEAR (result[2 ], 3 .0f * 0 .5f + 1 .0f , 1e-5f );
728728 ASSERT_NEAR (result[3 ], 4 .0f * 0 .5f + 1 .0f , 1e-5f );
729729}
730+
731+ TEST (ConvolutionalLayerTest, DepthwiseConv4DIntPathCoverage) {
732+ std::vector<int > image = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ,
733+ 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 };
734+ Shape input_shape ({1 , 2 , 2 , 4 });
735+ Tensor input = make_tensor (image, input_shape);
736+
737+ std::vector<int > kernelvec = {1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
738+ Shape kernel_shape ({2 , 1 , 2 , 2 });
739+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
740+
741+ std::vector<int > biasvec = {10 , 20 };
742+ Tensor bias = make_tensor (biasvec, Shape ({2 }));
743+
744+ size_t out_height = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
745+ size_t out_width = (4 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
746+ Shape output_shape ({1 , 2 , out_height, out_width});
747+ std::vector<int > output_vec (6 , 0 );
748+ Tensor output = make_tensor (output_vec, output_shape);
749+
750+ ConvolutionalLayer layer (1 , 0 , 1 , kernel, bias, kDefault , 2 );
751+ std::vector<Tensor> in{input};
752+ std::vector<Tensor> out{output};
753+
754+ EXPECT_NO_THROW (layer.run (in, out));
755+
756+ std::vector<int > result = *out[0 ].as <int >();
757+ EXPECT_FALSE (result.empty ());
758+ }
759+
760+ TEST (ConvolutionalLayerTest, DepthwiseConv4DFloatPathCoverage) {
761+ std::vector<float > image = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f , 6 .0f , 7 .0f , 8 .0f };
762+ Shape input_shape ({1 , 2 , 2 , 2 });
763+ Tensor input = make_tensor (image, input_shape);
764+
765+ std::vector<float > kernelvec = {1 .0f , 1 .0f , 1 .0f , 1 .0f ,
766+ 0 .5f , 0 .5f , 0 .5f , 0 .5f };
767+ Shape kernel_shape ({2 , 1 , 2 , 2 });
768+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
769+
770+ std::vector<float > biasvec = {0 .1f , 0 .2f };
771+ Tensor bias = make_tensor (biasvec, Shape ({2 }));
772+
773+ size_t out_height = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
774+ size_t out_width = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
775+ Shape output_shape ({1 , 2 , out_height, out_width});
776+ std::vector<float > output_vec (2 , 0 .0f );
777+ Tensor output = make_tensor (output_vec, output_shape);
778+
779+ ConvolutionalLayer layer (1 , 0 , 1 , kernel, bias, kDefault , 2 );
780+ std::vector<Tensor> in{input};
781+ std::vector<Tensor> out{output};
782+
783+ EXPECT_NO_THROW (layer.run (in, out));
784+
785+ std::vector<float > result = *out[0 ].as <float >();
786+ EXPECT_FALSE (result.empty ());
787+ }
788+
789+ TEST (ConvolutionalLayerTest, DepthwiseConv4DNoBiasIntPathCoverage) {
790+ std::vector<int > image = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
791+ Shape input_shape ({1 , 2 , 2 , 2 });
792+ Tensor input = make_tensor (image, input_shape);
793+
794+ std::vector<int > kernelvec = {1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
795+ Shape kernel_shape ({2 , 1 , 2 , 2 });
796+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
797+
798+ size_t out_height = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
799+ size_t out_width = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
800+ Shape output_shape ({1 , 2 , out_height, out_width});
801+ std::vector<int > output_vec (2 , 0 );
802+ Tensor output = make_tensor (output_vec, output_shape);
803+
804+ ConvolutionalLayer layer (1 , 0 , 1 , kernel, Tensor (), kDefault , 2 );
805+ std::vector<Tensor> in{input};
806+ std::vector<Tensor> out{output};
807+
808+ EXPECT_NO_THROW (layer.run (in, out));
809+
810+ std::vector<int > result = *out[0 ].as <int >();
811+ EXPECT_FALSE (result.empty ());
812+ }
813+
814+ TEST (ConvolutionalLayerTest, DepthwiseConv4DNoBiasFloatPathCoverage) {
815+ std::vector<float > image = {1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f , 6 .0f , 7 .0f , 8 .0f };
816+ Shape input_shape ({1 , 2 , 2 , 2 });
817+ Tensor input = make_tensor (image, input_shape);
818+
819+ std::vector<float > kernelvec = {1 .0f , 1 .0f , 1 .0f , 1 .0f ,
820+ 0 .5f , 0 .5f , 0 .5f , 0 .5f };
821+ Shape kernel_shape ({2 , 1 , 2 , 2 });
822+ Tensor kernel = make_tensor (kernelvec, kernel_shape);
823+
824+ size_t out_height = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
825+ size_t out_width = (2 + 2 * 0 - 1 * (2 - 1 ) - 1 ) / 1 + 1 ;
826+ Shape output_shape ({1 , 2 , out_height, out_width});
827+ std::vector<float > output_vec (2 , 0 .0f );
828+ Tensor output = make_tensor (output_vec, output_shape);
829+
830+ ConvolutionalLayer layer (1 , 0 , 1 , kernel, Tensor (), kDefault , 2 );
831+ std::vector<Tensor> in{input};
832+ std::vector<Tensor> out{output};
833+
834+ EXPECT_NO_THROW (layer.run (in, out));
835+
836+ std::vector<float > result = *out[0 ].as <float >();
837+ EXPECT_FALSE (result.empty ());
838+ }
0 commit comments