Skip to content

Commit 2afdd8d

Browse files
committed
add conv and flatten tests
1 parent 5075d25 commit 2afdd8d

2 files changed

Lines changed: 206 additions & 0 deletions

File tree

test/single_layer/test_convlayer.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

test/single_layer/test_flattenlayer.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,89 @@ TEST(flattenlayer, new_flattenlayer_can_flatten_int_reorder) {
183183
TEST(flattenlayer, get_layer_name) {
184184
EXPECT_EQ(FlattenLayer::get_name(), "Flatten layer");
185185
}
186+
187+
TEST(flattenlayer, MultipleInputTensorsThrowsError) {
188+
FlattenLayer layer;
189+
Shape sh({2, 3});
190+
Tensor input1 =
191+
make_tensor<float>({1.0F, -1.0F, 2.0F, -2.0F, 3.0F, -3.0F}, sh);
192+
Tensor input2 =
193+
make_tensor<float>({1.0F, -1.0F, 2.0F, -2.0F, 3.0F, -3.0F}, sh);
194+
Tensor output;
195+
std::vector<Tensor> in{input1, input2};
196+
std::vector<Tensor> out{output};
197+
198+
EXPECT_THROW(layer.run(in, out), std::runtime_error);
199+
}
200+
201+
TEST(flattenlayer, InvalidAxisValueThrowsError) {
202+
FlattenLayer layer(5);
203+
Shape sh({2, 3});
204+
Tensor input =
205+
make_tensor<float>({1.0F, -1.0F, 2.0F, -2.0F, 3.0F, -3.0F}, sh);
206+
Tensor output;
207+
std::vector<Tensor> in{input};
208+
std::vector<Tensor> out{output};
209+
210+
EXPECT_THROW(layer.run(in, out), std::runtime_error);
211+
}
212+
213+
TEST(flattenlayer, NegativeAxisOutOfRangeThrowsError) {
214+
FlattenLayer layer(-5);
215+
Shape sh({2, 3});
216+
Tensor input =
217+
make_tensor<float>({1.0F, -1.0F, 2.0F, -2.0F, 3.0F, -3.0F}, sh);
218+
Tensor output;
219+
std::vector<Tensor> in{input};
220+
std::vector<Tensor> out{output};
221+
222+
EXPECT_THROW(layer.run(in, out), std::runtime_error);
223+
}
224+
225+
TEST(flattenlayer, AxisEqualToShapeDimsThrowsError) {
226+
FlattenLayer layer(2);
227+
Shape sh({2, 3});
228+
Tensor input =
229+
make_tensor<float>({1.0F, -1.0F, 2.0F, -2.0F, 3.0F, -3.0F}, sh);
230+
Tensor output;
231+
std::vector<Tensor> in{input};
232+
std::vector<Tensor> out{output};
233+
234+
EXPECT_THROW(layer.run(in, out), std::runtime_error);
235+
}
236+
237+
TEST(flattenlayer, ValidAxisWithSupportedTypes) {
238+
std::vector<int> axis_values = {0, 1, -1, -2};
239+
240+
for (int axis : axis_values) {
241+
FlattenLayer layer(axis);
242+
Shape sh({2, 3, 4});
243+
size_t total_size = sh.count();
244+
245+
std::vector<float> float_data(total_size);
246+
std::vector<int> int_data(total_size);
247+
for (size_t i = 0; i < total_size; i++) {
248+
float_data[i] = static_cast<float>(i);
249+
int_data[i] = static_cast<int>(i);
250+
}
251+
252+
Tensor float_input = make_tensor<float>(float_data, sh);
253+
Tensor int_input = make_tensor<int>(int_data, sh);
254+
Tensor output;
255+
256+
std::vector<Tensor> float_in{float_input};
257+
std::vector<Tensor> int_in{int_input};
258+
std::vector<Tensor> out{output};
259+
260+
EXPECT_NO_THROW(layer.run(float_in, out));
261+
EXPECT_NO_THROW(layer.run(int_in, out));
262+
}
263+
}
264+
265+
TEST(flattenlayer, EmptyInputThrowsError) {
266+
FlattenLayer layer;
267+
std::vector<Tensor> in;
268+
std::vector<Tensor> out(1);
269+
270+
EXPECT_THROW(layer.run(in, out), std::runtime_error);
271+
}

0 commit comments

Comments
 (0)