bc286124c87310d4a8cd6920e8dd8c7a265294cb
[platform/core/ml/nntrainer.git] / test / unittest / unittest_nntrainer_tensor_fp16.cpp
1 // SPDX-License-Identifier: Apache-2.0
2 /**
3  * Copyright (C) 2020 Jijoong Moon <jijoong.moon@samsung.com>
4  *
5  * @file        unittest_nntrainer_tensor.cpp
6  * @date        03 June 2020
7  * @brief       Unit test utility for tensor.
8  * @see         https://github.com/nnstreamer/nntrainer
9  * @author      Jijoong Moon <jijoong.moon@samsung.com>
10  * @bug         No known bugs
11  */
12 #include <gtest/gtest.h>
13
14 #include "nntrainer_test_util.h"
15 #include "util_func.h"
16 #include <fstream>
17 #include <iostream>
18 #include <nntrainer_error.h>
19 #include <tensor.h>
20 #include <tensor_dim.h>
21
22 TEST(nntrainer_Tensor, Tensor_01_fp16_p) {
23   int status = ML_ERROR_NONE;
24   nntrainer::Tensor tensor = nntrainer::Tensor(
25     1, 2, 3, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
26   tensor.setZero();
27   ASSERT_NE(nullptr, tensor.getData<_Float16>());
28   if (tensor.getValue<_Float16>(0, 0, 0, 0) != 0.0)
29     status = ML_ERROR_INVALID_PARAMETER;
30   EXPECT_EQ(status, ML_ERROR_NONE);
31 }
32
33 TEST(nntrainer_Tensor, Tensor_01_nhwc_fp16_p) {
34   int status = ML_ERROR_NONE;
35   nntrainer::Tensor tensor = nntrainer::Tensor(
36     1, 2, 3, nntrainer::Tformat::NHWC, nntrainer::Tdatatype::FP16);
37   tensor.setZero();
38   ASSERT_NE(nullptr, tensor.getData<_Float16>());
39   if (tensor.getValue<_Float16>(0, 0, 0, 0) != 0.0)
40     status = ML_ERROR_INVALID_PARAMETER;
41   EXPECT_EQ(status, ML_ERROR_NONE);
42 }
43
44 TEST(nntrainer_Tensor, Tensor_02_fp16_p) {
45   int status = ML_ERROR_NONE;
46   int height = 3;
47   int width = 10;
48   std::vector<std::vector<_Float16>> in;
49   for (int i = 0; i < height; ++i) {
50     std::vector<_Float16> tv;
51     for (int j = 0; j < width; ++j) {
52       tv.push_back(static_cast<_Float16>(i * 2.0 + j));
53     }
54     in.push_back(tv);
55   }
56
57   nntrainer::Tensor tensor =
58     nntrainer::Tensor(in, {ml::train::TensorDim::Format::NCHW,
59                            ml::train::TensorDim::DataType::FP16});
60   ASSERT_NE(nullptr, tensor.getData<_Float16>());
61
62   if (tensor.getValue<_Float16>(0, 0, 0, 1) != 1.0)
63     status = ML_ERROR_INVALID_PARAMETER;
64   EXPECT_EQ(status, ML_ERROR_NONE);
65 }
66
67 TEST(nntrainer_Tensor, Tensor_03_fp16_p) {
68   int status = ML_ERROR_NONE;
69   int batch = 3;
70   int height = 3;
71   int width = 10;
72   std::vector<std::vector<std::vector<_Float16>>> in;
73   for (int k = 0; k < batch; ++k) {
74     std::vector<std::vector<_Float16>> ttv;
75     for (int i = 0; i < height; ++i) {
76       std::vector<_Float16> tv;
77       for (int j = 0; j < width; ++j) {
78         tv.push_back(k * height * width + i * width + j);
79       }
80       ttv.push_back(tv);
81     }
82     in.push_back(ttv);
83   }
84
85   nntrainer::Tensor tensor =
86     nntrainer::Tensor(in, {ml::train::TensorDim::Format::NCHW,
87                            ml::train::TensorDim::DataType::FP16});
88   ASSERT_NE(nullptr, tensor.getData<_Float16>());
89
90   if (tensor.getValue<_Float16>(0, 0, 0, 1) != 1.0)
91     status = ML_ERROR_INVALID_PARAMETER;
92   EXPECT_EQ(status, ML_ERROR_NONE);
93 }
94
95 TEST(nntrainer_Tensor, multiply_i_01_fp16_p) {
96   int status = ML_ERROR_NONE;
97   int batch = 3;
98   int channel = 1;
99   int height = 3;
100   int width = 10;
101
102   nntrainer::Tensor input(batch, channel, height, width,
103                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
104
105   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
106   input.print(std::cout);
107
108   nntrainer::Tensor original;
109   original.copy(input);
110
111   status = input.multiply_i(2.0);
112   EXPECT_EQ(status, ML_ERROR_NONE);
113   input.print(std::cout);
114
115   _Float16 *data = original.getData<_Float16>();
116   ASSERT_NE(nullptr, data);
117   _Float16 *indata = input.getData<_Float16>();
118   ASSERT_NE(nullptr, indata);
119
120   for (int i = 0; i < batch * height * width * channel; ++i) {
121     EXPECT_FLOAT_EQ(data[i] + data[i], indata[i]);
122   }
123 }
124
125 TEST(nntrainer_Tensor, multiply_i_02_fp16_p) {
126   int status = ML_ERROR_NONE;
127   int batch = 3;
128   int channel = 1;
129   int height = 3;
130   int width = 10;
131
132   nntrainer::Tensor input(batch, channel, height, width,
133                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
134   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
135
136   nntrainer::Tensor original;
137   original.copy(input);
138
139   status = input.multiply_i(input);
140   EXPECT_EQ(status, ML_ERROR_NONE);
141
142   _Float16 *data = original.getData<_Float16>();
143   ASSERT_NE(nullptr, data);
144   _Float16 *indata = input.getData<_Float16>();
145   ASSERT_NE(nullptr, indata);
146
147   for (int i = 0; i < batch * height * width * channel; ++i) {
148     EXPECT_FLOAT_EQ(data[i] * data[i], indata[i]);
149   }
150 }
151
152 TEST(nntrainer_Tensor, multiply_i_03_fp16_n) {
153   int status = ML_ERROR_NONE;
154   int batch = 3;
155   int channel = 1;
156   int height = 3;
157   int width = 10;
158
159   nntrainer::Tensor input(batch, channel, height, width,
160                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
161   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
162
163   nntrainer::Tensor target2(batch, channel, height - 2, width - 1,
164                             nntrainer::Tformat::NCHW,
165                             nntrainer::Tdatatype::FP16);
166   status = input.multiply_i(target2);
167
168   EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
169 }
170
171 TEST(nntrainer_Tensor, multiply_i_broadcast_01_fp16_p) {
172   {
173     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
174                                  nntrainer::Tdatatype::FP16);
175     nntrainer::Tensor t =
176       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
177     nntrainer::Tensor m =
178       ranged(1, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
179     _Float16 answer_data[] = {
180       static_cast<_Float16>(0),    static_cast<_Float16>(1),
181       static_cast<_Float16>(4),    static_cast<_Float16>(9),
182       static_cast<_Float16>(16),   static_cast<_Float16>(25),
183       static_cast<_Float16>(36),   static_cast<_Float16>(49),
184       static_cast<_Float16>(64),   static_cast<_Float16>(81),
185       static_cast<_Float16>(100),  static_cast<_Float16>(121),
186       static_cast<_Float16>(144),  static_cast<_Float16>(169),
187       static_cast<_Float16>(196),  static_cast<_Float16>(225),
188       static_cast<_Float16>(256),  static_cast<_Float16>(289),
189       static_cast<_Float16>(324),  static_cast<_Float16>(361),
190       static_cast<_Float16>(400),  static_cast<_Float16>(441),
191       static_cast<_Float16>(484),  static_cast<_Float16>(529),
192       static_cast<_Float16>(576),  static_cast<_Float16>(625),
193       static_cast<_Float16>(676),  static_cast<_Float16>(729),
194       static_cast<_Float16>(784),  static_cast<_Float16>(841),
195       static_cast<_Float16>(900),  static_cast<_Float16>(961),
196       static_cast<_Float16>(1024), static_cast<_Float16>(1089),
197       static_cast<_Float16>(1156), static_cast<_Float16>(1225),
198       static_cast<_Float16>(1296), static_cast<_Float16>(1369),
199       static_cast<_Float16>(1444), static_cast<_Float16>(1521),
200       static_cast<_Float16>(0),    static_cast<_Float16>(41),
201       static_cast<_Float16>(84),   static_cast<_Float16>(129),
202       static_cast<_Float16>(176),  static_cast<_Float16>(225),
203       static_cast<_Float16>(276),  static_cast<_Float16>(329),
204       static_cast<_Float16>(384),  static_cast<_Float16>(441),
205       static_cast<_Float16>(500),  static_cast<_Float16>(561),
206       static_cast<_Float16>(624),  static_cast<_Float16>(689),
207       static_cast<_Float16>(756),  static_cast<_Float16>(825),
208       static_cast<_Float16>(896),  static_cast<_Float16>(969),
209       static_cast<_Float16>(1044), static_cast<_Float16>(1121),
210       static_cast<_Float16>(1200), static_cast<_Float16>(1281),
211       static_cast<_Float16>(1364), static_cast<_Float16>(1449),
212       static_cast<_Float16>(1536), static_cast<_Float16>(1625),
213       static_cast<_Float16>(1716), static_cast<_Float16>(1809),
214       static_cast<_Float16>(1904), static_cast<_Float16>(2001),
215       static_cast<_Float16>(2100), static_cast<_Float16>(2201),
216       static_cast<_Float16>(2304), static_cast<_Float16>(2409),
217       static_cast<_Float16>(2516), static_cast<_Float16>(2625),
218       static_cast<_Float16>(2736), static_cast<_Float16>(2849),
219       static_cast<_Float16>(2964), static_cast<_Float16>(3081),
220       static_cast<_Float16>(0),    static_cast<_Float16>(81),
221       static_cast<_Float16>(164),  static_cast<_Float16>(249),
222       static_cast<_Float16>(336),  static_cast<_Float16>(425),
223       static_cast<_Float16>(516),  static_cast<_Float16>(609),
224       static_cast<_Float16>(704),  static_cast<_Float16>(801),
225       static_cast<_Float16>(900),  static_cast<_Float16>(1001),
226       static_cast<_Float16>(1104), static_cast<_Float16>(1209),
227       static_cast<_Float16>(1316), static_cast<_Float16>(1425),
228       static_cast<_Float16>(1536), static_cast<_Float16>(1649),
229       static_cast<_Float16>(1764), static_cast<_Float16>(1881),
230       static_cast<_Float16>(2000), static_cast<_Float16>(2121),
231       static_cast<_Float16>(2244), static_cast<_Float16>(2369),
232       static_cast<_Float16>(2496), static_cast<_Float16>(2625),
233       static_cast<_Float16>(2756), static_cast<_Float16>(2889),
234       static_cast<_Float16>(3024), static_cast<_Float16>(3161),
235       static_cast<_Float16>(3300), static_cast<_Float16>(3441),
236       static_cast<_Float16>(3584), static_cast<_Float16>(3729),
237       static_cast<_Float16>(3876), static_cast<_Float16>(4025),
238       static_cast<_Float16>(4176), static_cast<_Float16>(4329),
239       static_cast<_Float16>(4484), static_cast<_Float16>(4641)};
240     nntrainer::Tensor answer(ref_dim, answer_data);
241     int status = t.multiply_i(m);
242     EXPECT_EQ(status, ML_ERROR_NONE);
243     EXPECT_EQ(t, answer);
244   }
245   {
246     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
247                                  nntrainer::Tdatatype::FP16);
248     nntrainer::Tensor t =
249       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
250     nntrainer::Tensor m =
251       ranged(3, 1, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
252     _Float16 answer_data[] = {
253       static_cast<_Float16>(0),    static_cast<_Float16>(1),
254       static_cast<_Float16>(4),    static_cast<_Float16>(9),
255       static_cast<_Float16>(16),   static_cast<_Float16>(25),
256       static_cast<_Float16>(36),   static_cast<_Float16>(49),
257       static_cast<_Float16>(64),   static_cast<_Float16>(81),
258       static_cast<_Float16>(100),  static_cast<_Float16>(121),
259       static_cast<_Float16>(144),  static_cast<_Float16>(169),
260       static_cast<_Float16>(196),  static_cast<_Float16>(225),
261       static_cast<_Float16>(256),  static_cast<_Float16>(289),
262       static_cast<_Float16>(324),  static_cast<_Float16>(361),
263       static_cast<_Float16>(0),    static_cast<_Float16>(21),
264       static_cast<_Float16>(44),   static_cast<_Float16>(69),
265       static_cast<_Float16>(96),   static_cast<_Float16>(125),
266       static_cast<_Float16>(156),  static_cast<_Float16>(189),
267       static_cast<_Float16>(224),  static_cast<_Float16>(261),
268       static_cast<_Float16>(300),  static_cast<_Float16>(341),
269       static_cast<_Float16>(384),  static_cast<_Float16>(429),
270       static_cast<_Float16>(476),  static_cast<_Float16>(525),
271       static_cast<_Float16>(576),  static_cast<_Float16>(629),
272       static_cast<_Float16>(684),  static_cast<_Float16>(741),
273       static_cast<_Float16>(800),  static_cast<_Float16>(861),
274       static_cast<_Float16>(924),  static_cast<_Float16>(989),
275       static_cast<_Float16>(1056), static_cast<_Float16>(1125),
276       static_cast<_Float16>(1196), static_cast<_Float16>(1269),
277       static_cast<_Float16>(1344), static_cast<_Float16>(1421),
278       static_cast<_Float16>(1500), static_cast<_Float16>(1581),
279       static_cast<_Float16>(1664), static_cast<_Float16>(1749),
280       static_cast<_Float16>(1836), static_cast<_Float16>(1925),
281       static_cast<_Float16>(2016), static_cast<_Float16>(2109),
282       static_cast<_Float16>(2204), static_cast<_Float16>(2301),
283       static_cast<_Float16>(1200), static_cast<_Float16>(1281),
284       static_cast<_Float16>(1364), static_cast<_Float16>(1449),
285       static_cast<_Float16>(1536), static_cast<_Float16>(1625),
286       static_cast<_Float16>(1716), static_cast<_Float16>(1809),
287       static_cast<_Float16>(1904), static_cast<_Float16>(2001),
288       static_cast<_Float16>(2100), static_cast<_Float16>(2201),
289       static_cast<_Float16>(2304), static_cast<_Float16>(2409),
290       static_cast<_Float16>(2516), static_cast<_Float16>(2625),
291       static_cast<_Float16>(2736), static_cast<_Float16>(2849),
292       static_cast<_Float16>(2964), static_cast<_Float16>(3081),
293       static_cast<_Float16>(3200), static_cast<_Float16>(3321),
294       static_cast<_Float16>(3444), static_cast<_Float16>(3569),
295       static_cast<_Float16>(3696), static_cast<_Float16>(3825),
296       static_cast<_Float16>(3956), static_cast<_Float16>(4089),
297       static_cast<_Float16>(4224), static_cast<_Float16>(4361),
298       static_cast<_Float16>(4500), static_cast<_Float16>(4641),
299       static_cast<_Float16>(4784), static_cast<_Float16>(4929),
300       static_cast<_Float16>(5076), static_cast<_Float16>(5225),
301       static_cast<_Float16>(5376), static_cast<_Float16>(5529),
302       static_cast<_Float16>(5684), static_cast<_Float16>(5841),
303       static_cast<_Float16>(4000), static_cast<_Float16>(4141),
304       static_cast<_Float16>(4284), static_cast<_Float16>(4429),
305       static_cast<_Float16>(4576), static_cast<_Float16>(4725),
306       static_cast<_Float16>(4876), static_cast<_Float16>(5029),
307       static_cast<_Float16>(5184), static_cast<_Float16>(5341),
308       static_cast<_Float16>(5500), static_cast<_Float16>(5661),
309       static_cast<_Float16>(5824), static_cast<_Float16>(5989),
310       static_cast<_Float16>(6156), static_cast<_Float16>(6325),
311       static_cast<_Float16>(6496), static_cast<_Float16>(6669),
312       static_cast<_Float16>(6844), static_cast<_Float16>(7021)};
313     nntrainer::Tensor answer(ref_dim, answer_data);
314     int status = t.multiply_i(m);
315     EXPECT_EQ(status, ML_ERROR_NONE);
316     EXPECT_EQ(t, answer);
317   }
318   {
319     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
320                                  nntrainer::Tdatatype::FP16);
321     nntrainer::Tensor t =
322       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
323     nntrainer::Tensor m =
324       ranged(3, 2, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
325     _Float16 answer_data[] = {
326       static_cast<_Float16>(0),    static_cast<_Float16>(0),
327       static_cast<_Float16>(0),    static_cast<_Float16>(0),
328       static_cast<_Float16>(0),    static_cast<_Float16>(5),
329       static_cast<_Float16>(6),    static_cast<_Float16>(7),
330       static_cast<_Float16>(8),    static_cast<_Float16>(9),
331       static_cast<_Float16>(20),   static_cast<_Float16>(22),
332       static_cast<_Float16>(24),   static_cast<_Float16>(26),
333       static_cast<_Float16>(28),   static_cast<_Float16>(45),
334       static_cast<_Float16>(48),   static_cast<_Float16>(51),
335       static_cast<_Float16>(54),   static_cast<_Float16>(57),
336       static_cast<_Float16>(80),   static_cast<_Float16>(84),
337       static_cast<_Float16>(88),   static_cast<_Float16>(92),
338       static_cast<_Float16>(96),   static_cast<_Float16>(125),
339       static_cast<_Float16>(130),  static_cast<_Float16>(135),
340       static_cast<_Float16>(140),  static_cast<_Float16>(145),
341       static_cast<_Float16>(180),  static_cast<_Float16>(186),
342       static_cast<_Float16>(192),  static_cast<_Float16>(198),
343       static_cast<_Float16>(204),  static_cast<_Float16>(245),
344       static_cast<_Float16>(252),  static_cast<_Float16>(259),
345       static_cast<_Float16>(266),  static_cast<_Float16>(273),
346       static_cast<_Float16>(320),  static_cast<_Float16>(328),
347       static_cast<_Float16>(336),  static_cast<_Float16>(344),
348       static_cast<_Float16>(352),  static_cast<_Float16>(405),
349       static_cast<_Float16>(414),  static_cast<_Float16>(423),
350       static_cast<_Float16>(432),  static_cast<_Float16>(441),
351       static_cast<_Float16>(500),  static_cast<_Float16>(510),
352       static_cast<_Float16>(520),  static_cast<_Float16>(530),
353       static_cast<_Float16>(540),  static_cast<_Float16>(605),
354       static_cast<_Float16>(616),  static_cast<_Float16>(627),
355       static_cast<_Float16>(638),  static_cast<_Float16>(649),
356       static_cast<_Float16>(720),  static_cast<_Float16>(732),
357       static_cast<_Float16>(744),  static_cast<_Float16>(756),
358       static_cast<_Float16>(768),  static_cast<_Float16>(845),
359       static_cast<_Float16>(858),  static_cast<_Float16>(871),
360       static_cast<_Float16>(884),  static_cast<_Float16>(897),
361       static_cast<_Float16>(980),  static_cast<_Float16>(994),
362       static_cast<_Float16>(1008), static_cast<_Float16>(1022),
363       static_cast<_Float16>(1036), static_cast<_Float16>(1125),
364       static_cast<_Float16>(1140), static_cast<_Float16>(1155),
365       static_cast<_Float16>(1170), static_cast<_Float16>(1185),
366       static_cast<_Float16>(1280), static_cast<_Float16>(1296),
367       static_cast<_Float16>(1312), static_cast<_Float16>(1328),
368       static_cast<_Float16>(1344), static_cast<_Float16>(1445),
369       static_cast<_Float16>(1462), static_cast<_Float16>(1479),
370       static_cast<_Float16>(1496), static_cast<_Float16>(1513),
371       static_cast<_Float16>(1620), static_cast<_Float16>(1638),
372       static_cast<_Float16>(1656), static_cast<_Float16>(1674),
373       static_cast<_Float16>(1692), static_cast<_Float16>(1805),
374       static_cast<_Float16>(1824), static_cast<_Float16>(1843),
375       static_cast<_Float16>(1862), static_cast<_Float16>(1881),
376       static_cast<_Float16>(2000), static_cast<_Float16>(2020),
377       static_cast<_Float16>(2040), static_cast<_Float16>(2060),
378       static_cast<_Float16>(2080), static_cast<_Float16>(2205),
379       static_cast<_Float16>(2226), static_cast<_Float16>(2247),
380       static_cast<_Float16>(2268), static_cast<_Float16>(2289),
381       static_cast<_Float16>(2420), static_cast<_Float16>(2442),
382       static_cast<_Float16>(2464), static_cast<_Float16>(2486),
383       static_cast<_Float16>(2508), static_cast<_Float16>(2645),
384       static_cast<_Float16>(2668), static_cast<_Float16>(2691),
385       static_cast<_Float16>(2714), static_cast<_Float16>(2737)};
386     nntrainer::Tensor answer(ref_dim, answer_data);
387     int status = t.multiply_i(m);
388     EXPECT_EQ(status, ML_ERROR_NONE);
389     EXPECT_EQ(t, answer);
390   }
391   {
392     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
393                                  nntrainer::Tdatatype::FP16);
394     nntrainer::Tensor t =
395       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
396     nntrainer::Tensor m =
397       ranged(3, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
398     _Float16 answer_data[] = {
399       static_cast<_Float16>(0),    static_cast<_Float16>(1),
400       static_cast<_Float16>(4),    static_cast<_Float16>(9),
401       static_cast<_Float16>(16),   static_cast<_Float16>(0),
402       static_cast<_Float16>(6),    static_cast<_Float16>(14),
403       static_cast<_Float16>(24),   static_cast<_Float16>(36),
404       static_cast<_Float16>(0),    static_cast<_Float16>(11),
405       static_cast<_Float16>(24),   static_cast<_Float16>(39),
406       static_cast<_Float16>(56),   static_cast<_Float16>(0),
407       static_cast<_Float16>(16),   static_cast<_Float16>(34),
408       static_cast<_Float16>(54),   static_cast<_Float16>(76),
409       static_cast<_Float16>(0),    static_cast<_Float16>(21),
410       static_cast<_Float16>(44),   static_cast<_Float16>(69),
411       static_cast<_Float16>(96),   static_cast<_Float16>(0),
412       static_cast<_Float16>(26),   static_cast<_Float16>(54),
413       static_cast<_Float16>(84),   static_cast<_Float16>(116),
414       static_cast<_Float16>(0),    static_cast<_Float16>(31),
415       static_cast<_Float16>(64),   static_cast<_Float16>(99),
416       static_cast<_Float16>(136),  static_cast<_Float16>(0),
417       static_cast<_Float16>(36),   static_cast<_Float16>(74),
418       static_cast<_Float16>(114),  static_cast<_Float16>(156),
419       static_cast<_Float16>(200),  static_cast<_Float16>(246),
420       static_cast<_Float16>(294),  static_cast<_Float16>(344),
421       static_cast<_Float16>(396),  static_cast<_Float16>(225),
422       static_cast<_Float16>(276),  static_cast<_Float16>(329),
423       static_cast<_Float16>(384),  static_cast<_Float16>(441),
424       static_cast<_Float16>(250),  static_cast<_Float16>(306),
425       static_cast<_Float16>(364),  static_cast<_Float16>(424),
426       static_cast<_Float16>(486),  static_cast<_Float16>(275),
427       static_cast<_Float16>(336),  static_cast<_Float16>(399),
428       static_cast<_Float16>(464),  static_cast<_Float16>(531),
429       static_cast<_Float16>(300),  static_cast<_Float16>(366),
430       static_cast<_Float16>(434),  static_cast<_Float16>(504),
431       static_cast<_Float16>(576),  static_cast<_Float16>(325),
432       static_cast<_Float16>(396),  static_cast<_Float16>(469),
433       static_cast<_Float16>(544),  static_cast<_Float16>(621),
434       static_cast<_Float16>(350),  static_cast<_Float16>(426),
435       static_cast<_Float16>(504),  static_cast<_Float16>(584),
436       static_cast<_Float16>(666),  static_cast<_Float16>(375),
437       static_cast<_Float16>(456),  static_cast<_Float16>(539),
438       static_cast<_Float16>(624),  static_cast<_Float16>(711),
439       static_cast<_Float16>(800),  static_cast<_Float16>(891),
440       static_cast<_Float16>(984),  static_cast<_Float16>(1079),
441       static_cast<_Float16>(1176), static_cast<_Float16>(850),
442       static_cast<_Float16>(946),  static_cast<_Float16>(1044),
443       static_cast<_Float16>(1144), static_cast<_Float16>(1246),
444       static_cast<_Float16>(900),  static_cast<_Float16>(1001),
445       static_cast<_Float16>(1104), static_cast<_Float16>(1209),
446       static_cast<_Float16>(1316), static_cast<_Float16>(950),
447       static_cast<_Float16>(1056), static_cast<_Float16>(1164),
448       static_cast<_Float16>(1274), static_cast<_Float16>(1386),
449       static_cast<_Float16>(1000), static_cast<_Float16>(1111),
450       static_cast<_Float16>(1224), static_cast<_Float16>(1339),
451       static_cast<_Float16>(1456), static_cast<_Float16>(1050),
452       static_cast<_Float16>(1166), static_cast<_Float16>(1284),
453       static_cast<_Float16>(1404), static_cast<_Float16>(1526),
454       static_cast<_Float16>(1100), static_cast<_Float16>(1221),
455       static_cast<_Float16>(1344), static_cast<_Float16>(1469),
456       static_cast<_Float16>(1596), static_cast<_Float16>(1150),
457       static_cast<_Float16>(1276), static_cast<_Float16>(1404),
458       static_cast<_Float16>(1534), static_cast<_Float16>(1666)};
459     nntrainer::Tensor answer(ref_dim, answer_data);
460     int status = t.multiply_i(m);
461     EXPECT_EQ(status, ML_ERROR_NONE);
462     EXPECT_EQ(t, answer);
463   }
464   {
465     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
466                                  nntrainer::Tdatatype::FP16);
467     nntrainer::Tensor t =
468       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
469     nntrainer::Tensor m =
470       ranged(1, 2, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
471     _Float16 answer_data[] = {
472       static_cast<_Float16>(0),    static_cast<_Float16>(1),
473       static_cast<_Float16>(4),    static_cast<_Float16>(9),
474       static_cast<_Float16>(16),   static_cast<_Float16>(0),
475       static_cast<_Float16>(6),    static_cast<_Float16>(14),
476       static_cast<_Float16>(24),   static_cast<_Float16>(36),
477       static_cast<_Float16>(0),    static_cast<_Float16>(11),
478       static_cast<_Float16>(24),   static_cast<_Float16>(39),
479       static_cast<_Float16>(56),   static_cast<_Float16>(0),
480       static_cast<_Float16>(16),   static_cast<_Float16>(34),
481       static_cast<_Float16>(54),   static_cast<_Float16>(76),
482       static_cast<_Float16>(100),  static_cast<_Float16>(126),
483       static_cast<_Float16>(154),  static_cast<_Float16>(184),
484       static_cast<_Float16>(216),  static_cast<_Float16>(125),
485       static_cast<_Float16>(156),  static_cast<_Float16>(189),
486       static_cast<_Float16>(224),  static_cast<_Float16>(261),
487       static_cast<_Float16>(150),  static_cast<_Float16>(186),
488       static_cast<_Float16>(224),  static_cast<_Float16>(264),
489       static_cast<_Float16>(306),  static_cast<_Float16>(175),
490       static_cast<_Float16>(216),  static_cast<_Float16>(259),
491       static_cast<_Float16>(304),  static_cast<_Float16>(351),
492       static_cast<_Float16>(0),    static_cast<_Float16>(41),
493       static_cast<_Float16>(84),   static_cast<_Float16>(129),
494       static_cast<_Float16>(176),  static_cast<_Float16>(0),
495       static_cast<_Float16>(46),   static_cast<_Float16>(94),
496       static_cast<_Float16>(144),  static_cast<_Float16>(196),
497       static_cast<_Float16>(0),    static_cast<_Float16>(51),
498       static_cast<_Float16>(104),  static_cast<_Float16>(159),
499       static_cast<_Float16>(216),  static_cast<_Float16>(0),
500       static_cast<_Float16>(56),   static_cast<_Float16>(114),
501       static_cast<_Float16>(174),  static_cast<_Float16>(236),
502       static_cast<_Float16>(300),  static_cast<_Float16>(366),
503       static_cast<_Float16>(434),  static_cast<_Float16>(504),
504       static_cast<_Float16>(576),  static_cast<_Float16>(325),
505       static_cast<_Float16>(396),  static_cast<_Float16>(469),
506       static_cast<_Float16>(544),  static_cast<_Float16>(621),
507       static_cast<_Float16>(350),  static_cast<_Float16>(426),
508       static_cast<_Float16>(504),  static_cast<_Float16>(584),
509       static_cast<_Float16>(666),  static_cast<_Float16>(375),
510       static_cast<_Float16>(456),  static_cast<_Float16>(539),
511       static_cast<_Float16>(624),  static_cast<_Float16>(711),
512       static_cast<_Float16>(0),    static_cast<_Float16>(81),
513       static_cast<_Float16>(164),  static_cast<_Float16>(249),
514       static_cast<_Float16>(336),  static_cast<_Float16>(0),
515       static_cast<_Float16>(86),   static_cast<_Float16>(174),
516       static_cast<_Float16>(264),  static_cast<_Float16>(356),
517       static_cast<_Float16>(0),    static_cast<_Float16>(91),
518       static_cast<_Float16>(184),  static_cast<_Float16>(279),
519       static_cast<_Float16>(376),  static_cast<_Float16>(0),
520       static_cast<_Float16>(96),   static_cast<_Float16>(194),
521       static_cast<_Float16>(294),  static_cast<_Float16>(396),
522       static_cast<_Float16>(500),  static_cast<_Float16>(606),
523       static_cast<_Float16>(714),  static_cast<_Float16>(824),
524       static_cast<_Float16>(936),  static_cast<_Float16>(525),
525       static_cast<_Float16>(636),  static_cast<_Float16>(749),
526       static_cast<_Float16>(864),  static_cast<_Float16>(981),
527       static_cast<_Float16>(550),  static_cast<_Float16>(666),
528       static_cast<_Float16>(784),  static_cast<_Float16>(904),
529       static_cast<_Float16>(1026), static_cast<_Float16>(575),
530       static_cast<_Float16>(696),  static_cast<_Float16>(819),
531       static_cast<_Float16>(944),  static_cast<_Float16>(1071)};
532     nntrainer::Tensor answer(ref_dim, answer_data);
533     int status = t.multiply_i(m);
534     EXPECT_EQ(status, ML_ERROR_NONE);
535     EXPECT_EQ(t, answer);
536   }
537   {
538     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
539                                  nntrainer::Tdatatype::FP16);
540     nntrainer::Tensor t =
541       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
542     nntrainer::Tensor m =
543       ranged(3, 1, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
544     _Float16 answer_data[] = {
545       static_cast<_Float16>(0),    static_cast<_Float16>(0),
546       static_cast<_Float16>(0),    static_cast<_Float16>(0),
547       static_cast<_Float16>(0),    static_cast<_Float16>(5),
548       static_cast<_Float16>(6),    static_cast<_Float16>(7),
549       static_cast<_Float16>(8),    static_cast<_Float16>(9),
550       static_cast<_Float16>(20),   static_cast<_Float16>(22),
551       static_cast<_Float16>(24),   static_cast<_Float16>(26),
552       static_cast<_Float16>(28),   static_cast<_Float16>(45),
553       static_cast<_Float16>(48),   static_cast<_Float16>(51),
554       static_cast<_Float16>(54),   static_cast<_Float16>(57),
555       static_cast<_Float16>(0),    static_cast<_Float16>(0),
556       static_cast<_Float16>(0),    static_cast<_Float16>(0),
557       static_cast<_Float16>(0),    static_cast<_Float16>(25),
558       static_cast<_Float16>(26),   static_cast<_Float16>(27),
559       static_cast<_Float16>(28),   static_cast<_Float16>(29),
560       static_cast<_Float16>(60),   static_cast<_Float16>(62),
561       static_cast<_Float16>(64),   static_cast<_Float16>(66),
562       static_cast<_Float16>(68),   static_cast<_Float16>(105),
563       static_cast<_Float16>(108),  static_cast<_Float16>(111),
564       static_cast<_Float16>(114),  static_cast<_Float16>(117),
565       static_cast<_Float16>(160),  static_cast<_Float16>(164),
566       static_cast<_Float16>(168),  static_cast<_Float16>(172),
567       static_cast<_Float16>(176),  static_cast<_Float16>(225),
568       static_cast<_Float16>(230),  static_cast<_Float16>(235),
569       static_cast<_Float16>(240),  static_cast<_Float16>(245),
570       static_cast<_Float16>(300),  static_cast<_Float16>(306),
571       static_cast<_Float16>(312),  static_cast<_Float16>(318),
572       static_cast<_Float16>(324),  static_cast<_Float16>(385),
573       static_cast<_Float16>(392),  static_cast<_Float16>(399),
574       static_cast<_Float16>(406),  static_cast<_Float16>(413),
575       static_cast<_Float16>(240),  static_cast<_Float16>(244),
576       static_cast<_Float16>(248),  static_cast<_Float16>(252),
577       static_cast<_Float16>(256),  static_cast<_Float16>(325),
578       static_cast<_Float16>(330),  static_cast<_Float16>(335),
579       static_cast<_Float16>(340),  static_cast<_Float16>(345),
580       static_cast<_Float16>(420),  static_cast<_Float16>(426),
581       static_cast<_Float16>(432),  static_cast<_Float16>(438),
582       static_cast<_Float16>(444),  static_cast<_Float16>(525),
583       static_cast<_Float16>(532),  static_cast<_Float16>(539),
584       static_cast<_Float16>(546),  static_cast<_Float16>(553),
585       static_cast<_Float16>(640),  static_cast<_Float16>(648),
586       static_cast<_Float16>(656),  static_cast<_Float16>(664),
587       static_cast<_Float16>(672),  static_cast<_Float16>(765),
588       static_cast<_Float16>(774),  static_cast<_Float16>(783),
589       static_cast<_Float16>(792),  static_cast<_Float16>(801),
590       static_cast<_Float16>(900),  static_cast<_Float16>(910),
591       static_cast<_Float16>(920),  static_cast<_Float16>(930),
592       static_cast<_Float16>(940),  static_cast<_Float16>(1045),
593       static_cast<_Float16>(1056), static_cast<_Float16>(1067),
594       static_cast<_Float16>(1078), static_cast<_Float16>(1089),
595       static_cast<_Float16>(800),  static_cast<_Float16>(808),
596       static_cast<_Float16>(816),  static_cast<_Float16>(824),
597       static_cast<_Float16>(832),  static_cast<_Float16>(945),
598       static_cast<_Float16>(954),  static_cast<_Float16>(963),
599       static_cast<_Float16>(972),  static_cast<_Float16>(981),
600       static_cast<_Float16>(1100), static_cast<_Float16>(1110),
601       static_cast<_Float16>(1120), static_cast<_Float16>(1130),
602       static_cast<_Float16>(1140), static_cast<_Float16>(1265),
603       static_cast<_Float16>(1276), static_cast<_Float16>(1287),
604       static_cast<_Float16>(1298), static_cast<_Float16>(1309)};
605     nntrainer::Tensor answer(ref_dim, answer_data);
606     int status = t.multiply_i(m);
607     EXPECT_EQ(status, ML_ERROR_NONE);
608     EXPECT_EQ(t, answer);
609   }
610   {
611     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
612                                  nntrainer::Tdatatype::FP16);
613     nntrainer::Tensor t =
614       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
615     nntrainer::Tensor m =
616       ranged(1, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
617     _Float16 answer_data[] = {
618       static_cast<_Float16>(0),   static_cast<_Float16>(1),
619       static_cast<_Float16>(4),   static_cast<_Float16>(9),
620       static_cast<_Float16>(16),  static_cast<_Float16>(0),
621       static_cast<_Float16>(6),   static_cast<_Float16>(14),
622       static_cast<_Float16>(24),  static_cast<_Float16>(36),
623       static_cast<_Float16>(0),   static_cast<_Float16>(11),
624       static_cast<_Float16>(24),  static_cast<_Float16>(39),
625       static_cast<_Float16>(56),  static_cast<_Float16>(0),
626       static_cast<_Float16>(16),  static_cast<_Float16>(34),
627       static_cast<_Float16>(54),  static_cast<_Float16>(76),
628       static_cast<_Float16>(0),   static_cast<_Float16>(21),
629       static_cast<_Float16>(44),  static_cast<_Float16>(69),
630       static_cast<_Float16>(96),  static_cast<_Float16>(0),
631       static_cast<_Float16>(26),  static_cast<_Float16>(54),
632       static_cast<_Float16>(84),  static_cast<_Float16>(116),
633       static_cast<_Float16>(0),   static_cast<_Float16>(31),
634       static_cast<_Float16>(64),  static_cast<_Float16>(99),
635       static_cast<_Float16>(136), static_cast<_Float16>(0),
636       static_cast<_Float16>(36),  static_cast<_Float16>(74),
637       static_cast<_Float16>(114), static_cast<_Float16>(156),
638       static_cast<_Float16>(0),   static_cast<_Float16>(41),
639       static_cast<_Float16>(84),  static_cast<_Float16>(129),
640       static_cast<_Float16>(176), static_cast<_Float16>(0),
641       static_cast<_Float16>(46),  static_cast<_Float16>(94),
642       static_cast<_Float16>(144), static_cast<_Float16>(196),
643       static_cast<_Float16>(0),   static_cast<_Float16>(51),
644       static_cast<_Float16>(104), static_cast<_Float16>(159),
645       static_cast<_Float16>(216), static_cast<_Float16>(0),
646       static_cast<_Float16>(56),  static_cast<_Float16>(114),
647       static_cast<_Float16>(174), static_cast<_Float16>(236),
648       static_cast<_Float16>(0),   static_cast<_Float16>(61),
649       static_cast<_Float16>(124), static_cast<_Float16>(189),
650       static_cast<_Float16>(256), static_cast<_Float16>(0),
651       static_cast<_Float16>(66),  static_cast<_Float16>(134),
652       static_cast<_Float16>(204), static_cast<_Float16>(276),
653       static_cast<_Float16>(0),   static_cast<_Float16>(71),
654       static_cast<_Float16>(144), static_cast<_Float16>(219),
655       static_cast<_Float16>(296), static_cast<_Float16>(0),
656       static_cast<_Float16>(76),  static_cast<_Float16>(154),
657       static_cast<_Float16>(234), static_cast<_Float16>(316),
658       static_cast<_Float16>(0),   static_cast<_Float16>(81),
659       static_cast<_Float16>(164), static_cast<_Float16>(249),
660       static_cast<_Float16>(336), static_cast<_Float16>(0),
661       static_cast<_Float16>(86),  static_cast<_Float16>(174),
662       static_cast<_Float16>(264), static_cast<_Float16>(356),
663       static_cast<_Float16>(0),   static_cast<_Float16>(91),
664       static_cast<_Float16>(184), static_cast<_Float16>(279),
665       static_cast<_Float16>(376), static_cast<_Float16>(0),
666       static_cast<_Float16>(96),  static_cast<_Float16>(194),
667       static_cast<_Float16>(294), static_cast<_Float16>(396),
668       static_cast<_Float16>(0),   static_cast<_Float16>(101),
669       static_cast<_Float16>(204), static_cast<_Float16>(309),
670       static_cast<_Float16>(416), static_cast<_Float16>(0),
671       static_cast<_Float16>(106), static_cast<_Float16>(214),
672       static_cast<_Float16>(324), static_cast<_Float16>(436),
673       static_cast<_Float16>(0),   static_cast<_Float16>(111),
674       static_cast<_Float16>(224), static_cast<_Float16>(339),
675       static_cast<_Float16>(456), static_cast<_Float16>(0),
676       static_cast<_Float16>(116), static_cast<_Float16>(234),
677       static_cast<_Float16>(354), static_cast<_Float16>(476)};
678     nntrainer::Tensor answer(ref_dim, answer_data);
679     int status = t.multiply_i(m);
680     EXPECT_EQ(status, ML_ERROR_NONE);
681     EXPECT_EQ(t, answer);
682   }
683   {
684     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
685                                  nntrainer::Tdatatype::FP16);
686     nntrainer::Tensor t =
687       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
688     nntrainer::Tensor m =
689       ranged(1, 2, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
690     _Float16 answer_data[] = {
691       static_cast<_Float16>(0),   static_cast<_Float16>(0),
692       static_cast<_Float16>(0),   static_cast<_Float16>(0),
693       static_cast<_Float16>(0),   static_cast<_Float16>(0),
694       static_cast<_Float16>(0),   static_cast<_Float16>(0),
695       static_cast<_Float16>(0),   static_cast<_Float16>(0),
696       static_cast<_Float16>(0),   static_cast<_Float16>(0),
697       static_cast<_Float16>(0),   static_cast<_Float16>(0),
698       static_cast<_Float16>(0),   static_cast<_Float16>(0),
699       static_cast<_Float16>(0),   static_cast<_Float16>(0),
700       static_cast<_Float16>(0),   static_cast<_Float16>(0),
701       static_cast<_Float16>(20),  static_cast<_Float16>(21),
702       static_cast<_Float16>(22),  static_cast<_Float16>(23),
703       static_cast<_Float16>(24),  static_cast<_Float16>(25),
704       static_cast<_Float16>(26),  static_cast<_Float16>(27),
705       static_cast<_Float16>(28),  static_cast<_Float16>(29),
706       static_cast<_Float16>(30),  static_cast<_Float16>(31),
707       static_cast<_Float16>(32),  static_cast<_Float16>(33),
708       static_cast<_Float16>(34),  static_cast<_Float16>(35),
709       static_cast<_Float16>(36),  static_cast<_Float16>(37),
710       static_cast<_Float16>(38),  static_cast<_Float16>(39),
711       static_cast<_Float16>(0),   static_cast<_Float16>(0),
712       static_cast<_Float16>(0),   static_cast<_Float16>(0),
713       static_cast<_Float16>(0),   static_cast<_Float16>(0),
714       static_cast<_Float16>(0),   static_cast<_Float16>(0),
715       static_cast<_Float16>(0),   static_cast<_Float16>(0),
716       static_cast<_Float16>(0),   static_cast<_Float16>(0),
717       static_cast<_Float16>(0),   static_cast<_Float16>(0),
718       static_cast<_Float16>(0),   static_cast<_Float16>(0),
719       static_cast<_Float16>(0),   static_cast<_Float16>(0),
720       static_cast<_Float16>(0),   static_cast<_Float16>(0),
721       static_cast<_Float16>(60),  static_cast<_Float16>(61),
722       static_cast<_Float16>(62),  static_cast<_Float16>(63),
723       static_cast<_Float16>(64),  static_cast<_Float16>(65),
724       static_cast<_Float16>(66),  static_cast<_Float16>(67),
725       static_cast<_Float16>(68),  static_cast<_Float16>(69),
726       static_cast<_Float16>(70),  static_cast<_Float16>(71),
727       static_cast<_Float16>(72),  static_cast<_Float16>(73),
728       static_cast<_Float16>(74),  static_cast<_Float16>(75),
729       static_cast<_Float16>(76),  static_cast<_Float16>(77),
730       static_cast<_Float16>(78),  static_cast<_Float16>(79),
731       static_cast<_Float16>(0),   static_cast<_Float16>(0),
732       static_cast<_Float16>(0),   static_cast<_Float16>(0),
733       static_cast<_Float16>(0),   static_cast<_Float16>(0),
734       static_cast<_Float16>(0),   static_cast<_Float16>(0),
735       static_cast<_Float16>(0),   static_cast<_Float16>(0),
736       static_cast<_Float16>(0),   static_cast<_Float16>(0),
737       static_cast<_Float16>(0),   static_cast<_Float16>(0),
738       static_cast<_Float16>(0),   static_cast<_Float16>(0),
739       static_cast<_Float16>(0),   static_cast<_Float16>(0),
740       static_cast<_Float16>(0),   static_cast<_Float16>(0),
741       static_cast<_Float16>(100), static_cast<_Float16>(101),
742       static_cast<_Float16>(102), static_cast<_Float16>(103),
743       static_cast<_Float16>(104), static_cast<_Float16>(105),
744       static_cast<_Float16>(106), static_cast<_Float16>(107),
745       static_cast<_Float16>(108), static_cast<_Float16>(109),
746       static_cast<_Float16>(110), static_cast<_Float16>(111),
747       static_cast<_Float16>(112), static_cast<_Float16>(113),
748       static_cast<_Float16>(114), static_cast<_Float16>(115),
749       static_cast<_Float16>(116), static_cast<_Float16>(117),
750       static_cast<_Float16>(118), static_cast<_Float16>(119)};
751     nntrainer::Tensor answer(ref_dim, answer_data);
752     int status = t.multiply_i(m);
753     EXPECT_EQ(status, ML_ERROR_NONE);
754     EXPECT_EQ(t, answer);
755   }
756   {
757     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
758                                  nntrainer::Tdatatype::FP16);
759     nntrainer::Tensor t =
760       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
761     nntrainer::Tensor m =
762       ranged(3, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
763     _Float16 answer_data[] = {
764       static_cast<_Float16>(0),   static_cast<_Float16>(0),
765       static_cast<_Float16>(0),   static_cast<_Float16>(0),
766       static_cast<_Float16>(0),   static_cast<_Float16>(0),
767       static_cast<_Float16>(0),   static_cast<_Float16>(0),
768       static_cast<_Float16>(0),   static_cast<_Float16>(0),
769       static_cast<_Float16>(0),   static_cast<_Float16>(0),
770       static_cast<_Float16>(0),   static_cast<_Float16>(0),
771       static_cast<_Float16>(0),   static_cast<_Float16>(0),
772       static_cast<_Float16>(0),   static_cast<_Float16>(0),
773       static_cast<_Float16>(0),   static_cast<_Float16>(0),
774       static_cast<_Float16>(0),   static_cast<_Float16>(0),
775       static_cast<_Float16>(0),   static_cast<_Float16>(0),
776       static_cast<_Float16>(0),   static_cast<_Float16>(0),
777       static_cast<_Float16>(0),   static_cast<_Float16>(0),
778       static_cast<_Float16>(0),   static_cast<_Float16>(0),
779       static_cast<_Float16>(0),   static_cast<_Float16>(0),
780       static_cast<_Float16>(0),   static_cast<_Float16>(0),
781       static_cast<_Float16>(0),   static_cast<_Float16>(0),
782       static_cast<_Float16>(0),   static_cast<_Float16>(0),
783       static_cast<_Float16>(0),   static_cast<_Float16>(0),
784       static_cast<_Float16>(40),  static_cast<_Float16>(41),
785       static_cast<_Float16>(42),  static_cast<_Float16>(43),
786       static_cast<_Float16>(44),  static_cast<_Float16>(45),
787       static_cast<_Float16>(46),  static_cast<_Float16>(47),
788       static_cast<_Float16>(48),  static_cast<_Float16>(49),
789       static_cast<_Float16>(50),  static_cast<_Float16>(51),
790       static_cast<_Float16>(52),  static_cast<_Float16>(53),
791       static_cast<_Float16>(54),  static_cast<_Float16>(55),
792       static_cast<_Float16>(56),  static_cast<_Float16>(57),
793       static_cast<_Float16>(58),  static_cast<_Float16>(59),
794       static_cast<_Float16>(60),  static_cast<_Float16>(61),
795       static_cast<_Float16>(62),  static_cast<_Float16>(63),
796       static_cast<_Float16>(64),  static_cast<_Float16>(65),
797       static_cast<_Float16>(66),  static_cast<_Float16>(67),
798       static_cast<_Float16>(68),  static_cast<_Float16>(69),
799       static_cast<_Float16>(70),  static_cast<_Float16>(71),
800       static_cast<_Float16>(72),  static_cast<_Float16>(73),
801       static_cast<_Float16>(74),  static_cast<_Float16>(75),
802       static_cast<_Float16>(76),  static_cast<_Float16>(77),
803       static_cast<_Float16>(78),  static_cast<_Float16>(79),
804       static_cast<_Float16>(160), static_cast<_Float16>(162),
805       static_cast<_Float16>(164), static_cast<_Float16>(166),
806       static_cast<_Float16>(168), static_cast<_Float16>(170),
807       static_cast<_Float16>(172), static_cast<_Float16>(174),
808       static_cast<_Float16>(176), static_cast<_Float16>(178),
809       static_cast<_Float16>(180), static_cast<_Float16>(182),
810       static_cast<_Float16>(184), static_cast<_Float16>(186),
811       static_cast<_Float16>(188), static_cast<_Float16>(190),
812       static_cast<_Float16>(192), static_cast<_Float16>(194),
813       static_cast<_Float16>(196), static_cast<_Float16>(198),
814       static_cast<_Float16>(200), static_cast<_Float16>(202),
815       static_cast<_Float16>(204), static_cast<_Float16>(206),
816       static_cast<_Float16>(208), static_cast<_Float16>(210),
817       static_cast<_Float16>(212), static_cast<_Float16>(214),
818       static_cast<_Float16>(216), static_cast<_Float16>(218),
819       static_cast<_Float16>(220), static_cast<_Float16>(222),
820       static_cast<_Float16>(224), static_cast<_Float16>(226),
821       static_cast<_Float16>(228), static_cast<_Float16>(230),
822       static_cast<_Float16>(232), static_cast<_Float16>(234),
823       static_cast<_Float16>(236), static_cast<_Float16>(238)};
824     nntrainer::Tensor answer(ref_dim, answer_data);
825     int status = t.multiply_i(m);
826     EXPECT_EQ(status, ML_ERROR_NONE);
827     EXPECT_EQ(t, answer);
828   }
829   {
830     nntrainer::TensorDim ref_dim(3, 5, 1, 4, nntrainer::Tformat::NCHW,
831                                  nntrainer::Tdatatype::FP16);
832     nntrainer::Tensor t =
833       ranged(3, 5, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
834     nntrainer::Tensor m =
835       ranged(3, 1, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
836     _Float16 answer_data[] = {
837       static_cast<_Float16>(0),   static_cast<_Float16>(1),
838       static_cast<_Float16>(4),   static_cast<_Float16>(9),
839       static_cast<_Float16>(0),   static_cast<_Float16>(5),
840       static_cast<_Float16>(12),  static_cast<_Float16>(21),
841       static_cast<_Float16>(0),   static_cast<_Float16>(9),
842       static_cast<_Float16>(20),  static_cast<_Float16>(33),
843       static_cast<_Float16>(0),   static_cast<_Float16>(13),
844       static_cast<_Float16>(28),  static_cast<_Float16>(45),
845       static_cast<_Float16>(0),   static_cast<_Float16>(17),
846       static_cast<_Float16>(36),  static_cast<_Float16>(57),
847       static_cast<_Float16>(80),  static_cast<_Float16>(105),
848       static_cast<_Float16>(132), static_cast<_Float16>(161),
849       static_cast<_Float16>(96),  static_cast<_Float16>(125),
850       static_cast<_Float16>(156), static_cast<_Float16>(189),
851       static_cast<_Float16>(112), static_cast<_Float16>(145),
852       static_cast<_Float16>(180), static_cast<_Float16>(217),
853       static_cast<_Float16>(128), static_cast<_Float16>(165),
854       static_cast<_Float16>(204), static_cast<_Float16>(245),
855       static_cast<_Float16>(144), static_cast<_Float16>(185),
856       static_cast<_Float16>(228), static_cast<_Float16>(273),
857       static_cast<_Float16>(320), static_cast<_Float16>(369),
858       static_cast<_Float16>(420), static_cast<_Float16>(473),
859       static_cast<_Float16>(352), static_cast<_Float16>(405),
860       static_cast<_Float16>(460), static_cast<_Float16>(517),
861       static_cast<_Float16>(384), static_cast<_Float16>(441),
862       static_cast<_Float16>(500), static_cast<_Float16>(561),
863       static_cast<_Float16>(416), static_cast<_Float16>(477),
864       static_cast<_Float16>(540), static_cast<_Float16>(605),
865       static_cast<_Float16>(448), static_cast<_Float16>(513),
866       static_cast<_Float16>(580), static_cast<_Float16>(649)};
867     nntrainer::Tensor answer(ref_dim, answer_data);
868     int status = t.multiply_i(m);
869     EXPECT_EQ(status, ML_ERROR_NONE);
870     EXPECT_EQ(t, answer);
871   }
872 }
873
874 TEST(nntrainer_Tensor, multiply_i_broadcast_not_supported_01_n) {
875
876   nntrainer::Tensor target(3, 1, 3, 1, nntrainer::Tformat::NCHW,
877                            nntrainer::Tdatatype::FP16);
878   nntrainer::Tensor target2(3, 1, 3, 3, nntrainer::Tformat::NCHW,
879                             nntrainer::Tdatatype::FP16);
880
881   EXPECT_EQ(target.multiply_i(target2), ML_ERROR_INVALID_PARAMETER);
882 }
883
884 TEST(nntrainer_Tensor, multiply_i_broadcast_not_broadcastable_02_n) {
885   nntrainer::Tensor target(3, 2, 4, 5, nntrainer::Tformat::NCHW,
886                            nntrainer::Tdatatype::FP16);
887   nntrainer::Tensor target2(3, 2, 3, 1, nntrainer::Tformat::NCHW,
888                             nntrainer::Tdatatype::FP16);
889
890   EXPECT_EQ(target.multiply_i(target2), ML_ERROR_INVALID_PARAMETER);
891 }
892
893 TEST(nntrainer_Tensor, multiply_01_p) {
894   int status = ML_ERROR_NONE;
895   int batch = 3;
896   int channel = 1;
897   int height = 3;
898   int width = 10;
899
900   nntrainer::Tensor input(batch, channel, height, width,
901                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
902   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
903
904   nntrainer::Tensor result = input.multiply(0.0);
905   if (result.getValue<_Float16>(0, 0, 1, 1) != 0.0)
906     status = ML_ERROR_RESULT_OUT_OF_RANGE;
907   EXPECT_EQ(status, ML_ERROR_NONE);
908 }
909
910 TEST(nntrainer_Tensor, multiply_02_p) {
911   int status = ML_ERROR_NONE;
912   int batch = 3;
913   int channel = 1;
914   int height = 3;
915   int width = 10;
916
917   nntrainer::Tensor input(batch, channel, height, width,
918                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
919   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
920
921   nntrainer::Tensor result = input.multiply(input);
922
923   _Float16 *data = result.getData<_Float16>();
924   ASSERT_NE(nullptr, data);
925   _Float16 *indata = input.getData<_Float16>();
926   ASSERT_NE(nullptr, indata);
927
928   for (int i = 0; i < batch * height * width; ++i) {
929     if (data[i] != indata[i] * indata[i]) {
930       status = ML_ERROR_RESULT_OUT_OF_RANGE;
931       break;
932     }
933   }
934
935   EXPECT_EQ(status, ML_ERROR_NONE);
936 }
937
938 TEST(nntrainer_Tensor, multiply_03_n) {
939   int batch = 3;
940   int channel = 1;
941   int height = 3;
942   int width = 10;
943
944   nntrainer::Tensor input(batch, channel, height, width,
945                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
946   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
947
948   nntrainer::Tensor test(batch - 1, height - 1, width - 1,
949                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
950
951   EXPECT_THROW({ input.multiply(test); }, std::invalid_argument);
952 }
953
954 TEST(nntrainer_Tensor, multiply_04_n) {
955   int batch = 3;
956   int channel = 1;
957   int height = 3;
958   int width = 10;
959
960   nntrainer::TensorDim dim(batch, channel, height, width);
961
962   nntrainer::Tensor input(batch, channel, height, 2 * width,
963                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
964   nntrainer::Tensor shared_input = input.getSharedDataTensor(dim, 0, false);
965   nntrainer::Tensor test(dim);
966
967   EXPECT_THROW(shared_input.multiply(test), std::invalid_argument);
968 }
969
970 TEST(nntrainer_Tensor, multiply_05_n) {
971   int batch = 3;
972   int channel = 1;
973   int height = 3;
974   int width = 10;
975
976   nntrainer::TensorDim dim(batch, channel, height, width);
977
978   nntrainer::Tensor input(dim);
979   nntrainer::Tensor test(batch, channel, height, 2 * width,
980                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
981   nntrainer::Tensor shared_test = test.getSharedDataTensor(dim, 0, false);
982
983   EXPECT_THROW(input.multiply(shared_test), std::invalid_argument);
984 }
985
986 TEST(nntrainer_Tensor, multiply_06_n) {
987   int batch = 3;
988   int channel = 1;
989   int height = 3;
990   int width = 10;
991
992   nntrainer::TensorDim dim(batch, channel, height, width);
993
994   nntrainer::Tensor input(dim, false);
995   nntrainer::Tensor test(dim);
996   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
997
998   EXPECT_THROW(input.multiply(test), std::invalid_argument);
999 }
1000
1001 TEST(nntrainer_Tensor, multiply_07_n) {
1002   int batch = 3;
1003   int channel = 1;
1004   int height = 3;
1005   int width = 10;
1006
1007   nntrainer::TensorDim dim(batch, channel, height, width);
1008
1009   nntrainer::Tensor input(dim);
1010   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1011   nntrainer::Tensor test(dim, false);
1012
1013   EXPECT_THROW(input.multiply(test), std::invalid_argument);
1014 }
1015
1016 TEST(nntrainer_Tensor, multiply_08_n) {
1017   int batch = 3;
1018   int channel = 1;
1019   int height = 3;
1020   int width = 10;
1021
1022   nntrainer::TensorDim dim(batch, channel, height, width);
1023
1024   nntrainer::Tensor input(dim);
1025   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1026   nntrainer::Tensor test(dim);
1027   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 2);
1028   nntrainer::Tensor output(dim, false);
1029
1030   EXPECT_THROW(input.multiply(test, output), std::invalid_argument);
1031 }
1032
1033 TEST(nntrainer_Tensor, multiply__Float16_01_p) {
1034   int batch = 3;
1035   int channel = 1;
1036   int height = 3;
1037   int width = 10;
1038
1039   nntrainer::Tensor input(batch, channel, height, width,
1040                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1041   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1042
1043   nntrainer::Tensor expected(batch, channel, height, width,
1044                              nntrainer::Tformat::NCHW,
1045                              nntrainer::Tdatatype::FP16);
1046   GEN_TEST_INPUT(expected, (i * (batch * height) + j * (width) + k + 1) * 2);
1047
1048   nntrainer::Tensor result = input.multiply(2.0);
1049
1050   EXPECT_EQ(result, expected);
1051 }
1052
1053 TEST(nntrainer_Tensor, divide_i_01_p) {
1054   int status = ML_ERROR_NONE;
1055   int batch = 3;
1056   int channel = 1;
1057   int height = 3;
1058   int width = 10;
1059
1060   nntrainer::Tensor input(batch, channel, height, width,
1061                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1062   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
1063
1064   nntrainer::Tensor original;
1065   original.copy(input);
1066
1067   status = input.divide_i(2.0f);
1068   EXPECT_EQ(status, ML_ERROR_NONE);
1069
1070   _Float16 *data = original.getData<_Float16>();
1071   ASSERT_NE(nullptr, data);
1072   _Float16 *indata = input.getData<_Float16>();
1073   ASSERT_NE(nullptr, indata);
1074
1075   for (int i = 0; i < batch * height * width * channel; ++i) {
1076     EXPECT_FLOAT_EQ(data[i], indata[i] + indata[i]);
1077   }
1078 }
1079
1080 TEST(nntrainer_Tensor, divide_i_02_p) {
1081   int status = ML_ERROR_NONE;
1082   int batch = 3;
1083   int channel = 1;
1084   int height = 3;
1085   int width = 10;
1086
1087   nntrainer::Tensor input(batch, channel, height, width,
1088                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1089   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1090
1091   status = input.divide_i(input);
1092   EXPECT_EQ(status, ML_ERROR_NONE);
1093   _Float16 *indata = input.getData<_Float16>();
1094   ASSERT_NE(nullptr, indata);
1095
1096   for (int i = 0; i < batch * height * width * channel; ++i) {
1097     EXPECT_FLOAT_EQ(indata[i], _Float16(1.0));
1098   }
1099 }
1100
1101 TEST(nntrainer_Tensor, divide_i_01_n) {
1102   int status = ML_ERROR_NONE;
1103   int batch = 3;
1104   int channel = 1;
1105   int height = 3;
1106   int width = 10;
1107
1108   nntrainer::Tensor input(batch, channel, height, width,
1109                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1110   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
1111
1112   status = input.divide_i((_Float16)0);
1113   EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
1114 }
1115
1116 TEST(nntrainer_Tensor, divide_i_02_n) {
1117   int status = ML_ERROR_NONE;
1118   int batch = 3;
1119   int channel = 1;
1120   int height = 3;
1121   int width = 10;
1122
1123   nntrainer::Tensor input(batch, channel, height, width,
1124                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1125   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
1126
1127   nntrainer::Tensor original(batch, channel, height - 2, width - 1,
1128                              nntrainer::Tformat::NCHW,
1129                              nntrainer::Tdatatype::FP16);
1130
1131   status = input.divide_i(original);
1132   EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
1133 }
1134
1135 TEST(nntrainer_Tensor, divide_01_p) {
1136   int batch = 3;
1137   int channel = 1;
1138   int height = 3;
1139   int width = 10;
1140
1141   nntrainer::Tensor input(batch, channel, height, width,
1142                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1143   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1144
1145   nntrainer::Tensor result = input.divide(1.0);
1146
1147   _Float16 *previous = input.getData<_Float16>();
1148   ASSERT_NE(nullptr, previous);
1149   _Float16 *data = result.getData<_Float16>();
1150   ASSERT_NE(nullptr, data);
1151
1152   for (int i = 0; i < batch * height * width * channel; ++i) {
1153     EXPECT_FLOAT_EQ(data[i], previous[i]);
1154   }
1155 }
1156
1157 TEST(nntrainer_Tensor, divide_02_n) {
1158   int batch = 3;
1159   int channel = 1;
1160   int height = 3;
1161   int width = 10;
1162
1163   nntrainer::Tensor input(batch, channel, height, width,
1164                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1165   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1166
1167   EXPECT_THROW({ input.divide(0.0); }, std::invalid_argument);
1168 }
1169
1170 TEST(nntrainer_Tensor, divide_03_n) {
1171   int batch = 3;
1172   int channel = 1;
1173   int height = 3;
1174   int width = 10;
1175
1176   nntrainer::Tensor input(batch, channel, height, width,
1177                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1178   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1179
1180   nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
1181                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1182
1183   EXPECT_THROW({ input.divide(test); }, std::invalid_argument);
1184 }
1185
1186 TEST(nntrainer_Tensor, divide_04_n) {
1187   int batch = 3;
1188   int channel = 1;
1189   int height = 3;
1190   int width = 10;
1191
1192   nntrainer::TensorDim dim(batch, channel, height, width);
1193
1194   nntrainer::Tensor input(batch, channel, height, 2 * width,
1195                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1196   nntrainer::Tensor shared_input = input.getSharedDataTensor(dim, 0, false);
1197   nntrainer::Tensor test(dim);
1198
1199   EXPECT_THROW(shared_input.divide(test), std::invalid_argument);
1200 }
1201
1202 TEST(nntrainer_Tensor, divide_05_n) {
1203   int batch = 3;
1204   int channel = 1;
1205   int height = 3;
1206   int width = 10;
1207
1208   nntrainer::TensorDim dim(batch, channel, height, width);
1209
1210   nntrainer::Tensor input(dim);
1211   nntrainer::Tensor test(batch, channel, height, 2 * width,
1212                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1213   nntrainer::Tensor shared_test = test.getSharedDataTensor(dim, 0, false);
1214
1215   EXPECT_THROW(input.divide(shared_test), std::invalid_argument);
1216 }
1217
1218 TEST(nntrainer_Tensor, divide_06_n) {
1219   int batch = 3;
1220   int channel = 1;
1221   int height = 3;
1222   int width = 10;
1223
1224   nntrainer::TensorDim dim(batch, channel, height, width);
1225
1226   nntrainer::Tensor input(dim, false);
1227   nntrainer::Tensor test(dim);
1228   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
1229
1230   EXPECT_THROW(input.divide(test), std::invalid_argument);
1231 }
1232
1233 TEST(nntrainer_Tensor, divide_07_n) {
1234   int batch = 3;
1235   int channel = 1;
1236   int height = 3;
1237   int width = 10;
1238
1239   nntrainer::TensorDim dim(batch, channel, height, width);
1240
1241   nntrainer::Tensor input(dim);
1242   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1243   nntrainer::Tensor test(dim, false);
1244
1245   EXPECT_THROW(input.divide(test), std::invalid_argument);
1246 }
1247
1248 TEST(nntrainer_Tensor, divide_08_n) {
1249   int batch = 3;
1250   int channel = 1;
1251   int height = 3;
1252   int width = 10;
1253
1254   nntrainer::TensorDim dim(batch, channel, height, width,
1255                            nntrainer::Tformat::NCHW,
1256                            nntrainer::Tdatatype::FP16);
1257
1258   nntrainer::Tensor input(dim);
1259   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1260   nntrainer::Tensor test(dim);
1261   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 2);
1262   nntrainer::Tensor output(dim, false);
1263
1264   EXPECT_THROW(input.divide(test, output), std::invalid_argument);
1265 }
1266
1267 TEST(nntrainer_Tensor, divide_i_broadcast_01_p) {
1268   {
1269     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1270                                  nntrainer::Tdatatype::FP16);
1271     nntrainer::Tensor t =
1272       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1273     t.add_i(1);
1274     nntrainer::Tensor m =
1275       ranged(1, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1276     m.add_i(1);
1277     _Float16 answer_data[] = {
1278       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1279       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1280       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1281       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1282       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1283       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1284       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1285       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1286       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1287       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1288       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1289       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1290       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1291       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1292       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1293       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1294       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1295       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1296       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1297       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1298       static_cast<_Float16>(41.0),      static_cast<_Float16>(21.0),
1299       static_cast<_Float16>(14.333333), static_cast<_Float16>(11.0),
1300       static_cast<_Float16>(9.0),       static_cast<_Float16>(7.6666665),
1301       static_cast<_Float16>(6.714286),  static_cast<_Float16>(6.0),
1302       static_cast<_Float16>(5.4444447), static_cast<_Float16>(5.0),
1303       static_cast<_Float16>(4.6363635), static_cast<_Float16>(4.3333335),
1304       static_cast<_Float16>(4.076923),  static_cast<_Float16>(3.857143),
1305       static_cast<_Float16>(3.6666667), static_cast<_Float16>(3.5),
1306       static_cast<_Float16>(3.3529413), static_cast<_Float16>(3.2222223),
1307       static_cast<_Float16>(3.1052632), static_cast<_Float16>(3.0),
1308       static_cast<_Float16>(2.9047618), static_cast<_Float16>(2.8181818),
1309       static_cast<_Float16>(2.7391305), static_cast<_Float16>(2.6666667),
1310       static_cast<_Float16>(2.6),       static_cast<_Float16>(2.5384614),
1311       static_cast<_Float16>(2.4814816), static_cast<_Float16>(2.4285715),
1312       static_cast<_Float16>(2.3793104), static_cast<_Float16>(2.3333333),
1313       static_cast<_Float16>(2.2903225), static_cast<_Float16>(2.25),
1314       static_cast<_Float16>(2.2121212), static_cast<_Float16>(2.1764705),
1315       static_cast<_Float16>(2.142857),  static_cast<_Float16>(2.1111112),
1316       static_cast<_Float16>(2.0810812), static_cast<_Float16>(2.0526316),
1317       static_cast<_Float16>(2.025641),  static_cast<_Float16>(2.0),
1318       static_cast<_Float16>(81.0),      static_cast<_Float16>(41.0),
1319       static_cast<_Float16>(27.666666), static_cast<_Float16>(21.0),
1320       static_cast<_Float16>(17.0),      static_cast<_Float16>(14.333333),
1321       static_cast<_Float16>(12.428572), static_cast<_Float16>(11.0),
1322       static_cast<_Float16>(9.888889),  static_cast<_Float16>(9.0),
1323       static_cast<_Float16>(8.272727),  static_cast<_Float16>(7.6666665),
1324       static_cast<_Float16>(7.1538463), static_cast<_Float16>(6.714286),
1325       static_cast<_Float16>(6.3333335), static_cast<_Float16>(6.0),
1326       static_cast<_Float16>(5.7058825), static_cast<_Float16>(5.4444447),
1327       static_cast<_Float16>(5.2105265), static_cast<_Float16>(5.0),
1328       static_cast<_Float16>(4.8095236), static_cast<_Float16>(4.6363635),
1329       static_cast<_Float16>(4.478261),  static_cast<_Float16>(4.3333335),
1330       static_cast<_Float16>(4.2),       static_cast<_Float16>(4.076923),
1331       static_cast<_Float16>(3.9629629), static_cast<_Float16>(3.857143),
1332       static_cast<_Float16>(3.7586207), static_cast<_Float16>(3.6666667),
1333       static_cast<_Float16>(3.580645),  static_cast<_Float16>(3.5),
1334       static_cast<_Float16>(3.4242425), static_cast<_Float16>(3.3529413),
1335       static_cast<_Float16>(3.2857144), static_cast<_Float16>(3.2222223),
1336       static_cast<_Float16>(3.162162),  static_cast<_Float16>(3.1052632),
1337       static_cast<_Float16>(3.0512822), static_cast<_Float16>(3.0)};
1338     nntrainer::Tensor answer(ref_dim, answer_data);
1339     int status = t.divide_i(m);
1340     EXPECT_EQ(status, ML_ERROR_NONE);
1341     EXPECT_EQ(t, answer);
1342   }
1343   {
1344     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1345                                  nntrainer::Tdatatype::FP16);
1346     nntrainer::Tensor t =
1347       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1348     t.add_i(1);
1349     nntrainer::Tensor m =
1350       ranged(3, 1, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1351     m.add_i(1);
1352     _Float16 answer_data[] = {
1353       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1354       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1355       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1356       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1357       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1358       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1359       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1360       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1361       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1362       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1363       static_cast<_Float16>(21.0),      static_cast<_Float16>(11.0),
1364       static_cast<_Float16>(7.6666665), static_cast<_Float16>(6.0),
1365       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.3333335),
1366       static_cast<_Float16>(3.857143),  static_cast<_Float16>(3.5),
1367       static_cast<_Float16>(3.2222223), static_cast<_Float16>(3.0),
1368       static_cast<_Float16>(2.8181818), static_cast<_Float16>(2.6666667),
1369       static_cast<_Float16>(2.5384614), static_cast<_Float16>(2.4285715),
1370       static_cast<_Float16>(2.3333333), static_cast<_Float16>(2.25),
1371       static_cast<_Float16>(2.1764705), static_cast<_Float16>(2.1111112),
1372       static_cast<_Float16>(2.0526316), static_cast<_Float16>(2.0),
1373       static_cast<_Float16>(1.9523809), static_cast<_Float16>(1.9090909),
1374       static_cast<_Float16>(1.8695652), static_cast<_Float16>(1.8333334),
1375       static_cast<_Float16>(1.8),       static_cast<_Float16>(1.7692307),
1376       static_cast<_Float16>(1.7407408), static_cast<_Float16>(1.7142857),
1377       static_cast<_Float16>(1.6896552), static_cast<_Float16>(1.6666666),
1378       static_cast<_Float16>(1.6451613), static_cast<_Float16>(1.625),
1379       static_cast<_Float16>(1.6060606), static_cast<_Float16>(1.5882353),
1380       static_cast<_Float16>(1.5714285), static_cast<_Float16>(1.5555556),
1381       static_cast<_Float16>(1.5405406), static_cast<_Float16>(1.5263158),
1382       static_cast<_Float16>(1.5128205), static_cast<_Float16>(1.5),
1383       static_cast<_Float16>(2.9047618), static_cast<_Float16>(2.8181818),
1384       static_cast<_Float16>(2.7391305), static_cast<_Float16>(2.6666667),
1385       static_cast<_Float16>(2.6),       static_cast<_Float16>(2.5384614),
1386       static_cast<_Float16>(2.4814816), static_cast<_Float16>(2.4285715),
1387       static_cast<_Float16>(2.3793104), static_cast<_Float16>(2.3333333),
1388       static_cast<_Float16>(2.2903225), static_cast<_Float16>(2.25),
1389       static_cast<_Float16>(2.2121212), static_cast<_Float16>(2.1764705),
1390       static_cast<_Float16>(2.142857),  static_cast<_Float16>(2.1111112),
1391       static_cast<_Float16>(2.0810812), static_cast<_Float16>(2.0526316),
1392       static_cast<_Float16>(2.025641),  static_cast<_Float16>(2.0),
1393       static_cast<_Float16>(1.9756098), static_cast<_Float16>(1.9523809),
1394       static_cast<_Float16>(1.9302325), static_cast<_Float16>(1.9090909),
1395       static_cast<_Float16>(1.8888888), static_cast<_Float16>(1.8695652),
1396       static_cast<_Float16>(1.8510638), static_cast<_Float16>(1.8333334),
1397       static_cast<_Float16>(1.8163265), static_cast<_Float16>(1.8),
1398       static_cast<_Float16>(1.7843137), static_cast<_Float16>(1.7692307),
1399       static_cast<_Float16>(1.754717),  static_cast<_Float16>(1.7407408),
1400       static_cast<_Float16>(1.7272727), static_cast<_Float16>(1.7142857),
1401       static_cast<_Float16>(1.7017543), static_cast<_Float16>(1.6896552),
1402       static_cast<_Float16>(1.6779661), static_cast<_Float16>(1.6666666),
1403       static_cast<_Float16>(2.4634147), static_cast<_Float16>(2.4285715),
1404       static_cast<_Float16>(2.3953488), static_cast<_Float16>(2.3636363),
1405       static_cast<_Float16>(2.3333333), static_cast<_Float16>(2.3043478),
1406       static_cast<_Float16>(2.2765958), static_cast<_Float16>(2.25),
1407       static_cast<_Float16>(2.2244897), static_cast<_Float16>(2.2),
1408       static_cast<_Float16>(2.1764705), static_cast<_Float16>(2.1538463),
1409       static_cast<_Float16>(2.1320755), static_cast<_Float16>(2.1111112),
1410       static_cast<_Float16>(2.090909),  static_cast<_Float16>(2.0714285),
1411       static_cast<_Float16>(2.0526316), static_cast<_Float16>(2.0344827),
1412       static_cast<_Float16>(2.0169492), static_cast<_Float16>(2.0)};
1413     nntrainer::Tensor answer(ref_dim, answer_data);
1414     int status = t.divide_i(m);
1415     EXPECT_EQ(status, ML_ERROR_NONE);
1416     EXPECT_EQ(t, answer);
1417   }
1418   {
1419     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1420                                  nntrainer::Tdatatype::FP16);
1421     nntrainer::Tensor t =
1422       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1423     t.add_i(1);
1424     nntrainer::Tensor m =
1425       ranged(3, 2, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1426     m.add_i(1);
1427     _Float16 answer_data[] = {
1428       static_cast<_Float16>(1.0),       static_cast<_Float16>(2.0),
1429       static_cast<_Float16>(3.0),       static_cast<_Float16>(4.0),
1430       static_cast<_Float16>(5.0),       static_cast<_Float16>(3.0),
1431       static_cast<_Float16>(3.5),       static_cast<_Float16>(4.0),
1432       static_cast<_Float16>(4.5),       static_cast<_Float16>(5.0),
1433       static_cast<_Float16>(3.6666667), static_cast<_Float16>(4.0),
1434       static_cast<_Float16>(4.3333335), static_cast<_Float16>(4.6666665),
1435       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.0),
1436       static_cast<_Float16>(4.25),      static_cast<_Float16>(4.5),
1437       static_cast<_Float16>(4.75),      static_cast<_Float16>(5.0),
1438       static_cast<_Float16>(4.2),       static_cast<_Float16>(4.4),
1439       static_cast<_Float16>(4.6),       static_cast<_Float16>(4.8),
1440       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.3333335),
1441       static_cast<_Float16>(4.5),       static_cast<_Float16>(4.6666665),
1442       static_cast<_Float16>(4.8333335), static_cast<_Float16>(5.0),
1443       static_cast<_Float16>(4.428571),  static_cast<_Float16>(4.571429),
1444       static_cast<_Float16>(4.714286),  static_cast<_Float16>(4.857143),
1445       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.5),
1446       static_cast<_Float16>(4.625),     static_cast<_Float16>(4.75),
1447       static_cast<_Float16>(4.875),     static_cast<_Float16>(5.0),
1448       static_cast<_Float16>(4.5555553), static_cast<_Float16>(4.6666665),
1449       static_cast<_Float16>(4.7777777), static_cast<_Float16>(4.888889),
1450       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.6),
1451       static_cast<_Float16>(4.7),       static_cast<_Float16>(4.8),
1452       static_cast<_Float16>(4.9),       static_cast<_Float16>(5.0),
1453       static_cast<_Float16>(4.6363635), static_cast<_Float16>(4.7272725),
1454       static_cast<_Float16>(4.818182),  static_cast<_Float16>(4.909091),
1455       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.6666665),
1456       static_cast<_Float16>(4.75),      static_cast<_Float16>(4.8333335),
1457       static_cast<_Float16>(4.9166665), static_cast<_Float16>(5.0),
1458       static_cast<_Float16>(4.6923075), static_cast<_Float16>(4.769231),
1459       static_cast<_Float16>(4.8461537), static_cast<_Float16>(4.923077),
1460       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.714286),
1461       static_cast<_Float16>(4.785714),  static_cast<_Float16>(4.857143),
1462       static_cast<_Float16>(4.928571),  static_cast<_Float16>(5.0),
1463       static_cast<_Float16>(4.733333),  static_cast<_Float16>(4.8),
1464       static_cast<_Float16>(4.866667),  static_cast<_Float16>(4.9333334),
1465       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.75),
1466       static_cast<_Float16>(4.8125),    static_cast<_Float16>(4.875),
1467       static_cast<_Float16>(4.9375),    static_cast<_Float16>(5.0),
1468       static_cast<_Float16>(4.7647057), static_cast<_Float16>(4.8235292),
1469       static_cast<_Float16>(4.882353),  static_cast<_Float16>(4.9411764),
1470       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.7777777),
1471       static_cast<_Float16>(4.8333335), static_cast<_Float16>(4.888889),
1472       static_cast<_Float16>(4.9444447), static_cast<_Float16>(5.0),
1473       static_cast<_Float16>(4.7894735), static_cast<_Float16>(4.8421054),
1474       static_cast<_Float16>(4.894737),  static_cast<_Float16>(4.9473686),
1475       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.8),
1476       static_cast<_Float16>(4.85),      static_cast<_Float16>(4.9),
1477       static_cast<_Float16>(4.95),      static_cast<_Float16>(5.0),
1478       static_cast<_Float16>(4.8095236), static_cast<_Float16>(4.857143),
1479       static_cast<_Float16>(4.904762),  static_cast<_Float16>(4.952381),
1480       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.818182),
1481       static_cast<_Float16>(4.8636365), static_cast<_Float16>(4.909091),
1482       static_cast<_Float16>(4.9545455), static_cast<_Float16>(5.0),
1483       static_cast<_Float16>(4.826087),  static_cast<_Float16>(4.869565),
1484       static_cast<_Float16>(4.9130435), static_cast<_Float16>(4.9565215),
1485       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.8333335),
1486       static_cast<_Float16>(4.875),     static_cast<_Float16>(4.9166665),
1487       static_cast<_Float16>(4.9583335), static_cast<_Float16>(5.0)};
1488     nntrainer::Tensor answer(ref_dim, answer_data);
1489     int status = t.divide_i(m);
1490     EXPECT_EQ(status, ML_ERROR_NONE);
1491     EXPECT_EQ(t, answer);
1492   }
1493   {
1494     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1495                                  nntrainer::Tdatatype::FP16);
1496     nntrainer::Tensor t =
1497       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1498     t.add_i(1);
1499     nntrainer::Tensor m =
1500       ranged(3, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1501     m.add_i(1);
1502     _Float16 answer_data[] = {
1503       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1504       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1505       static_cast<_Float16>(1.0),       static_cast<_Float16>(6.0),
1506       static_cast<_Float16>(3.5),       static_cast<_Float16>(2.6666667),
1507       static_cast<_Float16>(2.25),      static_cast<_Float16>(2.0),
1508       static_cast<_Float16>(11.0),      static_cast<_Float16>(6.0),
1509       static_cast<_Float16>(4.3333335), static_cast<_Float16>(3.5),
1510       static_cast<_Float16>(3.0),       static_cast<_Float16>(16.0),
1511       static_cast<_Float16>(8.5),       static_cast<_Float16>(6.0),
1512       static_cast<_Float16>(4.75),      static_cast<_Float16>(4.0),
1513       static_cast<_Float16>(21.0),      static_cast<_Float16>(11.0),
1514       static_cast<_Float16>(7.6666665), static_cast<_Float16>(6.0),
1515       static_cast<_Float16>(5.0),       static_cast<_Float16>(26.0),
1516       static_cast<_Float16>(13.5),      static_cast<_Float16>(9.333333),
1517       static_cast<_Float16>(7.25),      static_cast<_Float16>(6.0),
1518       static_cast<_Float16>(31.0),      static_cast<_Float16>(16.0),
1519       static_cast<_Float16>(11.0),      static_cast<_Float16>(8.5),
1520       static_cast<_Float16>(7.0),       static_cast<_Float16>(36.0),
1521       static_cast<_Float16>(18.5),      static_cast<_Float16>(12.666667),
1522       static_cast<_Float16>(9.75),      static_cast<_Float16>(8.0),
1523       static_cast<_Float16>(6.8333335), static_cast<_Float16>(6.0),
1524       static_cast<_Float16>(5.375),     static_cast<_Float16>(4.888889),
1525       static_cast<_Float16>(4.5),       static_cast<_Float16>(7.6666665),
1526       static_cast<_Float16>(6.714286),  static_cast<_Float16>(6.0),
1527       static_cast<_Float16>(5.4444447), static_cast<_Float16>(5.0),
1528       static_cast<_Float16>(8.5),       static_cast<_Float16>(7.428571),
1529       static_cast<_Float16>(6.625),     static_cast<_Float16>(6.0),
1530       static_cast<_Float16>(5.5),       static_cast<_Float16>(9.333333),
1531       static_cast<_Float16>(8.142858),  static_cast<_Float16>(7.25),
1532       static_cast<_Float16>(6.5555553), static_cast<_Float16>(6.0),
1533       static_cast<_Float16>(10.166667), static_cast<_Float16>(8.857142),
1534       static_cast<_Float16>(7.875),     static_cast<_Float16>(7.111111),
1535       static_cast<_Float16>(6.5),       static_cast<_Float16>(11.0),
1536       static_cast<_Float16>(9.571428),  static_cast<_Float16>(8.5),
1537       static_cast<_Float16>(7.6666665), static_cast<_Float16>(7.0),
1538       static_cast<_Float16>(11.833333), static_cast<_Float16>(10.285714),
1539       static_cast<_Float16>(9.125),     static_cast<_Float16>(8.222222),
1540       static_cast<_Float16>(7.5),       static_cast<_Float16>(12.666667),
1541       static_cast<_Float16>(11.0),      static_cast<_Float16>(9.75),
1542       static_cast<_Float16>(8.777778),  static_cast<_Float16>(8.0),
1543       static_cast<_Float16>(7.3636365), static_cast<_Float16>(6.8333335),
1544       static_cast<_Float16>(6.3846154), static_cast<_Float16>(6.0),
1545       static_cast<_Float16>(5.6666665), static_cast<_Float16>(7.818182),
1546       static_cast<_Float16>(7.25),      static_cast<_Float16>(6.769231),
1547       static_cast<_Float16>(6.357143),  static_cast<_Float16>(6.0),
1548       static_cast<_Float16>(8.272727),  static_cast<_Float16>(7.6666665),
1549       static_cast<_Float16>(7.1538463), static_cast<_Float16>(6.714286),
1550       static_cast<_Float16>(6.3333335), static_cast<_Float16>(8.727273),
1551       static_cast<_Float16>(8.083333),  static_cast<_Float16>(7.5384617),
1552       static_cast<_Float16>(7.071429),  static_cast<_Float16>(6.6666665),
1553       static_cast<_Float16>(9.181818),  static_cast<_Float16>(8.5),
1554       static_cast<_Float16>(7.923077),  static_cast<_Float16>(7.428571),
1555       static_cast<_Float16>(7.0),       static_cast<_Float16>(9.636364),
1556       static_cast<_Float16>(8.916667),  static_cast<_Float16>(8.307693),
1557       static_cast<_Float16>(7.785714),  static_cast<_Float16>(7.3333335),
1558       static_cast<_Float16>(10.090909), static_cast<_Float16>(9.333333),
1559       static_cast<_Float16>(8.692307),  static_cast<_Float16>(8.142858),
1560       static_cast<_Float16>(7.6666665), static_cast<_Float16>(10.545455),
1561       static_cast<_Float16>(9.75),      static_cast<_Float16>(9.076923),
1562       static_cast<_Float16>(8.5),       static_cast<_Float16>(8.0)};
1563     nntrainer::Tensor answer(ref_dim, answer_data);
1564     int status = t.divide_i(m);
1565     EXPECT_EQ(status, ML_ERROR_NONE);
1566     EXPECT_EQ(t, answer);
1567   }
1568   {
1569     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1570                                  nntrainer::Tdatatype::FP16);
1571     nntrainer::Tensor t =
1572       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1573     t.add_i(1);
1574     nntrainer::Tensor m =
1575       ranged(1, 2, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1576     m.add_i(1);
1577     _Float16 answer_data[] = {
1578       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1579       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1580       static_cast<_Float16>(1.0),       static_cast<_Float16>(6.0),
1581       static_cast<_Float16>(3.5),       static_cast<_Float16>(2.6666667),
1582       static_cast<_Float16>(2.25),      static_cast<_Float16>(2.0),
1583       static_cast<_Float16>(11.0),      static_cast<_Float16>(6.0),
1584       static_cast<_Float16>(4.3333335), static_cast<_Float16>(3.5),
1585       static_cast<_Float16>(3.0),       static_cast<_Float16>(16.0),
1586       static_cast<_Float16>(8.5),       static_cast<_Float16>(6.0),
1587       static_cast<_Float16>(4.75),      static_cast<_Float16>(4.0),
1588       static_cast<_Float16>(3.5),       static_cast<_Float16>(3.142857),
1589       static_cast<_Float16>(2.875),     static_cast<_Float16>(2.6666667),
1590       static_cast<_Float16>(2.5),       static_cast<_Float16>(4.3333335),
1591       static_cast<_Float16>(3.857143),  static_cast<_Float16>(3.5),
1592       static_cast<_Float16>(3.2222223), static_cast<_Float16>(3.0),
1593       static_cast<_Float16>(5.1666665), static_cast<_Float16>(4.571429),
1594       static_cast<_Float16>(4.125),     static_cast<_Float16>(3.7777777),
1595       static_cast<_Float16>(3.5),       static_cast<_Float16>(6.0),
1596       static_cast<_Float16>(5.285714),  static_cast<_Float16>(4.75),
1597       static_cast<_Float16>(4.3333335), static_cast<_Float16>(4.0),
1598       static_cast<_Float16>(41.0),      static_cast<_Float16>(21.0),
1599       static_cast<_Float16>(14.333333), static_cast<_Float16>(11.0),
1600       static_cast<_Float16>(9.0),       static_cast<_Float16>(46.0),
1601       static_cast<_Float16>(23.5),      static_cast<_Float16>(16.0),
1602       static_cast<_Float16>(12.25),     static_cast<_Float16>(10.0),
1603       static_cast<_Float16>(51.0),      static_cast<_Float16>(26.0),
1604       static_cast<_Float16>(17.666666), static_cast<_Float16>(13.5),
1605       static_cast<_Float16>(11.0),      static_cast<_Float16>(56.0),
1606       static_cast<_Float16>(28.5),      static_cast<_Float16>(19.333334),
1607       static_cast<_Float16>(14.75),     static_cast<_Float16>(12.0),
1608       static_cast<_Float16>(10.166667), static_cast<_Float16>(8.857142),
1609       static_cast<_Float16>(7.875),     static_cast<_Float16>(7.111111),
1610       static_cast<_Float16>(6.5),       static_cast<_Float16>(11.0),
1611       static_cast<_Float16>(9.571428),  static_cast<_Float16>(8.5),
1612       static_cast<_Float16>(7.6666665), static_cast<_Float16>(7.0),
1613       static_cast<_Float16>(11.833333), static_cast<_Float16>(10.285714),
1614       static_cast<_Float16>(9.125),     static_cast<_Float16>(8.222222),
1615       static_cast<_Float16>(7.5),       static_cast<_Float16>(12.666667),
1616       static_cast<_Float16>(11.0),      static_cast<_Float16>(9.75),
1617       static_cast<_Float16>(8.777778),  static_cast<_Float16>(8.0),
1618       static_cast<_Float16>(81.0),      static_cast<_Float16>(41.0),
1619       static_cast<_Float16>(27.666666), static_cast<_Float16>(21.0),
1620       static_cast<_Float16>(17.0),      static_cast<_Float16>(86.0),
1621       static_cast<_Float16>(43.5),      static_cast<_Float16>(29.333334),
1622       static_cast<_Float16>(22.25),     static_cast<_Float16>(18.0),
1623       static_cast<_Float16>(91.0),      static_cast<_Float16>(46.0),
1624       static_cast<_Float16>(31.0),      static_cast<_Float16>(23.5),
1625       static_cast<_Float16>(19.0),      static_cast<_Float16>(96.0),
1626       static_cast<_Float16>(48.5),      static_cast<_Float16>(32.666668),
1627       static_cast<_Float16>(24.75),     static_cast<_Float16>(20.0),
1628       static_cast<_Float16>(16.833334), static_cast<_Float16>(14.571428),
1629       static_cast<_Float16>(12.875),    static_cast<_Float16>(11.555555),
1630       static_cast<_Float16>(10.5),      static_cast<_Float16>(17.666666),
1631       static_cast<_Float16>(15.285714), static_cast<_Float16>(13.5),
1632       static_cast<_Float16>(12.111111), static_cast<_Float16>(11.0),
1633       static_cast<_Float16>(18.5),      static_cast<_Float16>(16.0),
1634       static_cast<_Float16>(14.125),    static_cast<_Float16>(12.666667),
1635       static_cast<_Float16>(11.5),      static_cast<_Float16>(19.333334),
1636       static_cast<_Float16>(16.714285), static_cast<_Float16>(14.75),
1637       static_cast<_Float16>(13.222222), static_cast<_Float16>(12.0)};
1638     nntrainer::Tensor answer(ref_dim, answer_data);
1639     int status = t.divide_i(m);
1640     EXPECT_EQ(status, ML_ERROR_NONE);
1641     EXPECT_EQ(t, answer);
1642   }
1643   {
1644     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1645                                  nntrainer::Tdatatype::FP16);
1646     nntrainer::Tensor t =
1647       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1648     t.add_i(1);
1649     nntrainer::Tensor m =
1650       ranged(3, 1, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1651     m.add_i(1);
1652     _Float16 answer_data[] = {
1653       static_cast<_Float16>(1.0),       static_cast<_Float16>(2.0),
1654       static_cast<_Float16>(3.0),       static_cast<_Float16>(4.0),
1655       static_cast<_Float16>(5.0),       static_cast<_Float16>(3.0),
1656       static_cast<_Float16>(3.5),       static_cast<_Float16>(4.0),
1657       static_cast<_Float16>(4.5),       static_cast<_Float16>(5.0),
1658       static_cast<_Float16>(3.6666667), static_cast<_Float16>(4.0),
1659       static_cast<_Float16>(4.3333335), static_cast<_Float16>(4.6666665),
1660       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.0),
1661       static_cast<_Float16>(4.25),      static_cast<_Float16>(4.5),
1662       static_cast<_Float16>(4.75),      static_cast<_Float16>(5.0),
1663       static_cast<_Float16>(21.0),      static_cast<_Float16>(22.0),
1664       static_cast<_Float16>(23.0),      static_cast<_Float16>(24.0),
1665       static_cast<_Float16>(25.0),      static_cast<_Float16>(13.0),
1666       static_cast<_Float16>(13.5),      static_cast<_Float16>(14.0),
1667       static_cast<_Float16>(14.5),      static_cast<_Float16>(15.0),
1668       static_cast<_Float16>(10.333333), static_cast<_Float16>(10.666667),
1669       static_cast<_Float16>(11.0),      static_cast<_Float16>(11.333333),
1670       static_cast<_Float16>(11.666667), static_cast<_Float16>(9.0),
1671       static_cast<_Float16>(9.25),      static_cast<_Float16>(9.5),
1672       static_cast<_Float16>(9.75),      static_cast<_Float16>(10.0),
1673       static_cast<_Float16>(8.2),       static_cast<_Float16>(8.4),
1674       static_cast<_Float16>(8.6),       static_cast<_Float16>(8.8),
1675       static_cast<_Float16>(9.0),       static_cast<_Float16>(7.6666665),
1676       static_cast<_Float16>(7.8333335), static_cast<_Float16>(8.0),
1677       static_cast<_Float16>(8.166667),  static_cast<_Float16>(8.333333),
1678       static_cast<_Float16>(7.285714),  static_cast<_Float16>(7.428571),
1679       static_cast<_Float16>(7.571429),  static_cast<_Float16>(7.714286),
1680       static_cast<_Float16>(7.857143),  static_cast<_Float16>(7.0),
1681       static_cast<_Float16>(7.125),     static_cast<_Float16>(7.25),
1682       static_cast<_Float16>(7.375),     static_cast<_Float16>(7.5),
1683       static_cast<_Float16>(12.2),      static_cast<_Float16>(12.4),
1684       static_cast<_Float16>(12.6),      static_cast<_Float16>(12.8),
1685       static_cast<_Float16>(13.0),      static_cast<_Float16>(11.0),
1686       static_cast<_Float16>(11.166667), static_cast<_Float16>(11.333333),
1687       static_cast<_Float16>(11.5),      static_cast<_Float16>(11.666667),
1688       static_cast<_Float16>(10.142858), static_cast<_Float16>(10.285714),
1689       static_cast<_Float16>(10.428572), static_cast<_Float16>(10.571428),
1690       static_cast<_Float16>(10.714286), static_cast<_Float16>(9.5),
1691       static_cast<_Float16>(9.625),     static_cast<_Float16>(9.75),
1692       static_cast<_Float16>(9.875),     static_cast<_Float16>(10.0),
1693       static_cast<_Float16>(9.0),       static_cast<_Float16>(9.111111),
1694       static_cast<_Float16>(9.222222),  static_cast<_Float16>(9.333333),
1695       static_cast<_Float16>(9.444445),  static_cast<_Float16>(8.6),
1696       static_cast<_Float16>(8.7),       static_cast<_Float16>(8.8),
1697       static_cast<_Float16>(8.9),       static_cast<_Float16>(9.0),
1698       static_cast<_Float16>(8.272727),  static_cast<_Float16>(8.363636),
1699       static_cast<_Float16>(8.454545),  static_cast<_Float16>(8.545455),
1700       static_cast<_Float16>(8.636364),  static_cast<_Float16>(8.0),
1701       static_cast<_Float16>(8.083333),  static_cast<_Float16>(8.166667),
1702       static_cast<_Float16>(8.25),      static_cast<_Float16>(8.333333),
1703       static_cast<_Float16>(11.222222), static_cast<_Float16>(11.333333),
1704       static_cast<_Float16>(11.444445), static_cast<_Float16>(11.555555),
1705       static_cast<_Float16>(11.666667), static_cast<_Float16>(10.6),
1706       static_cast<_Float16>(10.7),      static_cast<_Float16>(10.8),
1707       static_cast<_Float16>(10.9),      static_cast<_Float16>(11.0),
1708       static_cast<_Float16>(10.090909), static_cast<_Float16>(10.181818),
1709       static_cast<_Float16>(10.272727), static_cast<_Float16>(10.363636),
1710       static_cast<_Float16>(10.454545), static_cast<_Float16>(9.666667),
1711       static_cast<_Float16>(9.75),      static_cast<_Float16>(9.833333),
1712       static_cast<_Float16>(9.916667),  static_cast<_Float16>(10.0)};
1713     nntrainer::Tensor answer(ref_dim, answer_data);
1714     int status = t.divide_i(m);
1715     EXPECT_EQ(status, ML_ERROR_NONE);
1716     EXPECT_EQ(t, answer);
1717   }
1718   {
1719     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1720                                  nntrainer::Tdatatype::FP16);
1721     nntrainer::Tensor t =
1722       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1723     t.add_i(1);
1724     nntrainer::Tensor m =
1725       ranged(1, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1726     m.add_i(1);
1727     _Float16 answer_data[] = {
1728       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1729       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1730       static_cast<_Float16>(1.0),       static_cast<_Float16>(6.0),
1731       static_cast<_Float16>(3.5),       static_cast<_Float16>(2.6666667),
1732       static_cast<_Float16>(2.25),      static_cast<_Float16>(2.0),
1733       static_cast<_Float16>(11.0),      static_cast<_Float16>(6.0),
1734       static_cast<_Float16>(4.3333335), static_cast<_Float16>(3.5),
1735       static_cast<_Float16>(3.0),       static_cast<_Float16>(16.0),
1736       static_cast<_Float16>(8.5),       static_cast<_Float16>(6.0),
1737       static_cast<_Float16>(4.75),      static_cast<_Float16>(4.0),
1738       static_cast<_Float16>(21.0),      static_cast<_Float16>(11.0),
1739       static_cast<_Float16>(7.6666665), static_cast<_Float16>(6.0),
1740       static_cast<_Float16>(5.0),       static_cast<_Float16>(26.0),
1741       static_cast<_Float16>(13.5),      static_cast<_Float16>(9.333333),
1742       static_cast<_Float16>(7.25),      static_cast<_Float16>(6.0),
1743       static_cast<_Float16>(31.0),      static_cast<_Float16>(16.0),
1744       static_cast<_Float16>(11.0),      static_cast<_Float16>(8.5),
1745       static_cast<_Float16>(7.0),       static_cast<_Float16>(36.0),
1746       static_cast<_Float16>(18.5),      static_cast<_Float16>(12.666667),
1747       static_cast<_Float16>(9.75),      static_cast<_Float16>(8.0),
1748       static_cast<_Float16>(41.0),      static_cast<_Float16>(21.0),
1749       static_cast<_Float16>(14.333333), static_cast<_Float16>(11.0),
1750       static_cast<_Float16>(9.0),       static_cast<_Float16>(46.0),
1751       static_cast<_Float16>(23.5),      static_cast<_Float16>(16.0),
1752       static_cast<_Float16>(12.25),     static_cast<_Float16>(10.0),
1753       static_cast<_Float16>(51.0),      static_cast<_Float16>(26.0),
1754       static_cast<_Float16>(17.666666), static_cast<_Float16>(13.5),
1755       static_cast<_Float16>(11.0),      static_cast<_Float16>(56.0),
1756       static_cast<_Float16>(28.5),      static_cast<_Float16>(19.333334),
1757       static_cast<_Float16>(14.75),     static_cast<_Float16>(12.0),
1758       static_cast<_Float16>(61.0),      static_cast<_Float16>(31.0),
1759       static_cast<_Float16>(21.0),      static_cast<_Float16>(16.0),
1760       static_cast<_Float16>(13.0),      static_cast<_Float16>(66.0),
1761       static_cast<_Float16>(33.5),      static_cast<_Float16>(22.666666),
1762       static_cast<_Float16>(17.25),     static_cast<_Float16>(14.0),
1763       static_cast<_Float16>(71.0),      static_cast<_Float16>(36.0),
1764       static_cast<_Float16>(24.333334), static_cast<_Float16>(18.5),
1765       static_cast<_Float16>(15.0),      static_cast<_Float16>(76.0),
1766       static_cast<_Float16>(38.5),      static_cast<_Float16>(26.0),
1767       static_cast<_Float16>(19.75),     static_cast<_Float16>(16.0),
1768       static_cast<_Float16>(81.0),      static_cast<_Float16>(41.0),
1769       static_cast<_Float16>(27.666666), static_cast<_Float16>(21.0),
1770       static_cast<_Float16>(17.0),      static_cast<_Float16>(86.0),
1771       static_cast<_Float16>(43.5),      static_cast<_Float16>(29.333334),
1772       static_cast<_Float16>(22.25),     static_cast<_Float16>(18.0),
1773       static_cast<_Float16>(91.0),      static_cast<_Float16>(46.0),
1774       static_cast<_Float16>(31.0),      static_cast<_Float16>(23.5),
1775       static_cast<_Float16>(19.0),      static_cast<_Float16>(96.0),
1776       static_cast<_Float16>(48.5),      static_cast<_Float16>(32.666668),
1777       static_cast<_Float16>(24.75),     static_cast<_Float16>(20.0),
1778       static_cast<_Float16>(101.0),     static_cast<_Float16>(51.0),
1779       static_cast<_Float16>(34.333332), static_cast<_Float16>(26.0),
1780       static_cast<_Float16>(21.0),      static_cast<_Float16>(106.0),
1781       static_cast<_Float16>(53.5),      static_cast<_Float16>(36.0),
1782       static_cast<_Float16>(27.25),     static_cast<_Float16>(22.0),
1783       static_cast<_Float16>(111.0),     static_cast<_Float16>(56.0),
1784       static_cast<_Float16>(37.666668), static_cast<_Float16>(28.5),
1785       static_cast<_Float16>(23.0),      static_cast<_Float16>(116.0),
1786       static_cast<_Float16>(58.5),      static_cast<_Float16>(39.333332),
1787       static_cast<_Float16>(29.75),     static_cast<_Float16>(24.0)};
1788     nntrainer::Tensor answer(ref_dim, answer_data);
1789     int status = t.divide_i(m);
1790     EXPECT_EQ(status, ML_ERROR_NONE);
1791     EXPECT_EQ(t, answer);
1792   }
1793   {
1794     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1795                                  nntrainer::Tdatatype::FP16);
1796     nntrainer::Tensor t =
1797       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1798     t.add_i(1);
1799     nntrainer::Tensor m =
1800       ranged(1, 2, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1801     m.add_i(1);
1802     _Float16 answer_data[] = {
1803       static_cast<_Float16>(1.0),  static_cast<_Float16>(2.0),
1804       static_cast<_Float16>(3.0),  static_cast<_Float16>(4.0),
1805       static_cast<_Float16>(5.0),  static_cast<_Float16>(6.0),
1806       static_cast<_Float16>(7.0),  static_cast<_Float16>(8.0),
1807       static_cast<_Float16>(9.0),  static_cast<_Float16>(10.0),
1808       static_cast<_Float16>(11.0), static_cast<_Float16>(12.0),
1809       static_cast<_Float16>(13.0), static_cast<_Float16>(14.0),
1810       static_cast<_Float16>(15.0), static_cast<_Float16>(16.0),
1811       static_cast<_Float16>(17.0), static_cast<_Float16>(18.0),
1812       static_cast<_Float16>(19.0), static_cast<_Float16>(20.0),
1813       static_cast<_Float16>(10.5), static_cast<_Float16>(11.0),
1814       static_cast<_Float16>(11.5), static_cast<_Float16>(12.0),
1815       static_cast<_Float16>(12.5), static_cast<_Float16>(13.0),
1816       static_cast<_Float16>(13.5), static_cast<_Float16>(14.0),
1817       static_cast<_Float16>(14.5), static_cast<_Float16>(15.0),
1818       static_cast<_Float16>(15.5), static_cast<_Float16>(16.0),
1819       static_cast<_Float16>(16.5), static_cast<_Float16>(17.0),
1820       static_cast<_Float16>(17.5), static_cast<_Float16>(18.0),
1821       static_cast<_Float16>(18.5), static_cast<_Float16>(19.0),
1822       static_cast<_Float16>(19.5), static_cast<_Float16>(20.0),
1823       static_cast<_Float16>(41.0), static_cast<_Float16>(42.0),
1824       static_cast<_Float16>(43.0), static_cast<_Float16>(44.0),
1825       static_cast<_Float16>(45.0), static_cast<_Float16>(46.0),
1826       static_cast<_Float16>(47.0), static_cast<_Float16>(48.0),
1827       static_cast<_Float16>(49.0), static_cast<_Float16>(50.0),
1828       static_cast<_Float16>(51.0), static_cast<_Float16>(52.0),
1829       static_cast<_Float16>(53.0), static_cast<_Float16>(54.0),
1830       static_cast<_Float16>(55.0), static_cast<_Float16>(56.0),
1831       static_cast<_Float16>(57.0), static_cast<_Float16>(58.0),
1832       static_cast<_Float16>(59.0), static_cast<_Float16>(60.0),
1833       static_cast<_Float16>(30.5), static_cast<_Float16>(31.0),
1834       static_cast<_Float16>(31.5), static_cast<_Float16>(32.0),
1835       static_cast<_Float16>(32.5), static_cast<_Float16>(33.0),
1836       static_cast<_Float16>(33.5), static_cast<_Float16>(34.0),
1837       static_cast<_Float16>(34.5), static_cast<_Float16>(35.0),
1838       static_cast<_Float16>(35.5), static_cast<_Float16>(36.0),
1839       static_cast<_Float16>(36.5), static_cast<_Float16>(37.0),
1840       static_cast<_Float16>(37.5), static_cast<_Float16>(38.0),
1841       static_cast<_Float16>(38.5), static_cast<_Float16>(39.0),
1842       static_cast<_Float16>(39.5), static_cast<_Float16>(40.0),
1843       static_cast<_Float16>(81.0), static_cast<_Float16>(82.0),
1844       static_cast<_Float16>(83.0), static_cast<_Float16>(84.0),
1845       static_cast<_Float16>(85.0), static_cast<_Float16>(86.0),
1846       static_cast<_Float16>(87.0), static_cast<_Float16>(88.0),
1847       static_cast<_Float16>(89.0), static_cast<_Float16>(90.0),
1848       static_cast<_Float16>(91.0), static_cast<_Float16>(92.0),
1849       static_cast<_Float16>(93.0), static_cast<_Float16>(94.0),
1850       static_cast<_Float16>(95.0), static_cast<_Float16>(96.0),
1851       static_cast<_Float16>(97.0), static_cast<_Float16>(98.0),
1852       static_cast<_Float16>(99.0), static_cast<_Float16>(100.0),
1853       static_cast<_Float16>(50.5), static_cast<_Float16>(51.0),
1854       static_cast<_Float16>(51.5), static_cast<_Float16>(52.0),
1855       static_cast<_Float16>(52.5), static_cast<_Float16>(53.0),
1856       static_cast<_Float16>(53.5), static_cast<_Float16>(54.0),
1857       static_cast<_Float16>(54.5), static_cast<_Float16>(55.0),
1858       static_cast<_Float16>(55.5), static_cast<_Float16>(56.0),
1859       static_cast<_Float16>(56.5), static_cast<_Float16>(57.0),
1860       static_cast<_Float16>(57.5), static_cast<_Float16>(58.0),
1861       static_cast<_Float16>(58.5), static_cast<_Float16>(59.0),
1862       static_cast<_Float16>(59.5), static_cast<_Float16>(60.0)};
1863     nntrainer::Tensor answer(ref_dim, answer_data);
1864     int status = t.divide_i(m);
1865     EXPECT_EQ(status, ML_ERROR_NONE);
1866     EXPECT_EQ(t, answer);
1867   }
1868   {
1869     nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
1870                                  nntrainer::Tdatatype::FP16);
1871     nntrainer::Tensor t =
1872       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1873     t.add_i(1);
1874     nntrainer::Tensor m =
1875       ranged(3, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1876     m.add_i(1);
1877     _Float16 answer_data[] = {
1878       static_cast<_Float16>(1.0),       static_cast<_Float16>(2.0),
1879       static_cast<_Float16>(3.0),       static_cast<_Float16>(4.0),
1880       static_cast<_Float16>(5.0),       static_cast<_Float16>(6.0),
1881       static_cast<_Float16>(7.0),       static_cast<_Float16>(8.0),
1882       static_cast<_Float16>(9.0),       static_cast<_Float16>(10.0),
1883       static_cast<_Float16>(11.0),      static_cast<_Float16>(12.0),
1884       static_cast<_Float16>(13.0),      static_cast<_Float16>(14.0),
1885       static_cast<_Float16>(15.0),      static_cast<_Float16>(16.0),
1886       static_cast<_Float16>(17.0),      static_cast<_Float16>(18.0),
1887       static_cast<_Float16>(19.0),      static_cast<_Float16>(20.0),
1888       static_cast<_Float16>(21.0),      static_cast<_Float16>(22.0),
1889       static_cast<_Float16>(23.0),      static_cast<_Float16>(24.0),
1890       static_cast<_Float16>(25.0),      static_cast<_Float16>(26.0),
1891       static_cast<_Float16>(27.0),      static_cast<_Float16>(28.0),
1892       static_cast<_Float16>(29.0),      static_cast<_Float16>(30.0),
1893       static_cast<_Float16>(31.0),      static_cast<_Float16>(32.0),
1894       static_cast<_Float16>(33.0),      static_cast<_Float16>(34.0),
1895       static_cast<_Float16>(35.0),      static_cast<_Float16>(36.0),
1896       static_cast<_Float16>(37.0),      static_cast<_Float16>(38.0),
1897       static_cast<_Float16>(39.0),      static_cast<_Float16>(40.0),
1898       static_cast<_Float16>(20.5),      static_cast<_Float16>(21.0),
1899       static_cast<_Float16>(21.5),      static_cast<_Float16>(22.0),
1900       static_cast<_Float16>(22.5),      static_cast<_Float16>(23.0),
1901       static_cast<_Float16>(23.5),      static_cast<_Float16>(24.0),
1902       static_cast<_Float16>(24.5),      static_cast<_Float16>(25.0),
1903       static_cast<_Float16>(25.5),      static_cast<_Float16>(26.0),
1904       static_cast<_Float16>(26.5),      static_cast<_Float16>(27.0),
1905       static_cast<_Float16>(27.5),      static_cast<_Float16>(28.0),
1906       static_cast<_Float16>(28.5),      static_cast<_Float16>(29.0),
1907       static_cast<_Float16>(29.5),      static_cast<_Float16>(30.0),
1908       static_cast<_Float16>(30.5),      static_cast<_Float16>(31.0),
1909       static_cast<_Float16>(31.5),      static_cast<_Float16>(32.0),
1910       static_cast<_Float16>(32.5),      static_cast<_Float16>(33.0),
1911       static_cast<_Float16>(33.5),      static_cast<_Float16>(34.0),
1912       static_cast<_Float16>(34.5),      static_cast<_Float16>(35.0),
1913       static_cast<_Float16>(35.5),      static_cast<_Float16>(36.0),
1914       static_cast<_Float16>(36.5),      static_cast<_Float16>(37.0),
1915       static_cast<_Float16>(37.5),      static_cast<_Float16>(38.0),
1916       static_cast<_Float16>(38.5),      static_cast<_Float16>(39.0),
1917       static_cast<_Float16>(39.5),      static_cast<_Float16>(40.0),
1918       static_cast<_Float16>(27.0),      static_cast<_Float16>(27.333334),
1919       static_cast<_Float16>(27.666666), static_cast<_Float16>(28.0),
1920       static_cast<_Float16>(28.333334), static_cast<_Float16>(28.666666),
1921       static_cast<_Float16>(29.0),      static_cast<_Float16>(29.333334),
1922       static_cast<_Float16>(29.666666), static_cast<_Float16>(30.0),
1923       static_cast<_Float16>(30.333334), static_cast<_Float16>(30.666666),
1924       static_cast<_Float16>(31.0),      static_cast<_Float16>(31.333334),
1925       static_cast<_Float16>(31.666666), static_cast<_Float16>(32.0),
1926       static_cast<_Float16>(32.333332), static_cast<_Float16>(32.666668),
1927       static_cast<_Float16>(33.0),      static_cast<_Float16>(33.333332),
1928       static_cast<_Float16>(33.666668), static_cast<_Float16>(34.0),
1929       static_cast<_Float16>(34.333332), static_cast<_Float16>(34.666668),
1930       static_cast<_Float16>(35.0),      static_cast<_Float16>(35.333332),
1931       static_cast<_Float16>(35.666668), static_cast<_Float16>(36.0),
1932       static_cast<_Float16>(36.333332), static_cast<_Float16>(36.666668),
1933       static_cast<_Float16>(37.0),      static_cast<_Float16>(37.333332),
1934       static_cast<_Float16>(37.666668), static_cast<_Float16>(38.0),
1935       static_cast<_Float16>(38.333332), static_cast<_Float16>(38.666668),
1936       static_cast<_Float16>(39.0),      static_cast<_Float16>(39.333332),
1937       static_cast<_Float16>(39.666668), static_cast<_Float16>(40.0)};
1938     nntrainer::Tensor answer(ref_dim, answer_data);
1939     int status = t.divide_i(m);
1940     EXPECT_EQ(status, ML_ERROR_NONE);
1941     EXPECT_EQ(t, answer);
1942   }
1943   {
1944     nntrainer::TensorDim ref_dim(3, 5, 1, 4, nntrainer::Tformat::NCHW,
1945                                  nntrainer::Tdatatype::FP16);
1946     nntrainer::Tensor t =
1947       ranged(3, 5, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1948     t.add_i(1);
1949     nntrainer::Tensor m =
1950       ranged(3, 1, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1951     m.add_i(1);
1952     _Float16 answer_data[] = {
1953       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1954       static_cast<_Float16>(1.0),       static_cast<_Float16>(1.0),
1955       static_cast<_Float16>(5.0),       static_cast<_Float16>(3.0),
1956       static_cast<_Float16>(2.3333333), static_cast<_Float16>(2.0),
1957       static_cast<_Float16>(9.0),       static_cast<_Float16>(5.0),
1958       static_cast<_Float16>(3.6666667), static_cast<_Float16>(3.0),
1959       static_cast<_Float16>(13.0),      static_cast<_Float16>(7.0),
1960       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.0),
1961       static_cast<_Float16>(17.0),      static_cast<_Float16>(9.0),
1962       static_cast<_Float16>(6.3333335), static_cast<_Float16>(5.0),
1963       static_cast<_Float16>(4.2),       static_cast<_Float16>(3.6666667),
1964       static_cast<_Float16>(3.2857144), static_cast<_Float16>(3.0),
1965       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.3333335),
1966       static_cast<_Float16>(3.857143),  static_cast<_Float16>(3.5),
1967       static_cast<_Float16>(5.8),       static_cast<_Float16>(5.0),
1968       static_cast<_Float16>(4.428571),  static_cast<_Float16>(4.0),
1969       static_cast<_Float16>(6.6),       static_cast<_Float16>(5.6666665),
1970       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.5),
1971       static_cast<_Float16>(7.4),       static_cast<_Float16>(6.3333335),
1972       static_cast<_Float16>(5.571429),  static_cast<_Float16>(5.0),
1973       static_cast<_Float16>(4.5555553), static_cast<_Float16>(4.2),
1974       static_cast<_Float16>(3.909091),  static_cast<_Float16>(3.6666667),
1975       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.6),
1976       static_cast<_Float16>(4.2727275), static_cast<_Float16>(4.0),
1977       static_cast<_Float16>(5.4444447), static_cast<_Float16>(5.0),
1978       static_cast<_Float16>(4.6363635), static_cast<_Float16>(4.3333335),
1979       static_cast<_Float16>(5.888889),  static_cast<_Float16>(5.4),
1980       static_cast<_Float16>(5.0),       static_cast<_Float16>(4.6666665),
1981       static_cast<_Float16>(6.3333335), static_cast<_Float16>(5.8),
1982       static_cast<_Float16>(5.3636365), static_cast<_Float16>(5.0)};
1983     nntrainer::Tensor answer(ref_dim, answer_data);
1984     int status = t.divide_i(m);
1985     EXPECT_EQ(status, ML_ERROR_NONE);
1986     EXPECT_EQ(t, answer);
1987   }
1988 }
1989
1990 TEST(nntrainer_Tensor, divide_i_broadcast_not_supported_01_n) {
1991   nntrainer::Tensor target(3, 1, 3, 1, nntrainer::Tformat::NCHW,
1992                            nntrainer::Tdatatype::FP16);
1993   nntrainer::Tensor target2(3, 1, 3, 3, nntrainer::Tformat::NCHW,
1994                             nntrainer::Tdatatype::FP16);
1995
1996   EXPECT_EQ(target.divide_i(target2), ML_ERROR_INVALID_PARAMETER);
1997 }
1998
1999 TEST(nntrainer_Tensor, divide_i_broadcast_not_broadcastable_02_n) {
2000   nntrainer::Tensor target(3, 2, 4, 5, nntrainer::Tformat::NCHW,
2001                            nntrainer::Tdatatype::FP16);
2002   nntrainer::Tensor target2(3, 2, 3, 1, nntrainer::Tformat::NCHW,
2003                             nntrainer::Tdatatype::FP16);
2004
2005   EXPECT_EQ(target.divide_i(target2), ML_ERROR_INVALID_PARAMETER);
2006 }
2007
2008 TEST(nntrainer_Tensor, add_i_01_p) {
2009   int status = ML_ERROR_NONE;
2010   int batch = 3;
2011   int height = 3;
2012   int width = 10;
2013   int channel = 1;
2014
2015   nntrainer::Tensor target(batch, channel, height, width,
2016                            nntrainer::Tformat::NCHW,
2017                            nntrainer::Tdatatype::FP16);
2018   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1 + channel);
2019
2020   nntrainer::Tensor original(batch, channel, height, width,
2021                              nntrainer::Tformat::NCHW,
2022                              nntrainer::Tdatatype::FP16);
2023   original.copy(target);
2024
2025   status = target.add_i((_Float16)2.1);
2026   EXPECT_EQ(status, ML_ERROR_NONE);
2027
2028   _Float16 *previous = original.getData<_Float16>();
2029   ASSERT_NE(nullptr, previous);
2030   _Float16 *data = target.getData<_Float16>();
2031   ASSERT_NE(nullptr, data);
2032
2033   for (int i = 0; i < batch * height * width; ++i) {
2034     EXPECT_FLOAT_EQ(data[i], (_Float16)(previous[i] + (_Float16)2.1));
2035   }
2036 }
2037
2038 TEST(nntrainer_Tensor, add_i_02_p) {
2039   int status = ML_ERROR_NONE;
2040   int batch = 3;
2041   int height = 3;
2042   int width = 10;
2043   int channel = 1;
2044
2045   nntrainer::Tensor target(batch, channel, height, width,
2046                            nntrainer::Tformat::NCHW,
2047                            nntrainer::Tdatatype::FP16);
2048   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1);
2049
2050   nntrainer::Tensor original(batch, height, width, nntrainer::Tformat::NCHW,
2051                              nntrainer::Tdatatype::FP16);
2052   original.copy(target);
2053
2054   status = target.add_i(target, 3.0);
2055   EXPECT_EQ(status, ML_ERROR_NONE);
2056
2057   _Float16 *previous = original.getData<_Float16>();
2058   ASSERT_NE(nullptr, previous);
2059   _Float16 *data = target.getData<_Float16>();
2060   ASSERT_NE(nullptr, data);
2061
2062   for (int i = 0; i < batch * height * width; ++i) {
2063     EXPECT_FLOAT_EQ(data[i], previous[i] * 4.0);
2064   }
2065 }
2066
2067 // /**
2068 //  * @brief operand dimension is not right
2069 //  */
2070 TEST(nntrainer_Tensor, add_i_01_n) {
2071   int status = ML_ERROR_NONE;
2072   int batch = 3;
2073   int height = 3;
2074   int width = 10;
2075   int channel = 1;
2076
2077   nntrainer::Tensor target(batch, channel, height, width,
2078                            nntrainer::Tformat::NCHW,
2079                            nntrainer::Tdatatype::FP16);
2080   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1);
2081
2082   nntrainer::Tensor target2(batch, height - 2, width - 3,
2083                             nntrainer::Tformat::NCHW,
2084                             nntrainer::Tdatatype::FP16);
2085
2086   status = target.add_i(target2);
2087   EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
2088 }
2089
2090 TEST(nntrainer_Tensor, add_i_broadcast_01_p) {
2091   nntrainer::TensorDim ref_dim(3, 2, 4, 5, nntrainer::Tformat::NCHW,
2092                                nntrainer::Tdatatype::FP16);
2093   {
2094     nntrainer::Tensor t =
2095       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2096     nntrainer::Tensor m =
2097       ranged(1, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2098     _Float16 answer_data[] = {
2099       static_cast<_Float16>(0),   static_cast<_Float16>(2),
2100       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2101       static_cast<_Float16>(8),   static_cast<_Float16>(10),
2102       static_cast<_Float16>(12),  static_cast<_Float16>(14),
2103       static_cast<_Float16>(16),  static_cast<_Float16>(18),
2104       static_cast<_Float16>(20),  static_cast<_Float16>(22),
2105       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2106       static_cast<_Float16>(28),  static_cast<_Float16>(30),
2107       static_cast<_Float16>(32),  static_cast<_Float16>(34),
2108       static_cast<_Float16>(36),  static_cast<_Float16>(38),
2109       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2110       static_cast<_Float16>(44),  static_cast<_Float16>(46),
2111       static_cast<_Float16>(48),  static_cast<_Float16>(50),
2112       static_cast<_Float16>(52),  static_cast<_Float16>(54),
2113       static_cast<_Float16>(56),  static_cast<_Float16>(58),
2114       static_cast<_Float16>(60),  static_cast<_Float16>(62),
2115       static_cast<_Float16>(64),  static_cast<_Float16>(66),
2116       static_cast<_Float16>(68),  static_cast<_Float16>(70),
2117       static_cast<_Float16>(72),  static_cast<_Float16>(74),
2118       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2119       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2120       static_cast<_Float16>(44),  static_cast<_Float16>(46),
2121       static_cast<_Float16>(48),  static_cast<_Float16>(50),
2122       static_cast<_Float16>(52),  static_cast<_Float16>(54),
2123       static_cast<_Float16>(56),  static_cast<_Float16>(58),
2124       static_cast<_Float16>(60),  static_cast<_Float16>(62),
2125       static_cast<_Float16>(64),  static_cast<_Float16>(66),
2126       static_cast<_Float16>(68),  static_cast<_Float16>(70),
2127       static_cast<_Float16>(72),  static_cast<_Float16>(74),
2128       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2129       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2130       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2131       static_cast<_Float16>(88),  static_cast<_Float16>(90),
2132       static_cast<_Float16>(92),  static_cast<_Float16>(94),
2133       static_cast<_Float16>(96),  static_cast<_Float16>(98),
2134       static_cast<_Float16>(100), static_cast<_Float16>(102),
2135       static_cast<_Float16>(104), static_cast<_Float16>(106),
2136       static_cast<_Float16>(108), static_cast<_Float16>(110),
2137       static_cast<_Float16>(112), static_cast<_Float16>(114),
2138       static_cast<_Float16>(116), static_cast<_Float16>(118),
2139       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2140       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2141       static_cast<_Float16>(88),  static_cast<_Float16>(90),
2142       static_cast<_Float16>(92),  static_cast<_Float16>(94),
2143       static_cast<_Float16>(96),  static_cast<_Float16>(98),
2144       static_cast<_Float16>(100), static_cast<_Float16>(102),
2145       static_cast<_Float16>(104), static_cast<_Float16>(106),
2146       static_cast<_Float16>(108), static_cast<_Float16>(110),
2147       static_cast<_Float16>(112), static_cast<_Float16>(114),
2148       static_cast<_Float16>(116), static_cast<_Float16>(118),
2149       static_cast<_Float16>(120), static_cast<_Float16>(122),
2150       static_cast<_Float16>(124), static_cast<_Float16>(126),
2151       static_cast<_Float16>(128), static_cast<_Float16>(130),
2152       static_cast<_Float16>(132), static_cast<_Float16>(134),
2153       static_cast<_Float16>(136), static_cast<_Float16>(138),
2154       static_cast<_Float16>(140), static_cast<_Float16>(142),
2155       static_cast<_Float16>(144), static_cast<_Float16>(146),
2156       static_cast<_Float16>(148), static_cast<_Float16>(150),
2157       static_cast<_Float16>(152), static_cast<_Float16>(154),
2158       static_cast<_Float16>(156), static_cast<_Float16>(158)};
2159     nntrainer::Tensor answer(ref_dim, answer_data);
2160     int status = t.add_i(m);
2161     EXPECT_EQ(status, ML_ERROR_NONE);
2162     EXPECT_EQ(t, answer);
2163   }
2164   {
2165     nntrainer::Tensor t =
2166       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2167     nntrainer::Tensor m =
2168       ranged(3, 1, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2169     _Float16 answer_data[] = {
2170       static_cast<_Float16>(0),   static_cast<_Float16>(2),
2171       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2172       static_cast<_Float16>(8),   static_cast<_Float16>(10),
2173       static_cast<_Float16>(12),  static_cast<_Float16>(14),
2174       static_cast<_Float16>(16),  static_cast<_Float16>(18),
2175       static_cast<_Float16>(20),  static_cast<_Float16>(22),
2176       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2177       static_cast<_Float16>(28),  static_cast<_Float16>(30),
2178       static_cast<_Float16>(32),  static_cast<_Float16>(34),
2179       static_cast<_Float16>(36),  static_cast<_Float16>(38),
2180       static_cast<_Float16>(20),  static_cast<_Float16>(22),
2181       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2182       static_cast<_Float16>(28),  static_cast<_Float16>(30),
2183       static_cast<_Float16>(32),  static_cast<_Float16>(34),
2184       static_cast<_Float16>(36),  static_cast<_Float16>(38),
2185       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2186       static_cast<_Float16>(44),  static_cast<_Float16>(46),
2187       static_cast<_Float16>(48),  static_cast<_Float16>(50),
2188       static_cast<_Float16>(52),  static_cast<_Float16>(54),
2189       static_cast<_Float16>(56),  static_cast<_Float16>(58),
2190       static_cast<_Float16>(60),  static_cast<_Float16>(62),
2191       static_cast<_Float16>(64),  static_cast<_Float16>(66),
2192       static_cast<_Float16>(68),  static_cast<_Float16>(70),
2193       static_cast<_Float16>(72),  static_cast<_Float16>(74),
2194       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2195       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2196       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2197       static_cast<_Float16>(88),  static_cast<_Float16>(90),
2198       static_cast<_Float16>(92),  static_cast<_Float16>(94),
2199       static_cast<_Float16>(96),  static_cast<_Float16>(98),
2200       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2201       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2202       static_cast<_Float16>(88),  static_cast<_Float16>(90),
2203       static_cast<_Float16>(92),  static_cast<_Float16>(94),
2204       static_cast<_Float16>(96),  static_cast<_Float16>(98),
2205       static_cast<_Float16>(100), static_cast<_Float16>(102),
2206       static_cast<_Float16>(104), static_cast<_Float16>(106),
2207       static_cast<_Float16>(108), static_cast<_Float16>(110),
2208       static_cast<_Float16>(112), static_cast<_Float16>(114),
2209       static_cast<_Float16>(116), static_cast<_Float16>(118),
2210       static_cast<_Float16>(120), static_cast<_Float16>(122),
2211       static_cast<_Float16>(124), static_cast<_Float16>(126),
2212       static_cast<_Float16>(128), static_cast<_Float16>(130),
2213       static_cast<_Float16>(132), static_cast<_Float16>(134),
2214       static_cast<_Float16>(136), static_cast<_Float16>(138),
2215       static_cast<_Float16>(140), static_cast<_Float16>(142),
2216       static_cast<_Float16>(144), static_cast<_Float16>(146),
2217       static_cast<_Float16>(148), static_cast<_Float16>(150),
2218       static_cast<_Float16>(152), static_cast<_Float16>(154),
2219       static_cast<_Float16>(156), static_cast<_Float16>(158),
2220       static_cast<_Float16>(140), static_cast<_Float16>(142),
2221       static_cast<_Float16>(144), static_cast<_Float16>(146),
2222       static_cast<_Float16>(148), static_cast<_Float16>(150),
2223       static_cast<_Float16>(152), static_cast<_Float16>(154),
2224       static_cast<_Float16>(156), static_cast<_Float16>(158),
2225       static_cast<_Float16>(160), static_cast<_Float16>(162),
2226       static_cast<_Float16>(164), static_cast<_Float16>(166),
2227       static_cast<_Float16>(168), static_cast<_Float16>(170),
2228       static_cast<_Float16>(172), static_cast<_Float16>(174),
2229       static_cast<_Float16>(176), static_cast<_Float16>(178)};
2230     nntrainer::Tensor answer(ref_dim, answer_data);
2231     int status = t.add_i(m);
2232     EXPECT_EQ(status, ML_ERROR_NONE);
2233     EXPECT_EQ(t, answer);
2234   }
2235   {
2236     nntrainer::Tensor t =
2237       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2238     nntrainer::Tensor m =
2239       ranged(3, 2, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2240     _Float16 answer_data[] = {
2241       static_cast<_Float16>(0),   static_cast<_Float16>(1),
2242       static_cast<_Float16>(2),   static_cast<_Float16>(3),
2243       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2244       static_cast<_Float16>(7),   static_cast<_Float16>(8),
2245       static_cast<_Float16>(9),   static_cast<_Float16>(10),
2246       static_cast<_Float16>(12),  static_cast<_Float16>(13),
2247       static_cast<_Float16>(14),  static_cast<_Float16>(15),
2248       static_cast<_Float16>(16),  static_cast<_Float16>(18),
2249       static_cast<_Float16>(19),  static_cast<_Float16>(20),
2250       static_cast<_Float16>(21),  static_cast<_Float16>(22),
2251       static_cast<_Float16>(24),  static_cast<_Float16>(25),
2252       static_cast<_Float16>(26),  static_cast<_Float16>(27),
2253       static_cast<_Float16>(28),  static_cast<_Float16>(30),
2254       static_cast<_Float16>(31),  static_cast<_Float16>(32),
2255       static_cast<_Float16>(33),  static_cast<_Float16>(34),
2256       static_cast<_Float16>(36),  static_cast<_Float16>(37),
2257       static_cast<_Float16>(38),  static_cast<_Float16>(39),
2258       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2259       static_cast<_Float16>(43),  static_cast<_Float16>(44),
2260       static_cast<_Float16>(45),  static_cast<_Float16>(46),
2261       static_cast<_Float16>(48),  static_cast<_Float16>(49),
2262       static_cast<_Float16>(50),  static_cast<_Float16>(51),
2263       static_cast<_Float16>(52),  static_cast<_Float16>(54),
2264       static_cast<_Float16>(55),  static_cast<_Float16>(56),
2265       static_cast<_Float16>(57),  static_cast<_Float16>(58),
2266       static_cast<_Float16>(60),  static_cast<_Float16>(61),
2267       static_cast<_Float16>(62),  static_cast<_Float16>(63),
2268       static_cast<_Float16>(64),  static_cast<_Float16>(66),
2269       static_cast<_Float16>(67),  static_cast<_Float16>(68),
2270       static_cast<_Float16>(69),  static_cast<_Float16>(70),
2271       static_cast<_Float16>(72),  static_cast<_Float16>(73),
2272       static_cast<_Float16>(74),  static_cast<_Float16>(75),
2273       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2274       static_cast<_Float16>(79),  static_cast<_Float16>(80),
2275       static_cast<_Float16>(81),  static_cast<_Float16>(82),
2276       static_cast<_Float16>(84),  static_cast<_Float16>(85),
2277       static_cast<_Float16>(86),  static_cast<_Float16>(87),
2278       static_cast<_Float16>(88),  static_cast<_Float16>(90),
2279       static_cast<_Float16>(91),  static_cast<_Float16>(92),
2280       static_cast<_Float16>(93),  static_cast<_Float16>(94),
2281       static_cast<_Float16>(96),  static_cast<_Float16>(97),
2282       static_cast<_Float16>(98),  static_cast<_Float16>(99),
2283       static_cast<_Float16>(100), static_cast<_Float16>(102),
2284       static_cast<_Float16>(103), static_cast<_Float16>(104),
2285       static_cast<_Float16>(105), static_cast<_Float16>(106),
2286       static_cast<_Float16>(108), static_cast<_Float16>(109),
2287       static_cast<_Float16>(110), static_cast<_Float16>(111),
2288       static_cast<_Float16>(112), static_cast<_Float16>(114),
2289       static_cast<_Float16>(115), static_cast<_Float16>(116),
2290       static_cast<_Float16>(117), static_cast<_Float16>(118),
2291       static_cast<_Float16>(120), static_cast<_Float16>(121),
2292       static_cast<_Float16>(122), static_cast<_Float16>(123),
2293       static_cast<_Float16>(124), static_cast<_Float16>(126),
2294       static_cast<_Float16>(127), static_cast<_Float16>(128),
2295       static_cast<_Float16>(129), static_cast<_Float16>(130),
2296       static_cast<_Float16>(132), static_cast<_Float16>(133),
2297       static_cast<_Float16>(134), static_cast<_Float16>(135),
2298       static_cast<_Float16>(136), static_cast<_Float16>(138),
2299       static_cast<_Float16>(139), static_cast<_Float16>(140),
2300       static_cast<_Float16>(141), static_cast<_Float16>(142)};
2301     nntrainer::Tensor answer(ref_dim, answer_data);
2302     int status = t.add_i(m);
2303     EXPECT_EQ(status, ML_ERROR_NONE);
2304     EXPECT_EQ(t, answer);
2305   }
2306   {
2307     nntrainer::Tensor t =
2308       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2309     nntrainer::Tensor m =
2310       ranged(3, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2311     _Float16 answer_data[] = {
2312       static_cast<_Float16>(0),   static_cast<_Float16>(2),
2313       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2314       static_cast<_Float16>(8),   static_cast<_Float16>(5),
2315       static_cast<_Float16>(7),   static_cast<_Float16>(9),
2316       static_cast<_Float16>(11),  static_cast<_Float16>(13),
2317       static_cast<_Float16>(10),  static_cast<_Float16>(12),
2318       static_cast<_Float16>(14),  static_cast<_Float16>(16),
2319       static_cast<_Float16>(18),  static_cast<_Float16>(15),
2320       static_cast<_Float16>(17),  static_cast<_Float16>(19),
2321       static_cast<_Float16>(21),  static_cast<_Float16>(23),
2322       static_cast<_Float16>(20),  static_cast<_Float16>(22),
2323       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2324       static_cast<_Float16>(28),  static_cast<_Float16>(25),
2325       static_cast<_Float16>(27),  static_cast<_Float16>(29),
2326       static_cast<_Float16>(31),  static_cast<_Float16>(33),
2327       static_cast<_Float16>(30),  static_cast<_Float16>(32),
2328       static_cast<_Float16>(34),  static_cast<_Float16>(36),
2329       static_cast<_Float16>(38),  static_cast<_Float16>(35),
2330       static_cast<_Float16>(37),  static_cast<_Float16>(39),
2331       static_cast<_Float16>(41),  static_cast<_Float16>(43),
2332       static_cast<_Float16>(45),  static_cast<_Float16>(47),
2333       static_cast<_Float16>(49),  static_cast<_Float16>(51),
2334       static_cast<_Float16>(53),  static_cast<_Float16>(50),
2335       static_cast<_Float16>(52),  static_cast<_Float16>(54),
2336       static_cast<_Float16>(56),  static_cast<_Float16>(58),
2337       static_cast<_Float16>(55),  static_cast<_Float16>(57),
2338       static_cast<_Float16>(59),  static_cast<_Float16>(61),
2339       static_cast<_Float16>(63),  static_cast<_Float16>(60),
2340       static_cast<_Float16>(62),  static_cast<_Float16>(64),
2341       static_cast<_Float16>(66),  static_cast<_Float16>(68),
2342       static_cast<_Float16>(65),  static_cast<_Float16>(67),
2343       static_cast<_Float16>(69),  static_cast<_Float16>(71),
2344       static_cast<_Float16>(73),  static_cast<_Float16>(70),
2345       static_cast<_Float16>(72),  static_cast<_Float16>(74),
2346       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2347       static_cast<_Float16>(75),  static_cast<_Float16>(77),
2348       static_cast<_Float16>(79),  static_cast<_Float16>(81),
2349       static_cast<_Float16>(83),  static_cast<_Float16>(80),
2350       static_cast<_Float16>(82),  static_cast<_Float16>(84),
2351       static_cast<_Float16>(86),  static_cast<_Float16>(88),
2352       static_cast<_Float16>(90),  static_cast<_Float16>(92),
2353       static_cast<_Float16>(94),  static_cast<_Float16>(96),
2354       static_cast<_Float16>(98),  static_cast<_Float16>(95),
2355       static_cast<_Float16>(97),  static_cast<_Float16>(99),
2356       static_cast<_Float16>(101), static_cast<_Float16>(103),
2357       static_cast<_Float16>(100), static_cast<_Float16>(102),
2358       static_cast<_Float16>(104), static_cast<_Float16>(106),
2359       static_cast<_Float16>(108), static_cast<_Float16>(105),
2360       static_cast<_Float16>(107), static_cast<_Float16>(109),
2361       static_cast<_Float16>(111), static_cast<_Float16>(113),
2362       static_cast<_Float16>(110), static_cast<_Float16>(112),
2363       static_cast<_Float16>(114), static_cast<_Float16>(116),
2364       static_cast<_Float16>(118), static_cast<_Float16>(115),
2365       static_cast<_Float16>(117), static_cast<_Float16>(119),
2366       static_cast<_Float16>(121), static_cast<_Float16>(123),
2367       static_cast<_Float16>(120), static_cast<_Float16>(122),
2368       static_cast<_Float16>(124), static_cast<_Float16>(126),
2369       static_cast<_Float16>(128), static_cast<_Float16>(125),
2370       static_cast<_Float16>(127), static_cast<_Float16>(129),
2371       static_cast<_Float16>(131), static_cast<_Float16>(133)};
2372     nntrainer::Tensor answer(ref_dim, answer_data);
2373     int status = t.add_i(m);
2374     EXPECT_EQ(status, ML_ERROR_NONE);
2375     EXPECT_EQ(t, answer);
2376   }
2377   {
2378     nntrainer::Tensor t =
2379       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2380     nntrainer::Tensor m =
2381       ranged(1, 2, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2382     _Float16 answer_data[] = {
2383       static_cast<_Float16>(0),   static_cast<_Float16>(2),
2384       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2385       static_cast<_Float16>(8),   static_cast<_Float16>(5),
2386       static_cast<_Float16>(7),   static_cast<_Float16>(9),
2387       static_cast<_Float16>(11),  static_cast<_Float16>(13),
2388       static_cast<_Float16>(10),  static_cast<_Float16>(12),
2389       static_cast<_Float16>(14),  static_cast<_Float16>(16),
2390       static_cast<_Float16>(18),  static_cast<_Float16>(15),
2391       static_cast<_Float16>(17),  static_cast<_Float16>(19),
2392       static_cast<_Float16>(21),  static_cast<_Float16>(23),
2393       static_cast<_Float16>(25),  static_cast<_Float16>(27),
2394       static_cast<_Float16>(29),  static_cast<_Float16>(31),
2395       static_cast<_Float16>(33),  static_cast<_Float16>(30),
2396       static_cast<_Float16>(32),  static_cast<_Float16>(34),
2397       static_cast<_Float16>(36),  static_cast<_Float16>(38),
2398       static_cast<_Float16>(35),  static_cast<_Float16>(37),
2399       static_cast<_Float16>(39),  static_cast<_Float16>(41),
2400       static_cast<_Float16>(43),  static_cast<_Float16>(40),
2401       static_cast<_Float16>(42),  static_cast<_Float16>(44),
2402       static_cast<_Float16>(46),  static_cast<_Float16>(48),
2403       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2404       static_cast<_Float16>(44),  static_cast<_Float16>(46),
2405       static_cast<_Float16>(48),  static_cast<_Float16>(45),
2406       static_cast<_Float16>(47),  static_cast<_Float16>(49),
2407       static_cast<_Float16>(51),  static_cast<_Float16>(53),
2408       static_cast<_Float16>(50),  static_cast<_Float16>(52),
2409       static_cast<_Float16>(54),  static_cast<_Float16>(56),
2410       static_cast<_Float16>(58),  static_cast<_Float16>(55),
2411       static_cast<_Float16>(57),  static_cast<_Float16>(59),
2412       static_cast<_Float16>(61),  static_cast<_Float16>(63),
2413       static_cast<_Float16>(65),  static_cast<_Float16>(67),
2414       static_cast<_Float16>(69),  static_cast<_Float16>(71),
2415       static_cast<_Float16>(73),  static_cast<_Float16>(70),
2416       static_cast<_Float16>(72),  static_cast<_Float16>(74),
2417       static_cast<_Float16>(76),  static_cast<_Float16>(78),
2418       static_cast<_Float16>(75),  static_cast<_Float16>(77),
2419       static_cast<_Float16>(79),  static_cast<_Float16>(81),
2420       static_cast<_Float16>(83),  static_cast<_Float16>(80),
2421       static_cast<_Float16>(82),  static_cast<_Float16>(84),
2422       static_cast<_Float16>(86),  static_cast<_Float16>(88),
2423       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2424       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2425       static_cast<_Float16>(88),  static_cast<_Float16>(85),
2426       static_cast<_Float16>(87),  static_cast<_Float16>(89),
2427       static_cast<_Float16>(91),  static_cast<_Float16>(93),
2428       static_cast<_Float16>(90),  static_cast<_Float16>(92),
2429       static_cast<_Float16>(94),  static_cast<_Float16>(96),
2430       static_cast<_Float16>(98),  static_cast<_Float16>(95),
2431       static_cast<_Float16>(97),  static_cast<_Float16>(99),
2432       static_cast<_Float16>(101), static_cast<_Float16>(103),
2433       static_cast<_Float16>(105), static_cast<_Float16>(107),
2434       static_cast<_Float16>(109), static_cast<_Float16>(111),
2435       static_cast<_Float16>(113), static_cast<_Float16>(110),
2436       static_cast<_Float16>(112), static_cast<_Float16>(114),
2437       static_cast<_Float16>(116), static_cast<_Float16>(118),
2438       static_cast<_Float16>(115), static_cast<_Float16>(117),
2439       static_cast<_Float16>(119), static_cast<_Float16>(121),
2440       static_cast<_Float16>(123), static_cast<_Float16>(120),
2441       static_cast<_Float16>(122), static_cast<_Float16>(124),
2442       static_cast<_Float16>(126), static_cast<_Float16>(128)};
2443     nntrainer::Tensor answer(ref_dim, answer_data);
2444     int status = t.add_i(m);
2445     EXPECT_EQ(status, ML_ERROR_NONE);
2446     EXPECT_EQ(t, answer);
2447   }
2448   {
2449     nntrainer::Tensor t =
2450       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2451     nntrainer::Tensor m =
2452       ranged(3, 1, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2453     _Float16 answer_data[] = {
2454       static_cast<_Float16>(0),   static_cast<_Float16>(1),
2455       static_cast<_Float16>(2),   static_cast<_Float16>(3),
2456       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2457       static_cast<_Float16>(7),   static_cast<_Float16>(8),
2458       static_cast<_Float16>(9),   static_cast<_Float16>(10),
2459       static_cast<_Float16>(12),  static_cast<_Float16>(13),
2460       static_cast<_Float16>(14),  static_cast<_Float16>(15),
2461       static_cast<_Float16>(16),  static_cast<_Float16>(18),
2462       static_cast<_Float16>(19),  static_cast<_Float16>(20),
2463       static_cast<_Float16>(21),  static_cast<_Float16>(22),
2464       static_cast<_Float16>(20),  static_cast<_Float16>(21),
2465       static_cast<_Float16>(22),  static_cast<_Float16>(23),
2466       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2467       static_cast<_Float16>(27),  static_cast<_Float16>(28),
2468       static_cast<_Float16>(29),  static_cast<_Float16>(30),
2469       static_cast<_Float16>(32),  static_cast<_Float16>(33),
2470       static_cast<_Float16>(34),  static_cast<_Float16>(35),
2471       static_cast<_Float16>(36),  static_cast<_Float16>(38),
2472       static_cast<_Float16>(39),  static_cast<_Float16>(40),
2473       static_cast<_Float16>(41),  static_cast<_Float16>(42),
2474       static_cast<_Float16>(44),  static_cast<_Float16>(45),
2475       static_cast<_Float16>(46),  static_cast<_Float16>(47),
2476       static_cast<_Float16>(48),  static_cast<_Float16>(50),
2477       static_cast<_Float16>(51),  static_cast<_Float16>(52),
2478       static_cast<_Float16>(53),  static_cast<_Float16>(54),
2479       static_cast<_Float16>(56),  static_cast<_Float16>(57),
2480       static_cast<_Float16>(58),  static_cast<_Float16>(59),
2481       static_cast<_Float16>(60),  static_cast<_Float16>(62),
2482       static_cast<_Float16>(63),  static_cast<_Float16>(64),
2483       static_cast<_Float16>(65),  static_cast<_Float16>(66),
2484       static_cast<_Float16>(64),  static_cast<_Float16>(65),
2485       static_cast<_Float16>(66),  static_cast<_Float16>(67),
2486       static_cast<_Float16>(68),  static_cast<_Float16>(70),
2487       static_cast<_Float16>(71),  static_cast<_Float16>(72),
2488       static_cast<_Float16>(73),  static_cast<_Float16>(74),
2489       static_cast<_Float16>(76),  static_cast<_Float16>(77),
2490       static_cast<_Float16>(78),  static_cast<_Float16>(79),
2491       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2492       static_cast<_Float16>(83),  static_cast<_Float16>(84),
2493       static_cast<_Float16>(85),  static_cast<_Float16>(86),
2494       static_cast<_Float16>(88),  static_cast<_Float16>(89),
2495       static_cast<_Float16>(90),  static_cast<_Float16>(91),
2496       static_cast<_Float16>(92),  static_cast<_Float16>(94),
2497       static_cast<_Float16>(95),  static_cast<_Float16>(96),
2498       static_cast<_Float16>(97),  static_cast<_Float16>(98),
2499       static_cast<_Float16>(100), static_cast<_Float16>(101),
2500       static_cast<_Float16>(102), static_cast<_Float16>(103),
2501       static_cast<_Float16>(104), static_cast<_Float16>(106),
2502       static_cast<_Float16>(107), static_cast<_Float16>(108),
2503       static_cast<_Float16>(109), static_cast<_Float16>(110),
2504       static_cast<_Float16>(108), static_cast<_Float16>(109),
2505       static_cast<_Float16>(110), static_cast<_Float16>(111),
2506       static_cast<_Float16>(112), static_cast<_Float16>(114),
2507       static_cast<_Float16>(115), static_cast<_Float16>(116),
2508       static_cast<_Float16>(117), static_cast<_Float16>(118),
2509       static_cast<_Float16>(120), static_cast<_Float16>(121),
2510       static_cast<_Float16>(122), static_cast<_Float16>(123),
2511       static_cast<_Float16>(124), static_cast<_Float16>(126),
2512       static_cast<_Float16>(127), static_cast<_Float16>(128),
2513       static_cast<_Float16>(129), static_cast<_Float16>(130)};
2514     nntrainer::Tensor answer(ref_dim, answer_data);
2515     int status = t.add_i(m);
2516     EXPECT_EQ(status, ML_ERROR_NONE);
2517     EXPECT_EQ(t, answer);
2518   }
2519   {
2520     nntrainer::Tensor t =
2521       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2522     nntrainer::Tensor m =
2523       ranged(1, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2524     _Float16 answer_data[] = {
2525       static_cast<_Float16>(0),   static_cast<_Float16>(2),
2526       static_cast<_Float16>(4),   static_cast<_Float16>(6),
2527       static_cast<_Float16>(8),   static_cast<_Float16>(5),
2528       static_cast<_Float16>(7),   static_cast<_Float16>(9),
2529       static_cast<_Float16>(11),  static_cast<_Float16>(13),
2530       static_cast<_Float16>(10),  static_cast<_Float16>(12),
2531       static_cast<_Float16>(14),  static_cast<_Float16>(16),
2532       static_cast<_Float16>(18),  static_cast<_Float16>(15),
2533       static_cast<_Float16>(17),  static_cast<_Float16>(19),
2534       static_cast<_Float16>(21),  static_cast<_Float16>(23),
2535       static_cast<_Float16>(20),  static_cast<_Float16>(22),
2536       static_cast<_Float16>(24),  static_cast<_Float16>(26),
2537       static_cast<_Float16>(28),  static_cast<_Float16>(25),
2538       static_cast<_Float16>(27),  static_cast<_Float16>(29),
2539       static_cast<_Float16>(31),  static_cast<_Float16>(33),
2540       static_cast<_Float16>(30),  static_cast<_Float16>(32),
2541       static_cast<_Float16>(34),  static_cast<_Float16>(36),
2542       static_cast<_Float16>(38),  static_cast<_Float16>(35),
2543       static_cast<_Float16>(37),  static_cast<_Float16>(39),
2544       static_cast<_Float16>(41),  static_cast<_Float16>(43),
2545       static_cast<_Float16>(40),  static_cast<_Float16>(42),
2546       static_cast<_Float16>(44),  static_cast<_Float16>(46),
2547       static_cast<_Float16>(48),  static_cast<_Float16>(45),
2548       static_cast<_Float16>(47),  static_cast<_Float16>(49),
2549       static_cast<_Float16>(51),  static_cast<_Float16>(53),
2550       static_cast<_Float16>(50),  static_cast<_Float16>(52),
2551       static_cast<_Float16>(54),  static_cast<_Float16>(56),
2552       static_cast<_Float16>(58),  static_cast<_Float16>(55),
2553       static_cast<_Float16>(57),  static_cast<_Float16>(59),
2554       static_cast<_Float16>(61),  static_cast<_Float16>(63),
2555       static_cast<_Float16>(60),  static_cast<_Float16>(62),
2556       static_cast<_Float16>(64),  static_cast<_Float16>(66),
2557       static_cast<_Float16>(68),  static_cast<_Float16>(65),
2558       static_cast<_Float16>(67),  static_cast<_Float16>(69),
2559       static_cast<_Float16>(71),  static_cast<_Float16>(73),
2560       static_cast<_Float16>(70),  static_cast<_Float16>(72),
2561       static_cast<_Float16>(74),  static_cast<_Float16>(76),
2562       static_cast<_Float16>(78),  static_cast<_Float16>(75),
2563       static_cast<_Float16>(77),  static_cast<_Float16>(79),
2564       static_cast<_Float16>(81),  static_cast<_Float16>(83),
2565       static_cast<_Float16>(80),  static_cast<_Float16>(82),
2566       static_cast<_Float16>(84),  static_cast<_Float16>(86),
2567       static_cast<_Float16>(88),  static_cast<_Float16>(85),
2568       static_cast<_Float16>(87),  static_cast<_Float16>(89),
2569       static_cast<_Float16>(91),  static_cast<_Float16>(93),
2570       static_cast<_Float16>(90),  static_cast<_Float16>(92),
2571       static_cast<_Float16>(94),  static_cast<_Float16>(96),
2572       static_cast<_Float16>(98),  static_cast<_Float16>(95),
2573       static_cast<_Float16>(97),  static_cast<_Float16>(99),
2574       static_cast<_Float16>(101), static_cast<_Float16>(103),
2575       static_cast<_Float16>(100), static_cast<_Float16>(102),
2576       static_cast<_Float16>(104), static_cast<_Float16>(106),
2577       static_cast<_Float16>(108), static_cast<_Float16>(105),
2578       static_cast<_Float16>(107), static_cast<_Float16>(109),
2579       static_cast<_Float16>(111), static_cast<_Float16>(113),
2580       static_cast<_Float16>(110), static_cast<_Float16>(112),
2581       static_cast<_Float16>(114), static_cast<_Float16>(116),
2582       static_cast<_Float16>(118), static_cast<_Float16>(115),
2583       static_cast<_Float16>(117), static_cast<_Float16>(119),
2584       static_cast<_Float16>(121), static_cast<_Float16>(123)};
2585     nntrainer::Tensor answer(ref_dim, answer_data);
2586     int status = t.add_i(m);
2587     EXPECT_EQ(status, ML_ERROR_NONE);
2588     EXPECT_EQ(t, answer);
2589   }
2590   {
2591     nntrainer::Tensor t =
2592       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2593     nntrainer::Tensor m =
2594       ranged(1, 2, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2595     _Float16 answer_data[] = {
2596       static_cast<_Float16>(0),   static_cast<_Float16>(1),
2597       static_cast<_Float16>(2),   static_cast<_Float16>(3),
2598       static_cast<_Float16>(4),   static_cast<_Float16>(5),
2599       static_cast<_Float16>(6),   static_cast<_Float16>(7),
2600       static_cast<_Float16>(8),   static_cast<_Float16>(9),
2601       static_cast<_Float16>(10),  static_cast<_Float16>(11),
2602       static_cast<_Float16>(12),  static_cast<_Float16>(13),
2603       static_cast<_Float16>(14),  static_cast<_Float16>(15),
2604       static_cast<_Float16>(16),  static_cast<_Float16>(17),
2605       static_cast<_Float16>(18),  static_cast<_Float16>(19),
2606       static_cast<_Float16>(21),  static_cast<_Float16>(22),
2607       static_cast<_Float16>(23),  static_cast<_Float16>(24),
2608       static_cast<_Float16>(25),  static_cast<_Float16>(26),
2609       static_cast<_Float16>(27),  static_cast<_Float16>(28),
2610       static_cast<_Float16>(29),  static_cast<_Float16>(30),
2611       static_cast<_Float16>(31),  static_cast<_Float16>(32),
2612       static_cast<_Float16>(33),  static_cast<_Float16>(34),
2613       static_cast<_Float16>(35),  static_cast<_Float16>(36),
2614       static_cast<_Float16>(37),  static_cast<_Float16>(38),
2615       static_cast<_Float16>(39),  static_cast<_Float16>(40),
2616       static_cast<_Float16>(40),  static_cast<_Float16>(41),
2617       static_cast<_Float16>(42),  static_cast<_Float16>(43),
2618       static_cast<_Float16>(44),  static_cast<_Float16>(45),
2619       static_cast<_Float16>(46),  static_cast<_Float16>(47),
2620       static_cast<_Float16>(48),  static_cast<_Float16>(49),
2621       static_cast<_Float16>(50),  static_cast<_Float16>(51),
2622       static_cast<_Float16>(52),  static_cast<_Float16>(53),
2623       static_cast<_Float16>(54),  static_cast<_Float16>(55),
2624       static_cast<_Float16>(56),  static_cast<_Float16>(57),
2625       static_cast<_Float16>(58),  static_cast<_Float16>(59),
2626       static_cast<_Float16>(61),  static_cast<_Float16>(62),
2627       static_cast<_Float16>(63),  static_cast<_Float16>(64),
2628       static_cast<_Float16>(65),  static_cast<_Float16>(66),
2629       static_cast<_Float16>(67),  static_cast<_Float16>(68),
2630       static_cast<_Float16>(69),  static_cast<_Float16>(70),
2631       static_cast<_Float16>(71),  static_cast<_Float16>(72),
2632       static_cast<_Float16>(73),  static_cast<_Float16>(74),
2633       static_cast<_Float16>(75),  static_cast<_Float16>(76),
2634       static_cast<_Float16>(77),  static_cast<_Float16>(78),
2635       static_cast<_Float16>(79),  static_cast<_Float16>(80),
2636       static_cast<_Float16>(80),  static_cast<_Float16>(81),
2637       static_cast<_Float16>(82),  static_cast<_Float16>(83),
2638       static_cast<_Float16>(84),  static_cast<_Float16>(85),
2639       static_cast<_Float16>(86),  static_cast<_Float16>(87),
2640       static_cast<_Float16>(88),  static_cast<_Float16>(89),
2641       static_cast<_Float16>(90),  static_cast<_Float16>(91),
2642       static_cast<_Float16>(92),  static_cast<_Float16>(93),
2643       static_cast<_Float16>(94),  static_cast<_Float16>(95),
2644       static_cast<_Float16>(96),  static_cast<_Float16>(97),
2645       static_cast<_Float16>(98),  static_cast<_Float16>(99),
2646       static_cast<_Float16>(101), static_cast<_Float16>(102),
2647       static_cast<_Float16>(103), static_cast<_Float16>(104),
2648       static_cast<_Float16>(105), static_cast<_Float16>(106),
2649       static_cast<_Float16>(107), static_cast<_Float16>(108),
2650       static_cast<_Float16>(109), static_cast<_Float16>(110),
2651       static_cast<_Float16>(111), static_cast<_Float16>(112),
2652       static_cast<_Float16>(113), static_cast<_Float16>(114),
2653       static_cast<_Float16>(115), static_cast<_Float16>(116),
2654       static_cast<_Float16>(117), static_cast<_Float16>(118),
2655       static_cast<_Float16>(119), static_cast<_Float16>(120)};
2656     nntrainer::Tensor answer(ref_dim, answer_data);
2657     int status = t.add_i(m);
2658     EXPECT_EQ(status, ML_ERROR_NONE);
2659     EXPECT_EQ(t, answer);
2660   }
2661   {
2662     nntrainer::Tensor t =
2663       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2664     nntrainer::Tensor m =
2665       ranged(3, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2666     _Float16 answer_data[] = {
2667       static_cast<_Float16>(0),   static_cast<_Float16>(1),
2668       static_cast<_Float16>(2),   static_cast<_Float16>(3),
2669       static_cast<_Float16>(4),   static_cast<_Float16>(5),
2670       static_cast<_Float16>(6),   static_cast<_Float16>(7),
2671       static_cast<_Float16>(8),   static_cast<_Float16>(9),
2672       static_cast<_Float16>(10),  static_cast<_Float16>(11),
2673       static_cast<_Float16>(12),  static_cast<_Float16>(13),
2674       static_cast<_Float16>(14),  static_cast<_Float16>(15),
2675       static_cast<_Float16>(16),  static_cast<_Float16>(17),
2676       static_cast<_Float16>(18),  static_cast<_Float16>(19),
2677       static_cast<_Float16>(20),  static_cast<_Float16>(21),
2678       static_cast<_Float16>(22),  static_cast<_Float16>(23),
2679       static_cast<_Float16>(24),  static_cast<_Float16>(25),
2680       static_cast<_Float16>(26),  static_cast<_Float16>(27),
2681       static_cast<_Float16>(28),  static_cast<_Float16>(29),
2682       static_cast<_Float16>(30),  static_cast<_Float16>(31),
2683       static_cast<_Float16>(32),  static_cast<_Float16>(33),
2684       static_cast<_Float16>(34),  static_cast<_Float16>(35),
2685       static_cast<_Float16>(36),  static_cast<_Float16>(37),
2686       static_cast<_Float16>(38),  static_cast<_Float16>(39),
2687       static_cast<_Float16>(41),  static_cast<_Float16>(42),
2688       static_cast<_Float16>(43),  static_cast<_Float16>(44),
2689       static_cast<_Float16>(45),  static_cast<_Float16>(46),
2690       static_cast<_Float16>(47),  static_cast<_Float16>(48),
2691       static_cast<_Float16>(49),  static_cast<_Float16>(50),
2692       static_cast<_Float16>(51),  static_cast<_Float16>(52),
2693       static_cast<_Float16>(53),  static_cast<_Float16>(54),
2694       static_cast<_Float16>(55),  static_cast<_Float16>(56),
2695       static_cast<_Float16>(57),  static_cast<_Float16>(58),
2696       static_cast<_Float16>(59),  static_cast<_Float16>(60),
2697       static_cast<_Float16>(61),  static_cast<_Float16>(62),
2698       static_cast<_Float16>(63),  static_cast<_Float16>(64),
2699       static_cast<_Float16>(65),  static_cast<_Float16>(66),
2700       static_cast<_Float16>(67),  static_cast<_Float16>(68),
2701       static_cast<_Float16>(69),  static_cast<_Float16>(70),
2702       static_cast<_Float16>(71),  static_cast<_Float16>(72),
2703       static_cast<_Float16>(73),  static_cast<_Float16>(74),
2704       static_cast<_Float16>(75),  static_cast<_Float16>(76),
2705       static_cast<_Float16>(77),  static_cast<_Float16>(78),
2706       static_cast<_Float16>(79),  static_cast<_Float16>(80),
2707       static_cast<_Float16>(82),  static_cast<_Float16>(83),
2708       static_cast<_Float16>(84),  static_cast<_Float16>(85),
2709       static_cast<_Float16>(86),  static_cast<_Float16>(87),
2710       static_cast<_Float16>(88),  static_cast<_Float16>(89),
2711       static_cast<_Float16>(90),  static_cast<_Float16>(91),
2712       static_cast<_Float16>(92),  static_cast<_Float16>(93),
2713       static_cast<_Float16>(94),  static_cast<_Float16>(95),
2714       static_cast<_Float16>(96),  static_cast<_Float16>(97),
2715       static_cast<_Float16>(98),  static_cast<_Float16>(99),
2716       static_cast<_Float16>(100), static_cast<_Float16>(101),
2717       static_cast<_Float16>(102), static_cast<_Float16>(103),
2718       static_cast<_Float16>(104), static_cast<_Float16>(105),
2719       static_cast<_Float16>(106), static_cast<_Float16>(107),
2720       static_cast<_Float16>(108), static_cast<_Float16>(109),
2721       static_cast<_Float16>(110), static_cast<_Float16>(111),
2722       static_cast<_Float16>(112), static_cast<_Float16>(113),
2723       static_cast<_Float16>(114), static_cast<_Float16>(115),
2724       static_cast<_Float16>(116), static_cast<_Float16>(117),
2725       static_cast<_Float16>(118), static_cast<_Float16>(119),
2726       static_cast<_Float16>(120), static_cast<_Float16>(121)};
2727     nntrainer::Tensor answer(ref_dim, answer_data);
2728     int status = t.add_i(m);
2729     EXPECT_EQ(status, ML_ERROR_NONE);
2730     EXPECT_EQ(t, answer);
2731   }
2732   {
2733     nntrainer::Tensor t =
2734       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2735     nntrainer::Tensor m =
2736       ranged(1, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2737     m.add_i(1.0);
2738     _Float16 answer_data[] = {
2739       static_cast<_Float16>(1),   static_cast<_Float16>(2),
2740       static_cast<_Float16>(3),   static_cast<_Float16>(4),
2741       static_cast<_Float16>(5),   static_cast<_Float16>(6),
2742       static_cast<_Float16>(7),   static_cast<_Float16>(8),
2743       static_cast<_Float16>(9),   static_cast<_Float16>(10),
2744       static_cast<_Float16>(11),  static_cast<_Float16>(12),
2745       static_cast<_Float16>(13),  static_cast<_Float16>(14),
2746       static_cast<_Float16>(15),  static_cast<_Float16>(16),
2747       static_cast<_Float16>(17),  static_cast<_Float16>(18),
2748       static_cast<_Float16>(19),  static_cast<_Float16>(20),
2749       static_cast<_Float16>(21),  static_cast<_Float16>(22),
2750       static_cast<_Float16>(23),  static_cast<_Float16>(24),
2751       static_cast<_Float16>(25),  static_cast<_Float16>(26),
2752       static_cast<_Float16>(27),  static_cast<_Float16>(28),
2753       static_cast<_Float16>(29),  static_cast<_Float16>(30),
2754       static_cast<_Float16>(31),  static_cast<_Float16>(32),
2755       static_cast<_Float16>(33),  static_cast<_Float16>(34),
2756       static_cast<_Float16>(35),  static_cast<_Float16>(36),
2757       static_cast<_Float16>(37),  static_cast<_Float16>(38),
2758       static_cast<_Float16>(39),  static_cast<_Float16>(40),
2759       static_cast<_Float16>(41),  static_cast<_Float16>(42),
2760       static_cast<_Float16>(43),  static_cast<_Float16>(44),
2761       static_cast<_Float16>(45),  static_cast<_Float16>(46),
2762       static_cast<_Float16>(47),  static_cast<_Float16>(48),
2763       static_cast<_Float16>(49),  static_cast<_Float16>(50),
2764       static_cast<_Float16>(51),  static_cast<_Float16>(52),
2765       static_cast<_Float16>(53),  static_cast<_Float16>(54),
2766       static_cast<_Float16>(55),  static_cast<_Float16>(56),
2767       static_cast<_Float16>(57),  static_cast<_Float16>(58),
2768       static_cast<_Float16>(59),  static_cast<_Float16>(60),
2769       static_cast<_Float16>(61),  static_cast<_Float16>(62),
2770       static_cast<_Float16>(63),  static_cast<_Float16>(64),
2771       static_cast<_Float16>(65),  static_cast<_Float16>(66),
2772       static_cast<_Float16>(67),  static_cast<_Float16>(68),
2773       static_cast<_Float16>(69),  static_cast<_Float16>(70),
2774       static_cast<_Float16>(71),  static_cast<_Float16>(72),
2775       static_cast<_Float16>(73),  static_cast<_Float16>(74),
2776       static_cast<_Float16>(75),  static_cast<_Float16>(76),
2777       static_cast<_Float16>(77),  static_cast<_Float16>(78),
2778       static_cast<_Float16>(79),  static_cast<_Float16>(80),
2779       static_cast<_Float16>(81),  static_cast<_Float16>(82),
2780       static_cast<_Float16>(83),  static_cast<_Float16>(84),
2781       static_cast<_Float16>(85),  static_cast<_Float16>(86),
2782       static_cast<_Float16>(87),  static_cast<_Float16>(88),
2783       static_cast<_Float16>(89),  static_cast<_Float16>(90),
2784       static_cast<_Float16>(91),  static_cast<_Float16>(92),
2785       static_cast<_Float16>(93),  static_cast<_Float16>(94),
2786       static_cast<_Float16>(95),  static_cast<_Float16>(96),
2787       static_cast<_Float16>(97),  static_cast<_Float16>(98),
2788       static_cast<_Float16>(99),  static_cast<_Float16>(100),
2789       static_cast<_Float16>(101), static_cast<_Float16>(102),
2790       static_cast<_Float16>(103), static_cast<_Float16>(104),
2791       static_cast<_Float16>(105), static_cast<_Float16>(106),
2792       static_cast<_Float16>(107), static_cast<_Float16>(108),
2793       static_cast<_Float16>(109), static_cast<_Float16>(110),
2794       static_cast<_Float16>(111), static_cast<_Float16>(112),
2795       static_cast<_Float16>(113), static_cast<_Float16>(114),
2796       static_cast<_Float16>(115), static_cast<_Float16>(116),
2797       static_cast<_Float16>(117), static_cast<_Float16>(118),
2798       static_cast<_Float16>(119), static_cast<_Float16>(120)};
2799     nntrainer::Tensor answer(ref_dim, answer_data);
2800     int status = t.add_i(m);
2801     EXPECT_EQ(status, ML_ERROR_NONE);
2802     EXPECT_EQ(t, answer);
2803   }
2804   {
2805     nntrainer::TensorDim ref_dim(3, 5, 1, 4, nntrainer::Tformat::NCHW,
2806                                  nntrainer::Tdatatype::FP16);
2807     nntrainer::Tensor t =
2808       ranged(3, 5, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2809     nntrainer::Tensor m =
2810       ranged(3, 1, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2811     _Float16 answer_data[] = {
2812       static_cast<_Float16>(0),  static_cast<_Float16>(2),
2813       static_cast<_Float16>(4),  static_cast<_Float16>(6),
2814       static_cast<_Float16>(4),  static_cast<_Float16>(6),
2815       static_cast<_Float16>(8),  static_cast<_Float16>(10),
2816       static_cast<_Float16>(8),  static_cast<_Float16>(10),
2817       static_cast<_Float16>(12), static_cast<_Float16>(14),
2818       static_cast<_Float16>(12), static_cast<_Float16>(14),
2819       static_cast<_Float16>(16), static_cast<_Float16>(18),
2820       static_cast<_Float16>(16), static_cast<_Float16>(18),
2821       static_cast<_Float16>(20), static_cast<_Float16>(22),
2822       static_cast<_Float16>(24), static_cast<_Float16>(26),
2823       static_cast<_Float16>(28), static_cast<_Float16>(30),
2824       static_cast<_Float16>(28), static_cast<_Float16>(30),
2825       static_cast<_Float16>(32), static_cast<_Float16>(34),
2826       static_cast<_Float16>(32), static_cast<_Float16>(34),
2827       static_cast<_Float16>(36), static_cast<_Float16>(38),
2828       static_cast<_Float16>(36), static_cast<_Float16>(38),
2829       static_cast<_Float16>(40), static_cast<_Float16>(42),
2830       static_cast<_Float16>(40), static_cast<_Float16>(42),
2831       static_cast<_Float16>(44), static_cast<_Float16>(46),
2832       static_cast<_Float16>(48), static_cast<_Float16>(50),
2833       static_cast<_Float16>(52), static_cast<_Float16>(54),
2834       static_cast<_Float16>(52), static_cast<_Float16>(54),
2835       static_cast<_Float16>(56), static_cast<_Float16>(58),
2836       static_cast<_Float16>(56), static_cast<_Float16>(58),
2837       static_cast<_Float16>(60), static_cast<_Float16>(62),
2838       static_cast<_Float16>(60), static_cast<_Float16>(62),
2839       static_cast<_Float16>(64), static_cast<_Float16>(66),
2840       static_cast<_Float16>(64), static_cast<_Float16>(66),
2841       static_cast<_Float16>(68), static_cast<_Float16>(70)};
2842     nntrainer::Tensor answer(ref_dim, answer_data);
2843     int status = t.add_i(m);
2844     EXPECT_EQ(status, ML_ERROR_NONE);
2845     EXPECT_EQ(t, answer);
2846   }
2847   {
2848     nntrainer::TensorDim ref_dim(1, 1, 2, 1, nntrainer::Tformat::NCHW,
2849                                  nntrainer::Tdatatype::FP16);
2850     nntrainer::Tensor t =
2851       ranged(1, 1, 2, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2852     nntrainer::Tensor m =
2853       ranged(1, 1, 2, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2854     _Float16 answer_data[] = {static_cast<_Float16>(0.0),
2855                               static_cast<_Float16>(2.0)};
2856     nntrainer::Tensor answer(ref_dim, answer_data);
2857     int status = t.add_i(m);
2858     EXPECT_EQ(status, ML_ERROR_NONE);
2859     EXPECT_EQ(t, answer);
2860   }
2861   {
2862     nntrainer::TensorDim ref_dim(16, 1, 1, 1, nntrainer::Tformat::NCHW,
2863                                  nntrainer::Tdatatype::FP16);
2864     nntrainer::Tensor t =
2865       ranged(16, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2866     nntrainer::Tensor m =
2867       ranged(1, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2868     _Float16 answer_data[] = {
2869       static_cast<_Float16>(0.0),  static_cast<_Float16>(1.0),
2870       static_cast<_Float16>(2.0),  static_cast<_Float16>(3.0),
2871       static_cast<_Float16>(4.0),  static_cast<_Float16>(5.0),
2872       static_cast<_Float16>(6.0),  static_cast<_Float16>(7.0),
2873       static_cast<_Float16>(8.0),  static_cast<_Float16>(9.0),
2874       static_cast<_Float16>(10.0), static_cast<_Float16>(11.0),
2875       static_cast<_Float16>(12.0), static_cast<_Float16>(13.0),
2876       static_cast<_Float16>(14.0), static_cast<_Float16>(15.0)};
2877     nntrainer::Tensor answer(ref_dim, answer_data);
2878     int status = t.add_i(m);
2879     EXPECT_EQ(status, ML_ERROR_NONE);
2880     EXPECT_EQ(t, answer);
2881   }
2882 }
2883
2884 TEST(nntrainer_Tensor, add_i_broadcast_not_supported_01_n) {
2885   nntrainer::Tensor target(3, 1, 3, 1, nntrainer::Tformat::NCHW,
2886                            nntrainer::Tdatatype::FP16);
2887   nntrainer::Tensor target2(3, 1, 3, 3, nntrainer::Tformat::NCHW,
2888                             nntrainer::Tdatatype::FP16);
2889
2890   EXPECT_EQ(target.add_i(target2), ML_ERROR_INVALID_PARAMETER);
2891 }
2892
2893 TEST(nntrainer_Tensor, add_i_broadcast_not_broadcastable_02_n) {
2894   nntrainer::Tensor target(3, 2, 4, 5, nntrainer::Tformat::NCHW,
2895                            nntrainer::Tdatatype::FP16);
2896   nntrainer::Tensor target2(3, 2, 3, 1, nntrainer::Tformat::NCHW,
2897                             nntrainer::Tdatatype::FP16);
2898
2899   EXPECT_EQ(target.add_i(target2), ML_ERROR_INVALID_PARAMETER);
2900 }
2901
2902 TEST(nntrainer_Tensor, add_01_p) {
2903   int status = ML_ERROR_NONE;
2904   int batch = 3;
2905   int channel = 1;
2906   int height = 3;
2907   int width = 10;
2908
2909   nntrainer::Tensor input(batch, channel, height, width,
2910                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2911   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
2912
2913   nntrainer::Tensor result = input.add(1.0);
2914
2915   _Float16 *data = result.getData<_Float16>();
2916   ASSERT_NE(nullptr, data);
2917   _Float16 *indata = input.getData<_Float16>();
2918   ASSERT_NE(nullptr, indata);
2919
2920   for (int i = 0; i < batch * height * width; ++i) {
2921     if (data[i] != (_Float16)(indata[i] + (_Float16)1.0)) {
2922       status = ML_ERROR_RESULT_OUT_OF_RANGE;
2923       break;
2924     }
2925   }
2926
2927   EXPECT_EQ(status, ML_ERROR_NONE);
2928 }
2929
2930 TEST(nntrainer_Tensor, add_02_p) {
2931   int status = ML_ERROR_NONE;
2932   int batch = 3;
2933   int channel = 1;
2934   int height = 3;
2935   int width = 10;
2936
2937   nntrainer::Tensor input(batch, channel, height, width,
2938                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2939   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
2940
2941   nntrainer::Tensor result = input.add(input);
2942
2943   _Float16 *data = result.getData<_Float16>();
2944   ASSERT_NE(nullptr, data);
2945   _Float16 *indata = input.getData<_Float16>();
2946   ASSERT_NE(nullptr, indata);
2947
2948   for (int i = 0; i < batch * height * width; ++i) {
2949     if (data[i] != indata[i] + indata[i]) {
2950       status = ML_ERROR_RESULT_OUT_OF_RANGE;
2951       break;
2952     }
2953   }
2954
2955   EXPECT_EQ(status, ML_ERROR_NONE);
2956 }
2957
2958 TEST(nntrainer_Tensor, add_03_n) {
2959   int batch = 3;
2960   int channel = 1;
2961   int height = 3;
2962   int width = 10;
2963
2964   nntrainer::Tensor input(batch, channel, height, width,
2965                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2966   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
2967
2968   nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
2969                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2970
2971   EXPECT_THROW({ input.add(test); }, std::invalid_argument);
2972 }
2973
2974 TEST(nntrainer_Tensor, add_04_n) {
2975   int batch = 3;
2976   int channel = 1;
2977   int height = 3;
2978   int width = 10;
2979
2980   nntrainer::TensorDim dim(batch, channel, height, width,
2981                            nntrainer::Tformat::NCHW,
2982                            nntrainer::Tdatatype::FP16);
2983
2984   nntrainer::Tensor input(batch, channel, height, 2 * width);
2985   nntrainer::Tensor shared_input = input.getSharedDataTensor(dim, 0, false);
2986   nntrainer::Tensor test(dim);
2987
2988   EXPECT_THROW(shared_input.add(test), std::invalid_argument);
2989 }
2990
2991 TEST(nntrainer_Tensor, add_05_n) {
2992   int batch = 3;
2993   int channel = 1;
2994   int height = 3;
2995   int width = 10;
2996
2997   nntrainer::TensorDim dim(batch, channel, height, width,
2998                            nntrainer::Tformat::NCHW,
2999                            nntrainer::Tdatatype::FP16);
3000
3001   nntrainer::Tensor input(dim);
3002   nntrainer::Tensor test(batch, channel, height, 2 * width,
3003                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3004   nntrainer::Tensor shared_test = test.getSharedDataTensor(dim, 0, false);
3005
3006   EXPECT_THROW(input.add(shared_test), std::invalid_argument);
3007 }
3008
3009 TEST(nntrainer_Tensor, add_06_n) {
3010   int batch = 3;
3011   int channel = 1;
3012   int height = 3;
3013   int width = 10;
3014
3015   nntrainer::TensorDim dim(batch, channel, height, width,
3016                            nntrainer::Tformat::NCHW,
3017                            nntrainer::Tdatatype::FP16);
3018
3019   nntrainer::Tensor input(dim, false);
3020   nntrainer::Tensor test(dim);
3021   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
3022
3023   EXPECT_THROW(input.add(test), std::invalid_argument);
3024 }
3025
3026 TEST(nntrainer_Tensor, add_07_n) {
3027   int batch = 3;
3028   int channel = 1;
3029   int height = 3;
3030   int width = 10;
3031
3032   nntrainer::TensorDim dim(batch, channel, height, width,
3033                            nntrainer::Tformat::NCHW,
3034                            nntrainer::Tdatatype::FP16);
3035
3036   nntrainer::Tensor input(dim);
3037   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3038   nntrainer::Tensor test(dim, false);
3039
3040   EXPECT_THROW(input.add(test), std::invalid_argument);
3041 }
3042
3043 TEST(nntrainer_Tensor, add_08_n) {
3044   int batch = 3;
3045   int channel = 1;
3046   int height = 3;
3047   int width = 10;
3048
3049   nntrainer::TensorDim dim(batch, channel, height, width,
3050                            nntrainer::Tformat::NCHW,
3051                            nntrainer::Tdatatype::FP16);
3052
3053   nntrainer::Tensor input(dim);
3054   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3055   nntrainer::Tensor test(dim);
3056   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 2);
3057   nntrainer::Tensor output(dim, false);
3058
3059   EXPECT_THROW(input.add(test, output), std::invalid_argument);
3060 }
3061
3062 TEST(nntrainer_Tensor, pow_01_p) {
3063
3064   nntrainer::Tensor input = constant(4.0, 3, 2, 4, 5, nntrainer::Tformat::NCHW,
3065                                      nntrainer::Tdatatype::FP16);
3066
3067   nntrainer::Tensor actual, expected;
3068
3069   actual = input.pow(0.5f);
3070   expected = constant(2.0, 3, 2, 4, 5, nntrainer::Tformat::NCHW,
3071                       nntrainer::Tdatatype::FP16);
3072   EXPECT_EQ(actual, expected);
3073
3074   actual = input.pow(2.0f);
3075   expected = constant(16.0, 3, 2, 4, 5, nntrainer::Tformat::NCHW,
3076                       nntrainer::Tdatatype::FP16);
3077   EXPECT_EQ(actual, expected);
3078
3079   actual = input.pow(-0.5f);
3080   expected = constant(0.5, 3, 2, 4, 5, nntrainer::Tformat::NCHW,
3081                       nntrainer::Tdatatype::FP16);
3082   EXPECT_EQ(actual, expected);
3083 }
3084
3085 // TEST(nntrainer_Tensor, erf_01_p) {
3086 //   int batch = 1;
3087 //   int channel = 1;
3088 //   int height = 2;
3089 //   int width = 2;
3090
3091 //   nntrainer::TensorDim dim(batch, channel, height, width,
3092 //                            nntrainer::Tformat::NCHW,
3093 //                            nntrainer::Tdatatype::FP16);
3094
3095 //   nntrainer::Tensor input(dim);
3096 //   GEN_TEST_INPUT(input, k + l * 0.5 + 0.5);
3097 //   nntrainer::Tensor actual = input.erf();
3098 //   nntrainer::Tensor expected(
3099 //     std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3100 //       {{{{0.5205, 0.8427}, {0.966105, 0.995322}}}}),
3101 //     dim.getTensorType());
3102
3103 //   EXPECT_EQ(actual, expected);
3104 // }
3105
3106 TEST(nntrainer_Tensor, subtract_i_01_p) {
3107   int status = ML_ERROR_NONE;
3108   int batch = 3;
3109   int height = 3;
3110   int width = 10;
3111   int channel = 1;
3112
3113   nntrainer::Tensor target(batch, channel, height, width,
3114                            nntrainer::Tformat::NCHW,
3115                            nntrainer::Tdatatype::FP16);
3116   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1 + channel);
3117
3118   nntrainer::Tensor original(batch, height, width, nntrainer::Tformat::NCHW,
3119                              nntrainer::Tdatatype::FP16);
3120   original.copy(target);
3121
3122   status = target.subtract_i(2.1);
3123   EXPECT_EQ(status, ML_ERROR_NONE);
3124
3125   _Float16 *previous = original.getData<_Float16>();
3126   ASSERT_NE(nullptr, previous);
3127   _Float16 *data = target.getData<_Float16>();
3128   ASSERT_NE(nullptr, data);
3129
3130   for (int i = 0; i < batch * height * width; ++i) {
3131     EXPECT_FLOAT_EQ(data[i], ((_Float16)(previous[i] - (_Float16)2.1)));
3132   }
3133 }
3134
3135 TEST(nntrainer_Tensor, subtract_i_02_p) {
3136   int status = ML_ERROR_NONE;
3137   int batch = 3;
3138   int height = 3;
3139   int width = 10;
3140   int channel = 1;
3141
3142   nntrainer::Tensor target(batch, channel, height, width,
3143                            nntrainer::Tformat::NCHW,
3144                            nntrainer::Tdatatype::FP16);
3145   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1 + channel);
3146
3147   status = target.subtract_i(target);
3148   EXPECT_EQ(status, ML_ERROR_NONE);
3149
3150   _Float16 *data = target.getData<_Float16>();
3151   ASSERT_NE(nullptr, data);
3152
3153   for (int i = 0; i < batch * height * width; ++i) {
3154     EXPECT_FLOAT_EQ(data[i], 0);
3155   }
3156 }
3157
3158 TEST(nntrainer_Tensor, subtract_i_03_n) {
3159   int status = ML_ERROR_NONE;
3160   int batch = 3;
3161   int height = 3;
3162   int width = 10;
3163   int channel = 1;
3164
3165   nntrainer::Tensor target(batch, channel, height, width,
3166                            nntrainer::Tformat::NCHW,
3167                            nntrainer::Tdatatype::FP16);
3168   GEN_TEST_INPUT(target, i * (batch * height) + j * (width) + k + 1 + channel);
3169
3170   nntrainer::Tensor target2(batch, channel, height - 1, width - 3,
3171                             nntrainer::Tformat::NCHW,
3172                             nntrainer::Tdatatype::FP16);
3173
3174   status = target.subtract_i(target2);
3175   EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
3176 }
3177
3178 TEST(nntrainer_Tensor, subtract_01_p) {
3179   int status = ML_ERROR_NONE;
3180   int batch = 3;
3181   int channel = 1;
3182   int height = 3;
3183   int width = 10;
3184
3185   nntrainer::Tensor input(batch, channel, height, width,
3186                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3187   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3188
3189   nntrainer::Tensor result = input.subtract(1.0);
3190
3191   _Float16 *data = result.getData<_Float16>();
3192   ASSERT_NE(nullptr, data);
3193   _Float16 *indata = input.getData<_Float16>();
3194   ASSERT_NE(nullptr, indata);
3195
3196   for (int i = 0; i < batch * height * width; ++i) {
3197     if (data[i] != indata[i] - 1.0) {
3198       status = ML_ERROR_RESULT_OUT_OF_RANGE;
3199       break;
3200     }
3201   }
3202
3203   EXPECT_EQ(status, ML_ERROR_NONE);
3204 }
3205
3206 TEST(nntrainer_Tensor, subtract_02_p) {
3207   int batch = 3;
3208   int channel = 1;
3209   int height = 3;
3210   int width = 10;
3211
3212   nntrainer::Tensor input(batch, channel, height, width);
3213   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3214
3215   nntrainer::Tensor result = input.subtract(input);
3216
3217   EXPECT_EQ(constant(0.0, batch, channel, height, width), result);
3218 }
3219
3220 TEST(nntrainer_Tensor, subtract_03_n) {
3221   int batch = 3;
3222   int channel = 1;
3223   int height = 3;
3224   int width = 10;
3225
3226   nntrainer::Tensor input(batch, channel, height, width,
3227                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3228   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3229
3230   nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
3231                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3232
3233   EXPECT_THROW({ input.subtract(test); }, std::invalid_argument);
3234 }
3235
3236 TEST(nntrainer_Tensor, subtract_04_n) {
3237   int batch = 3;
3238   int channel = 1;
3239   int height = 3;
3240   int width = 10;
3241
3242   nntrainer::TensorDim dim(batch, channel, height, width,
3243                            nntrainer::Tformat::NCHW,
3244                            nntrainer::Tdatatype::FP16);
3245
3246   nntrainer::Tensor input(batch, channel, height, 2 * width,
3247                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3248   nntrainer::Tensor shared_input = input.getSharedDataTensor(dim, 0, false);
3249   nntrainer::Tensor test(dim);
3250
3251   EXPECT_THROW(shared_input.subtract(test), std::invalid_argument);
3252 }
3253
3254 TEST(nntrainer_Tensor, subtract_05_n) {
3255   int batch = 3;
3256   int channel = 1;
3257   int height = 3;
3258   int width = 10;
3259
3260   nntrainer::TensorDim dim(batch, channel, height, width,
3261                            nntrainer::Tformat::NCHW,
3262                            nntrainer::Tdatatype::FP16);
3263
3264   nntrainer::Tensor input(dim);
3265   nntrainer::Tensor test(batch, channel, height, 2 * width,
3266                          nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3267   nntrainer::Tensor shared_test = test.getSharedDataTensor(dim, 0, false);
3268
3269   EXPECT_THROW(input.subtract(shared_test), std::invalid_argument);
3270 }
3271
3272 TEST(nntrainer_Tensor, subtract_06_n) {
3273   int batch = 3;
3274   int channel = 1;
3275   int height = 3;
3276   int width = 10;
3277
3278   nntrainer::TensorDim dim(batch, channel, height, width,
3279                            nntrainer::Tformat::NCHW,
3280                            nntrainer::Tdatatype::FP16);
3281
3282   nntrainer::Tensor input(dim, false);
3283   nntrainer::Tensor test(dim);
3284   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
3285
3286   EXPECT_THROW(input.subtract(test), std::invalid_argument);
3287 }
3288
3289 TEST(nntrainer_Tensor, subtract_07_n) {
3290   int batch = 3;
3291   int channel = 1;
3292   int height = 3;
3293   int width = 10;
3294
3295   nntrainer::TensorDim dim(batch, channel, height, width,
3296                            nntrainer::Tformat::NCHW,
3297                            nntrainer::Tdatatype::FP16);
3298
3299   nntrainer::Tensor input(dim);
3300   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3301   nntrainer::Tensor test(dim, false);
3302
3303   EXPECT_THROW(input.subtract(test), std::invalid_argument);
3304 }
3305
3306 TEST(nntrainer_Tensor, subtract_08_n) {
3307   int batch = 3;
3308   int channel = 1;
3309   int height = 3;
3310   int width = 10;
3311
3312   nntrainer::TensorDim dim(batch, channel, height, width,
3313                            nntrainer::Tformat::NCHW,
3314                            nntrainer::Tdatatype::FP16);
3315
3316   nntrainer::Tensor input(dim);
3317   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3318   nntrainer::Tensor test(dim);
3319   GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 2);
3320   nntrainer::Tensor output(dim, false);
3321
3322   EXPECT_THROW(input.subtract(test, output), std::invalid_argument);
3323 }
3324
3325 TEST(nntrainer_Tensor, subtract__Float16_01_p) {
3326   int batch = 3;
3327   int channel = 1;
3328   int height = 3;
3329   int width = 10;
3330
3331   nntrainer::Tensor input(batch, channel, height, width,
3332                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3333   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3334
3335   nntrainer::Tensor expected(batch, channel, height, width,
3336                              nntrainer::Tformat::NCHW,
3337                              nntrainer::Tdatatype::FP16);
3338   GEN_TEST_INPUT(expected, i * (batch * height) + j * (width) + k);
3339
3340   nntrainer::Tensor result = input.subtract(1.0);
3341
3342   EXPECT_EQ(result, expected);
3343 }
3344
3345 TEST(nntrainer_Tensor, sum_01_n) {
3346   int batch = 3;
3347   int channel = 1;
3348   int height = 3;
3349   int width = 10;
3350
3351   nntrainer::Tensor input(batch, channel, height, width,
3352                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3353   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
3354
3355   EXPECT_THROW({ input.sum(4); }, std::out_of_range);
3356 }
3357
3358 TEST(nntrainer_Tensor, sum_02_n) {
3359   int batch = 3;
3360   int channel = 1;
3361   int height = 3;
3362   int width = 10;
3363
3364   nntrainer::Tensor input(batch, channel, height, width,
3365                           nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3366   GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
3367
3368   EXPECT_THROW({ input.sum(-1); }, std::out_of_range);
3369 }
3370
3371 TEST(nntrainer_Tensor, sum_02_p) {
3372   int batch = 3;
3373   int channel = 2;
3374   int height = 2;
3375   int width = 10;
3376
3377   nntrainer::TensorDim::TensorType t_type;
3378   t_type.format = nntrainer::Tformat::NCHW;
3379   t_type.data_type = nntrainer::Tdatatype::FP16;
3380
3381   nntrainer::Tensor ans0(
3382     std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3383       {{{{39, 42, 45, 48, 51, 54, 57, 60, 63, 66},
3384          {69, 72, 75, 78, 81, 84, 87, 90, 93, 96}},
3385         {{57, 60, 63, 66, 69, 72, 75, 78, 81, 84},
3386          {87, 90, 93, 96, 99, 102, 105, 108, 111, 114}}}}),
3387     t_type);
3388
3389   nntrainer::Tensor ans1(
3390     std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3391       {{{{8, 10, 12, 14, 16, 18, 20, 22, 24, 26},
3392          {28, 30, 32, 34, 36, 38, 40, 42, 44, 46}}},
3393        {{{32, 34, 36, 38, 40, 42, 44, 46, 48, 50},
3394          {52, 54, 56, 58, 60, 62, 64, 66, 68, 70}}},
3395        {{{56, 58, 60, 62, 64, 66, 68, 70, 72, 74},
3396          {76, 78, 80, 82, 84, 86, 88, 90, 92, 94}}}}),
3397     t_type);
3398
3399   nntrainer::Tensor ans2(
3400     std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3401       {{{{12, 14, 16, 18, 20, 22, 24, 26, 28, 30}},
3402         {{24, 26, 28, 30, 32, 34, 36, 38, 40, 42}}},
3403        {{{36, 38, 40, 42, 44, 46, 48, 50, 52, 54}},
3404         {{48, 50, 52, 54, 56, 58, 60, 62, 64, 66}}},
3405        {{{60, 62, 64, 66, 68, 70, 72, 74, 76, 78}},
3406         {{72, 74, 76, 78, 80, 82, 84, 86, 88, 90}}}}),
3407     t_type);
3408
3409   nntrainer::Tensor ans3(
3410     std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3411       {{{{55}, {155}}, {{115}, {215}}},
3412        {{{175}, {275}}, {{235}, {335}}},
3413        {{{295}, {395}}, {{355}, {455}}}}),
3414     t_type);
3415
3416   nntrainer::Tensor input(batch, channel, height, width, t_type);
3417   GEN_TEST_INPUT(input, i * (batch * height * channel) + j * (batch * height) +
3418                           k * (width) + l + 1);
3419
3420   nntrainer::Tensor result0 = input.sum(0);
3421   nntrainer::Tensor result1 = input.sum(1);
3422   nntrainer::Tensor result2 = input.sum(2);
3423   nntrainer::Tensor result3 = input.sum(3);
3424
3425   EXPECT_EQ(ans0, result0);
3426   EXPECT_EQ(ans1, result1);
3427   EXPECT_EQ(ans2, result2);
3428   EXPECT_EQ(ans3, result3);
3429 }
3430
3431 TEST(nntrainer_Tensor, sum_03_p) {
3432   const int batch = 3;
3433   const int channel = 2;
3434   const int height = 1;
3435   const int width = 10;
3436
3437   nntrainer::TensorDim::TensorType t_type;
3438   t_type.format = nntrainer::Tformat::NCHW;
3439   t_type.data_type = nntrainer::Tdatatype::FP16;
3440
3441   nntrainer::Tensor input(batch, channel, height, width, t_type);
3442   GEN_TEST_INPUT(input, i * (height * channel * width) + j * (height * width) +
3443                           k * (width) + l + 1);
3444   // Test for alpha == 1 and beta == 0 and dimension of reduced axis == 1
3445   {
3446     nntrainer::Tensor ans_0_1_0(
3447       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3448         {{{{63, 66, 69, 72, 75, 78, 81, 84, 87, 90}},
3449           {{93, 96, 99, 102, 105, 108, 111, 114, 117, 120}}}}),
3450       t_type);
3451
3452     nntrainer::Tensor ans_1_1_0(
3453       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3454         {{{{12, 14, 16, 18, 20, 22, 24, 26, 28, 30}}},
3455          {{{52, 54, 56, 58, 60, 62, 64, 66, 68, 70}}},
3456          {{{92, 94, 96, 98, 100, 102, 104, 106, 108, 110}}}}),
3457       t_type);
3458
3459     nntrainer::Tensor ans_2_1_0(
3460       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3461         {{{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}},
3462           {{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}}},
3463          {{{21, 22, 23, 24, 25, 26, 27, 28, 29, 30}},
3464           {{31, 32, 33, 34, 35, 36, 37, 38, 39, 40}}},
3465          {{{41, 42, 43, 44, 45, 46, 47, 48, 49, 50}},
3466           {{51, 52, 53, 54, 55, 56, 57, 58, 59, 60}}}}),
3467       t_type);
3468
3469     nntrainer::Tensor ans_3_1_0(
3470       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3471         {{{{55}}, {{155}}}, {{{255}}, {{355}}}, {{{455}}, {{555}}}}),
3472       t_type);
3473
3474     nntrainer::Tensor result_0_1_0 = input.sum(0, 1);
3475     nntrainer::Tensor result_1_1_0 = input.sum(1, 1);
3476     nntrainer::Tensor result_2_1_0 = input.sum(2, 1);
3477     nntrainer::Tensor result_3_1_0 = input.sum(3, 1);
3478
3479     EXPECT_EQ(ans_0_1_0, result_0_1_0);
3480     EXPECT_EQ(ans_1_1_0, result_1_1_0);
3481     EXPECT_EQ(ans_2_1_0, result_2_1_0);
3482     EXPECT_EQ(ans_3_1_0, result_3_1_0);
3483   }
3484
3485   // Test for alpha == 1 and beta == 2 and dimension of reduced axis == 1
3486   {
3487     nntrainer::Tensor ans_0_1_2(
3488       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3489         {{{{65, 70, 75, 80, 85, 90, 95, 100, 105, 110}},
3490           {{115, 120, 125, 130, 135, 140, 145, 150, 155, 160}}}}),
3491       t_type);
3492
3493     nntrainer::Tensor ans_1_1_2(
3494       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3495         {{{{14, 18, 22, 26, 30, 34, 38, 42, 46, 50}}},
3496          {{{74, 78, 82, 86, 90, 94, 98, 102, 106, 110}}},
3497          {{{134, 138, 142, 146, 150, 154, 158, 162, 166, 170}}}}),
3498       t_type);
3499
3500     nntrainer::Tensor ans_2_1_2(
3501       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3502         {{{{3, 6, 9, 12, 15, 18, 21, 24, 27, 30}},
3503           {{33, 36, 39, 42, 45, 48, 51, 54, 57, 60}}},
3504          {{{63, 66, 69, 72, 75, 78, 81, 84, 87, 90}},
3505           {{93, 96, 99, 102, 105, 108, 111, 114, 117, 120}}},
3506          {{{123, 126, 129, 132, 135, 138, 141, 144, 147, 150}},
3507           {{153, 156, 159, 162, 165, 168, 171, 174, 177, 180}}}}),
3508       t_type);
3509
3510     nntrainer::Tensor ans_3_1_2(
3511       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3512         {{{{57}}, {{159}}}, {{{261}}, {{363}}}, {{{465}}, {{567}}}}),
3513       t_type);
3514
3515     nntrainer::Tensor output_0_1_2(1, channel, height, width, t_type);
3516     {
3517       const int batch = 1;
3518       GEN_TEST_INPUT(output_0_1_2, i * (channel * height * width) +
3519                                      j * (height * width) + k * (width) + l +
3520                                      1);
3521     }
3522     nntrainer::Tensor output_1_1_2(batch, 1, height, width, t_type);
3523     {
3524       const int channel = 1;
3525       GEN_TEST_INPUT(output_1_1_2, i * (channel * height * width) +
3526                                      j * (height * width) + k * (width) + l +
3527                                      1);
3528     }
3529     nntrainer::Tensor output_2_1_2(batch, channel, 1, width, t_type);
3530     {
3531       const int height = 1;
3532       GEN_TEST_INPUT(output_2_1_2, i * (channel * height * width) +
3533                                      j * (height * width) + k * (width) + l +
3534                                      1);
3535     }
3536     nntrainer::Tensor output_3_1_2(batch, channel, height, 1, t_type);
3537     {
3538       const int width = 1;
3539       GEN_TEST_INPUT(output_3_1_2, i * (channel * height * width) +
3540                                      j * (height * width) + k * (width) + l +
3541                                      1);
3542     }
3543     nntrainer::Tensor result_0_1_2 = input.sum(0, output_0_1_2, 1, 2);
3544     nntrainer::Tensor result_1_1_2 = input.sum(1, output_1_1_2, 1, 2);
3545     nntrainer::Tensor result_2_1_2 = input.sum(2, output_2_1_2, 1, 2);
3546     nntrainer::Tensor result_3_1_2 = input.sum(3, output_3_1_2, 1, 2);
3547
3548     EXPECT_EQ(ans_0_1_2, result_0_1_2);
3549     EXPECT_EQ(ans_1_1_2, result_1_1_2);
3550     EXPECT_EQ(ans_2_1_2, result_2_1_2);
3551     EXPECT_EQ(ans_3_1_2, result_3_1_2);
3552   }
3553
3554   // Test for alpha == 2 and beta == 0
3555   {
3556     nntrainer::Tensor ans_0_2_0(
3557       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3558         {{{{126, 132, 138, 144, 150, 156, 162, 168, 174, 180}},
3559           {{186, 192, 198, 204, 210, 216, 222, 228, 234, 240}}}}),
3560       t_type);
3561
3562     nntrainer::Tensor ans_1_2_0(
3563       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3564         {{{{24, 28, 32, 36, 40, 44, 48, 52, 56, 60}}},
3565          {{{104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}},
3566          {{{184, 188, 192, 196, 200, 204, 208, 212, 216, 220}}}}),
3567       t_type);
3568
3569     nntrainer::Tensor ans_2_2_0(
3570       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3571         {{{{2, 4, 6, 8, 10, 12, 14, 16, 18, 20}},
3572           {{22, 24, 26, 28, 30, 32, 34, 36, 38, 40}}},
3573          {{{42, 44, 46, 48, 50, 52, 54, 56, 58, 60}},
3574           {{62, 64, 66, 68, 70, 72, 74, 76, 78, 80}}},
3575          {{{82, 84, 86, 88, 90, 92, 94, 96, 98, 100}},
3576           {{102, 104, 106, 108, 110, 112, 114, 116, 118, 120}}}}),
3577       t_type);
3578
3579     nntrainer::Tensor ans_3_2_0(
3580       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3581         {{{{110}}, {{310}}}, {{{510}}, {{710}}}, {{{910}}, {{1110}}}}),
3582       t_type);
3583
3584     nntrainer::Tensor result_0_2_0 = input.sum(0, 2);
3585     nntrainer::Tensor result_1_2_0 = input.sum(1, 2);
3586     nntrainer::Tensor result_2_2_0 = input.sum(2, 2);
3587     nntrainer::Tensor result_3_2_0 = input.sum(3, 2);
3588
3589     EXPECT_EQ(ans_0_2_0, result_0_2_0);
3590     EXPECT_EQ(ans_1_2_0, result_1_2_0);
3591     EXPECT_EQ(ans_2_2_0, result_2_2_0);
3592     EXPECT_EQ(ans_3_2_0, result_3_2_0);
3593   }
3594
3595   // Test for alpha == 2 and beta == 2
3596   {
3597     nntrainer::Tensor ans_0_2_2(
3598       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3599         {{{{128, 136, 144, 152, 160, 168, 176, 184, 192, 200}},
3600           {{208, 216, 224, 232, 240, 248, 256, 264, 272, 280}}}}),
3601       t_type);
3602
3603     nntrainer::Tensor ans_1_2_2(
3604       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3605         {{{{26, 32, 38, 44, 50, 56, 62, 68, 74, 80}}},
3606          {{{126, 132, 138, 144, 150, 156, 162, 168, 174, 180}}},
3607          {{{226, 232, 238, 244, 250, 256, 262, 268, 274, 280}}}}),
3608       t_type);
3609
3610     nntrainer::Tensor ans_2_2_2(
3611       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3612         {{{{4, 8, 12, 16, 20, 24, 28, 32, 36, 40}},
3613           {{44, 48, 52, 56, 60, 64, 68, 72, 76, 80}}},
3614          {{{84, 88, 92, 96, 100, 104, 108, 112, 116, 120}},
3615           {{124, 128, 132, 136, 140, 144, 148, 152, 156, 160}}},
3616          {{{164, 168, 172, 176, 180, 184, 188, 192, 196, 200}},
3617           {{204, 208, 212, 216, 220, 224, 228, 232, 236, 240}}}}),
3618       t_type);
3619
3620     nntrainer::Tensor ans_3_2_2(
3621       std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3622         {{{{112}}, {{314}}}, {{{516}}, {{718}}}, {{{920}}, {{1122}}}}),
3623       t_type);
3624
3625     nntrainer::Tensor output_0_2_2(1, channel, height, width, t_type);
3626     {
3627       const int batch = 1;
3628       GEN_TEST_INPUT(output_0_2_2, i * (channel * height * width) +
3629                                      j * (height * width) + k * (width) + l +
3630                                      1);
3631     }
3632     nntrainer::Tensor output_1_2_2(batch, 1, height, width, t_type);
3633     {
3634       const int channel = 1;
3635       GEN_TEST_INPUT(output_1_2_2, i * (channel * height * width) +
3636                                      j * (height * width) + k * (width) + l +
3637                                      1);
3638     }
3639     nntrainer::Tensor output_2_2_2(batch, channel, 1, width, t_type);
3640     {
3641       const int height = 1;
3642       GEN_TEST_INPUT(output_2_2_2, i * (channel * height * width) +
3643                                      j * (height * width) + k * (width) + l +
3644                                      1);
3645     }
3646     nntrainer::Tensor output_3_2_2(batch, channel, height, 1, t_type);
3647     {
3648       const int width = 1;
3649       GEN_TEST_INPUT(output_3_2_2, i * (channel * height * width) +
3650                                      j * (height * width) + k * (width) + l +
3651                                      1);
3652     }
3653     nntrainer::Tensor result_0_2_2 = input.sum(0, output_0_2_2, 2, 2);
3654     nntrainer::Tensor result_1_2_2 = input.sum(1, output_1_2_2, 2, 2);
3655     nntrainer::Tensor result_2_2_2 = input.sum(2, output_2_2_2, 2, 2);
3656     nntrainer::Tensor result_3_2_2 = input.sum(3, output_3_2_2, 2, 2);
3657
3658     EXPECT_EQ(ans_0_2_2, result_0_2_2);
3659     EXPECT_EQ(ans_1_2_2, result_1_2_2);
3660     EXPECT_EQ(ans_2_2_2, result_2_2_2);
3661     EXPECT_EQ(ans_3_2_2, result_3_2_2);
3662   }
3663 }
3664
3665 TEST(nntrainer_Tensor, sum_04_p) {
3666   int status = ML_ERROR_NONE;
3667   int batch = 3;
3668   int channel = 2;
3669   int height = 2;
3670   int width = 10;
3671
3672   nntrainer::TensorDim::TensorType t_type;
3673   t_type.format = nntrainer::Tformat::NCHW;
3674   t_type.data_type = nntrainer::Tdatatype::FP16;
3675
3676   nntrainer::Tensor input(batch, channel, height, width, t_type);
3677   GEN_TEST_INPUT(input, i * (batch * height * channel) + j * (height * width) +
3678                           k * width + l + 1);
3679
3680   nntrainer::Tensor result = input.sum_by_batch();
3681   if (result.getValue<_Float16>(0, 0, 0, 0) != 820 ||
3682       result.getValue<_Float16>(1, 0, 0, 0) != 1300 ||
3683       result.getValue<_Float16>(2, 0, 0, 0) != 1780)
3684     status = ML_ERROR_RESULT_OUT_OF_RANGE;
3685
3686   EXPECT_EQ(status, ML_ERROR_NONE);
3687 }
3688
3689 TEST(nntrainer_Tensor, multiple_sum_invalid_args_01_n) {
3690
3691   nntrainer::Tensor t = constant(1.0, 1, 1, 1, 1, nntrainer::Tformat::NCHW,
3692                                  nntrainer::Tdatatype::FP16);
3693   EXPECT_THROW(t.sum(std::vector<unsigned int>()), std::invalid_argument);
3694 }
3695
3696 TEST(nntrainer_Tensor, multiple_sum_out_of_range_n) {
3697   nntrainer::Tensor t = constant(1.0, 1, 1, 1, 1, nntrainer::Tformat::NCHW,
3698                                  nntrainer::Tdatatype::FP16);
3699   EXPECT_THROW(t.sum({7}), std::out_of_range);
3700 }
3701
3702 TEST(nntrainer_Tensor, multiple_sum_p) {
3703   nntrainer::Tensor t = constant(1.0, 2, 3, 5, 7, nntrainer::Tformat::NCHW,
3704                                  nntrainer::Tdatatype::FP16);
3705   nntrainer::Tensor actual, expected;
3706
3707   actual = t.sum({0, 1});
3708   expected = constant(2 * 3, 1, 1, 5, 7, nntrainer::Tformat::NCHW,
3709                       nntrainer::Tdatatype::FP16);
3710   EXPECT_EQ(actual, expected);
3711
3712   actual = t.sum({1, 2, 3});
3713   expected = constant(3 * 5 * 7, 2, 1, 1, 1, nntrainer::Tformat::NCHW,
3714                       nntrainer::Tdatatype::FP16);
3715   EXPECT_EQ(actual, expected);
3716
3717   actual = t.sum({3, 1});
3718   expected = constant(7 * 3, 2, 1, 5, 1, nntrainer::Tformat::NCHW,
3719                       nntrainer::Tdatatype::FP16);
3720   EXPECT_EQ(actual, expected);
3721
3722   actual = t.sum({3, 1}, 0.5);
3723   expected = constant(7 * 3 * 0.5, 2, 1, 5, 1, nntrainer::Tformat::NCHW,
3724                       nntrainer::Tdatatype::FP16);
3725   EXPECT_EQ(actual, expected);
3726 }
3727
3728 // @todo check later
3729 // TEST(nntrainer_Tensor, average_p) {
3730 //   nntrainer::Tensor t = constant(1.0, 2, 3, 5, 7, nntrainer::Tformat::NCHW,
3731 //                                  nntrainer::Tdatatype::FP16);
3732
3733 //   nntrainer::Tensor actual, expected;
3734 //   actual.setTensorType({nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16});
3735
3736 //   actual = t.average();
3737 //   expected = constant(1.0, 1, 1, 1, 1, nntrainer::Tformat::NCHW,
3738 //                       nntrainer::Tdatatype::FP16);
3739 //   EXPECT_EQ(actual, expected);
3740
3741 //   int idx = 0;
3742 //   t = t.apply(
3743 //     (std::function<_Float16(_Float16)>)[&](_Float16 in) { return idx++ % 2; });
3744
3745 //   actual = t.average();
3746 //   expected = constant(0.5, 1, 1, 1, 1, nntrainer::Tformat::NCHW,
3747 //                       nntrainer::Tdatatype::FP16);
3748 //   EXPECT_EQ(actual, expected);
3749 // }
3750
3751 TEST(nntrainer_Tensor, average_axis_p) {
3752   nntrainer::Tensor t = constant(1.0, 2, 2, 2, 2, nntrainer::Tformat::NCHW,
3753                                  nntrainer::Tdatatype::FP16);
3754   int idx = 0;
3755   std::function<float(float)> f = [&](float in) { return idx++ % 2; };
3756   t = t.apply(f);
3757
3758   nntrainer::Tensor actual, expected;
3759
3760   actual = t.average(0);
3761   expected = constant(0, 1, 2, 2, 2, nntrainer::Tformat::NCHW,
3762                       nntrainer::Tdatatype::FP16)
3763                .apply(f);
3764   EXPECT_EQ(actual, expected);
3765
3766   actual = t.average(1);
3767   expected = constant(0, 2, 1, 2, 2, nntrainer::Tformat::NCHW,
3768                       nntrainer::Tdatatype::FP16)
3769                .apply(f);
3770   EXPECT_EQ(actual, expected);
3771
3772   actual = t.average(2);
3773   expected = constant(0, 2, 2, 1, 2, nntrainer::Tformat::NCHW,
3774                       nntrainer::Tdatatype::FP16)
3775                .apply(f);
3776   EXPECT_EQ(actual, expected);
3777
3778   actual = t.average(3);
3779   expected = constant(0.5, 2, 2, 2, 1, nntrainer::Tformat::NCHW,
3780                       nntrainer::Tdatatype::FP16);
3781   EXPECT_EQ(actual, expected);
3782 }
3783
3784 TEST(nntrainer_Tensor, average_axis_out_of_range_01_n) {
3785   nntrainer::Tensor t = constant(1.0, 2, 2, 2, 2, nntrainer::Tformat::NCHW,
3786                                  nntrainer::Tdatatype::FP16);
3787   EXPECT_THROW(t.average(-1), std::out_of_range);
3788 }
3789
3790 TEST(nntrainer_Tensor, average_axis_out_of_range_02_n) {
3791   nntrainer::Tensor t = constant(1.0, 2, 2, 2, 2, nntrainer::Tformat::NCHW,
3792                                  nntrainer::Tdatatype::FP16);
3793   EXPECT_THROW(t.average(7), std::out_of_range);
3794 }
3795
3796 TEST(nntrainer_Tensor, average_multiple_axes_p) {
3797   nntrainer::Tensor t = constant(1.0, 2, 3, 5, 7, nntrainer::Tformat::NCHW,
3798                                  nntrainer::Tdatatype::FP16);
3799   nntrainer::Tensor actual, expected;
3800
3801   actual = t.average({0, 1, 2});
3802   expected = constant(1.0, 1, 1, 1, 7, nntrainer::Tformat::NCHW,
3803                       nntrainer::Tdatatype::FP16);
3804   EXPECT_EQ(actual, expected);
3805
3806   actual = t.average({0, 1, 2, 3});
3807   expected = constant(1.0, 1, 1, 1, 1, nntrainer::Tformat::NCHW,
3808                       nntrainer::Tdatatype::FP16);
3809   EXPECT_EQ(actual, expected);
3810
3811   actual = t.average({3, 1});
3812   expected = constant(1.0, 2, 1, 5, 1, nntrainer::Tformat::NCHW,
3813                       nntrainer::Tdatatype::FP16);
3814   EXPECT_EQ(actual, expected);
3815
3816   actual = t.average({3, 1, 1, 1, 3});
3817   expected = constant(1.0, 2, 1, 5, 1, nntrainer::Tformat::NCHW,
3818                       nntrainer::Tdatatype::FP16);
3819   EXPECT_EQ(actual, expected);
3820 }
3821
3822 TEST(nntrainer_Tensor, average_multiple_axes_01_n) {
3823   nntrainer::Tensor t = constant(1.0, 2, 3, 5, 7, nntrainer::Tformat::NCHW,
3824                                  nntrainer::Tdatatype::FP16);
3825   EXPECT_THROW(t.average({5, 7}), std::out_of_range);
3826 }
3827
3828 TEST(nntrainer_Tensor, dot_01_n) {
3829
3830   nntrainer::TensorDim::TensorType t_type;
3831   t_type.format = nntrainer::Tformat::NCHW;
3832   t_type.data_type = nntrainer::Tdatatype::FP16;
3833
3834   nntrainer::Tensor input(2, 3, 4, 5, t_type);
3835   nntrainer::Tensor m(1, 3, 4, 5, t_type);
3836   EXPECT_THROW(nntrainer::Tensor result = input.dot(m), std::runtime_error);
3837 }
3838
3839 TEST(nntrainer_Tensor, dot_02_n) {
3840
3841   nntrainer::TensorDim::TensorType t_type;
3842   t_type.format = nntrainer::Tformat::NCHW;
3843   t_type.data_type = nntrainer::Tdatatype::FP16;
3844
3845   nntrainer::Tensor input(2, 3, 4, 5, t_type);
3846   nntrainer::Tensor m(1, 3, 4, 5, t_type);
3847   EXPECT_THROW(nntrainer::Tensor result = input.dot(m, true),
3848                std::runtime_error);
3849 }
3850
3851 TEST(nntrainer_Tensor, dot_02_p) {
3852
3853   nntrainer::TensorDim::TensorType t_type;
3854   t_type.format = nntrainer::Tformat::NCHW;
3855   t_type.data_type = nntrainer::Tdatatype::FP16;
3856
3857   nntrainer::Tensor input(2, 3, 4, 5, t_type);
3858   nntrainer::Tensor m(1, 3, 4, 5, t_type);
3859   EXPECT_NO_THROW(nntrainer::Tensor result = input.dot(m, false, true));
3860 }
3861
3862 TEST(nntrainer_Tensor, dot_03_p) {
3863
3864   nntrainer::TensorDim::TensorType t_type;
3865   t_type.format = nntrainer::Tformat::NCHW;
3866   t_type.data_type = nntrainer::Tdatatype::FP16;
3867
3868   nntrainer::Tensor input(1, 3, 4, 5, t_type);
3869   nntrainer::Tensor m(1, 3, 4, 5, t_type);
3870   EXPECT_NO_THROW(nntrainer::Tensor result = input.dot(m, true));
3871 }
3872
3873 TEST(nntrainer_Tensor, dot_04_n) {
3874
3875   nntrainer::TensorDim::TensorType t_type;
3876   t_type.format = nntrainer::Tformat::NCHW;
3877   t_type.data_type = nntrainer::Tdatatype::FP16;
3878
3879   nntrainer::Tensor input(2, 3, 4, 5, t_type);
3880   nntrainer::Tensor m(1, 1, 4, 5, t_type);
3881   EXPECT_THROW(nntrainer::Tensor result = input.dot(m), std::runtime_error);
3882   EXPECT_NO_THROW(nntrainer::Tensor result = input.dot(m, false, true));
3883 }
3884 #include <iostream>
3885 TEST(nntrainer_Tensor, dot_05_p) {
3886   int status = ML_ERROR_NONE;
3887   int batch = 2;
3888   int channel = 3;
3889   int height = 4;
3890   int width = 5;
3891
3892   nntrainer::TensorDim::TensorType t_type;
3893   t_type.format = nntrainer::Tformat::NCHW;
3894   t_type.data_type = nntrainer::Tdatatype::FP16;
3895
3896   _Float16 ans[2][3][4][24] = {0};
3897
3898   nntrainer::Tensor input(batch, channel, height, width, t_type);
3899   GEN_TEST_INPUT(input, i * (channel * width * height) + j * (height * width) +
3900                           k * (width) + l + 1);
3901   nntrainer::Tensor weight(batch, channel, height, width, t_type);
3902   GEN_TEST_INPUT(weight, i * (channel * width * height) + j * (height * width) +
3903                            k * (width) + l + 1);
3904   weight.reshape({1, 1, 24, 5, t_type});
3905
3906   nntrainer::Tensor result = input.dot(weight, false, true);
3907
3908   for (int b = 0; b < batch; b++) {
3909     for (int c = 0; c < channel; c++) {
3910       for (int h = 0; h < height; h++) {
3911         for (int k = 0; k < batch * channel * height; k++) {
3912           ans[b][c][h][k] = 0;
3913           for (int w = 0; w < width; w++) {
3914             _Float16 val1 = input.getValue<_Float16>(b, c, h, w);
3915             _Float16 val2 = weight.getValue<_Float16>(0, 0, k, w);
3916             ans[b][c][h][k] += val1 * val2;
3917           }
3918         }
3919       }
3920     }
3921   }
3922
3923   for (unsigned int i = 0; i < result.batch(); ++i) {
3924     for (unsigned int c = 0; c < result.channel(); ++c) {
3925       for (unsigned int j = 0; j < result.height(); ++j) {
3926         for (unsigned int k = 0; k < result.width(); ++k) {
3927           _Float16 val1 = ans[i][c][j][k];
3928           _Float16 val2 = result.getValue<_Float16>(i, c, j, k);
3929           if (val1 != val2) {
3930             status = ML_ERROR_RESULT_OUT_OF_RANGE;
3931             goto end_dot_01_p;
3932           }
3933         }
3934       }
3935     }
3936   }
3937 end_dot_01_p:
3938   EXPECT_EQ(status, ML_ERROR_NONE);
3939 }
3940
3941 TEST(nntrainer_Tensor, dot_06_p) {
3942   int status = ML_ERROR_NONE;
3943   int batch = 3;
3944   int channel = 1;
3945   int height = 1;
3946   int width = 3;
3947
3948   nntrainer::TensorDim::TensorType t_type;
3949   t_type.format = nntrainer::Tformat::NCHW;
3950   t_type.data_type = nntrainer::Tdatatype::FP16;
3951
3952   _Float16 ans[3][1][1][3] = {
3953     {{{30, 36, 42}}}, {{{66, 81, 96}}}, {{{102, 126, 150}}}};
3954
3955   nntrainer::Tensor input(batch, channel, height, width, t_type);
3956   GEN_TEST_INPUT(input, i * (channel * width * height) + j * (height * width) +
3957                           k * (width) + l + 1);
3958
3959   nntrainer::Tensor result = input.dot(input);
3960
3961   for (unsigned int i = 0; i < result.batch(); ++i) {
3962     for (unsigned int j = 0; j < result.height(); ++j) {
3963       for (unsigned int k = 0; k < result.width(); ++k) {
3964         if (ans[i][0][j][k] != result.getValue<_Float16>(i, 0, j, k)) {
3965           status = ML_ERROR_RESULT_OUT_OF_RANGE;
3966           goto end_dot_01_p;
3967         }
3968       }
3969     }
3970   }
3971 end_dot_01_p:
3972   EXPECT_EQ(status, ML_ERROR_NONE);
3973 }
3974
3975 TEST(nntrainer_Tensor, dot_transpose_p) {
3976   nntrainer::TensorDim::TensorType t_type;
3977   t_type.format = nntrainer::Tformat::NCHW;
3978   t_type.data_type = nntrainer::Tdatatype::FP16;
3979   {
3980     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
3981     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
3982     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
3983     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
3984     _Float16 answer_data[] = {20, 23,  26,  29,  56,  68,  80,  92,
3985                               92, 113, 134, 155, 128, 158, 188, 218};
3986     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 4, t_type),
3987                              answer_data);
3988     nntrainer::Tensor ret = a.dot(b, true, true);
3989     EXPECT_EQ(ret, answer);
3990   }
3991   {
3992     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
3993     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
3994     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
3995     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
3996     _Float16 answer_data[] = {20, 23,  26,  29,  56,  68,  80,  92,
3997                               92, 113, 134, 155, 128, 158, 188, 218};
3998     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 4, t_type),
3999                              answer_data);
4000     nntrainer::Tensor ret = a.dot(b, true, false);
4001     EXPECT_EQ(ret, answer);
4002   }
4003   {
4004     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4005     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4006     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4007     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4008     _Float16 answer_data[] = {20, 23,  26,  29,  56,  68,  80,  92,
4009                               92, 113, 134, 155, 128, 158, 188, 218};
4010     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 4, t_type),
4011                              answer_data);
4012     nntrainer::Tensor ret = a.dot(b, false, true);
4013     EXPECT_EQ(ret, answer);
4014   }
4015   {
4016     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4017     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4018     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4019     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4020     _Float16 answer_data[] = {20, 23,  26,  29,  56,  68,  80,  92,
4021                               92, 113, 134, 155, 128, 158, 188, 218};
4022     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 4, t_type),
4023                              answer_data);
4024     nntrainer::Tensor ret = a.dot(b, false, false);
4025     EXPECT_EQ(ret, answer);
4026   }
4027   {
4028     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4029     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4030     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4031     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4032     _Float16 answer_data[] = {20, 23, 26, 29, 56, 68, 80, 92};
4033     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 4, t_type),
4034                              answer_data);
4035     nntrainer::Tensor ret = a.dot(b, true, true);
4036     EXPECT_EQ(ret, answer);
4037   }
4038   {
4039     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4040     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4041     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4042     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4043     _Float16 answer_data[] = {20, 23, 26, 29, 56, 68, 80, 92};
4044     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 4, t_type),
4045                              answer_data);
4046     nntrainer::Tensor ret = a.dot(b, true, false);
4047     EXPECT_EQ(ret, answer);
4048   }
4049   {
4050     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4051     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4052     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4053     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4054     _Float16 answer_data[] = {20, 23, 26, 29, 56, 68, 80, 92};
4055     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 4, t_type),
4056                              answer_data);
4057     nntrainer::Tensor ret = a.dot(b, false, true);
4058     EXPECT_EQ(ret, answer);
4059   }
4060   {
4061     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4062     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4063     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4064     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4065     _Float16 answer_data[] = {20, 23, 26, 29, 56, 68, 80, 92};
4066     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 4, t_type),
4067                              answer_data);
4068     nntrainer::Tensor ret = a.dot(b, false, false);
4069     EXPECT_EQ(ret, answer);
4070   }
4071   {
4072     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
4073     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
4074     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4075     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4076     _Float16 answer_data[] = {10, 13, 28, 40, 46, 67, 64, 94};
4077     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 2, t_type),
4078                              answer_data);
4079     nntrainer::Tensor ret = a.dot(b, true, true);
4080     EXPECT_EQ(ret, answer);
4081   }
4082   {
4083     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
4084     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
4085     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4086     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4087     _Float16 answer_data[] = {10, 13, 28, 40, 46, 67, 64, 94};
4088     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 2, t_type),
4089                              answer_data);
4090     nntrainer::Tensor ret = a.dot(b, true, false);
4091     EXPECT_EQ(ret, answer);
4092   }
4093   {
4094     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4095     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4096     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4097     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4098     _Float16 answer_data[] = {10, 13, 28, 40, 46, 67, 64, 94};
4099     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 2, t_type),
4100                              answer_data);
4101     nntrainer::Tensor ret = a.dot(b, false, true);
4102     EXPECT_EQ(ret, answer);
4103   }
4104   {
4105     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4106     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4107     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4108     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4109     _Float16 answer_data[] = {10, 13, 28, 40, 46, 67, 64, 94};
4110     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 2, t_type),
4111                              answer_data);
4112     nntrainer::Tensor ret = a.dot(b, false, false);
4113     EXPECT_EQ(ret, answer);
4114   }
4115   {
4116     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4117     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4118     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4119     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4120     _Float16 answer_data[] = {10, 13, 28, 40};
4121     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 2, t_type),
4122                              answer_data);
4123     nntrainer::Tensor ret = a.dot(b, true, true);
4124     EXPECT_EQ(ret, answer);
4125   }
4126   {
4127     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4128     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4129     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4130     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4131     _Float16 answer_data[] = {10, 13, 28, 40};
4132     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 2, t_type),
4133                              answer_data);
4134     nntrainer::Tensor ret = a.dot(b, true, false);
4135     EXPECT_EQ(ret, answer);
4136   }
4137   {
4138     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4139     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4140     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4141     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4142     _Float16 answer_data[] = {10, 13, 28, 40};
4143     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 2, t_type),
4144                              answer_data);
4145     nntrainer::Tensor ret = a.dot(b, false, true);
4146     EXPECT_EQ(ret, answer);
4147   }
4148   {
4149     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4150     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4151     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4152     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4153     _Float16 answer_data[] = {10, 13, 28, 40};
4154     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 2, t_type),
4155                              answer_data);
4156     nntrainer::Tensor ret = a.dot(b, false, false);
4157     EXPECT_EQ(ret, answer);
4158   }
4159 }
4160
4161 TEST(nntrainer_Tensor, dot_shortcuts_p) {
4162   nntrainer::TensorDim::TensorType t_type;
4163   t_type.format = nntrainer::Tformat::NCHW;
4164   t_type.data_type = nntrainer::Tdatatype::FP16;
4165   {
4166     _Float16 a_data[] = {0, 1, 2};
4167     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4168     _Float16 b_data[] = {0, 1, 2};
4169     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4170     _Float16 answer_data[] = {5};
4171     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1, t_type),
4172                              answer_data);
4173     nntrainer::Tensor ret = a.dot(b, false, false);
4174     EXPECT_EQ(ret, answer);
4175   }
4176   {
4177     _Float16 a_data[] = {0, 1, 2};
4178     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4179     _Float16 b_data[] = {0, 1, 2};
4180     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4181     _Float16 answer_data[] = {5};
4182     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1, t_type),
4183                              answer_data);
4184     nntrainer::Tensor ret = a.dot(b, true, false);
4185     EXPECT_EQ(ret, answer);
4186   }
4187   {
4188     _Float16 a_data[] = {0, 1, 2};
4189     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4190     _Float16 b_data[] = {0, 1, 2};
4191     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4192     _Float16 answer_data[] = {5};
4193     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1, t_type),
4194                              answer_data);
4195     nntrainer::Tensor ret = a.dot(b, false, true);
4196     EXPECT_EQ(ret, answer);
4197   }
4198   {
4199     _Float16 a_data[] = {0, 1, 2};
4200     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4201     _Float16 b_data[] = {0, 1, 2};
4202     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4203     _Float16 answer_data[] = {5};
4204     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 1, t_type),
4205                              answer_data);
4206     nntrainer::Tensor ret = a.dot(b, true, true);
4207     EXPECT_EQ(ret, answer);
4208   }
4209   {
4210     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4211     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4212     _Float16 b_data[] = {0, 1, 2};
4213     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4214     _Float16 answer_data[] = {5, 14};
4215     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1, t_type),
4216                              answer_data);
4217     nntrainer::Tensor ret = a.dot(b, false, false);
4218     EXPECT_EQ(ret, answer);
4219   }
4220   {
4221     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4222     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4223     _Float16 b_data[] = {0, 1, 2};
4224     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4225     _Float16 answer_data[] = {5, 14};
4226     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1, t_type),
4227                              answer_data);
4228     nntrainer::Tensor ret = a.dot(b, true, false);
4229     EXPECT_EQ(ret, answer);
4230   }
4231   {
4232     _Float16 a_data[] = {0, 1, 2, 3, 4, 5};
4233     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 2, 3, t_type), a_data);
4234     _Float16 b_data[] = {0, 1, 2};
4235     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4236     _Float16 answer_data[] = {5, 14};
4237     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1, t_type),
4238                              answer_data);
4239     nntrainer::Tensor ret = a.dot(b, false, true);
4240     EXPECT_EQ(ret, answer);
4241   }
4242   {
4243     _Float16 a_data[] = {0, 3, 1, 4, 2, 5};
4244     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 2, t_type), a_data);
4245     _Float16 b_data[] = {0, 1, 2};
4246     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4247     _Float16 answer_data[] = {5, 14};
4248     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 2, 1, t_type),
4249                              answer_data);
4250     nntrainer::Tensor ret = a.dot(b, true, true);
4251     EXPECT_EQ(ret, answer);
4252   }
4253   {
4254     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4255     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4256     _Float16 b_data[] = {0, 1, 2};
4257     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4258     _Float16 answer_data[] = {5, 14, 23, 32};
4259     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1, t_type),
4260                              answer_data);
4261     nntrainer::Tensor ret = a.dot(b, false, false);
4262     EXPECT_EQ(ret, answer);
4263   }
4264   {
4265     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
4266     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
4267     _Float16 b_data[] = {0, 1, 2};
4268     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 1, t_type), b_data);
4269     _Float16 answer_data[] = {5, 14, 23, 32};
4270     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1, t_type),
4271                              answer_data);
4272     nntrainer::Tensor ret = a.dot(b, true, false);
4273     EXPECT_EQ(ret, answer);
4274   }
4275   {
4276     _Float16 a_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4277     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 4, 3, t_type), a_data);
4278     _Float16 b_data[] = {0, 1, 2};
4279     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4280     _Float16 answer_data[] = {5, 14, 23, 32};
4281     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1, t_type),
4282                              answer_data);
4283     nntrainer::Tensor ret = a.dot(b, false, true);
4284     EXPECT_EQ(ret, answer);
4285   }
4286   {
4287     _Float16 a_data[] = {0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11};
4288     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 4, t_type), a_data);
4289     _Float16 b_data[] = {0, 1, 2};
4290     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 1, 3, t_type), b_data);
4291     _Float16 answer_data[] = {5, 14, 23, 32};
4292     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 4, 1, t_type),
4293                              answer_data);
4294     nntrainer::Tensor ret = a.dot(b, true, true);
4295     EXPECT_EQ(ret, answer);
4296   }
4297   {
4298     _Float16 a_data[] = {0, 1, 2};
4299     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4300     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4301     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4302     _Float16 answer_data[] = {20, 23, 26, 29};
4303     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4304                              answer_data);
4305     nntrainer::Tensor ret = a.dot(b, false, false);
4306     EXPECT_EQ(ret, answer);
4307   }
4308   {
4309     _Float16 a_data[] = {0, 1, 2};
4310     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4311     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4312     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4313     _Float16 answer_data[] = {20, 23, 26, 29};
4314     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4315                              answer_data);
4316     nntrainer::Tensor ret = a.dot(b, true, false);
4317     EXPECT_EQ(ret, answer);
4318   }
4319   {
4320     _Float16 a_data[] = {0, 1, 2};
4321     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4322     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4323     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4324     _Float16 answer_data[] = {20, 23, 26, 29};
4325     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4326                              answer_data);
4327     nntrainer::Tensor ret = a.dot(b, false, true);
4328     EXPECT_EQ(ret, answer);
4329   }
4330   {
4331     _Float16 a_data[] = {0, 1, 2};
4332     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4333     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4334     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4335     _Float16 answer_data[] = {20, 23, 26, 29};
4336     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4337                              answer_data);
4338     nntrainer::Tensor ret = a.dot(b, true, true);
4339     EXPECT_EQ(ret, answer);
4340   }
4341   {
4342     _Float16 a_data[] = {0, 1, 2};
4343     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4344     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4345     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4346     _Float16 answer_data[] = {20, 23, 26, 29};
4347     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4348                              answer_data);
4349     nntrainer::Tensor ret = a.dot(b, false, false);
4350     EXPECT_EQ(ret, answer);
4351   }
4352   {
4353     _Float16 a_data[] = {0, 1, 2};
4354     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4355     _Float16 b_data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
4356     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 4, t_type), b_data);
4357     _Float16 answer_data[] = {20, 23, 26, 29};
4358     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4359                              answer_data);
4360     nntrainer::Tensor ret = a.dot(b, true, false);
4361     EXPECT_EQ(ret, answer);
4362   }
4363   {
4364     _Float16 a_data[] = {0, 1, 2};
4365     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4366     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4367     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4368     _Float16 answer_data[] = {20, 23, 26, 29};
4369     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4370                              answer_data);
4371     nntrainer::Tensor ret = a.dot(b, false, true);
4372     EXPECT_EQ(ret, answer);
4373   }
4374   {
4375     _Float16 a_data[] = {0, 1, 2};
4376     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4377     _Float16 b_data[] = {0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11};
4378     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 4, 3, t_type), b_data);
4379     _Float16 answer_data[] = {20, 23, 26, 29};
4380     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 4, t_type),
4381                              answer_data);
4382     nntrainer::Tensor ret = a.dot(b, true, true);
4383     EXPECT_EQ(ret, answer);
4384   }
4385   {
4386     _Float16 a_data[] = {0, 1, 2};
4387     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4388     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4389     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4390     _Float16 answer_data[] = {10, 13};
4391     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2, t_type),
4392                              answer_data);
4393     nntrainer::Tensor ret = a.dot(b, false, false);
4394     EXPECT_EQ(ret, answer);
4395   }
4396   {
4397     _Float16 a_data[] = {0, 1, 2};
4398     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4399     _Float16 b_data[] = {0, 1, 2, 3, 4, 5};
4400     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 3, 2, t_type), b_data);
4401     _Float16 answer_data[] = {10, 13};
4402     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2, t_type),
4403                              answer_data);
4404     nntrainer::Tensor ret = a.dot(b, true, false);
4405     EXPECT_EQ(ret, answer);
4406   }
4407   {
4408     _Float16 a_data[] = {0, 1, 2};
4409     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 1, 3, t_type), a_data);
4410     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4411     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4412     _Float16 answer_data[] = {10, 13};
4413     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2, t_type),
4414                              answer_data);
4415     nntrainer::Tensor ret = a.dot(b, false, true);
4416     EXPECT_EQ(ret, answer);
4417   }
4418   {
4419     _Float16 a_data[] = {0, 1, 2};
4420     nntrainer::Tensor a(nntrainer::TensorDim(1, 1, 3, 1, t_type), a_data);
4421     _Float16 b_data[] = {0, 2, 4, 1, 3, 5};
4422     nntrainer::Tensor b(nntrainer::TensorDim(1, 1, 2, 3, t_type), b_data);
4423     _Float16 answer_data[] = {10, 13};
4424     nntrainer::Tensor answer(nntrainer::TensorDim(1, 1, 1, 2, t_type),
4425                              answer_data);
4426     nntrainer::Tensor ret = a.dot(b, true, true);
4427     EXPECT_EQ(ret, answer);
4428   }
4429 }
4430
4431 TEST(nntrainer_Tensor, transpose_p) {
4432   nntrainer::TensorDim::TensorType t_type;
4433   t_type.format = nntrainer::Tformat::NCHW;
4434   t_type.data_type = nntrainer::Tdatatype::FP16;
4435
4436   nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4437
4438   /// plain transpose
4439   {
4440     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4441     nntrainer::Tensor t =
4442       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4443     _Float16 answer_data[] = {
4444       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,
4445       14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
4446       28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
4447       42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
4448       56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
4449       70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
4450       84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
4451       98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
4452       112, 113, 114, 115, 116, 117, 118, 119};
4453     nntrainer::Tensor answer({3, 2, 4, 5, t_type}, answer_data);
4454     nntrainer::Tensor m = t.transpose("0:1:2");
4455     EXPECT_EQ(answer, m);
4456   }
4457   {
4458     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4459     nntrainer::Tensor t =
4460       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4461     _Float16 answer_data[] = {
4462       0,   5,   10,  15,  1,   6,   11,  16,  2,   7,   12,  17,  3,   8,
4463       13,  18,  4,   9,   14,  19,  20,  25,  30,  35,  21,  26,  31,  36,
4464       22,  27,  32,  37,  23,  28,  33,  38,  24,  29,  34,  39,  40,  45,
4465       50,  55,  41,  46,  51,  56,  42,  47,  52,  57,  43,  48,  53,  58,
4466       44,  49,  54,  59,  60,  65,  70,  75,  61,  66,  71,  76,  62,  67,
4467       72,  77,  63,  68,  73,  78,  64,  69,  74,  79,  80,  85,  90,  95,
4468       81,  86,  91,  96,  82,  87,  92,  97,  83,  88,  93,  98,  84,  89,
4469       94,  99,  100, 105, 110, 115, 101, 106, 111, 116, 102, 107, 112, 117,
4470       103, 108, 113, 118, 104, 109, 114, 119};
4471     nntrainer::Tensor answer({3, 2, 5, 4, t_type}, answer_data);
4472     nntrainer::Tensor m = t.transpose("0:2:1");
4473     EXPECT_EQ(answer, m);
4474   }
4475   {
4476     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4477     nntrainer::Tensor t =
4478       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4479     _Float16 answer_data[] = {
4480       0,   1,   2,   3,   4,   20,  21,  22,  23,  24,  5,   6,   7,   8,
4481       9,   25,  26,  27,  28,  29,  10,  11,  12,  13,  14,  30,  31,  32,
4482       33,  34,  15,  16,  17,  18,  19,  35,  36,  37,  38,  39,  40,  41,
4483       42,  43,  44,  60,  61,  62,  63,  64,  45,  46,  47,  48,  49,  65,
4484       66,  67,  68,  69,  50,  51,  52,  53,  54,  70,  71,  72,  73,  74,
4485       55,  56,  57,  58,  59,  75,  76,  77,  78,  79,  80,  81,  82,  83,
4486       84,  100, 101, 102, 103, 104, 85,  86,  87,  88,  89,  105, 106, 107,
4487       108, 109, 90,  91,  92,  93,  94,  110, 111, 112, 113, 114, 95,  96,
4488       97,  98,  99,  115, 116, 117, 118, 119};
4489     nntrainer::Tensor answer({3, 4, 2, 5, t_type}, answer_data);
4490     nntrainer::Tensor m = t.transpose("1:0:2");
4491     EXPECT_EQ(answer, m);
4492   }
4493   {
4494     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4495     nntrainer::Tensor t =
4496       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4497     _Float16 answer_data[] = {
4498       0,  20,  1,  21,  2,  22,  3,  23,  4,  24,  5,  25,  6,  26,  7,  27,
4499       8,  28,  9,  29,  10, 30,  11, 31,  12, 32,  13, 33,  14, 34,  15, 35,
4500       16, 36,  17, 37,  18, 38,  19, 39,  40, 60,  41, 61,  42, 62,  43, 63,
4501       44, 64,  45, 65,  46, 66,  47, 67,  48, 68,  49, 69,  50, 70,  51, 71,
4502       52, 72,  53, 73,  54, 74,  55, 75,  56, 76,  57, 77,  58, 78,  59, 79,
4503       80, 100, 81, 101, 82, 102, 83, 103, 84, 104, 85, 105, 86, 106, 87, 107,
4504       88, 108, 89, 109, 90, 110, 91, 111, 92, 112, 93, 113, 94, 114, 95, 115,
4505       96, 116, 97, 117, 98, 118, 99, 119};
4506     nntrainer::Tensor answer({3, 4, 5, 2, t_type}, answer_data);
4507     nntrainer::Tensor m = t.transpose("1:2:0");
4508     EXPECT_EQ(answer, m);
4509   }
4510   {
4511     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4512     nntrainer::Tensor t =
4513       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4514     _Float16 answer_data[] = {
4515       0,  5,  10,  15,  20,  25,  30,  35, 1,  6,   11,  16,  21,  26,  31,
4516       36, 2,  7,   12,  17,  22,  27,  32, 37, 3,   8,   13,  18,  23,  28,
4517       33, 38, 4,   9,   14,  19,  24,  29, 34, 39,  40,  45,  50,  55,  60,
4518       65, 70, 75,  41,  46,  51,  56,  61, 66, 71,  76,  42,  47,  52,  57,
4519       62, 67, 72,  77,  43,  48,  53,  58, 63, 68,  73,  78,  44,  49,  54,
4520       59, 64, 69,  74,  79,  80,  85,  90, 95, 100, 105, 110, 115, 81,  86,
4521       91, 96, 101, 106, 111, 116, 82,  87, 92, 97,  102, 107, 112, 117, 83,
4522       88, 93, 98,  103, 108, 113, 118, 84, 89, 94,  99,  104, 109, 114, 119};
4523     nntrainer::Tensor answer({3, 5, 2, 4, t_type}, answer_data);
4524     nntrainer::Tensor m = t.transpose("2:0:1");
4525     EXPECT_EQ(answer, m);
4526   }
4527   {
4528     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4529     nntrainer::Tensor t =
4530       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4531     _Float16 answer_data[] = {
4532       0,  20,  5,  25,  10, 30,  15, 35,  1,  21,  6,  26,  11, 31,  16, 36,
4533       2,  22,  7,  27,  12, 32,  17, 37,  3,  23,  8,  28,  13, 33,  18, 38,
4534       4,  24,  9,  29,  14, 34,  19, 39,  40, 60,  45, 65,  50, 70,  55, 75,
4535       41, 61,  46, 66,  51, 71,  56, 76,  42, 62,  47, 67,  52, 72,  57, 77,
4536       43, 63,  48, 68,  53, 73,  58, 78,  44, 64,  49, 69,  54, 74,  59, 79,
4537       80, 100, 85, 105, 90, 110, 95, 115, 81, 101, 86, 106, 91, 111, 96, 116,
4538       82, 102, 87, 107, 92, 112, 97, 117, 83, 103, 88, 108, 93, 113, 98, 118,
4539       84, 104, 89, 109, 94, 114, 99, 119};
4540     nntrainer::Tensor answer({3, 5, 4, 2, t_type}, answer_data);
4541     nntrainer::Tensor m = t.transpose("2:1:0");
4542     EXPECT_EQ(answer, m);
4543   }
4544
4545   /// outplace transpose
4546   {
4547     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4548     nntrainer::Tensor t =
4549       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4550     nntrainer::Tensor m =
4551       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4552     _Float16 answer_data[] = {
4553       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,
4554       14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
4555       28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
4556       42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
4557       56,  57,  58,  59,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
4558       70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,
4559       84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
4560       98,  99,  100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
4561       112, 113, 114, 115, 116, 117, 118, 119};
4562     nntrainer::Tensor answer({3, 2, 4, 5, t_type}, answer_data);
4563     t.transpose("0:1:2", m);
4564     EXPECT_EQ(answer, m);
4565   }
4566   {
4567     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4568     nntrainer::Tensor t =
4569       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4570     nntrainer::Tensor m =
4571       ranged(3, 2, 5, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4572     _Float16 answer_data[] = {
4573       0,   5,   10,  15,  1,   6,   11,  16,  2,   7,   12,  17,  3,   8,
4574       13,  18,  4,   9,   14,  19,  20,  25,  30,  35,  21,  26,  31,  36,
4575       22,  27,  32,  37,  23,  28,  33,  38,  24,  29,  34,  39,  40,  45,
4576       50,  55,  41,  46,  51,  56,  42,  47,  52,  57,  43,  48,  53,  58,
4577       44,  49,  54,  59,  60,  65,  70,  75,  61,  66,  71,  76,  62,  67,
4578       72,  77,  63,  68,  73,  78,  64,  69,  74,  79,  80,  85,  90,  95,
4579       81,  86,  91,  96,  82,  87,  92,  97,  83,  88,  93,  98,  84,  89,
4580       94,  99,  100, 105, 110, 115, 101, 106, 111, 116, 102, 107, 112, 117,
4581       103, 108, 113, 118, 104, 109, 114, 119};
4582     nntrainer::Tensor answer({3, 2, 5, 4, t_type}, answer_data);
4583     t.transpose("0:2:1", m);
4584     EXPECT_EQ(answer, m);
4585   }
4586   {
4587     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4588     nntrainer::Tensor t =
4589       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4590     nntrainer::Tensor m =
4591       ranged(3, 4, 2, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4592     _Float16 answer_data[] = {
4593       0,   1,   2,   3,   4,   20,  21,  22,  23,  24,  5,   6,   7,   8,
4594       9,   25,  26,  27,  28,  29,  10,  11,  12,  13,  14,  30,  31,  32,
4595       33,  34,  15,  16,  17,  18,  19,  35,  36,  37,  38,  39,  40,  41,
4596       42,  43,  44,  60,  61,  62,  63,  64,  45,  46,  47,  48,  49,  65,
4597       66,  67,  68,  69,  50,  51,  52,  53,  54,  70,  71,  72,  73,  74,
4598       55,  56,  57,  58,  59,  75,  76,  77,  78,  79,  80,  81,  82,  83,
4599       84,  100, 101, 102, 103, 104, 85,  86,  87,  88,  89,  105, 106, 107,
4600       108, 109, 90,  91,  92,  93,  94,  110, 111, 112, 113, 114, 95,  96,
4601       97,  98,  99,  115, 116, 117, 118, 119};
4602     nntrainer::Tensor answer({3, 4, 2, 5, t_type}, answer_data);
4603     t.transpose("1:0:2", m);
4604     EXPECT_EQ(answer, m);
4605   }
4606   {
4607     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4608     nntrainer::Tensor t =
4609       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4610     nntrainer::Tensor m =
4611       ranged(3, 4, 5, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4612     _Float16 answer_data[] = {
4613       0,  20,  1,  21,  2,  22,  3,  23,  4,  24,  5,  25,  6,  26,  7,  27,
4614       8,  28,  9,  29,  10, 30,  11, 31,  12, 32,  13, 33,  14, 34,  15, 35,
4615       16, 36,  17, 37,  18, 38,  19, 39,  40, 60,  41, 61,  42, 62,  43, 63,
4616       44, 64,  45, 65,  46, 66,  47, 67,  48, 68,  49, 69,  50, 70,  51, 71,
4617       52, 72,  53, 73,  54, 74,  55, 75,  56, 76,  57, 77,  58, 78,  59, 79,
4618       80, 100, 81, 101, 82, 102, 83, 103, 84, 104, 85, 105, 86, 106, 87, 107,
4619       88, 108, 89, 109, 90, 110, 91, 111, 92, 112, 93, 113, 94, 114, 95, 115,
4620       96, 116, 97, 117, 98, 118, 99, 119};
4621     nntrainer::Tensor answer({3, 4, 5, 2, t_type}, answer_data);
4622     t.transpose("1:2:0", m);
4623     EXPECT_EQ(answer, m);
4624   }
4625   {
4626     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4627     nntrainer::Tensor t =
4628       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4629     nntrainer::Tensor m =
4630       ranged(3, 5, 2, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4631     _Float16 answer_data[] = {
4632       0,  5,  10,  15,  20,  25,  30,  35, 1,  6,   11,  16,  21,  26,  31,
4633       36, 2,  7,   12,  17,  22,  27,  32, 37, 3,   8,   13,  18,  23,  28,
4634       33, 38, 4,   9,   14,  19,  24,  29, 34, 39,  40,  45,  50,  55,  60,
4635       65, 70, 75,  41,  46,  51,  56,  61, 66, 71,  76,  42,  47,  52,  57,
4636       62, 67, 72,  77,  43,  48,  53,  58, 63, 68,  73,  78,  44,  49,  54,
4637       59, 64, 69,  74,  79,  80,  85,  90, 95, 100, 105, 110, 115, 81,  86,
4638       91, 96, 101, 106, 111, 116, 82,  87, 92, 97,  102, 107, 112, 117, 83,
4639       88, 93, 98,  103, 108, 113, 118, 84, 89, 94,  99,  104, 109, 114, 119};
4640     nntrainer::Tensor answer({3, 5, 2, 4, t_type}, answer_data);
4641     t.transpose("2:0:1", m);
4642     EXPECT_EQ(answer, m);
4643   }
4644   {
4645     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
4646     nntrainer::Tensor t =
4647       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4648     nntrainer::Tensor m =
4649       ranged(3, 5, 4, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4650     _Float16 answer_data[] = {
4651       0,  20,  5,  25,  10, 30,  15, 35,  1,  21,  6,  26,  11, 31,  16, 36,
4652       2,  22,  7,  27,  12, 32,  17, 37,  3,  23,  8,  28,  13, 33,  18, 38,
4653       4,  24,  9,  29,  14, 34,  19, 39,  40, 60,  45, 65,  50, 70,  55, 75,
4654       41, 61,  46, 66,  51, 71,  56, 76,  42, 62,  47, 67,  52, 72,  57, 77,
4655       43, 63,  48, 68,  53, 73,  58, 78,  44, 64,  49, 69,  54, 74,  59, 79,
4656       80, 100, 85, 105, 90, 110, 95, 115, 81, 101, 86, 106, 91, 111, 96, 116,
4657       82, 102, 87, 107, 92, 112, 97, 117, 83, 103, 88, 108, 93, 113, 98, 118,
4658       84, 104, 89, 109, 94, 114, 99, 119};
4659     nntrainer::Tensor answer({3, 5, 4, 2, t_type}, answer_data);
4660     t.transpose("2:1:0", m);
4661     EXPECT_EQ(answer, m);
4662   }
4663 }
4664
4665 TEST(nntrainer_Tensor, tranpose_dimension_not_match_n) {
4666   nntrainer::TensorDim::TensorType t_type;
4667   t_type.format = nntrainer::Tformat::NCHW;
4668   t_type.data_type = nntrainer::Tdatatype::FP16;
4669
4670   nntrainer::Tensor a(3, 2, 4, 5, t_type);
4671   nntrainer::Tensor b(3, 1, 2, 3, t_type);
4672
4673   EXPECT_THROW(a.transpose("0:1:2", b), std::invalid_argument);
4674 }
4675
4676 // TEST(nntrainer_Tensor, DISABLED_set_01_p) {
4677 //   nntrainer::TensorDim::TensorType t_type;
4678 //   t_type.format = nntrainer::Tformat::NCHW;
4679 //   t_type.data_type = nntrainer::Tdatatype::FP16;
4680
4681 //   nntrainer::Tensor tensor = nntrainer::Tensor(1, 1, 1, 1, t_type);
4682
4683 //   tensor.setZero();
4684 //   EXPECT_EQ(tensor.getValue<_Float16>(0, 0, 0, 0), 0.0);
4685
4686 //   tensor.setRandUniform(-0.5, 0.0);
4687 //   std::cout << "val : " << (float)tensor.getValue<_Float16>(0, 0, 0, 0)
4688 //             << std::endl;
4689
4690 //   _Float16 val = tensor.getValue<_Float16>(0, 0, 0, 0);
4691 //   EXPECT_TRUE(val >= -0.5 && val < 0);
4692 // }
4693
4694 TEST(nntrainer_Tensor, save_read_01_p) {
4695   int batch = 3;
4696   int channel = 4;
4697   int height = 5;
4698   int width = 6;
4699
4700   nntrainer::TensorDim::TensorType t_type;
4701   t_type.format = nntrainer::Tformat::NCHW;
4702   t_type.data_type = nntrainer::Tdatatype::FP16;
4703
4704   nntrainer::Tensor target(3, 4, 5, 6, t_type);
4705   nntrainer::Tensor readed(3, 4, 5, 6, t_type);
4706
4707   GEN_TEST_INPUT(target, i * (channel * width * height) + j * (height * width) +
4708                            k * (width) + l + 1);
4709
4710   std::ofstream save_file("save.bin", std::ios::out | std::ios::binary);
4711   target.save(save_file);
4712   save_file.close();
4713
4714   std::ifstream read_file("save.bin");
4715   readed.read(read_file);
4716   read_file.close();
4717
4718   EXPECT_EQ(target, readed);
4719
4720   int status = std::remove("save.bin");
4721
4722   ASSERT_EQ(status, 0);
4723 }
4724
4725 TEST(nntrainer_Tensor, save_read_01_n) {
4726   int batch = 3;
4727   int channel = 4;
4728   int height = 5;
4729   int width = 6;
4730
4731   nntrainer::TensorDim::TensorType t_type;
4732   t_type.format = nntrainer::Tformat::NCHW;
4733   t_type.data_type = nntrainer::Tdatatype::FP16;
4734
4735   nntrainer::Tensor target(3, 4, 5, 6, t_type);
4736   nntrainer::Tensor readed(3, 4, 1, 1, t_type);
4737
4738   GEN_TEST_INPUT(target, i * (channel * width * height) + j * (height * width) +
4739                            k * (width) + l + 1);
4740
4741   std::ofstream save_file("save.bin", std::ios::out | std::ios::binary);
4742   target.save(save_file);
4743   save_file.close();
4744
4745   std::ifstream read_file("save.bin");
4746   readed.read(read_file);
4747   read_file.close();
4748
4749   EXPECT_NE(target, readed);
4750
4751   int status = std::remove("save.bin");
4752
4753   ASSERT_EQ(status, 0);
4754 }
4755
4756 TEST(nntrainer_Tensor, copy_and_shares_variable_p) {
4757
4758   nntrainer::TensorDim::TensorType t_type;
4759   t_type.format = nntrainer::Tformat::NCHW;
4760   t_type.data_type = nntrainer::Tdatatype::FP16;
4761
4762   nntrainer::Tensor A = constant(1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW,
4763                                  nntrainer::Tdatatype::FP16);
4764   nntrainer::Tensor B = A.clone();
4765   nntrainer::Tensor C = A;
4766
4767   C.setValue(1, 1, 1, 1, 2.0f);
4768
4769   EXPECT_EQ(A, C);
4770   EXPECT_NE(B, C);
4771
4772   C.reshape(nntrainer::TensorDim(3, 4, 6, 5, t_type));
4773   EXPECT_EQ(A.getDim(), B.getDim());
4774   EXPECT_NE(A.getDim(), C.getDim());
4775 }
4776
4777 TEST(nntrainer_Tensor, reshape_n_01) {
4778   nntrainer::TensorDim::TensorType t_type;
4779   t_type.format = nntrainer::Tformat::NCHW;
4780   t_type.data_type = nntrainer::Tdatatype::FP16;
4781
4782   nntrainer::Tensor A = constant(1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW,
4783                                  nntrainer::Tdatatype::FP16);
4784
4785   EXPECT_THROW(A.reshape(nntrainer::TensorDim(9, 9, 9, 9, t_type)),
4786                std::invalid_argument);
4787 }
4788
4789 TEST(nntrainer_Tensor, reshape_n_02) {
4790   nntrainer::Tensor A = constant(1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW,
4791                                  nntrainer::Tdatatype::FP16);
4792   nntrainer::TensorDim A_dim = A.getDim();
4793
4794   /** Changing the dim of a tensor only affects local copy of the dim */
4795   A_dim.setTensorDim(1, 100);
4796   EXPECT_EQ(A_dim.getTensorDim(1), 100u);
4797
4798   nntrainer::TensorDim A_dim_2 = A.getDim();
4799   EXPECT_EQ(A_dim_2.getTensorDim(1), 4u);
4800 }
4801
4802 TEST(nntrainer_Tensor, copy_and_reshape_n) {
4803   nntrainer::TensorDim::TensorType t_type;
4804   t_type.format = nntrainer::Tformat::NCHW;
4805   t_type.data_type = nntrainer::Tdatatype::FP16;
4806
4807   nntrainer::Tensor A = constant(1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW,
4808                                  nntrainer::Tdatatype::FP16);
4809   nntrainer::Tensor B = A;
4810   nntrainer::Tensor C = A.clone();
4811
4812   EXPECT_THROW(B.reshape(nntrainer::TensorDim(9, 9, 9, 9, t_type)),
4813                std::invalid_argument);
4814 }
4815
4816 /// @note this test case demonstrates it is dangerous to use sharedConstTensor
4817 /// to const correct the inner data.
4818 TEST(nntrainer_Tensor, constructor_from_shared_const_ptr_shares_variable_n) {
4819   nntrainer::TensorDim::TensorType t_type;
4820   t_type.format = nntrainer::Tformat::NCHW;
4821   t_type.data_type = nntrainer::Tdatatype::FP16;
4822
4823   nntrainer::sharedConstTensor A = MAKE_SHARED_TENSOR(constant(
4824     1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
4825
4826   nntrainer::Tensor B = *A;
4827   nntrainer::Tensor C = A->clone();
4828
4829   B.setValue(2, 3, 4, 5, 2.0f);
4830   EXPECT_EQ(*A, B);
4831   EXPECT_NE(*A, C);
4832
4833   C.reshape(nntrainer::TensorDim(3, 4, 6, 5, t_type));
4834   EXPECT_EQ(A->getDim(), B.getDim());
4835   EXPECT_NE(A->getDim(), C.getDim());
4836 }
4837
4838 TEST(nntrainer_Tensor, print_small_size) {
4839   nntrainer::Tensor target = constant(1.0, 3, 1, 2, 3, nntrainer::Tformat::NCHW,
4840                                       nntrainer::Tdatatype::FP16);
4841
4842   std::stringstream ss, expected;
4843   ss << target;
4844
4845   expected << '<' << typeid(target).name() << " at " << &target << ">\n"
4846            << "data addr: " << target.getData<_Float16>() << '\n'
4847            << "Shape: 3:1:2:3 [ FP16 : NCHW ]\n"
4848            << "         1          1          1 \n"
4849            << "         1          1          1 \n"
4850            << "\n"
4851            << "-------\n"
4852            << "         1          1          1 \n"
4853            << "         1          1          1 \n"
4854            << "\n"
4855            << "-------\n"
4856            << "         1          1          1 \n"
4857            << "         1          1          1 \n"
4858            << "\n"
4859            << "-------\n";
4860
4861   EXPECT_EQ(ss.str(), expected.str());
4862 }
4863
4864 TEST(nntrainer_Tensor, print_large_size) {
4865   nntrainer::Tensor target = constant(
4866     1.2, 3, 10, 10, 10, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4867
4868   std::stringstream ss, expected;
4869
4870   expected << '<' << typeid(target).name() << " at " << &target << ">\n"
4871            << "data addr: " << target.getData<_Float16>() << '\n'
4872            << "Shape: 3:10:10:10 [ FP16 : NCHW ]\n"
4873            << "[1.2002 1.2002 1.2002 ... 1.2002 1.2002 1.2002]\n";
4874   ss << target;
4875
4876   EXPECT_EQ(ss.str(), expected.str());
4877 }
4878
4879 // TEST(nntrainer_Tensor, DISABLED_equation_test_01_p) {
4880 //   nntrainer::Tensor a, b, c;
4881 //   nntrainer::Tensor ret1, ret2;
4882
4883 //   a = randUniform(4, 6, 7, 3, -100, 100);
4884 //   b = randUniform(4, 6, 7, 3, -100, 100);
4885 //   c = randUniform(4, 6, 7, 3, -100, 100);
4886
4887 //   ret1 = a.subtract(b).multiply(c);
4888 //   ret2 = a.multiply(c).subtract(b.multiply(c));
4889
4890 //   _Float16 *data1 = ret1.getData<_Float16>();
4891 //   _Float16 *data2 = ret2.getData<_Float16>();
4892 //   EXPECT_EQ(ret1, ret2);
4893
4894 //   for (unsigned int i = 0; i < ret1.size(); ++i) {
4895 //     EXPECT_FLOAT_EQ(data1[i], data2[i]);
4896 //   }
4897 // }
4898
4899 TEST(nntrainer_Tensor, fill_p) {
4900   /// same dimension, buffer size
4901   nntrainer::TensorDim::TensorType t_type;
4902   t_type.format = nntrainer::Tformat::NCHW;
4903   t_type.data_type = nntrainer::Tdatatype::FP16;
4904   {
4905     nntrainer::Tensor target(3, 2, 4, 5, t_type);
4906     // nntrainer::Tensor original = randUniform(3, 2, 4, 5, -1.0f, 1.0f);
4907     nntrainer::Tensor original =
4908       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4909     target.fill(original, false);
4910
4911     EXPECT_EQ(target, original);
4912   }
4913
4914   /// same dimension, buffer size is different (not tested)
4915   {
4916     /// there is no way to make non contiguous tensor publicily yet
4917     EXPECT_TRUE(true);
4918   }
4919
4920   /// uninitialized with initialized flag is true
4921   {
4922     nntrainer::Tensor target;
4923     // nntrainer::Tensor original = randUniform(3, 2, 4, 5, -1.0f, 1.0f);
4924     nntrainer::Tensor original =
4925       ranged(3, 5, 4, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4926     target.fill(original, true);
4927
4928     EXPECT_EQ(target, original);
4929   }
4930 }
4931
4932 TEST(nntrainer_Tensor, fill_uninitialized_n) {
4933   nntrainer::Tensor target;
4934   // nntrainer::Tensor original = randUniform(3, 1, 2, 3, -1.0f, 1.0f);
4935   nntrainer::Tensor original =
4936     ranged(3, 5, 4, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4937   EXPECT_THROW(target.fill(original, false), std::invalid_argument);
4938 }
4939
4940 TEST(nntrainer_Tensor, fill_different_dimension_n) {
4941   nntrainer::TensorDim::TensorType t_type;
4942   t_type.format = nntrainer::Tformat::NCHW;
4943   t_type.data_type = nntrainer::Tdatatype::FP16;
4944
4945   nntrainer::Tensor target(3, 1, 3, 2, t_type);
4946   // nntrainer::Tensor original = randUniform(3, 1, 2, 3, -1.0f, 1.0f);
4947   nntrainer::Tensor original =
4948     ranged(3, 1, 2, 3, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
4949   EXPECT_THROW(target.fill(original, false), std::invalid_argument);
4950 }
4951
4952 // TEST(nntrainer_Tensor, DISABLED_fill_non_contiguous_n) {
4953 //   /// there is no way to make non contiguous tensor publicily yet
4954 //   EXPECT_TRUE(false);
4955 // }
4956
4957 // TEST(nntrainer_Tensor, DISABLED_fill_different_buffer_size_n) {
4958 //   /// there is no way to make same dimension, diffrent buffersized tensor
4959 //   /// publicily yet
4960 //   EXPECT_TRUE(false);
4961 // }
4962
4963 TEST(nntrainer_Tensor, empty_01) {
4964   nntrainer::Tensor t;
4965
4966   EXPECT_TRUE(t.empty());
4967 }
4968
4969 TEST(nntrainer_Tensor, empty_02) {
4970   nntrainer::TensorDim::TensorType t_type;
4971   t_type.format = nntrainer::Tformat::NCHW;
4972   t_type.data_type = nntrainer::Tdatatype::FP16;
4973
4974   nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
4975
4976   EXPECT_FALSE(t.empty());
4977 }
4978
4979 TEST(nntrainer_Tensor, empty_03) {
4980   nntrainer::TensorDim::TensorType t_type;
4981   t_type.format = nntrainer::Tformat::NCHW;
4982   t_type.data_type = nntrainer::Tdatatype::FP16;
4983
4984   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
4985
4986   EXPECT_FALSE(t.empty());
4987 }
4988
4989 TEST(nntrainer_Tensor, allocate_01_n) {
4990   nntrainer::Tensor t;
4991   EXPECT_FALSE(t.isAllocated());
4992
4993   t.allocate();
4994   EXPECT_FALSE(t.isAllocated());
4995 }
4996
4997 TEST(nntrainer_Tensor, allocate_02_p) {
4998   nntrainer::TensorDim::TensorType t_type;
4999   t_type.format = nntrainer::Tformat::NCHW;
5000   t_type.data_type = nntrainer::Tdatatype::FP16;
5001
5002   nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5003   EXPECT_FALSE(t.isAllocated());
5004
5005   t.allocate();
5006   EXPECT_TRUE(t.isAllocated());
5007 }
5008
5009 TEST(nntrainer_Tensor, allocate_03_p) {
5010   nntrainer::TensorDim::TensorType t_type;
5011   t_type.format = nntrainer::Tformat::NCHW;
5012   t_type.data_type = nntrainer::Tdatatype::FP16;
5013
5014   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
5015   EXPECT_TRUE(t.isAllocated());
5016
5017   t.allocate();
5018   EXPECT_TRUE(t.isAllocated());
5019 }
5020
5021 TEST(nntrainer_Tensor, initialize_01_p) {
5022   nntrainer::TensorDim::TensorType t_type;
5023   t_type.format = nntrainer::Tformat::NCHW;
5024   t_type.data_type = nntrainer::Tdatatype::FP16;
5025
5026   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5027                       nntrainer::Tensor::Initializer::ONES);
5028
5029   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5030   golden.setValue(1);
5031
5032   EXPECT_EQ(golden, t);
5033 }
5034
5035 TEST(nntrainer_Tensor, initialize_02_p) {
5036   nntrainer::TensorDim::TensorType t_type;
5037   t_type.format = nntrainer::Tformat::NCHW;
5038   t_type.data_type = nntrainer::Tdatatype::FP16;
5039
5040   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
5041
5042   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5043   golden.setValue(1);
5044
5045   EXPECT_NE(golden, t);
5046
5047   t.initialize(nntrainer::Tensor::Initializer::ONES);
5048   EXPECT_EQ(golden, t);
5049 }
5050
5051 TEST(nntrainer_Tensor, initialize_03_p) {
5052   nntrainer::TensorDim::TensorType t_type;
5053   t_type.format = nntrainer::Tformat::NCHW;
5054   t_type.data_type = nntrainer::Tdatatype::FP16;
5055
5056   nntrainer::Tensor t({1, 2, 3, 4, t_type}, false,
5057                       nntrainer::Tensor::Initializer::ONES);
5058   t.allocate();
5059
5060   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5061   golden.setValue(1);
5062
5063   EXPECT_EQ(golden, t);
5064 }
5065
5066 TEST(nntrainer_Tensor, initialize_04_p) {
5067   nntrainer::TensorDim::TensorType t_type;
5068   t_type.format = nntrainer::Tformat::NCHW;
5069   t_type.data_type = nntrainer::Tdatatype::FP16;
5070
5071   nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5072   t.initialize(nntrainer::Tensor::Initializer::ONES);
5073   t.allocate();
5074
5075   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5076   golden.setValue(1);
5077
5078   EXPECT_EQ(golden, t);
5079 }
5080
5081 TEST(nntrainer_Tensor, initialize_05_p) {
5082   nntrainer::TensorDim::TensorType t_type;
5083   t_type.format = nntrainer::Tformat::NCHW;
5084   t_type.data_type = nntrainer::Tdatatype::FP16;
5085
5086   nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5087   t.allocate();
5088
5089   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5090   golden.setValue(1.f);
5091
5092   /**
5093    * Ideally, it should be NE, but it can be equal due to no initialization
5094    * EXPECT_NE(golden, t);
5095    */
5096
5097   t.initialize(nntrainer::Tensor::Initializer::ONES);
5098   EXPECT_EQ(golden, t);
5099 }
5100
5101 TEST(nntrainer_Tensor, initialize_06_n) {
5102   nntrainer::TensorDim::TensorType t_type;
5103   t_type.format = nntrainer::Tformat::NCHW;
5104   t_type.data_type = nntrainer::Tdatatype::FP16;
5105
5106   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5107                       nntrainer::Tensor::Initializer::ONES);
5108   nntrainer::Tensor golden({1, 2, 3, 4, t_type}, true,
5109                            nntrainer::Tensor::Initializer::ZEROS);
5110
5111   EXPECT_NE(golden, t);
5112
5113   golden.initialize(nntrainer::Tensor::Initializer::ONES);
5114   EXPECT_EQ(golden, t);
5115 }
5116
5117 TEST(nntrainer_Tensor, initialize_07_p) {
5118   nntrainer::TensorDim::TensorType t_type;
5119   t_type.format = nntrainer::Tformat::NCHW;
5120   t_type.data_type = nntrainer::Tdatatype::FP16;
5121
5122   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5123                       nntrainer::Tensor::Initializer::ONES);
5124
5125   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5126   golden.setValue(1);
5127
5128   EXPECT_EQ(golden, t);
5129
5130   t.setValue(0, 0, 0, 0, 0);
5131   t.setValue(0, 0, 0, t.size() - 1, 0);
5132   EXPECT_NE(golden, t);
5133
5134   t.initialize();
5135   EXPECT_EQ(golden, t);
5136 }
5137
5138 TEST(nntrainer_Tensor, initialize_08_p) {
5139   nntrainer::TensorDim::TensorType t_type;
5140   t_type.format = nntrainer::Tformat::NCHW;
5141   t_type.data_type = nntrainer::Tdatatype::FP16;
5142
5143   nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5144                       nntrainer::Tensor::Initializer::ONES);
5145
5146   nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5147   golden.setValue(1.f);
5148   EXPECT_EQ(golden, t);
5149
5150   /// @todo this test case is not valid anymore, since
5151   /// std::uniform_real_distribution does not support _Float16
5152   // t.initialize(nntrainer::Tensor::Initializer::HE_NORMAL);
5153   // EXPECT_NE(golden, t);
5154   // t.initialize();
5155   // EXPECT_NE(golden, t);
5156
5157   t.initialize(nntrainer::Tensor::Initializer::ONES);
5158   EXPECT_EQ(golden, t);
5159
5160   t.initialize();
5161   EXPECT_EQ(golden, t);
5162 }
5163
5164 TEST(nntrainer_Tensor, split_01_p) {
5165   nntrainer::TensorDim::TensorType t_type;
5166   t_type.format = nntrainer::Tformat::NCHW;
5167   t_type.data_type = nntrainer::Tdatatype::FP16;
5168   {
5169     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5170     nntrainer::Tensor t =
5171       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5172     std::vector<nntrainer::Tensor> answer;
5173     answer.reserve(3);
5174     {
5175       _Float16 answer_data[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
5176                                 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
5177                                 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
5178                                 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
5179       answer.emplace_back(ml::train::TensorDim{1, 2, 4, 5, t_type},
5180                           answer_data);
5181     }
5182     {
5183       _Float16 answer_data[] = {40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
5184                                 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
5185                                 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
5186                                 70, 71, 72, 73, 74, 75, 76, 77, 78, 79};
5187       answer.emplace_back(ml::train::TensorDim{1, 2, 4, 5, t_type},
5188                           answer_data);
5189     }
5190     {
5191       _Float16 answer_data[] = {
5192         80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,
5193         94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
5194         108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5195       answer.emplace_back(ml::train::TensorDim{1, 2, 4, 5, t_type},
5196                           answer_data);
5197     }
5198     EXPECT_EQ(t.split(3, 0), answer);
5199   }
5200   {
5201     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5202     nntrainer::Tensor t =
5203       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5204     std::vector<nntrainer::Tensor> answer;
5205     answer.reserve(2);
5206     {
5207       _Float16 answer_data[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
5208                                 12, 13, 14, 15, 16, 17, 18, 19, 40, 41, 42, 43,
5209                                 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
5210                                 56, 57, 58, 59, 80, 81, 82, 83, 84, 85, 86, 87,
5211                                 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99};
5212       answer.emplace_back(ml::train::TensorDim{3, 1, 4, 5, t_type},
5213                           answer_data);
5214     }
5215     {
5216       _Float16 answer_data[] = {
5217         20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
5218         32,  33,  34,  35,  36,  37,  38,  39,  60,  61,  62,  63,
5219         64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,
5220         76,  77,  78,  79,  100, 101, 102, 103, 104, 105, 106, 107,
5221         108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5222       answer.emplace_back(ml::train::TensorDim{3, 1, 4, 5, t_type},
5223                           answer_data);
5224     }
5225     EXPECT_EQ(t.split(2, 1), answer);
5226   }
5227   {
5228     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5229     nntrainer::Tensor t =
5230       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5231     std::vector<nntrainer::Tensor> answer;
5232     answer.reserve(2);
5233     {
5234       _Float16 answer_data[] = {
5235         0,  1,  2,  3,  4,  5,   6,   7,   8,   9,   20,  21,  22,  23,  24,
5236         25, 26, 27, 28, 29, 40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
5237         60, 61, 62, 63, 64, 65,  66,  67,  68,  69,  80,  81,  82,  83,  84,
5238         85, 86, 87, 88, 89, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109};
5239       answer.emplace_back(ml::train::TensorDim{3, 2, 2, 5, t_type},
5240                           answer_data);
5241     }
5242     {
5243       _Float16 answer_data[] = {
5244         10, 11, 12, 13, 14, 15,  16,  17,  18,  19,  30,  31,  32,  33,  34,
5245         35, 36, 37, 38, 39, 50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
5246         70, 71, 72, 73, 74, 75,  76,  77,  78,  79,  90,  91,  92,  93,  94,
5247         95, 96, 97, 98, 99, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5248       answer.emplace_back(ml::train::TensorDim{3, 2, 2, 5, t_type},
5249                           answer_data);
5250     }
5251     EXPECT_EQ(t.split(2, 2), answer);
5252   }
5253   {
5254     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5255     nntrainer::Tensor t =
5256       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5257     std::vector<nntrainer::Tensor> answer;
5258     answer.reserve(5);
5259     {
5260       _Float16 answer_data[] = {0,  5,  10, 15, 20,  25,  30,  35,
5261                                 40, 45, 50, 55, 60,  65,  70,  75,
5262                                 80, 85, 90, 95, 100, 105, 110, 115};
5263       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5264                           answer_data);
5265     }
5266     {
5267       _Float16 answer_data[] = {1,  6,  11, 16, 21,  26,  31,  36,
5268                                 41, 46, 51, 56, 61,  66,  71,  76,
5269                                 81, 86, 91, 96, 101, 106, 111, 116};
5270       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5271                           answer_data);
5272     }
5273     {
5274       _Float16 answer_data[] = {2,  7,  12, 17, 22,  27,  32,  37,
5275                                 42, 47, 52, 57, 62,  67,  72,  77,
5276                                 82, 87, 92, 97, 102, 107, 112, 117};
5277       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5278                           answer_data);
5279     }
5280     {
5281       _Float16 answer_data[] = {3,  8,  13, 18, 23,  28,  33,  38,
5282                                 43, 48, 53, 58, 63,  68,  73,  78,
5283                                 83, 88, 93, 98, 103, 108, 113, 118};
5284       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5285                           answer_data);
5286     }
5287     {
5288       _Float16 answer_data[] = {4,  9,  14, 19, 24,  29,  34,  39,
5289                                 44, 49, 54, 59, 64,  69,  74,  79,
5290                                 84, 89, 94, 99, 104, 109, 114, 119};
5291       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5292                           answer_data);
5293     }
5294     EXPECT_EQ(t.split(5, 3), answer);
5295   }
5296   {
5297     nntrainer::TensorDim ref_dim(1, 1, 4, 6, t_type);
5298     nntrainer::Tensor t =
5299       ranged(1, 1, 4, 6, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5300     std::vector<nntrainer::Tensor> answer;
5301     answer.reserve(2);
5302     {
5303       _Float16 answer_data[] = {0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20};
5304       answer.emplace_back(ml::train::TensorDim{1, 1, 4, 3, t_type},
5305                           answer_data);
5306     }
5307     {
5308       _Float16 answer_data[] = {3, 4, 5, 9, 10, 11, 15, 16, 17, 21, 22, 23};
5309       answer.emplace_back(ml::train::TensorDim{1, 1, 4, 3, t_type},
5310                           answer_data);
5311     }
5312     EXPECT_EQ(t.split(2, 3), answer);
5313   }
5314 }
5315
5316 TEST(nntrainer_Tensor, split_02_n) {
5317   nntrainer::TensorDim::TensorType t_type;
5318   t_type.format = nntrainer::Tformat::NCHW;
5319   t_type.data_type = nntrainer::Tdatatype::FP16;
5320
5321   nntrainer::Tensor t(1, 1, 1, 1, t_type);
5322   EXPECT_THROW(t.split(0, 0), std::invalid_argument);
5323 }
5324
5325 TEST(nntrainer_Tensor, split_03_n) {
5326   nntrainer::TensorDim::TensorType t_type;
5327   t_type.format = nntrainer::Tformat::NCHW;
5328   t_type.data_type = nntrainer::Tdatatype::FP16;
5329
5330   nntrainer::Tensor t(3, 1, 1, 1, t_type);
5331   EXPECT_THROW(t.split(2, 0), std::invalid_argument);
5332 }
5333
5334 TEST(nntrainer_Tensor, split_04_p) {
5335   nntrainer::TensorDim::TensorType t_type;
5336   t_type.format = nntrainer::Tformat::NCHW;
5337   t_type.data_type = nntrainer::Tdatatype::FP16;
5338   {
5339     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5340     nntrainer::Tensor t =
5341       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5342     std::vector<nntrainer::Tensor> answer;
5343     answer.reserve(2);
5344     {
5345       _Float16 answer_data[] = {
5346         0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
5347         16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
5348         32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
5349         48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
5350         64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79};
5351       answer.emplace_back(ml::train::TensorDim{2, 2, 4, 5, t_type},
5352                           answer_data);
5353     }
5354     {
5355       _Float16 answer_data[] = {
5356         80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,
5357         94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104, 105, 106, 107,
5358         108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5359       answer.emplace_back(ml::train::TensorDim{1, 2, 4, 5, t_type},
5360                           answer_data);
5361     }
5362     EXPECT_EQ(t.split({2, 1}, 0), answer);
5363   }
5364   {
5365     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5366     nntrainer::Tensor t =
5367       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5368     std::vector<nntrainer::Tensor> answer;
5369     answer.reserve(2);
5370     {
5371       _Float16 answer_data[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11,
5372                                 12, 13, 14, 15, 16, 17, 18, 19, 40, 41, 42, 43,
5373                                 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
5374                                 56, 57, 58, 59, 80, 81, 82, 83, 84, 85, 86, 87,
5375                                 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99};
5376       answer.emplace_back(ml::train::TensorDim{3, 1, 4, 5, t_type},
5377                           answer_data);
5378     }
5379     {
5380       _Float16 answer_data[] = {
5381         20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,
5382         32,  33,  34,  35,  36,  37,  38,  39,  60,  61,  62,  63,
5383         64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,
5384         76,  77,  78,  79,  100, 101, 102, 103, 104, 105, 106, 107,
5385         108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5386       answer.emplace_back(ml::train::TensorDim{3, 1, 4, 5, t_type},
5387                           answer_data);
5388     }
5389     EXPECT_EQ(t.split({1, 1}, 1), answer);
5390   }
5391   {
5392     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5393     nntrainer::Tensor t =
5394       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5395     std::vector<nntrainer::Tensor> answer;
5396     answer.reserve(2);
5397     {
5398       _Float16 answer_data[] = {
5399         0,  1,  2,  3,  4,  5,   6,   7,   8,   9,   20,  21,  22,  23,  24,
5400         25, 26, 27, 28, 29, 40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
5401         60, 61, 62, 63, 64, 65,  66,  67,  68,  69,  80,  81,  82,  83,  84,
5402         85, 86, 87, 88, 89, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109};
5403       answer.emplace_back(ml::train::TensorDim{3, 2, 2, 5, t_type},
5404                           answer_data);
5405     }
5406     {
5407       _Float16 answer_data[] = {
5408         10, 11, 12, 13, 14, 15,  16,  17,  18,  19,  30,  31,  32,  33,  34,
5409         35, 36, 37, 38, 39, 50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
5410         70, 71, 72, 73, 74, 75,  76,  77,  78,  79,  90,  91,  92,  93,  94,
5411         95, 96, 97, 98, 99, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
5412       answer.emplace_back(ml::train::TensorDim{3, 2, 2, 5, t_type},
5413                           answer_data);
5414     }
5415     EXPECT_EQ(t.split({2, 2}, 2), answer);
5416   }
5417   {
5418     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5419     nntrainer::Tensor t =
5420       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5421     std::vector<nntrainer::Tensor> answer;
5422     answer.reserve(3);
5423     {
5424       _Float16 answer_data[] = {0,  5,  10, 15, 20,  25,  30,  35,
5425                                 40, 45, 50, 55, 60,  65,  70,  75,
5426                                 80, 85, 90, 95, 100, 105, 110, 115};
5427       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5428                           answer_data);
5429     }
5430     {
5431       _Float16 answer_data[] = {
5432         1,   2,   3,   6,   7,   8,   11,  12,  13,  16,  17,  18, 21, 22, 23,
5433         26,  27,  28,  31,  32,  33,  36,  37,  38,  41,  42,  43, 46, 47, 48,
5434         51,  52,  53,  56,  57,  58,  61,  62,  63,  66,  67,  68, 71, 72, 73,
5435         76,  77,  78,  81,  82,  83,  86,  87,  88,  91,  92,  93, 96, 97, 98,
5436         101, 102, 103, 106, 107, 108, 111, 112, 113, 116, 117, 118};
5437       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 3, t_type},
5438                           answer_data);
5439     }
5440     {
5441       _Float16 answer_data[] = {4,  9,  14, 19, 24,  29,  34,  39,
5442                                 44, 49, 54, 59, 64,  69,  74,  79,
5443                                 84, 89, 94, 99, 104, 109, 114, 119};
5444       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5445                           answer_data);
5446     }
5447     EXPECT_EQ(t.split({1, 3, 1}, 3), answer);
5448   }
5449   {
5450     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5451     nntrainer::Tensor t =
5452       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5453     std::vector<nntrainer::Tensor> answer;
5454     answer.reserve(3);
5455     {
5456       _Float16 answer_data[] = {
5457         0,  1,  5,  6,  10, 11, 15, 16, 20,  21,  25,  26,  30,  31,  35,  36,
5458         40, 41, 45, 46, 50, 51, 55, 56, 60,  61,  65,  66,  70,  71,  75,  76,
5459         80, 81, 85, 86, 90, 91, 95, 96, 100, 101, 105, 106, 110, 111, 115, 116};
5460       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 2, t_type},
5461                           answer_data);
5462     }
5463     {
5464       _Float16 answer_data[] = {
5465         2,  3,  7,  8,  12, 13, 17, 18, 22,  23,  27,  28,  32,  33,  37,  38,
5466         42, 43, 47, 48, 52, 53, 57, 58, 62,  63,  67,  68,  72,  73,  77,  78,
5467         82, 83, 87, 88, 92, 93, 97, 98, 102, 103, 107, 108, 112, 113, 117, 118};
5468       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 2, t_type},
5469                           answer_data);
5470     }
5471     {
5472       _Float16 answer_data[] = {4,  9,  14, 19, 24,  29,  34,  39,
5473                                 44, 49, 54, 59, 64,  69,  74,  79,
5474                                 84, 89, 94, 99, 104, 109, 114, 119};
5475       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 1, t_type},
5476                           answer_data);
5477     }
5478     EXPECT_EQ(t.split({2, 2, 1}, 3), answer);
5479   }
5480   {
5481     nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
5482     nntrainer::Tensor t =
5483       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5484     std::vector<nntrainer::Tensor> answer;
5485     answer.reserve(2);
5486     {
5487       _Float16 answer_data[] = {
5488         0,  1,  5,  6,  10, 11, 15, 16, 20,  21,  25,  26,  30,  31,  35,  36,
5489         40, 41, 45, 46, 50, 51, 55, 56, 60,  61,  65,  66,  70,  71,  75,  76,
5490         80, 81, 85, 86, 90, 91, 95, 96, 100, 101, 105, 106, 110, 111, 115, 116};
5491       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 2, t_type},
5492                           answer_data);
5493     }
5494     {
5495       _Float16 answer_data[] = {
5496         2,   3,   4,   7,   8,   9,   12,  13,  14,  17,  18,  19, 22, 23, 24,
5497         27,  28,  29,  32,  33,  34,  37,  38,  39,  42,  43,  44, 47, 48, 49,
5498         52,  53,  54,  57,  58,  59,  62,  63,  64,  67,  68,  69, 72, 73, 74,
5499         77,  78,  79,  82,  83,  84,  87,  88,  89,  92,  93,  94, 97, 98, 99,
5500         102, 103, 104, 107, 108, 109, 112, 113, 114, 117, 118, 119};
5501       answer.emplace_back(ml::train::TensorDim{3, 2, 4, 3, t_type},
5502                           answer_data);
5503     }
5504     EXPECT_EQ(t.split({2, 3}, 3), answer);
5505   }
5506   {
5507     nntrainer::TensorDim ref_dim(1, 1, 4, 6, t_type);
5508     nntrainer::Tensor t =
5509       ranged(1, 1, 4, 6, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5510     std::vector<nntrainer::Tensor> answer;
5511     answer.reserve(3);
5512     {
5513       _Float16 answer_data[] = {0, 6, 12, 18};
5514       answer.emplace_back(ml::train::TensorDim{1, 1, 4, 1, t_type},
5515                           answer_data);
5516     }
5517     {
5518       _Float16 answer_data[] = {1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21};
5519       answer.emplace_back(ml::train::TensorDim{1, 1, 4, 3, t_type},
5520                           answer_data);
5521     }
5522     {
5523       _Float16 answer_data[] = {4, 5, 10, 11, 16, 17, 22, 23};
5524       answer.emplace_back(ml::train::TensorDim{1, 1, 4, 2, t_type},
5525                           answer_data);
5526     }
5527     EXPECT_EQ(t.split({1, 3, 2}, 3), answer);
5528   }
5529 }
5530
5531 TEST(nntrainer_Tensor, split_05_n) {
5532   nntrainer::TensorDim::TensorType t_type;
5533   t_type.format = nntrainer::Tformat::NCHW;
5534   t_type.data_type = nntrainer::Tdatatype::FP16;
5535
5536   nntrainer::Tensor t(3, 1, 1, 1, t_type);
5537   EXPECT_THROW(t.split({1, 1}, 0), std::invalid_argument);
5538 }
5539
5540 TEST(nntrainer_Tensor, split_06_n) {
5541   nntrainer::TensorDim::TensorType t_type;
5542   t_type.format = nntrainer::Tformat::NCHW;
5543   t_type.data_type = nntrainer::Tdatatype::FP16;
5544
5545   nntrainer::Tensor t(3, 1, 1, 1, t_type);
5546   EXPECT_THROW(t.split({2, 0, 1}, 0), std::invalid_argument);
5547 }
5548
5549 TEST(nntrainer_Tensor, split_07_n) {
5550   nntrainer::TensorDim::TensorType t_type;
5551   t_type.format = nntrainer::Tformat::NCHW;
5552   t_type.data_type = nntrainer::Tdatatype::FP16;
5553
5554   nntrainer::Tensor t(3, 1, 1, 1, t_type);
5555   EXPECT_THROW(t.split({}, 0), std::invalid_argument);
5556 }
5557
5558 TEST(nntrainer_Tensor, cat_01_p) {
5559   nntrainer::TensorDim::TensorType t_type;
5560   t_type.format = nntrainer::Tformat::NCHW;
5561   t_type.data_type = nntrainer::Tdatatype::FP16;
5562   {
5563     std::vector<nntrainer::Tensor> inputs;
5564     inputs.reserve(2);
5565     inputs.emplace_back(
5566       ranged(2, 1, 1, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5567     inputs.emplace_back(
5568       ranged(2, 2, 1, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5569     _Float16 answer_data[] = {0, 1, 0, 1, 2, 3, 2, 3, 4, 5, 6, 7};
5570     nntrainer::Tensor answer(ml::train::TensorDim{2, 3, 1, 2, t_type},
5571                              answer_data);
5572     EXPECT_EQ(nntrainer::Tensor::cat(inputs, 1), answer);
5573   }
5574   {
5575     std::vector<nntrainer::Tensor> inputs;
5576     inputs.reserve(2);
5577     inputs.emplace_back(
5578       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5579     inputs.emplace_back(
5580       ranged(2, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5581     _Float16 answer_data[] = {
5582       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
5583       15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
5584       30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
5585       45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
5586       60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
5587       75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
5588       90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
5589       105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
5590       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
5591       15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
5592       30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
5593       45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
5594       60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
5595       75,  76,  77,  78,  79};
5596     nntrainer::Tensor answer(ml::train::TensorDim{5, 2, 4, 5, t_type},
5597                              answer_data);
5598     EXPECT_EQ(nntrainer::Tensor::cat(inputs, 0), answer);
5599   }
5600   {
5601     std::vector<nntrainer::Tensor> inputs;
5602     inputs.reserve(2);
5603     inputs.emplace_back(
5604       ranged(3, 3, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5605     inputs.emplace_back(
5606       ranged(3, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5607     _Float16 answer_data[] = {
5608       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,
5609       14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,
5610       28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,
5611       42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,
5612       56,  57,  58,  59,  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
5613       10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,
5614       24,  25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
5615       38,  39,  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,
5616       72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,
5617       86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
5618       100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
5619       114, 115, 116, 117, 118, 119, 40,  41,  42,  43,  44,  45,  46,  47,
5620       48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,
5621       62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,
5622       76,  77,  78,  79,  120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
5623       130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
5624       144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
5625       158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171,
5626       172, 173, 174, 175, 176, 177, 178, 179, 80,  81,  82,  83,  84,  85,
5627       86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
5628       100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
5629       114, 115, 116, 117, 118, 119};
5630     nntrainer::Tensor answer(ml::train::TensorDim{3, 5, 4, 5, t_type},
5631                              answer_data);
5632     EXPECT_EQ(nntrainer::Tensor::cat(inputs, 1), answer);
5633   }
5634   {
5635     std::vector<nntrainer::Tensor> inputs;
5636     inputs.reserve(2);
5637     inputs.emplace_back(
5638       ranged(3, 2, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5639     inputs.emplace_back(
5640       ranged(3, 2, 2, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5641     _Float16 answer_data[] = {
5642       0,  1,  2,  3,  4,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  5,  6,  7,
5643       8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 20,
5644       21, 22, 23, 24, 25, 26, 27, 28, 29, 15, 16, 17, 18, 19, 30, 31, 32, 33,
5645       34, 35, 36, 37, 38, 39, 20, 21, 22, 23, 24, 40, 41, 42, 43, 44, 45, 46,
5646       47, 48, 49, 25, 26, 27, 28, 29, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59};
5647     nntrainer::Tensor answer(ml::train::TensorDim{3, 2, 3, 5, t_type},
5648                              answer_data);
5649     EXPECT_EQ(nntrainer::Tensor::cat(inputs, 2), answer);
5650   }
5651   {
5652     std::vector<nntrainer::Tensor> inputs;
5653     inputs.reserve(3);
5654     inputs.emplace_back(
5655       ranged(3, 2, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5656     inputs.emplace_back(
5657       ranged(3, 2, 4, 3, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5658     inputs.emplace_back(
5659       ranged(3, 2, 4, 2, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
5660     _Float16 answer_data[] = {
5661       0,  0,  1,  2,  0,  1,  1,  3,  4,  5,  2,  3,  2,  6,  7,  8,  4,  5,
5662       3,  9,  10, 11, 6,  7,  4,  12, 13, 14, 8,  9,  5,  15, 16, 17, 10, 11,
5663       6,  18, 19, 20, 12, 13, 7,  21, 22, 23, 14, 15, 8,  24, 25, 26, 16, 17,
5664       9,  27, 28, 29, 18, 19, 10, 30, 31, 32, 20, 21, 11, 33, 34, 35, 22, 23,
5665       12, 36, 37, 38, 24, 25, 13, 39, 40, 41, 26, 27, 14, 42, 43, 44, 28, 29,
5666       15, 45, 46, 47, 30, 31, 16, 48, 49, 50, 32, 33, 17, 51, 52, 53, 34, 35,
5667       18, 54, 55, 56, 36, 37, 19, 57, 58, 59, 38, 39, 20, 60, 61, 62, 40, 41,
5668       21, 63, 64, 65, 42, 43, 22, 66, 67, 68, 44, 45, 23, 69, 70, 71, 46, 47};
5669     nntrainer::Tensor answer(ml::train::TensorDim{3, 2, 4, 6, t_type},
5670                              answer_data);
5671     EXPECT_EQ(nntrainer::Tensor::cat(inputs, 3), answer);
5672   }
5673 }
5674
5675 TEST(nntrainer_Tensor, cat_02_n) {
5676   nntrainer::TensorDim::TensorType t_type;
5677   t_type.format = nntrainer::Tformat::NCHW;
5678   t_type.data_type = nntrainer::Tdatatype::FP16;
5679
5680   {
5681     std::vector<nntrainer::Tensor> inputs;
5682     inputs.reserve(2);
5683     inputs.emplace_back(nntrainer::Tensor(2, 1, 1, 2, t_type));
5684     inputs.emplace_back(nntrainer::Tensor(2, 2, 1, 2, t_type));
5685     EXPECT_THROW(nntrainer::Tensor::cat(inputs, 2), std::invalid_argument);
5686   }
5687 }
5688
5689 TEST(nntrainer_Tensor, zoneout_mask_01_n) {
5690   nntrainer::TensorDim::TensorType t_type;
5691   t_type.format = nntrainer::Tformat::NCHW;
5692   t_type.data_type = nntrainer::Tdatatype::FP16;
5693
5694   const float zoneout_rate = 0.3f;
5695   nntrainer::Tensor t(10, 10, 10, 10, t_type);
5696   nntrainer::Tensor opposite(20, 20, 20, 20, t_type);
5697   EXPECT_THROW(t.zoneout_mask(opposite, zoneout_rate), std::invalid_argument);
5698 }
5699
5700 TEST(nntrainer_Tensor, zoneout_mask_02_p) {
5701   nntrainer::TensorDim::TensorType t_type;
5702   t_type.format = nntrainer::Tformat::NCHW;
5703   t_type.data_type = nntrainer::Tdatatype::FP16;
5704
5705   const float zoneout_rate = 0.3f;
5706   nntrainer::Tensor t(10, 10, 10, 10, t_type);
5707   nntrainer::Tensor opposite = t.zoneout_mask(zoneout_rate);
5708   constexpr float epsilon = 1e-3;
5709
5710   EXPECT_EQ(t.size(), opposite.size());
5711
5712   auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5713     return val2 - epsilon < val1 && val1 < val2 + epsilon;
5714   };
5715
5716   for (unsigned int i = 0; i < opposite.size(); ++i) {
5717     if (is_near(opposite.getValue<_Float16>(i), static_cast<_Float16>(0.0f))) {
5718       EXPECT_NEAR(t.getValue<_Float16>(i), 1.0f, epsilon);
5719     } else if (is_near(opposite.getValue<_Float16>(i),
5720                        static_cast<_Float16>(1.0f))) {
5721       EXPECT_NEAR(t.getValue<_Float16>(i), 0.0f, epsilon);
5722     } else {
5723       FAIL() << "This should not be happen";
5724     }
5725   }
5726 }
5727
5728 TEST(nntrainer_Tensor, zoneout_mask_03_p) {
5729   nntrainer::TensorDim::TensorType t_type;
5730   t_type.format = nntrainer::Tformat::NCHW;
5731   t_type.data_type = nntrainer::Tdatatype::FP16;
5732
5733   const float zoneout_rate = 0.3f;
5734   nntrainer::Tensor t(10, 10, 100, 100, t_type);
5735   nntrainer::Tensor opposite = t.zoneout_mask(zoneout_rate);
5736   constexpr float epsilon = 1e-3;
5737
5738   auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5739     return val2 - epsilon < val1 && val1 < val2 + epsilon;
5740   };
5741   auto percentage = [](unsigned int dividend, unsigned int divisor) {
5742     return (float)dividend / (float)divisor;
5743   };
5744
5745   {
5746     unsigned int zeros = 0;
5747     unsigned int ones = 0;
5748     for (unsigned int i = 0; i < opposite.size(); ++i) {
5749       if (is_near(opposite.getValue<_Float16>(i), static_cast<_Float16>(0.0))) {
5750         ++zeros;
5751       } else if (is_near(opposite.getValue<_Float16>(i),
5752                          static_cast<_Float16>(1.0))) {
5753         ++ones;
5754       } else {
5755         FAIL() << "This should not be happen";
5756       }
5757     }
5758     EXPECT_NEAR(percentage(zeros, opposite.size()), (1.0 - zoneout_rate),
5759                 epsilon);
5760
5761     // main test
5762     EXPECT_NEAR(percentage(ones, opposite.size()), zoneout_rate, epsilon);
5763   }
5764
5765   {
5766     unsigned int zeros = 0;
5767     unsigned int ones = 0;
5768     for (unsigned int i = 0; i < t.size(); ++i) {
5769       if (is_near(t.getValue<_Float16>(i), (_Float16)0.0)) {
5770         ++zeros;
5771       } else if (is_near(t.getValue<_Float16>(i), (_Float16)1.0)) {
5772         ++ones;
5773       } else {
5774         FAIL() << "This should not be happen";
5775       }
5776     }
5777     EXPECT_NEAR(percentage(zeros, t.size()), zoneout_rate, epsilon);
5778
5779     // main test
5780     EXPECT_NEAR(percentage(ones, t.size()), (1.0f - zoneout_rate), epsilon);
5781   }
5782 }
5783
5784 TEST(nntrainer_Tensor, zoneout_mask_04_n) {
5785   nntrainer::TensorDim::TensorType t_type;
5786   t_type.format = nntrainer::Tformat::NCHW;
5787   t_type.data_type = nntrainer::Tdatatype::FP16;
5788
5789   const float zoneout_rate = 0.3f;
5790   nntrainer::Tensor t(10, 10, 100, 100, t_type);
5791   nntrainer::Tensor opposite = t.zoneout_mask(zoneout_rate);
5792   constexpr float epsilon = 1e-3;
5793
5794   auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5795     return val2 - epsilon < val1 && val1 < val2 + epsilon;
5796   };
5797   auto percentage = [](unsigned int dividend, unsigned int divisor) {
5798     return (float)dividend / (float)divisor;
5799   };
5800
5801   {
5802     unsigned int zeros = 0;
5803     unsigned int ones = 0;
5804     for (unsigned int i = 0; i < opposite.size(); ++i) {
5805       if (is_near(opposite.getValue<_Float16>(i),
5806                   static_cast<_Float16>(0.0f))) {
5807         ++zeros;
5808       } else if (is_near(opposite.getValue<_Float16>(i),
5809                          static_cast<_Float16>(1.0f))) {
5810         ++ones;
5811       } else {
5812         FAIL() << "This should not be happen";
5813       }
5814     }
5815     EXPECT_FALSE(
5816       is_near(static_cast<_Float16>(percentage(ones, opposite.size())),
5817               static_cast<_Float16>(1.0f - zoneout_rate)));
5818   }
5819
5820   {
5821     unsigned int zeros = 0;
5822     unsigned int ones = 0;
5823     for (unsigned int i = 0; i < t.size(); ++i) {
5824       if (is_near(t.getValue<_Float16>(i), static_cast<_Float16>(0.0f))) {
5825         ++zeros;
5826       } else if (is_near(t.getValue<_Float16>(i),
5827                          static_cast<_Float16>(1.0f))) {
5828         ++ones;
5829       } else {
5830         FAIL() << "This should not be happen";
5831       }
5832     }
5833     EXPECT_FALSE(is_near(static_cast<_Float16>(percentage(ones, t.size())),
5834                          static_cast<_Float16>(zoneout_rate)));
5835   }
5836 }
5837
5838 TEST(nntrainer_Tensor, TensorMap_p) {
5839   _Float16 dat[] = {1, 2, 3};
5840
5841   {
5842     nntrainer::Tensor a =
5843       nntrainer::Tensor::Map(dat, 3 * sizeof(_Float16), {3});
5844     /// check if a.getData<_Float16>() has same address with dat
5845     EXPECT_EQ(dat, a.getData<_Float16>());
5846     {
5847       /// check if b.getData<_Float16>() has same address with data
5848       nntrainer::Tensor b = a;
5849       EXPECT_EQ(dat, b.getData<_Float16>());
5850     }
5851   }
5852   /// check if dat is accessible after destruction of all the tensor
5853   EXPECT_FLOAT_EQ(dat[2], 3);
5854 }
5855
5856 TEST(nntrainer_Tensor, TensorWrap_01_n) {
5857   _Float16 dat[] = {1, 2, 3};
5858   EXPECT_THROW(nntrainer::Tensor::Map(dat, 3, nntrainer::TensorDim({})),
5859                std::invalid_argument);
5860 }
5861
5862 TEST(nntrainer_Tensor, TensorWrap_02_n) {
5863   _Float16 dat[] = {1, 2, 3};
5864   EXPECT_THROW(nntrainer::Tensor::Map(dat, 3, {4}), std::invalid_argument);
5865 }
5866
5867 TEST(nntrainer_Tensor, TensorPaddedValue_p) {
5868   nntrainer::Tensor a =
5869     ranged(1, 1, 3, 3, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
5870   _Float16 default_padded = -1;
5871
5872   for (int i = 0; i < 5; ++i) {
5873     for (int j = 0; j < 5; ++j) {
5874       _Float16 expected = default_padded;
5875       if (1 <= i && i <= 3 && 1 <= j && j <= 3) {
5876         expected = (i - 1) * 3 + (j - 1);
5877       }
5878       _Float16 actual =
5879         a.getValuePaddedVirtual<_Float16>(0, 0, i, j, 1, 1, default_padded);
5880       EXPECT_FLOAT_EQ(actual, expected);
5881     }
5882   }
5883 }
5884
5885 GTEST_API_ int main(int argc, char **argv) {
5886   int result = -1;
5887
5888   try {
5889     testing::InitGoogleTest(&argc, argv);
5890   } catch (...) {
5891     std::cerr << "Error duing InitGoogleTest" << std::endl;
5892     return 0;
5893   }
5894
5895   try {
5896     result = RUN_ALL_TESTS();
5897   } catch (...) {
5898     std::cerr << "Error duing RUN_ALL_TESTS()" << std::endl;
5899   }
5900
5901   return result;
5902 }