3 * Copyright (C) 2021 Samsung Electronics
4 * Copyright (C) 2021 Dongju Chae <dongju.chae@samsung.com>
7 * @file ne_core_data_test.cc
9 * @brief UnitTests to test functionality of data converter
10 * @author Dongju Chae <dongju.chae@samsung.com>
11 * @bug No known bugs except for NYI items
15 #include "ne_unittest_utils.h"
17 #include <npubinfmt.h>
21 * @brief Test checkCapability()
23 TEST (ne_core_data_test, check_capability) {
24 std::unique_ptr<DataConverter> converter (new DataConverter (true));
25 converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
27 converter->setDataLayout (DATA_LAYOUT_NHWC, DATA_LAYOUT_TRIV2);
28 EXPECT_TRUE (converter->checkCapability ());
30 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_NHWC);
31 EXPECT_TRUE (converter->checkCapability ());
35 * @brief Test checkCapability() with negative cases
37 TEST (ne_core_data_test, check_capability_n) {
38 std::unique_ptr<DataConverter> converter (new DataConverter (true));
40 /* layouts are not resolved yet */
41 converter->setDataLayout (DATA_LAYOUT_MODEL, DATA_LAYOUT_MODEL);
42 EXPECT_FALSE (converter->checkCapability ());
44 /* types are not resolved yet */
45 converter->setDataLayout (DATA_LAYOUT_NHWC, DATA_LAYOUT_TRIV2);
46 converter->setDataType (DATA_TYPE_MODEL, DATA_TYPE_MODEL);
47 EXPECT_FALSE (converter->checkCapability ());
49 /* some layouts are not supported */
50 converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
51 converter->setDataLayout (DATA_LAYOUT_NCHW, DATA_LAYOUT_TRIV2);
52 EXPECT_FALSE (converter->checkCapability ());
56 * @brief Test perform() with quantization (QASYMM8)
58 TEST (ne_core_data_test, perform_quantization_asymm8) {
59 std::unique_ptr<DataConverter> converter (new DataConverter (true));
60 uint16_t *src_data = new uint16_t[4096];
61 uint8_t *dst_data = new uint8_t[4096];
62 uint32_t data_dims[] = {1, 8, 8, 64};
68 converter->setData (src_data, dst_data, 4096 * 2);
69 converter->setDataDims (data_dims);
70 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_TRIV2);
71 converter->setDataType (DATA_TYPE_UINT16, DATA_TYPE_QASYMM8);
72 converter->setQuantZero (zero);
73 converter->setQuantScale (scale);
76 for (int i = 0; i < 4096; i++) {
77 src_data[i] = rand () % UINT16_MAX;
81 EXPECT_EQ (converter->perform (), 4096 * 2);
83 /* check quantized value */
84 for (int i = 0; i < 4096; i++) {
85 double val = src_data[i];
88 val = (val > max) ? max : val;
89 val = (val < min) ? min : val;
90 EXPECT_EQ (dst_data[i], (uint8_t) val);
98 * @brief Test perform() with quantization (QSYMM16)
100 TEST (ne_core_data_test, perform_quantization_symm16) {
101 std::unique_ptr<DataConverter> converter (new DataConverter (true));
102 uint32_t *src_data = new uint32_t[4096];
103 int16_t *dst_data = new int16_t[4096];
104 uint32_t data_dims[] = {1, 8, 8, 64};
107 double max = 32767.0;
108 double min = -32768.0;
110 converter->setData (src_data, dst_data, 4096 * 4);
111 converter->setDataDims (data_dims);
112 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_TRIV2);
113 converter->setDataType (DATA_TYPE_UINT32, DATA_TYPE_QSYMM16);
114 converter->setQuantZero (zero);
115 converter->setQuantScale (scale);
118 for (int i = 0; i < 4096; i++) {
119 src_data[i] = rand () % UINT32_MAX;
123 EXPECT_EQ (converter->perform (), 4096 * 4);
125 /* check quantized value */
126 for (int i = 0; i < 4096; i++) {
127 double val = src_data[i];
130 val = (val > max) ? max : val;
131 val = (val < min) ? min : val;
132 EXPECT_EQ (dst_data[i], (int16_t) val);
140 * @brief Test perform() with quantization (negative)
142 TEST (ne_core_data_test, perform_quantization_n) {
143 std::unique_ptr<DataConverter> converter (new DataConverter (true));
144 uint32_t *src_data = new uint32_t[4096];
145 int16_t *dst_data = new int16_t[4096];
146 uint32_t data_dims[] = {1, 8, 8, 64};
150 converter->setData (src_data, dst_data, 4096 * 4);
151 converter->setDataDims (data_dims);
152 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_TRIV2);
153 converter->setDataType (DATA_TYPE_UINT32, DATA_TYPE_QSYMM16);
154 converter->setQuantZero (zero);
155 converter->setQuantScale (scale);
158 for (int i = 0; i < 4096; i++) {
159 src_data[i] = rand () % UINT32_MAX;
163 EXPECT_EQ (converter->perform (), 4096 * 4);
165 /* failed to quantize */
166 for (int i = 0; i < 4096; i++) {
167 EXPECT_EQ (dst_data[i], 0);
175 * @brief Test perform() with dequantization (QASYMM8)
177 TEST (ne_core_data_test, perform_dequantization_asymm8) {
178 std::unique_ptr<DataConverter> converter (new DataConverter (false));
179 uint8_t *src_data = new uint8_t[4096];
180 uint16_t *dst_data = new uint16_t[4096];
181 uint32_t data_dims[] = {1, 8, 8, 64};
185 converter->setData (src_data, dst_data, 4096);
186 converter->setDataDims (data_dims);
187 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_TRIV2);
188 converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_UINT16);
189 converter->setQuantZero (zero);
190 converter->setQuantScale (scale);
193 for (int i = 0; i < 4096; i++) {
194 src_data[i] = rand () % UINT8_MAX;
198 EXPECT_EQ (converter->perform (), 4096);
200 /* check dequantized value */
201 for (int i = 0; i < 4096; i++) {
202 double val = src_data[i];
205 EXPECT_EQ (dst_data[i], (uint16_t) val);
213 * @brief Test perform() with dequantization (QSYMM16)
215 TEST (ne_core_data_test, perform_dequantization_symm16) {
216 std::unique_ptr<DataConverter> converter (new DataConverter (false));
217 int16_t *src_data = new int16_t[4096];
218 uint32_t *dst_data = new uint32_t[4096];
219 uint32_t data_dims[] = {1, 8, 8, 64};
223 converter->setData (src_data, dst_data, 4096 * 2);
224 converter->setDataDims (data_dims);
225 converter->setDataLayout (DATA_LAYOUT_TRIV2, DATA_LAYOUT_TRIV2);
226 converter->setDataType (DATA_TYPE_QSYMM16, DATA_TYPE_UINT32);
227 converter->setQuantZero (zero);
228 converter->setQuantScale (scale);
231 for (int i = 0; i < 4096; i++) {
232 src_data[i] = rand () % INT16_MAX;
236 EXPECT_EQ (converter->perform (), 4096 * 2);
238 /* check dequantized value */
239 for (int i = 0; i < 4096; i++) {
240 double val = src_data[i];
243 EXPECT_EQ (dst_data[i], (int32_t) val);
251 * @brief Test perform() with layer conversion (QASYMM8)
253 TEST (ne_core_data_test, perform_layer_conversion_asymm8) {
254 std::unique_ptr<DataConverter> converter (new DataConverter (true));
255 uint8_t *src_data = new uint8_t[4096];
256 uint8_t *dst_data = new uint8_t[4096];
257 uint32_t data_dims[] = {1, 8, 8, 64};
258 uint32_t granularity = DATA_GRANULARITY;
260 converter->setData (src_data, dst_data, 4096);
261 converter->setDataDims (data_dims);
262 converter->setDataLayout (DATA_LAYOUT_NHWC, DATA_LAYOUT_TRIV2);
263 converter->setDataType (DATA_TYPE_QASYMM8, DATA_TYPE_QASYMM8);
266 for (int i = 0; i < 4096; i++) {
267 src_data[i] = rand () % UINT8_MAX;
271 EXPECT_EQ (converter->perform (), 4096);
274 EXPECT_EQ (memcmp (src_data, dst_data, 4096), 0);
277 converter->setTops (2);
278 EXPECT_EQ (converter->perform (), 4096);
280 for (int i = 0; i < 4096; i += granularity) {
282 memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity),
285 EXPECT_EQ (memcmp (src_data + i + (granularity / 2),
286 dst_data + (granularity / 2) * (i / granularity) + 2048,
296 * @brief Test perform() with layer conversion (QSYMM16)
298 TEST (ne_core_data_test, perform_layer_conversion_symm16) {
299 std::unique_ptr<DataConverter> converter (new DataConverter (true));
300 int16_t *src_data = new int16_t[4096];
301 int16_t *dst_data = new int16_t[4096];
302 uint32_t data_dims[] = {1, 8, 8, 64};
303 uint32_t granularity = DATA_GRANULARITY;
305 converter->setData (src_data, dst_data, 4096 * 2);
306 converter->setDataDims (data_dims);
307 converter->setDataLayout (DATA_LAYOUT_NHWC, DATA_LAYOUT_TRIV2);
308 converter->setDataType (DATA_TYPE_QSYMM16, DATA_TYPE_QSYMM16);
311 for (int i = 0; i < 4096; i++) {
312 src_data[i] = rand () % INT16_MAX;
316 EXPECT_EQ (converter->perform (), 4096 * 2);
319 for (int i = 0; i < 4096; i += granularity) {
321 memcmp (src_data + i, dst_data + (granularity / 2) * (i / granularity),
324 EXPECT_EQ (memcmp (src_data + i + (granularity / 2),
325 dst_data + (granularity / 2) * (i / granularity) + 2048,
331 converter->setTops (2);
332 EXPECT_EQ (converter->perform (), 4096 * 2);
334 for (int i = 0; i < 4096; i += granularity) {
336 memcmp (src_data + i, dst_data + (granularity / 4) * (i / granularity),
339 EXPECT_EQ (memcmp (src_data + i + (granularity / 4),
340 dst_data + (granularity / 4) * (i / granularity) + 1024,
343 EXPECT_EQ (memcmp (src_data + i + 2 * (granularity / 4),
344 dst_data + (granularity / 4) * (i / granularity) + 2048,
347 EXPECT_EQ (memcmp (src_data + i + 3 * (granularity / 4),
348 dst_data + (granularity / 4) * (i / granularity) + 3072,
358 * @brief Test perform() with negative cases
360 TEST (ne_core_data_test, perform_n) {
361 std::unique_ptr<DataConverter> converter (new DataConverter (true));
362 char *dummy_data = new char[4096];
363 uint32_t dummy_dims[] = {1, 1, 1, 4096};
365 /* invalid parameters */
366 converter->setData (nullptr, nullptr, 4096);
367 EXPECT_EQ (converter->perform (), 0);
369 converter->setData (dummy_data, nullptr, 4096);
370 EXPECT_EQ (converter->perform (), 0);
372 converter->setData (nullptr, dummy_data, 4096);
373 EXPECT_EQ (converter->perform (), 0);
375 converter->setData (dummy_data, dummy_data, 0);
376 EXPECT_EQ (converter->perform (), 0);
378 converter->setData (dummy_data, dummy_data, 4096);
379 converter->setDataDims (nullptr);
380 EXPECT_EQ (converter->perform (), 0);
382 /* still layout/types are not resolved */
383 converter->setDataDims (dummy_dims);
384 EXPECT_EQ (converter->perform (), 0);
390 * @brief main function for unit test
393 main (int argc, char **argv) {
394 return start_gtest (argc, argv);