• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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