1 // SPDX-License-Identifier: Apache-2.0
3 * Copyright (C) 2020 Jijoong Moon <jijoong.moon@samsung.com>
5 * @file unittest_nntrainer_tensor.cpp
7 * @brief Unit test utility for tensor.
8 * @see https://github.com/nnstreamer/nntrainer
9 * @author Jijoong Moon <jijoong.moon@samsung.com>
12 #include <gtest/gtest.h>
14 #include "nntrainer_test_util.h"
15 #include "util_func.h"
18 #include <nntrainer_error.h>
20 #include <tensor_dim.h>
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);
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);
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);
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);
44 TEST(nntrainer_Tensor, Tensor_02_fp16_p) {
45 int status = ML_ERROR_NONE;
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));
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>());
62 if (tensor.getValue<_Float16>(0, 0, 0, 1) != 1.0)
63 status = ML_ERROR_INVALID_PARAMETER;
64 EXPECT_EQ(status, ML_ERROR_NONE);
67 TEST(nntrainer_Tensor, Tensor_03_fp16_p) {
68 int status = ML_ERROR_NONE;
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);
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>());
90 if (tensor.getValue<_Float16>(0, 0, 0, 1) != 1.0)
91 status = ML_ERROR_INVALID_PARAMETER;
92 EXPECT_EQ(status, ML_ERROR_NONE);
95 TEST(nntrainer_Tensor, multiply_i_01_fp16_p) {
96 int status = ML_ERROR_NONE;
102 nntrainer::Tensor input(batch, channel, height, width,
103 nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
105 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k);
106 input.print(std::cout);
108 nntrainer::Tensor original;
109 original.copy(input);
111 status = input.multiply_i(2.0);
112 EXPECT_EQ(status, ML_ERROR_NONE);
113 input.print(std::cout);
115 _Float16 *data = original.getData<_Float16>();
116 ASSERT_NE(nullptr, data);
117 _Float16 *indata = input.getData<_Float16>();
118 ASSERT_NE(nullptr, indata);
120 for (int i = 0; i < batch * height * width * channel; ++i) {
121 EXPECT_FLOAT_EQ(data[i] + data[i], indata[i]);
125 TEST(nntrainer_Tensor, multiply_i_02_fp16_p) {
126 int status = ML_ERROR_NONE;
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);
136 nntrainer::Tensor original;
137 original.copy(input);
139 status = input.multiply_i(input);
140 EXPECT_EQ(status, ML_ERROR_NONE);
142 _Float16 *data = original.getData<_Float16>();
143 ASSERT_NE(nullptr, data);
144 _Float16 *indata = input.getData<_Float16>();
145 ASSERT_NE(nullptr, indata);
147 for (int i = 0; i < batch * height * width * channel; ++i) {
148 EXPECT_FLOAT_EQ(data[i] * data[i], indata[i]);
152 TEST(nntrainer_Tensor, multiply_i_03_fp16_n) {
153 int status = ML_ERROR_NONE;
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);
163 nntrainer::Tensor target2(batch, channel, height - 2, width - 1,
164 nntrainer::Tformat::NCHW,
165 nntrainer::Tdatatype::FP16);
166 status = input.multiply_i(target2);
168 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
171 TEST(nntrainer_Tensor, multiply_i_broadcast_01_fp16_p) {
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
874 TEST(nntrainer_Tensor, multiply_i_broadcast_not_supported_01_n) {
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);
881 EXPECT_EQ(target.multiply_i(target2), ML_ERROR_INVALID_PARAMETER);
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);
890 EXPECT_EQ(target.multiply_i(target2), ML_ERROR_INVALID_PARAMETER);
893 TEST(nntrainer_Tensor, multiply_01_p) {
894 int status = ML_ERROR_NONE;
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);
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);
910 TEST(nntrainer_Tensor, multiply_02_p) {
911 int status = ML_ERROR_NONE;
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);
921 nntrainer::Tensor result = input.multiply(input);
923 _Float16 *data = result.getData<_Float16>();
924 ASSERT_NE(nullptr, data);
925 _Float16 *indata = input.getData<_Float16>();
926 ASSERT_NE(nullptr, indata);
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;
935 EXPECT_EQ(status, ML_ERROR_NONE);
938 TEST(nntrainer_Tensor, multiply_03_n) {
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);
948 nntrainer::Tensor test(batch - 1, height - 1, width - 1,
949 nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
951 EXPECT_THROW({ input.multiply(test); }, std::invalid_argument);
954 TEST(nntrainer_Tensor, multiply_04_n) {
960 nntrainer::TensorDim dim(batch, channel, height, width);
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);
967 EXPECT_THROW(shared_input.multiply(test), std::invalid_argument);
970 TEST(nntrainer_Tensor, multiply_05_n) {
976 nntrainer::TensorDim dim(batch, channel, height, width);
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);
983 EXPECT_THROW(input.multiply(shared_test), std::invalid_argument);
986 TEST(nntrainer_Tensor, multiply_06_n) {
992 nntrainer::TensorDim dim(batch, channel, height, width);
994 nntrainer::Tensor input(dim, false);
995 nntrainer::Tensor test(dim);
996 GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
998 EXPECT_THROW(input.multiply(test), std::invalid_argument);
1001 TEST(nntrainer_Tensor, multiply_07_n) {
1007 nntrainer::TensorDim dim(batch, channel, height, width);
1009 nntrainer::Tensor input(dim);
1010 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1011 nntrainer::Tensor test(dim, false);
1013 EXPECT_THROW(input.multiply(test), std::invalid_argument);
1016 TEST(nntrainer_Tensor, multiply_08_n) {
1022 nntrainer::TensorDim dim(batch, channel, height, width);
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);
1030 EXPECT_THROW(input.multiply(test, output), std::invalid_argument);
1033 TEST(nntrainer_Tensor, multiply__Float16_01_p) {
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);
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);
1048 nntrainer::Tensor result = input.multiply(2.0);
1050 EXPECT_EQ(result, expected);
1053 TEST(nntrainer_Tensor, divide_i_01_p) {
1054 int status = ML_ERROR_NONE;
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);
1064 nntrainer::Tensor original;
1065 original.copy(input);
1067 status = input.divide_i(2.0f);
1068 EXPECT_EQ(status, ML_ERROR_NONE);
1070 _Float16 *data = original.getData<_Float16>();
1071 ASSERT_NE(nullptr, data);
1072 _Float16 *indata = input.getData<_Float16>();
1073 ASSERT_NE(nullptr, indata);
1075 for (int i = 0; i < batch * height * width * channel; ++i) {
1076 EXPECT_FLOAT_EQ(data[i], indata[i] + indata[i]);
1080 TEST(nntrainer_Tensor, divide_i_02_p) {
1081 int status = ML_ERROR_NONE;
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);
1091 status = input.divide_i(input);
1092 EXPECT_EQ(status, ML_ERROR_NONE);
1093 _Float16 *indata = input.getData<_Float16>();
1094 ASSERT_NE(nullptr, indata);
1096 for (int i = 0; i < batch * height * width * channel; ++i) {
1097 EXPECT_FLOAT_EQ(indata[i], _Float16(1.0));
1101 TEST(nntrainer_Tensor, divide_i_01_n) {
1102 int status = ML_ERROR_NONE;
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);
1112 status = input.divide_i((_Float16)0);
1113 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
1116 TEST(nntrainer_Tensor, divide_i_02_n) {
1117 int status = ML_ERROR_NONE;
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);
1127 nntrainer::Tensor original(batch, channel, height - 2, width - 1,
1128 nntrainer::Tformat::NCHW,
1129 nntrainer::Tdatatype::FP16);
1131 status = input.divide_i(original);
1132 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
1135 TEST(nntrainer_Tensor, divide_01_p) {
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);
1145 nntrainer::Tensor result = input.divide(1.0);
1147 _Float16 *previous = input.getData<_Float16>();
1148 ASSERT_NE(nullptr, previous);
1149 _Float16 *data = result.getData<_Float16>();
1150 ASSERT_NE(nullptr, data);
1152 for (int i = 0; i < batch * height * width * channel; ++i) {
1153 EXPECT_FLOAT_EQ(data[i], previous[i]);
1157 TEST(nntrainer_Tensor, divide_02_n) {
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);
1167 EXPECT_THROW({ input.divide(0.0); }, std::invalid_argument);
1170 TEST(nntrainer_Tensor, divide_03_n) {
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);
1180 nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
1181 nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
1183 EXPECT_THROW({ input.divide(test); }, std::invalid_argument);
1186 TEST(nntrainer_Tensor, divide_04_n) {
1192 nntrainer::TensorDim dim(batch, channel, height, width);
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);
1199 EXPECT_THROW(shared_input.divide(test), std::invalid_argument);
1202 TEST(nntrainer_Tensor, divide_05_n) {
1208 nntrainer::TensorDim dim(batch, channel, height, width);
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);
1215 EXPECT_THROW(input.divide(shared_test), std::invalid_argument);
1218 TEST(nntrainer_Tensor, divide_06_n) {
1224 nntrainer::TensorDim dim(batch, channel, height, width);
1226 nntrainer::Tensor input(dim, false);
1227 nntrainer::Tensor test(dim);
1228 GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
1230 EXPECT_THROW(input.divide(test), std::invalid_argument);
1233 TEST(nntrainer_Tensor, divide_07_n) {
1239 nntrainer::TensorDim dim(batch, channel, height, width);
1241 nntrainer::Tensor input(dim);
1242 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
1243 nntrainer::Tensor test(dim, false);
1245 EXPECT_THROW(input.divide(test), std::invalid_argument);
1248 TEST(nntrainer_Tensor, divide_08_n) {
1254 nntrainer::TensorDim dim(batch, channel, height, width,
1255 nntrainer::Tformat::NCHW,
1256 nntrainer::Tdatatype::FP16);
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);
1264 EXPECT_THROW(input.divide(test, output), std::invalid_argument);
1267 TEST(nntrainer_Tensor, divide_i_broadcast_01_p) {
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);
1274 nntrainer::Tensor m =
1275 ranged(1, 2, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1349 nntrainer::Tensor m =
1350 ranged(3, 1, 4, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1424 nntrainer::Tensor m =
1425 ranged(3, 2, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1499 nntrainer::Tensor m =
1500 ranged(3, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1574 nntrainer::Tensor m =
1575 ranged(1, 2, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1649 nntrainer::Tensor m =
1650 ranged(3, 1, 4, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1724 nntrainer::Tensor m =
1725 ranged(1, 1, 1, 5, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1799 nntrainer::Tensor m =
1800 ranged(1, 2, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1874 nntrainer::Tensor m =
1875 ranged(3, 1, 1, 1, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1949 nntrainer::Tensor m =
1950 ranged(3, 1, 1, 4, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
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);
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);
1996 EXPECT_EQ(target.divide_i(target2), ML_ERROR_INVALID_PARAMETER);
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);
2005 EXPECT_EQ(target.divide_i(target2), ML_ERROR_INVALID_PARAMETER);
2008 TEST(nntrainer_Tensor, add_i_01_p) {
2009 int status = ML_ERROR_NONE;
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);
2020 nntrainer::Tensor original(batch, channel, height, width,
2021 nntrainer::Tformat::NCHW,
2022 nntrainer::Tdatatype::FP16);
2023 original.copy(target);
2025 status = target.add_i((_Float16)2.1);
2026 EXPECT_EQ(status, ML_ERROR_NONE);
2028 _Float16 *previous = original.getData<_Float16>();
2029 ASSERT_NE(nullptr, previous);
2030 _Float16 *data = target.getData<_Float16>();
2031 ASSERT_NE(nullptr, data);
2033 for (int i = 0; i < batch * height * width; ++i) {
2034 EXPECT_FLOAT_EQ(data[i], (_Float16)(previous[i] + (_Float16)2.1));
2038 TEST(nntrainer_Tensor, add_i_02_p) {
2039 int status = ML_ERROR_NONE;
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);
2050 nntrainer::Tensor original(batch, height, width, nntrainer::Tformat::NCHW,
2051 nntrainer::Tdatatype::FP16);
2052 original.copy(target);
2054 status = target.add_i(target, 3.0);
2055 EXPECT_EQ(status, ML_ERROR_NONE);
2057 _Float16 *previous = original.getData<_Float16>();
2058 ASSERT_NE(nullptr, previous);
2059 _Float16 *data = target.getData<_Float16>();
2060 ASSERT_NE(nullptr, data);
2062 for (int i = 0; i < batch * height * width; ++i) {
2063 EXPECT_FLOAT_EQ(data[i], previous[i] * 4.0);
2068 // * @brief operand dimension is not right
2070 TEST(nntrainer_Tensor, add_i_01_n) {
2071 int status = ML_ERROR_NONE;
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);
2082 nntrainer::Tensor target2(batch, height - 2, width - 3,
2083 nntrainer::Tformat::NCHW,
2084 nntrainer::Tdatatype::FP16);
2086 status = target.add_i(target2);
2087 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
2890 EXPECT_EQ(target.add_i(target2), ML_ERROR_INVALID_PARAMETER);
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);
2899 EXPECT_EQ(target.add_i(target2), ML_ERROR_INVALID_PARAMETER);
2902 TEST(nntrainer_Tensor, add_01_p) {
2903 int status = ML_ERROR_NONE;
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);
2913 nntrainer::Tensor result = input.add(1.0);
2915 _Float16 *data = result.getData<_Float16>();
2916 ASSERT_NE(nullptr, data);
2917 _Float16 *indata = input.getData<_Float16>();
2918 ASSERT_NE(nullptr, indata);
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;
2927 EXPECT_EQ(status, ML_ERROR_NONE);
2930 TEST(nntrainer_Tensor, add_02_p) {
2931 int status = ML_ERROR_NONE;
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);
2941 nntrainer::Tensor result = input.add(input);
2943 _Float16 *data = result.getData<_Float16>();
2944 ASSERT_NE(nullptr, data);
2945 _Float16 *indata = input.getData<_Float16>();
2946 ASSERT_NE(nullptr, indata);
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;
2955 EXPECT_EQ(status, ML_ERROR_NONE);
2958 TEST(nntrainer_Tensor, add_03_n) {
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);
2968 nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
2969 nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
2971 EXPECT_THROW({ input.add(test); }, std::invalid_argument);
2974 TEST(nntrainer_Tensor, add_04_n) {
2980 nntrainer::TensorDim dim(batch, channel, height, width,
2981 nntrainer::Tformat::NCHW,
2982 nntrainer::Tdatatype::FP16);
2984 nntrainer::Tensor input(batch, channel, height, 2 * width);
2985 nntrainer::Tensor shared_input = input.getSharedDataTensor(dim, 0, false);
2986 nntrainer::Tensor test(dim);
2988 EXPECT_THROW(shared_input.add(test), std::invalid_argument);
2991 TEST(nntrainer_Tensor, add_05_n) {
2997 nntrainer::TensorDim dim(batch, channel, height, width,
2998 nntrainer::Tformat::NCHW,
2999 nntrainer::Tdatatype::FP16);
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);
3006 EXPECT_THROW(input.add(shared_test), std::invalid_argument);
3009 TEST(nntrainer_Tensor, add_06_n) {
3015 nntrainer::TensorDim dim(batch, channel, height, width,
3016 nntrainer::Tformat::NCHW,
3017 nntrainer::Tdatatype::FP16);
3019 nntrainer::Tensor input(dim, false);
3020 nntrainer::Tensor test(dim);
3021 GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
3023 EXPECT_THROW(input.add(test), std::invalid_argument);
3026 TEST(nntrainer_Tensor, add_07_n) {
3032 nntrainer::TensorDim dim(batch, channel, height, width,
3033 nntrainer::Tformat::NCHW,
3034 nntrainer::Tdatatype::FP16);
3036 nntrainer::Tensor input(dim);
3037 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3038 nntrainer::Tensor test(dim, false);
3040 EXPECT_THROW(input.add(test), std::invalid_argument);
3043 TEST(nntrainer_Tensor, add_08_n) {
3049 nntrainer::TensorDim dim(batch, channel, height, width,
3050 nntrainer::Tformat::NCHW,
3051 nntrainer::Tdatatype::FP16);
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);
3059 EXPECT_THROW(input.add(test, output), std::invalid_argument);
3062 TEST(nntrainer_Tensor, pow_01_p) {
3064 nntrainer::Tensor input = constant(4.0, 3, 2, 4, 5, nntrainer::Tformat::NCHW,
3065 nntrainer::Tdatatype::FP16);
3067 nntrainer::Tensor actual, expected;
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);
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);
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);
3085 // TEST(nntrainer_Tensor, erf_01_p) {
3091 // nntrainer::TensorDim dim(batch, channel, height, width,
3092 // nntrainer::Tformat::NCHW,
3093 // nntrainer::Tdatatype::FP16);
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());
3103 // EXPECT_EQ(actual, expected);
3106 TEST(nntrainer_Tensor, subtract_i_01_p) {
3107 int status = ML_ERROR_NONE;
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);
3118 nntrainer::Tensor original(batch, height, width, nntrainer::Tformat::NCHW,
3119 nntrainer::Tdatatype::FP16);
3120 original.copy(target);
3122 status = target.subtract_i(2.1);
3123 EXPECT_EQ(status, ML_ERROR_NONE);
3125 _Float16 *previous = original.getData<_Float16>();
3126 ASSERT_NE(nullptr, previous);
3127 _Float16 *data = target.getData<_Float16>();
3128 ASSERT_NE(nullptr, data);
3130 for (int i = 0; i < batch * height * width; ++i) {
3131 EXPECT_FLOAT_EQ(data[i], ((_Float16)(previous[i] - (_Float16)2.1)));
3135 TEST(nntrainer_Tensor, subtract_i_02_p) {
3136 int status = ML_ERROR_NONE;
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);
3147 status = target.subtract_i(target);
3148 EXPECT_EQ(status, ML_ERROR_NONE);
3150 _Float16 *data = target.getData<_Float16>();
3151 ASSERT_NE(nullptr, data);
3153 for (int i = 0; i < batch * height * width; ++i) {
3154 EXPECT_FLOAT_EQ(data[i], 0);
3158 TEST(nntrainer_Tensor, subtract_i_03_n) {
3159 int status = ML_ERROR_NONE;
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);
3170 nntrainer::Tensor target2(batch, channel, height - 1, width - 3,
3171 nntrainer::Tformat::NCHW,
3172 nntrainer::Tdatatype::FP16);
3174 status = target.subtract_i(target2);
3175 EXPECT_EQ(status, ML_ERROR_INVALID_PARAMETER);
3178 TEST(nntrainer_Tensor, subtract_01_p) {
3179 int status = ML_ERROR_NONE;
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);
3189 nntrainer::Tensor result = input.subtract(1.0);
3191 _Float16 *data = result.getData<_Float16>();
3192 ASSERT_NE(nullptr, data);
3193 _Float16 *indata = input.getData<_Float16>();
3194 ASSERT_NE(nullptr, indata);
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;
3203 EXPECT_EQ(status, ML_ERROR_NONE);
3206 TEST(nntrainer_Tensor, subtract_02_p) {
3212 nntrainer::Tensor input(batch, channel, height, width);
3213 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3215 nntrainer::Tensor result = input.subtract(input);
3217 EXPECT_EQ(constant(0.0, batch, channel, height, width), result);
3220 TEST(nntrainer_Tensor, subtract_03_n) {
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);
3230 nntrainer::Tensor test(batch - 1, channel, height - 1, width - 1,
3231 nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16);
3233 EXPECT_THROW({ input.subtract(test); }, std::invalid_argument);
3236 TEST(nntrainer_Tensor, subtract_04_n) {
3242 nntrainer::TensorDim dim(batch, channel, height, width,
3243 nntrainer::Tformat::NCHW,
3244 nntrainer::Tdatatype::FP16);
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);
3251 EXPECT_THROW(shared_input.subtract(test), std::invalid_argument);
3254 TEST(nntrainer_Tensor, subtract_05_n) {
3260 nntrainer::TensorDim dim(batch, channel, height, width,
3261 nntrainer::Tformat::NCHW,
3262 nntrainer::Tdatatype::FP16);
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);
3269 EXPECT_THROW(input.subtract(shared_test), std::invalid_argument);
3272 TEST(nntrainer_Tensor, subtract_06_n) {
3278 nntrainer::TensorDim dim(batch, channel, height, width,
3279 nntrainer::Tformat::NCHW,
3280 nntrainer::Tdatatype::FP16);
3282 nntrainer::Tensor input(dim, false);
3283 nntrainer::Tensor test(dim);
3284 GEN_TEST_INPUT(test, i * (batch * height) + j * (width) + k + 1);
3286 EXPECT_THROW(input.subtract(test), std::invalid_argument);
3289 TEST(nntrainer_Tensor, subtract_07_n) {
3295 nntrainer::TensorDim dim(batch, channel, height, width,
3296 nntrainer::Tformat::NCHW,
3297 nntrainer::Tdatatype::FP16);
3299 nntrainer::Tensor input(dim);
3300 GEN_TEST_INPUT(input, i * (batch * height) + j * (width) + k + 1);
3301 nntrainer::Tensor test(dim, false);
3303 EXPECT_THROW(input.subtract(test), std::invalid_argument);
3306 TEST(nntrainer_Tensor, subtract_08_n) {
3312 nntrainer::TensorDim dim(batch, channel, height, width,
3313 nntrainer::Tformat::NCHW,
3314 nntrainer::Tdatatype::FP16);
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);
3322 EXPECT_THROW(input.subtract(test, output), std::invalid_argument);
3325 TEST(nntrainer_Tensor, subtract__Float16_01_p) {
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);
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);
3340 nntrainer::Tensor result = input.subtract(1.0);
3342 EXPECT_EQ(result, expected);
3345 TEST(nntrainer_Tensor, sum_01_n) {
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);
3355 EXPECT_THROW({ input.sum(4); }, std::out_of_range);
3358 TEST(nntrainer_Tensor, sum_02_n) {
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);
3368 EXPECT_THROW({ input.sum(-1); }, std::out_of_range);
3371 TEST(nntrainer_Tensor, sum_02_p) {
3377 nntrainer::TensorDim::TensorType t_type;
3378 t_type.format = nntrainer::Tformat::NCHW;
3379 t_type.data_type = nntrainer::Tdatatype::FP16;
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}}}}),
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}}}}),
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}}}}),
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}}}}),
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);
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);
3425 EXPECT_EQ(ans0, result0);
3426 EXPECT_EQ(ans1, result1);
3427 EXPECT_EQ(ans2, result2);
3428 EXPECT_EQ(ans3, result3);
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;
3437 nntrainer::TensorDim::TensorType t_type;
3438 t_type.format = nntrainer::Tformat::NCHW;
3439 t_type.data_type = nntrainer::Tdatatype::FP16;
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
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}}}}),
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}}}}),
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}}}}),
3469 nntrainer::Tensor ans_3_1_0(
3470 std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3471 {{{{55}}, {{155}}}, {{{255}}, {{355}}}, {{{455}}, {{555}}}}),
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);
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);
3485 // Test for alpha == 1 and beta == 2 and dimension of reduced axis == 1
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}}}}),
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}}}}),
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}}}}),
3510 nntrainer::Tensor ans_3_1_2(
3511 std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3512 {{{{57}}, {{159}}}, {{{261}}, {{363}}}, {{{465}}, {{567}}}}),
3515 nntrainer::Tensor output_0_1_2(1, channel, height, width, t_type);
3517 const int batch = 1;
3518 GEN_TEST_INPUT(output_0_1_2, i * (channel * height * width) +
3519 j * (height * width) + k * (width) + l +
3522 nntrainer::Tensor output_1_1_2(batch, 1, height, width, t_type);
3524 const int channel = 1;
3525 GEN_TEST_INPUT(output_1_1_2, i * (channel * height * width) +
3526 j * (height * width) + k * (width) + l +
3529 nntrainer::Tensor output_2_1_2(batch, channel, 1, width, t_type);
3531 const int height = 1;
3532 GEN_TEST_INPUT(output_2_1_2, i * (channel * height * width) +
3533 j * (height * width) + k * (width) + l +
3536 nntrainer::Tensor output_3_1_2(batch, channel, height, 1, t_type);
3538 const int width = 1;
3539 GEN_TEST_INPUT(output_3_1_2, i * (channel * height * width) +
3540 j * (height * width) + k * (width) + l +
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);
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);
3554 // Test for alpha == 2 and beta == 0
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}}}}),
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}}}}),
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}}}}),
3579 nntrainer::Tensor ans_3_2_0(
3580 std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3581 {{{{110}}, {{310}}}, {{{510}}, {{710}}}, {{{910}}, {{1110}}}}),
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);
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);
3595 // Test for alpha == 2 and beta == 2
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}}}}),
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}}}}),
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}}}}),
3620 nntrainer::Tensor ans_3_2_2(
3621 std::vector<std::vector<std::vector<std::vector<_Float16>>>>(
3622 {{{{112}}, {{314}}}, {{{516}}, {{718}}}, {{{920}}, {{1122}}}}),
3625 nntrainer::Tensor output_0_2_2(1, channel, height, width, t_type);
3627 const int batch = 1;
3628 GEN_TEST_INPUT(output_0_2_2, i * (channel * height * width) +
3629 j * (height * width) + k * (width) + l +
3632 nntrainer::Tensor output_1_2_2(batch, 1, height, width, t_type);
3634 const int channel = 1;
3635 GEN_TEST_INPUT(output_1_2_2, i * (channel * height * width) +
3636 j * (height * width) + k * (width) + l +
3639 nntrainer::Tensor output_2_2_2(batch, channel, 1, width, t_type);
3641 const int height = 1;
3642 GEN_TEST_INPUT(output_2_2_2, i * (channel * height * width) +
3643 j * (height * width) + k * (width) + l +
3646 nntrainer::Tensor output_3_2_2(batch, channel, height, 1, t_type);
3648 const int width = 1;
3649 GEN_TEST_INPUT(output_3_2_2, i * (channel * height * width) +
3650 j * (height * width) + k * (width) + l +
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);
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);
3665 TEST(nntrainer_Tensor, sum_04_p) {
3666 int status = ML_ERROR_NONE;
3672 nntrainer::TensorDim::TensorType t_type;
3673 t_type.format = nntrainer::Tformat::NCHW;
3674 t_type.data_type = nntrainer::Tdatatype::FP16;
3676 nntrainer::Tensor input(batch, channel, height, width, t_type);
3677 GEN_TEST_INPUT(input, i * (batch * height * channel) + j * (height * width) +
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;
3686 EXPECT_EQ(status, ML_ERROR_NONE);
3689 TEST(nntrainer_Tensor, multiple_sum_invalid_args_01_n) {
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);
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);
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;
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);
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);
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);
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);
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);
3733 // nntrainer::Tensor actual, expected;
3734 // actual.setTensorType({nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16});
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);
3743 // (std::function<_Float16(_Float16)>)[&](_Float16 in) { return idx++ % 2; });
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);
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);
3755 std::function<float(float)> f = [&](float in) { return idx++ % 2; };
3758 nntrainer::Tensor actual, expected;
3760 actual = t.average(0);
3761 expected = constant(0, 1, 2, 2, 2, nntrainer::Tformat::NCHW,
3762 nntrainer::Tdatatype::FP16)
3764 EXPECT_EQ(actual, expected);
3766 actual = t.average(1);
3767 expected = constant(0, 2, 1, 2, 2, nntrainer::Tformat::NCHW,
3768 nntrainer::Tdatatype::FP16)
3770 EXPECT_EQ(actual, expected);
3772 actual = t.average(2);
3773 expected = constant(0, 2, 2, 1, 2, nntrainer::Tformat::NCHW,
3774 nntrainer::Tdatatype::FP16)
3776 EXPECT_EQ(actual, expected);
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);
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);
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);
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;
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);
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);
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);
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);
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);
3828 TEST(nntrainer_Tensor, dot_01_n) {
3830 nntrainer::TensorDim::TensorType t_type;
3831 t_type.format = nntrainer::Tformat::NCHW;
3832 t_type.data_type = nntrainer::Tdatatype::FP16;
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);
3839 TEST(nntrainer_Tensor, dot_02_n) {
3841 nntrainer::TensorDim::TensorType t_type;
3842 t_type.format = nntrainer::Tformat::NCHW;
3843 t_type.data_type = nntrainer::Tdatatype::FP16;
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);
3851 TEST(nntrainer_Tensor, dot_02_p) {
3853 nntrainer::TensorDim::TensorType t_type;
3854 t_type.format = nntrainer::Tformat::NCHW;
3855 t_type.data_type = nntrainer::Tdatatype::FP16;
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));
3862 TEST(nntrainer_Tensor, dot_03_p) {
3864 nntrainer::TensorDim::TensorType t_type;
3865 t_type.format = nntrainer::Tformat::NCHW;
3866 t_type.data_type = nntrainer::Tdatatype::FP16;
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));
3873 TEST(nntrainer_Tensor, dot_04_n) {
3875 nntrainer::TensorDim::TensorType t_type;
3876 t_type.format = nntrainer::Tformat::NCHW;
3877 t_type.data_type = nntrainer::Tdatatype::FP16;
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));
3885 TEST(nntrainer_Tensor, dot_05_p) {
3886 int status = ML_ERROR_NONE;
3892 nntrainer::TensorDim::TensorType t_type;
3893 t_type.format = nntrainer::Tformat::NCHW;
3894 t_type.data_type = nntrainer::Tdatatype::FP16;
3896 _Float16 ans[2][3][4][24] = {0};
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});
3906 nntrainer::Tensor result = input.dot(weight, false, true);
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;
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);
3930 status = ML_ERROR_RESULT_OUT_OF_RANGE;
3938 EXPECT_EQ(status, ML_ERROR_NONE);
3941 TEST(nntrainer_Tensor, dot_06_p) {
3942 int status = ML_ERROR_NONE;
3948 nntrainer::TensorDim::TensorType t_type;
3949 t_type.format = nntrainer::Tformat::NCHW;
3950 t_type.data_type = nntrainer::Tdatatype::FP16;
3952 _Float16 ans[3][1][1][3] = {
3953 {{{30, 36, 42}}}, {{{66, 81, 96}}}, {{{102, 126, 150}}}};
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);
3959 nntrainer::Tensor result = input.dot(input);
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;
3972 EXPECT_EQ(status, ML_ERROR_NONE);
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;
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),
3988 nntrainer::Tensor ret = a.dot(b, true, true);
3989 EXPECT_EQ(ret, answer);
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),
4000 nntrainer::Tensor ret = a.dot(b, true, false);
4001 EXPECT_EQ(ret, answer);
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),
4012 nntrainer::Tensor ret = a.dot(b, false, true);
4013 EXPECT_EQ(ret, answer);
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),
4024 nntrainer::Tensor ret = a.dot(b, false, false);
4025 EXPECT_EQ(ret, answer);
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),
4035 nntrainer::Tensor ret = a.dot(b, true, true);
4036 EXPECT_EQ(ret, answer);
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),
4046 nntrainer::Tensor ret = a.dot(b, true, false);
4047 EXPECT_EQ(ret, answer);
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),
4057 nntrainer::Tensor ret = a.dot(b, false, true);
4058 EXPECT_EQ(ret, answer);
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),
4068 nntrainer::Tensor ret = a.dot(b, false, false);
4069 EXPECT_EQ(ret, answer);
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),
4079 nntrainer::Tensor ret = a.dot(b, true, true);
4080 EXPECT_EQ(ret, answer);
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),
4090 nntrainer::Tensor ret = a.dot(b, true, false);
4091 EXPECT_EQ(ret, answer);
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),
4101 nntrainer::Tensor ret = a.dot(b, false, true);
4102 EXPECT_EQ(ret, answer);
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),
4112 nntrainer::Tensor ret = a.dot(b, false, false);
4113 EXPECT_EQ(ret, answer);
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),
4123 nntrainer::Tensor ret = a.dot(b, true, true);
4124 EXPECT_EQ(ret, answer);
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),
4134 nntrainer::Tensor ret = a.dot(b, true, false);
4135 EXPECT_EQ(ret, answer);
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),
4145 nntrainer::Tensor ret = a.dot(b, false, true);
4146 EXPECT_EQ(ret, answer);
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),
4156 nntrainer::Tensor ret = a.dot(b, false, false);
4157 EXPECT_EQ(ret, answer);
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;
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),
4173 nntrainer::Tensor ret = a.dot(b, false, false);
4174 EXPECT_EQ(ret, answer);
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),
4184 nntrainer::Tensor ret = a.dot(b, true, false);
4185 EXPECT_EQ(ret, answer);
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),
4195 nntrainer::Tensor ret = a.dot(b, false, true);
4196 EXPECT_EQ(ret, answer);
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),
4206 nntrainer::Tensor ret = a.dot(b, true, true);
4207 EXPECT_EQ(ret, answer);
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),
4217 nntrainer::Tensor ret = a.dot(b, false, false);
4218 EXPECT_EQ(ret, answer);
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),
4228 nntrainer::Tensor ret = a.dot(b, true, false);
4229 EXPECT_EQ(ret, answer);
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),
4239 nntrainer::Tensor ret = a.dot(b, false, true);
4240 EXPECT_EQ(ret, answer);
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),
4250 nntrainer::Tensor ret = a.dot(b, true, true);
4251 EXPECT_EQ(ret, answer);
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),
4261 nntrainer::Tensor ret = a.dot(b, false, false);
4262 EXPECT_EQ(ret, answer);
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),
4272 nntrainer::Tensor ret = a.dot(b, true, false);
4273 EXPECT_EQ(ret, answer);
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),
4283 nntrainer::Tensor ret = a.dot(b, false, true);
4284 EXPECT_EQ(ret, answer);
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),
4294 nntrainer::Tensor ret = a.dot(b, true, true);
4295 EXPECT_EQ(ret, answer);
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),
4305 nntrainer::Tensor ret = a.dot(b, false, false);
4306 EXPECT_EQ(ret, answer);
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),
4316 nntrainer::Tensor ret = a.dot(b, true, false);
4317 EXPECT_EQ(ret, answer);
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),
4327 nntrainer::Tensor ret = a.dot(b, false, true);
4328 EXPECT_EQ(ret, answer);
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),
4338 nntrainer::Tensor ret = a.dot(b, true, true);
4339 EXPECT_EQ(ret, answer);
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),
4349 nntrainer::Tensor ret = a.dot(b, false, false);
4350 EXPECT_EQ(ret, answer);
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),
4360 nntrainer::Tensor ret = a.dot(b, true, false);
4361 EXPECT_EQ(ret, answer);
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),
4371 nntrainer::Tensor ret = a.dot(b, false, true);
4372 EXPECT_EQ(ret, answer);
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),
4382 nntrainer::Tensor ret = a.dot(b, true, true);
4383 EXPECT_EQ(ret, answer);
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),
4393 nntrainer::Tensor ret = a.dot(b, false, false);
4394 EXPECT_EQ(ret, answer);
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),
4404 nntrainer::Tensor ret = a.dot(b, true, false);
4405 EXPECT_EQ(ret, answer);
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),
4415 nntrainer::Tensor ret = a.dot(b, false, true);
4416 EXPECT_EQ(ret, answer);
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),
4426 nntrainer::Tensor ret = a.dot(b, true, true);
4427 EXPECT_EQ(ret, answer);
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;
4436 nntrainer::TensorDim ref_dim(3, 2, 4, 5, t_type);
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);
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);
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);
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);
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);
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);
4545 /// outplace transpose
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);
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);
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);
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);
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);
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);
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;
4670 nntrainer::Tensor a(3, 2, 4, 5, t_type);
4671 nntrainer::Tensor b(3, 1, 2, 3, t_type);
4673 EXPECT_THROW(a.transpose("0:1:2", b), std::invalid_argument);
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;
4681 // nntrainer::Tensor tensor = nntrainer::Tensor(1, 1, 1, 1, t_type);
4683 // tensor.setZero();
4684 // EXPECT_EQ(tensor.getValue<_Float16>(0, 0, 0, 0), 0.0);
4686 // tensor.setRandUniform(-0.5, 0.0);
4687 // std::cout << "val : " << (float)tensor.getValue<_Float16>(0, 0, 0, 0)
4690 // _Float16 val = tensor.getValue<_Float16>(0, 0, 0, 0);
4691 // EXPECT_TRUE(val >= -0.5 && val < 0);
4694 TEST(nntrainer_Tensor, save_read_01_p) {
4700 nntrainer::TensorDim::TensorType t_type;
4701 t_type.format = nntrainer::Tformat::NCHW;
4702 t_type.data_type = nntrainer::Tdatatype::FP16;
4704 nntrainer::Tensor target(3, 4, 5, 6, t_type);
4705 nntrainer::Tensor readed(3, 4, 5, 6, t_type);
4707 GEN_TEST_INPUT(target, i * (channel * width * height) + j * (height * width) +
4708 k * (width) + l + 1);
4710 std::ofstream save_file("save.bin", std::ios::out | std::ios::binary);
4711 target.save(save_file);
4714 std::ifstream read_file("save.bin");
4715 readed.read(read_file);
4718 EXPECT_EQ(target, readed);
4720 int status = std::remove("save.bin");
4722 ASSERT_EQ(status, 0);
4725 TEST(nntrainer_Tensor, save_read_01_n) {
4731 nntrainer::TensorDim::TensorType t_type;
4732 t_type.format = nntrainer::Tformat::NCHW;
4733 t_type.data_type = nntrainer::Tdatatype::FP16;
4735 nntrainer::Tensor target(3, 4, 5, 6, t_type);
4736 nntrainer::Tensor readed(3, 4, 1, 1, t_type);
4738 GEN_TEST_INPUT(target, i * (channel * width * height) + j * (height * width) +
4739 k * (width) + l + 1);
4741 std::ofstream save_file("save.bin", std::ios::out | std::ios::binary);
4742 target.save(save_file);
4745 std::ifstream read_file("save.bin");
4746 readed.read(read_file);
4749 EXPECT_NE(target, readed);
4751 int status = std::remove("save.bin");
4753 ASSERT_EQ(status, 0);
4756 TEST(nntrainer_Tensor, copy_and_shares_variable_p) {
4758 nntrainer::TensorDim::TensorType t_type;
4759 t_type.format = nntrainer::Tformat::NCHW;
4760 t_type.data_type = nntrainer::Tdatatype::FP16;
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;
4767 C.setValue(1, 1, 1, 1, 2.0f);
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());
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;
4782 nntrainer::Tensor A = constant(1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW,
4783 nntrainer::Tdatatype::FP16);
4785 EXPECT_THROW(A.reshape(nntrainer::TensorDim(9, 9, 9, 9, t_type)),
4786 std::invalid_argument);
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();
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);
4798 nntrainer::TensorDim A_dim_2 = A.getDim();
4799 EXPECT_EQ(A_dim_2.getTensorDim(1), 4u);
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;
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();
4812 EXPECT_THROW(B.reshape(nntrainer::TensorDim(9, 9, 9, 9, t_type)),
4813 std::invalid_argument);
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;
4823 nntrainer::sharedConstTensor A = MAKE_SHARED_TENSOR(constant(
4824 1.0f, 3, 4, 5, 6, nntrainer::Tformat::NCHW, nntrainer::Tdatatype::FP16));
4826 nntrainer::Tensor B = *A;
4827 nntrainer::Tensor C = A->clone();
4829 B.setValue(2, 3, 4, 5, 2.0f);
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());
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);
4842 std::stringstream ss, expected;
4845 expected << '<' << typeid(target).name() << " at " << &target << ">\n"
4846 << "data addr: " << target.getData<_Float16>() << '\n'
4847 << "Shape: 3:1:2:3 [ FP16 : NCHW ]\n"
4861 EXPECT_EQ(ss.str(), expected.str());
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);
4868 std::stringstream ss, expected;
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";
4876 EXPECT_EQ(ss.str(), expected.str());
4879 // TEST(nntrainer_Tensor, DISABLED_equation_test_01_p) {
4880 // nntrainer::Tensor a, b, c;
4881 // nntrainer::Tensor ret1, ret2;
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);
4887 // ret1 = a.subtract(b).multiply(c);
4888 // ret2 = a.multiply(c).subtract(b.multiply(c));
4890 // _Float16 *data1 = ret1.getData<_Float16>();
4891 // _Float16 *data2 = ret2.getData<_Float16>();
4892 // EXPECT_EQ(ret1, ret2);
4894 // for (unsigned int i = 0; i < ret1.size(); ++i) {
4895 // EXPECT_FLOAT_EQ(data1[i], data2[i]);
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;
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);
4911 EXPECT_EQ(target, original);
4914 /// same dimension, buffer size is different (not tested)
4916 /// there is no way to make non contiguous tensor publicily yet
4920 /// uninitialized with initialized flag is true
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);
4928 EXPECT_EQ(target, original);
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);
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;
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);
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);
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);
4963 TEST(nntrainer_Tensor, empty_01) {
4964 nntrainer::Tensor t;
4966 EXPECT_TRUE(t.empty());
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;
4974 nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
4976 EXPECT_FALSE(t.empty());
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;
4984 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
4986 EXPECT_FALSE(t.empty());
4989 TEST(nntrainer_Tensor, allocate_01_n) {
4990 nntrainer::Tensor t;
4991 EXPECT_FALSE(t.isAllocated());
4994 EXPECT_FALSE(t.isAllocated());
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;
5002 nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5003 EXPECT_FALSE(t.isAllocated());
5006 EXPECT_TRUE(t.isAllocated());
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;
5014 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
5015 EXPECT_TRUE(t.isAllocated());
5018 EXPECT_TRUE(t.isAllocated());
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;
5026 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5027 nntrainer::Tensor::Initializer::ONES);
5029 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5032 EXPECT_EQ(golden, t);
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;
5040 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true);
5042 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5045 EXPECT_NE(golden, t);
5047 t.initialize(nntrainer::Tensor::Initializer::ONES);
5048 EXPECT_EQ(golden, t);
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;
5056 nntrainer::Tensor t({1, 2, 3, 4, t_type}, false,
5057 nntrainer::Tensor::Initializer::ONES);
5060 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5063 EXPECT_EQ(golden, t);
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;
5071 nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5072 t.initialize(nntrainer::Tensor::Initializer::ONES);
5075 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5078 EXPECT_EQ(golden, t);
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;
5086 nntrainer::Tensor t({1, 2, 3, 4, t_type}, false);
5089 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5090 golden.setValue(1.f);
5093 * Ideally, it should be NE, but it can be equal due to no initialization
5094 * EXPECT_NE(golden, t);
5097 t.initialize(nntrainer::Tensor::Initializer::ONES);
5098 EXPECT_EQ(golden, t);
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;
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);
5111 EXPECT_NE(golden, t);
5113 golden.initialize(nntrainer::Tensor::Initializer::ONES);
5114 EXPECT_EQ(golden, t);
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;
5122 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5123 nntrainer::Tensor::Initializer::ONES);
5125 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5128 EXPECT_EQ(golden, t);
5130 t.setValue(0, 0, 0, 0, 0);
5131 t.setValue(0, 0, 0, t.size() - 1, 0);
5132 EXPECT_NE(golden, t);
5135 EXPECT_EQ(golden, t);
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;
5143 nntrainer::Tensor t({1, 2, 3, 4, t_type}, true,
5144 nntrainer::Tensor::Initializer::ONES);
5146 nntrainer::Tensor golden(1, 2, 3, 4, t_type);
5147 golden.setValue(1.f);
5148 EXPECT_EQ(golden, t);
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);
5155 // EXPECT_NE(golden, t);
5157 t.initialize(nntrainer::Tensor::Initializer::ONES);
5158 EXPECT_EQ(golden, t);
5161 EXPECT_EQ(golden, t);
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;
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;
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},
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},
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},
5198 EXPECT_EQ(t.split(3, 0), answer);
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;
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},
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},
5225 EXPECT_EQ(t.split(2, 1), answer);
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;
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},
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},
5251 EXPECT_EQ(t.split(2, 2), answer);
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;
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},
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},
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},
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},
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},
5294 EXPECT_EQ(t.split(5, 3), answer);
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;
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},
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},
5312 EXPECT_EQ(t.split(2, 3), answer);
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;
5321 nntrainer::Tensor t(1, 1, 1, 1, t_type);
5322 EXPECT_THROW(t.split(0, 0), std::invalid_argument);
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;
5330 nntrainer::Tensor t(3, 1, 1, 1, t_type);
5331 EXPECT_THROW(t.split(2, 0), std::invalid_argument);
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;
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;
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},
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},
5362 EXPECT_EQ(t.split({2, 1}, 0), answer);
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;
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},
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},
5389 EXPECT_EQ(t.split({1, 1}, 1), answer);
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;
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},
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},
5415 EXPECT_EQ(t.split({2, 2}, 2), answer);
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;
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},
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},
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},
5447 EXPECT_EQ(t.split({1, 3, 1}, 3), answer);
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;
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},
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},
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},
5478 EXPECT_EQ(t.split({2, 2, 1}, 3), answer);
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;
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},
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},
5504 EXPECT_EQ(t.split({2, 3}, 3), answer);
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;
5513 _Float16 answer_data[] = {0, 6, 12, 18};
5514 answer.emplace_back(ml::train::TensorDim{1, 1, 4, 1, t_type},
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},
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},
5527 EXPECT_EQ(t.split({1, 3, 2}, 3), answer);
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;
5536 nntrainer::Tensor t(3, 1, 1, 1, t_type);
5537 EXPECT_THROW(t.split({1, 1}, 0), std::invalid_argument);
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;
5545 nntrainer::Tensor t(3, 1, 1, 1, t_type);
5546 EXPECT_THROW(t.split({2, 0, 1}, 0), std::invalid_argument);
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;
5554 nntrainer::Tensor t(3, 1, 1, 1, t_type);
5555 EXPECT_THROW(t.split({}, 0), std::invalid_argument);
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;
5563 std::vector<nntrainer::Tensor> inputs;
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},
5572 EXPECT_EQ(nntrainer::Tensor::cat(inputs, 1), answer);
5575 std::vector<nntrainer::Tensor> inputs;
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},
5598 EXPECT_EQ(nntrainer::Tensor::cat(inputs, 0), answer);
5601 std::vector<nntrainer::Tensor> inputs;
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},
5632 EXPECT_EQ(nntrainer::Tensor::cat(inputs, 1), answer);
5635 std::vector<nntrainer::Tensor> inputs;
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},
5649 EXPECT_EQ(nntrainer::Tensor::cat(inputs, 2), answer);
5652 std::vector<nntrainer::Tensor> inputs;
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},
5671 EXPECT_EQ(nntrainer::Tensor::cat(inputs, 3), answer);
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;
5681 std::vector<nntrainer::Tensor> inputs;
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);
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;
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);
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;
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;
5710 EXPECT_EQ(t.size(), opposite.size());
5712 auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5713 return val2 - epsilon < val1 && val1 < val2 + epsilon;
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);
5723 FAIL() << "This should not be happen";
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;
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;
5738 auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5739 return val2 - epsilon < val1 && val1 < val2 + epsilon;
5741 auto percentage = [](unsigned int dividend, unsigned int divisor) {
5742 return (float)dividend / (float)divisor;
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))) {
5751 } else if (is_near(opposite.getValue<_Float16>(i),
5752 static_cast<_Float16>(1.0))) {
5755 FAIL() << "This should not be happen";
5758 EXPECT_NEAR(percentage(zeros, opposite.size()), (1.0 - zoneout_rate),
5762 EXPECT_NEAR(percentage(ones, opposite.size()), zoneout_rate, epsilon);
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)) {
5771 } else if (is_near(t.getValue<_Float16>(i), (_Float16)1.0)) {
5774 FAIL() << "This should not be happen";
5777 EXPECT_NEAR(percentage(zeros, t.size()), zoneout_rate, epsilon);
5780 EXPECT_NEAR(percentage(ones, t.size()), (1.0f - zoneout_rate), epsilon);
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;
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;
5794 auto is_near = [epsilon](_Float16 val1, _Float16 val2) {
5795 return val2 - epsilon < val1 && val1 < val2 + epsilon;
5797 auto percentage = [](unsigned int dividend, unsigned int divisor) {
5798 return (float)dividend / (float)divisor;
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))) {
5808 } else if (is_near(opposite.getValue<_Float16>(i),
5809 static_cast<_Float16>(1.0f))) {
5812 FAIL() << "This should not be happen";
5816 is_near(static_cast<_Float16>(percentage(ones, opposite.size())),
5817 static_cast<_Float16>(1.0f - zoneout_rate)));
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))) {
5826 } else if (is_near(t.getValue<_Float16>(i),
5827 static_cast<_Float16>(1.0f))) {
5830 FAIL() << "This should not be happen";
5833 EXPECT_FALSE(is_near(static_cast<_Float16>(percentage(ones, t.size())),
5834 static_cast<_Float16>(zoneout_rate)));
5838 TEST(nntrainer_Tensor, TensorMap_p) {
5839 _Float16 dat[] = {1, 2, 3};
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>());
5847 /// check if b.getData<_Float16>() has same address with data
5848 nntrainer::Tensor b = a;
5849 EXPECT_EQ(dat, b.getData<_Float16>());
5852 /// check if dat is accessible after destruction of all the tensor
5853 EXPECT_FLOAT_EQ(dat[2], 3);
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);
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);
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;
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);
5879 a.getValuePaddedVirtual<_Float16>(0, 0, i, j, 1, 1, default_padded);
5880 EXPECT_FLOAT_EQ(actual, expected);
5885 GTEST_API_ int main(int argc, char **argv) {
5889 testing::InitGoogleTest(&argc, argv);
5891 std::cerr << "Error duing InitGoogleTest" << std::endl;
5896 result = RUN_ALL_TESTS();
5898 std::cerr << "Error duing RUN_ALL_TESTS()" << std::endl;