11#include < vector>
22
3- #include " layers/Tensor.hpp"
43#include " gtest/gtest.h"
54#include " layers/MulLayer.hpp"
5+ #include " layers/Tensor.hpp"
66
77using namespace itlab_2023 ;
88
@@ -23,7 +23,6 @@ class MulLayerTests : public ::testing::Test {
2323 Tensor scalar_int;
2424};
2525
26- // Тест умножения тензоров одинаковой формы (float)
2726TEST_F (MulLayerTests, MulSameShapeFloat) {
2827 MulLayer layer;
2928 Tensor input1 = make_tensor<float >(data1, {2 , 2 });
@@ -33,13 +32,12 @@ TEST_F(MulLayerTests, MulSameShapeFloat) {
3332 layer.run (input1, input2, output);
3433
3534 auto * result = output.as <float >();
36- EXPECT_FLOAT_EQ ((*result)[0 ], 2 .0f ); // 1*2
37- EXPECT_FLOAT_EQ ((*result)[1 ], 6 .0f ); // 2*3
38- EXPECT_FLOAT_EQ ((*result)[2 ], 12 .0f ); // 3*4
39- EXPECT_FLOAT_EQ ((*result)[3 ], 20 .0f ); // 4*5
35+ EXPECT_FLOAT_EQ ((*result)[0 ], 2 .0f );
36+ EXPECT_FLOAT_EQ ((*result)[1 ], 6 .0f );
37+ EXPECT_FLOAT_EQ ((*result)[2 ], 12 .0f );
38+ EXPECT_FLOAT_EQ ((*result)[3 ], 20 .0f );
4039}
4140
42- // Тест умножения тензоров одинаковой формы (int)
4341TEST_F (MulLayerTests, MulSameShapeInt) {
4442 MulLayer layer;
4543 Tensor input1 = make_tensor<int >(data_int, {2 , 2 });
@@ -49,13 +47,28 @@ TEST_F(MulLayerTests, MulSameShapeInt) {
4947 layer.run (input1, input2, output);
5048
5149 auto * result = output.as <int >();
52- EXPECT_EQ ((*result)[0 ], 1 ); // 1*1
53- EXPECT_EQ ((*result)[1 ], 4 ); // 2*2
54- EXPECT_EQ ((*result)[2 ], 9 ); // 3*3
55- EXPECT_EQ ((*result)[3 ], 16 ); // 4*4
50+ EXPECT_EQ ((*result)[0 ], 1 );
51+ EXPECT_EQ ((*result)[1 ], 4 );
52+ EXPECT_EQ ((*result)[2 ], 9 );
53+ EXPECT_EQ ((*result)[3 ], 16 );
54+ }
55+
56+ TEST_F (MulLayerTests, MulSameShapeIntResNet1) {
57+ MulLayer layer;
58+ Tensor input1 = make_tensor<int >({1 , 2 , 64 , 64 , 64 }, {5 });
59+ Tensor input2 = make_tensor<int >({1 , 2 , 64 , 1 , 1 }, {5 });
60+ Tensor output;
61+
62+ layer.run (input1, input2, output);
63+
64+ auto * result = output.as <int >();
65+ EXPECT_EQ ((*result)[0 ], 1 );
66+ EXPECT_EQ ((*result)[1 ], 4 );
67+ EXPECT_EQ ((*result)[2 ], 4096 );
68+ EXPECT_EQ ((*result)[3 ], 64 );
69+ EXPECT_EQ ((*result)[4 ], 64 );
5670}
5771
58- // Тест умножения тензора на скаляр (float)
5972TEST_F (MulLayerTests, MulWithScalarFloat) {
6073 MulLayer layer;
6174 Tensor input = make_tensor<float >(data1, {2 , 2 });
@@ -64,13 +77,12 @@ TEST_F(MulLayerTests, MulWithScalarFloat) {
6477 layer.run (input, scalar, output);
6578
6679 auto * result = output.as <float >();
67- EXPECT_FLOAT_EQ ((*result)[0 ], 2 .0f ); // 1*2
68- EXPECT_FLOAT_EQ ((*result)[1 ], 4 .0f ); // 2*2
69- EXPECT_FLOAT_EQ ((*result)[2 ], 6 .0f ); // 3*2
70- EXPECT_FLOAT_EQ ((*result)[3 ], 8 .0f ); // 4*2
80+ EXPECT_FLOAT_EQ ((*result)[0 ], 2 .0f );
81+ EXPECT_FLOAT_EQ ((*result)[1 ], 4 .0f );
82+ EXPECT_FLOAT_EQ ((*result)[2 ], 6 .0f );
83+ EXPECT_FLOAT_EQ ((*result)[3 ], 8 .0f );
7184}
7285
73- // Тест умножения тензора на скаляр (int)
7486TEST_F (MulLayerTests, MulWithScalarInt) {
7587 MulLayer layer;
7688 Tensor input = make_tensor<int >(data_int, {2 , 2 });
@@ -79,31 +91,70 @@ TEST_F(MulLayerTests, MulWithScalarInt) {
7991 layer.run (input, scalar_int, output);
8092
8193 auto * result = output.as <int >();
82- EXPECT_EQ ((*result)[0 ], 2 ); // 1*2
83- EXPECT_EQ ((*result)[1 ], 4 ); // 2*2
84- EXPECT_EQ ((*result)[2 ], 6 ); // 3*2
85- EXPECT_EQ ((*result)[3 ], 8 ); // 4*2
94+ EXPECT_EQ ((*result)[0 ], 2 );
95+ EXPECT_EQ ((*result)[1 ], 4 );
96+ EXPECT_EQ ((*result)[2 ], 6 );
97+ EXPECT_EQ ((*result)[3 ], 8 );
8698}
8799
88- // Тест broadcasting (расширения размерностей)
89- TEST_F (MulLayerTests, BroadcastingTest) {
100+ TEST_F (MulLayerTests, BroadcastingTest1) {
90101 MulLayer layer;
91- Tensor input1 = make_tensor<float >({1 .0f , 2 .0f }, {2 , 1 }); // shape [2,1]
92- Tensor input2 = make_tensor<float >({3 .0f , 4 .0f }, {1 , 2 }); // shape [1,2]
102+ Tensor input1 = make_tensor<float >({1 .0f , 2 .0f }, {2 , 1 });
103+ Tensor input2 = make_tensor<float >({3 .0f , 4 .0f }, {1 , 2 });
93104 Tensor output;
94105
95106 layer.run (input1, input2, output);
96107
97- // Ожидаемый результат после broadcasting:
98- // [[1*3, 1*4], [2*3, 2*4]] = [[3,4], [6,8]]
99108 auto * result = output.as <float >();
100109 EXPECT_FLOAT_EQ ((*result)[0 ], 3 .0f );
101110 EXPECT_FLOAT_EQ ((*result)[1 ], 4 .0f );
102111 EXPECT_FLOAT_EQ ((*result)[2 ], 6 .0f );
103112 EXPECT_FLOAT_EQ ((*result)[3 ], 8 .0f );
104113}
105114
106- // Тест на несовместимые формы
115+ TEST_F (MulLayerTests, Broadcasting3D) {
116+ MulLayer layer;
117+ Tensor input1 =
118+ make_tensor<float >({1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f , 6 .0f }, {2 , 1 , 3 });
119+ Tensor input2 =
120+ make_tensor<float >({1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f , 6 .0f }, {2 , 3 , 1 });
121+ Tensor output;
122+
123+ layer.run (input1, input2, output);
124+
125+ ASSERT_EQ (output.get_shape (), Shape ({2 , 3 , 3 }));
126+ auto * result = output.as <float >();
127+ EXPECT_FLOAT_EQ ((*result)[0 ], 1 .0f );
128+ EXPECT_FLOAT_EQ ((*result)[1 ], 2 .0f );
129+ EXPECT_FLOAT_EQ ((*result)[2 ], 3 .0f );
130+ EXPECT_FLOAT_EQ ((*result)[3 ], 2 .0f );
131+ EXPECT_FLOAT_EQ ((*result)[4 ], 4 .0f );
132+ EXPECT_FLOAT_EQ ((*result)[5 ], 6 .0f );
133+ EXPECT_FLOAT_EQ ((*result)[12 ], 20 .0f );
134+ EXPECT_FLOAT_EQ ((*result)[13 ], 25 .0f );
135+ EXPECT_FLOAT_EQ ((*result)[14 ], 30 .0f );
136+ EXPECT_FLOAT_EQ ((*result)[15 ], 24 .0f );
137+ EXPECT_FLOAT_EQ ((*result)[16 ], 30 .0f );
138+ EXPECT_FLOAT_EQ ((*result)[17 ], 36 .0f );
139+ }
140+
141+ TEST_F (MulLayerTests, BroadcastingDifferentRanks) {
142+ MulLayer layer;
143+ Tensor input1 = make_tensor<float >({1 .0f , 2 .0f , 3 .0f }, {3 });
144+ Tensor input2 =
145+ make_tensor<float >({1 .0f , 2 .0f , 3 .0f , 4 .0f , 5 .0f , 6 .0f }, {2 , 1 , 3 });
146+ Tensor output;
147+
148+ layer.run (input1, input2, output);
149+
150+ ASSERT_EQ (output.get_shape (), Shape ({2 , 1 , 3 }));
151+ auto * result = output.as <float >();
152+ EXPECT_FLOAT_EQ ((*result)[0 ], 1 .0f );
153+ EXPECT_FLOAT_EQ ((*result)[1 ], 4 .0f );
154+ EXPECT_FLOAT_EQ ((*result)[2 ], 9 .0f );
155+ EXPECT_FLOAT_EQ ((*result)[3 ], 4 .0f );
156+ }
157+
107158TEST_F (MulLayerTests, IncompatibleShapes) {
108159 MulLayer layer;
109160 Tensor input1 = make_tensor<float >(data1, {4 });
@@ -113,12 +164,10 @@ TEST_F(MulLayerTests, IncompatibleShapes) {
113164 EXPECT_THROW (layer.run (input1, input2, output), std::runtime_error);
114165}
115166
116- // Тест имени слоя
117167TEST_F (MulLayerTests, LayerName) {
118168 EXPECT_EQ (MulLayer::get_name (), " Element-wise Multiplication Layer" );
119169}
120170
121- // Тест умножения пустых тензоров
122171TEST_F (MulLayerTests, EmptyTensors) {
123172 MulLayer layer;
124173 Tensor empty1 ({}, Type::kFloat );
0 commit comments