1+ #include < vector>
2+
3+ #include " gtest/gtest.h"
4+ #include " layers/SplitLayer.hpp"
5+ #include " layers/Tensor.hpp"
6+
7+ using namespace it_lab_ai ;
8+
9+ TEST (SplitLayerTests, SplitEqualParts1D) {
10+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 , 6 }, {6 });
11+ SplitLayer splitter (0 , 3 );
12+
13+ std::vector<Tensor> outputs;
14+ splitter.run (input, outputs);
15+
16+ ASSERT_EQ (outputs.size (), 3 );
17+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 }));
18+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 }));
19+ EXPECT_EQ (outputs[2 ].get_shape (), Shape ({2 }));
20+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({0 }), 1 .0f );
21+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({0 }), 3 .0f );
22+ EXPECT_FLOAT_EQ (outputs[2 ].get <float >({0 }), 5 .0f );
23+ }
24+
25+ TEST (SplitLayerTests, SplitVariableParts1D) {
26+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 , 6 }, {6 });
27+ SplitLayer splitter (0 , {2 , 4 });
28+
29+ std::vector<Tensor> outputs;
30+ splitter.run (input, outputs);
31+
32+ ASSERT_EQ (outputs.size (), 2 );
33+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 }));
34+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({4 }));
35+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({1 }), 2 .0f );
36+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({3 }), 6 .0f );
37+ }
38+
39+ TEST (SplitLayerTests, Split2DAlongAxis0) {
40+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 , 6 }, {2 , 3 });
41+ SplitLayer splitter (0 , {1 , 1 });
42+
43+ std::vector<Tensor> outputs;
44+ splitter.run (input, outputs);
45+
46+ ASSERT_EQ (outputs.size (), 2 );
47+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({1 , 3 }));
48+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({1 , 3 }));
49+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({0 , 2 }), 3 .0f );
50+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({0 , 0 }), 4 .0f );
51+ }
52+
53+ TEST (SplitLayerTests, Split2DAlongAxis1) {
54+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 , 6 }, {2 , 3 });
55+ SplitLayer splitter (1 , {1 , 2 });
56+
57+ std::vector<Tensor> outputs;
58+ splitter.run (input, outputs);
59+
60+ ASSERT_EQ (outputs.size (), 2 );
61+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 , 1 }));
62+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 , 2 }));
63+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({1 , 0 }), 4 .0f );
64+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({0 , 1 }), 3 .0f );
65+ }
66+
67+ TEST (SplitLayerTests, Split3DEqualParts) {
68+ std::vector<float > data (2 * 3 * 4 );
69+ std::iota (data.begin (), data.end (), 0 .0f );
70+ Tensor input = make_tensor<float >(data, {2 , 3 , 4 });
71+
72+ SplitLayer splitter (1 , 3 );
73+
74+ std::vector<Tensor> outputs;
75+ splitter.run (input, outputs);
76+
77+ ASSERT_EQ (outputs.size (), 3 );
78+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 , 1 , 4 }));
79+ EXPECT_EQ (outputs[1 ].get <float >({1 , 0 , 3 }), 19 .0f );
80+ }
81+
82+ TEST (SplitLayerTests, Split4DVariableParts) {
83+ std::vector<float > data (1 * 3 * 2 * 4 );
84+ std::iota (data.begin (), data.end (), 0 .0f );
85+ Tensor input = make_tensor<float >(data, {1 , 3 , 2 , 4 });
86+
87+ SplitLayer splitter (2 , {1 , 1 });
88+
89+ std::vector<Tensor> outputs;
90+ splitter.run (input, outputs);
91+
92+ ASSERT_EQ (outputs.size (), 2 );
93+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({1 , 3 , 1 , 4 }));
94+ EXPECT_EQ (outputs[1 ].get <float >({0 , 2 , 0 , 3 }), 23 .0f );
95+ }
96+
97+ TEST (SplitLayerTests, SplitNegativeAxis) {
98+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 , 6 }, {2 , 3 });
99+ SplitLayer splitter (-1 , {1 , 2 });
100+
101+ std::vector<Tensor> outputs;
102+ splitter.run (input, outputs);
103+
104+ ASSERT_EQ (outputs.size (), 2 );
105+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 , 1 }));
106+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 , 2 }));
107+ }
108+
109+ TEST (SplitLayerTests, InvalidSplitSizes) {
110+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 }, {4 });
111+
112+ SplitLayer splitter (0 , {1 , 2 });
113+
114+ std::vector<Tensor> outputs;
115+ EXPECT_THROW (splitter.run (input, outputs), std::runtime_error);
116+ }
117+
118+ TEST (SplitLayerTests, EmptyInputTensor) {
119+ Tensor input = make_tensor<float >({}, {0 });
120+
121+ SplitLayer splitter (0 , {});
122+
123+ std::vector<Tensor> outputs;
124+ EXPECT_THROW (splitter.run (input, outputs), std::runtime_error);
125+ }
126+
127+ TEST (SplitLayerTests, Split192IntoTwo96) {
128+ std::vector<float > input_data (1 * 192 * 56 * 56 );
129+ std::iota (input_data.begin (), input_data.end (), 0 .0f );
130+ Tensor input = make_tensor<float >(input_data, {1 , 192 , 56 , 56 });
131+
132+ SplitLayer splitter (1 , {96 , 96 });
133+ std::vector<Tensor> outputs;
134+ splitter.run (input, outputs);
135+
136+ ASSERT_EQ (outputs.size (), 2 );
137+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({1 , 96 , 56 , 56 }));
138+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({1 , 96 , 56 , 56 }));
139+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({0 , 0 , 0 , 0 }), 0 .0f );
140+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({0 , 0 , 0 , 0 }), 96 * 56 * 56 );
141+ }
142+
143+ TEST (SplitLayerTests, UnevenSplitWithRemainder) {
144+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 , 5 }, {5 });
145+ SplitLayer splitter (0 , 3 );
146+
147+ std::vector<Tensor> outputs;
148+ splitter.run (input, outputs);
149+
150+ ASSERT_EQ (outputs.size (), 3 );
151+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 }));
152+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 }));
153+ EXPECT_EQ (outputs[2 ].get_shape (), Shape ({1 }));
154+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({1 }), 2 .0f );
155+ EXPECT_FLOAT_EQ (outputs[1 ].get <float >({1 }), 4 .0f );
156+ EXPECT_FLOAT_EQ (outputs[2 ].get <float >({0 }), 5 .0f );
157+ }
158+
159+ TEST (SplitLayerTests, NumOutputsGreaterThanAxisSize) {
160+ Tensor input = make_tensor<float >({1 , 2 , 3 }, {3 });
161+ SplitLayer splitter (0 , 5 );
162+
163+ std::vector<Tensor> outputs;
164+ EXPECT_THROW (splitter.run (input, outputs), std::runtime_error);
165+ }
166+
167+ TEST (SplitLayerTests, IntegerDataType) {
168+ Tensor input = make_tensor<int >({1 , 2 , 3 , 4 , 5 , 6 }, {2 , 3 });
169+ SplitLayer splitter (1 , {1 , 2 });
170+
171+ std::vector<Tensor> outputs;
172+ splitter.run (input, outputs);
173+
174+ ASSERT_EQ (outputs.size (), 2 );
175+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 , 1 }));
176+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 , 2 }));
177+ EXPECT_EQ (outputs[0 ].get <int >({1 , 0 }), 4 );
178+ EXPECT_EQ (outputs[1 ].get <int >({0 , 1 }), 3 );
179+ }
180+
181+ TEST (SplitLayerTests, NegativeAxis2D) {
182+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 }, {2 , 2 });
183+ SplitLayer splitter (-2 , {1 , 1 });
184+
185+ std::vector<Tensor> outputs;
186+ splitter.run (input, outputs);
187+
188+ ASSERT_EQ (outputs.size (), 2 );
189+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({1 , 2 }));
190+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({1 , 2 }));
191+ }
192+
193+ TEST (SplitLayerTests, NegativeAxis3D) {
194+ std::vector<float > data (2 * 3 * 4 );
195+ std::iota (data.begin (), data.end (), 1 .0f );
196+ Tensor input = make_tensor<float >(data, {2 , 3 , 4 });
197+
198+ SplitLayer splitter (-1 , {1 , 3 });
199+
200+ std::vector<Tensor> outputs;
201+ splitter.run (input, outputs);
202+
203+ ASSERT_EQ (outputs.size (), 2 );
204+ EXPECT_EQ (outputs[0 ].get_shape (), Shape ({2 , 3 , 1 }));
205+ EXPECT_EQ (outputs[1 ].get_shape (), Shape ({2 , 3 , 3 }));
206+ EXPECT_FLOAT_EQ (outputs[0 ].get <float >({1 , 2 , 0 }), 21 .0f );
207+ }
208+
209+ TEST (SplitLayerTests, LargeAxisValue) {
210+ Tensor input = make_tensor<float >({1 , 2 , 3 , 4 }, {2 , 2 });
211+
212+ SplitLayer splitter (10 , {1 , 1 });
213+ std::vector<Tensor> outputs;
214+ EXPECT_THROW (splitter.run (input, outputs), std::runtime_error);
215+ }
0 commit comments