1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10 #include "main.h"
11
12 #include <Eigen/CXX11/Tensor>
13
14 using Eigen::Tensor;
15 using Eigen::array;
16
test_simple_cast()17 static void test_simple_cast()
18 {
19 Tensor<float, 2> ftensor(20,30);
20 ftensor = ftensor.random() * 100.f;
21 Tensor<char, 2> chartensor(20,30);
22 chartensor.setRandom();
23 Tensor<std::complex<float>, 2> cplextensor(20,30);
24 cplextensor.setRandom();
25
26 chartensor = ftensor.cast<char>();
27 cplextensor = ftensor.cast<std::complex<float> >();
28
29 for (int i = 0; i < 20; ++i) {
30 for (int j = 0; j < 30; ++j) {
31 VERIFY_IS_EQUAL(chartensor(i,j), static_cast<char>(ftensor(i,j)));
32 VERIFY_IS_EQUAL(cplextensor(i,j), static_cast<std::complex<float> >(ftensor(i,j)));
33 }
34 }
35 }
36
37
test_vectorized_cast()38 static void test_vectorized_cast()
39 {
40 Tensor<int, 2> itensor(20,30);
41 itensor = itensor.random() / 1000;
42 Tensor<float, 2> ftensor(20,30);
43 ftensor.setRandom();
44 Tensor<double, 2> dtensor(20,30);
45 dtensor.setRandom();
46
47 ftensor = itensor.cast<float>();
48 dtensor = itensor.cast<double>();
49
50 for (int i = 0; i < 20; ++i) {
51 for (int j = 0; j < 30; ++j) {
52 VERIFY_IS_EQUAL(itensor(i,j), static_cast<int>(ftensor(i,j)));
53 VERIFY_IS_EQUAL(dtensor(i,j), static_cast<double>(ftensor(i,j)));
54 }
55 }
56 }
57
58
test_float_to_int_cast()59 static void test_float_to_int_cast()
60 {
61 Tensor<float, 2> ftensor(20,30);
62 ftensor = ftensor.random() * 1000.0f;
63 Tensor<double, 2> dtensor(20,30);
64 dtensor = dtensor.random() * 1000.0;
65
66 Tensor<int, 2> i1tensor = ftensor.cast<int>();
67 Tensor<int, 2> i2tensor = dtensor.cast<int>();
68
69 for (int i = 0; i < 20; ++i) {
70 for (int j = 0; j < 30; ++j) {
71 VERIFY_IS_EQUAL(i1tensor(i,j), static_cast<int>(ftensor(i,j)));
72 VERIFY_IS_EQUAL(i2tensor(i,j), static_cast<int>(dtensor(i,j)));
73 }
74 }
75 }
76
77
test_big_to_small_type_cast()78 static void test_big_to_small_type_cast()
79 {
80 Tensor<double, 2> dtensor(20, 30);
81 dtensor.setRandom();
82 Tensor<float, 2> ftensor(20, 30);
83 ftensor = dtensor.cast<float>();
84
85 for (int i = 0; i < 20; ++i) {
86 for (int j = 0; j < 30; ++j) {
87 VERIFY_IS_APPROX(dtensor(i,j), static_cast<double>(ftensor(i,j)));
88 }
89 }
90 }
91
92
test_small_to_big_type_cast()93 static void test_small_to_big_type_cast()
94 {
95 Tensor<float, 2> ftensor(20, 30);
96 ftensor.setRandom();
97 Tensor<double, 2> dtensor(20, 30);
98 dtensor = ftensor.cast<double>();
99
100 for (int i = 0; i < 20; ++i) {
101 for (int j = 0; j < 30; ++j) {
102 VERIFY_IS_APPROX(dtensor(i,j), static_cast<double>(ftensor(i,j)));
103 }
104 }
105 }
106
107
test_cxx11_tensor_casts()108 void test_cxx11_tensor_casts()
109 {
110 CALL_SUBTEST(test_simple_cast());
111 CALL_SUBTEST(test_vectorized_cast());
112 CALL_SUBTEST(test_float_to_int_cast());
113 CALL_SUBTEST(test_big_to_small_type_cast());
114 CALL_SUBTEST(test_small_to_big_type_cast());
115 }
116