cxx11_tensor_trace.cpp File Reference
#include "main.h"
#include <Eigen/CXX11/Tensor>

Functions

template<int DataLayout>
static void test_0D_trace ()
 
template<int DataLayout>
static void test_all_dimensions_trace ()
 
template<int DataLayout>
static void test_simple_trace ()
 
template<int DataLayout>
static void test_trace_in_expr ()
 
 EIGEN_DECLARE_TEST (cxx11_tensor_trace)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( cxx11_tensor_trace  )
159  {
160  CALL_SUBTEST(test_0D_trace<ColMajor>());
161  CALL_SUBTEST(test_0D_trace<RowMajor>());
162  CALL_SUBTEST(test_all_dimensions_trace<ColMajor>());
163  CALL_SUBTEST(test_all_dimensions_trace<RowMajor>());
164  CALL_SUBTEST(test_simple_trace<ColMajor>());
165  CALL_SUBTEST(test_simple_trace<RowMajor>());
166  CALL_SUBTEST(test_trace_in_expr<ColMajor>());
167  CALL_SUBTEST(test_trace_in_expr<RowMajor>());
168 }
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST.

◆ test_0D_trace()

template<int DataLayout>
static void test_0D_trace ( )
static
18  {
20  tensor.setRandom();
22  Tensor<float, 0, DataLayout> result = tensor.trace(dims);
23  VERIFY_IS_EQUAL(result(), tensor());
24 }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & setRandom()
Definition: TensorBase.h:1049
The tensor class.
Definition: Tensor.h:68
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
std::array< T, N > array
Definition: EmulateArray.h:231

References Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_EQUAL.

◆ test_all_dimensions_trace()

template<int DataLayout>
static void test_all_dimensions_trace ( )
static
27  {
28  Tensor<float, 3, DataLayout> tensor1(5, 5, 5);
29  tensor1.setRandom();
30  Tensor<float, 0, DataLayout> result1 = tensor1.trace();
31  VERIFY_IS_EQUAL(result1.rank(), 0);
32  float sum = 0.0f;
33  for (int i = 0; i < 5; ++i) {
34  sum += tensor1(i, i, i);
35  }
36  VERIFY_IS_EQUAL(result1(), sum);
37 
38  Tensor<float, 5, DataLayout> tensor2(7, 7, 7, 7, 7);
39  tensor2.setRandom();
40  array<ptrdiff_t, 5> dims = {{2, 1, 0, 3, 4}};
41  Tensor<float, 0, DataLayout> result2 = tensor2.trace(dims);
42  VERIFY_IS_EQUAL(result2.rank(), 0);
43  sum = 0.0f;
44  for (int i = 0; i < 7; ++i) {
45  sum += tensor2(i, i, i, i, i);
46  }
47  VERIFY_IS_EQUAL(result2(), sum);
48 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rank() const
Definition: Tensor.h:98

References i, Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::rank(), Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_EQUAL.

◆ test_simple_trace()

template<int DataLayout>
static void test_simple_trace ( )
static
51  {
52  Tensor<float, 3, DataLayout> tensor1(3, 5, 3);
53  tensor1.setRandom();
54  array<ptrdiff_t, 2> dims1 = {{0, 2}};
55  Tensor<float, 1, DataLayout> result1 = tensor1.trace(dims1);
56  VERIFY_IS_EQUAL(result1.rank(), 1);
57  VERIFY_IS_EQUAL(result1.dimension(0), 5);
58  float sum = 0.0f;
59  for (int i = 0; i < 5; ++i) {
60  sum = 0.0f;
61  for (int j = 0; j < 3; ++j) {
62  sum += tensor1(j, i, j);
63  }
64  VERIFY_IS_EQUAL(result1(i), sum);
65  }
66 
67  Tensor<float, 4, DataLayout> tensor2(5, 5, 7, 7);
68  tensor2.setRandom();
69  array<ptrdiff_t, 2> dims2 = {{2, 3}};
70  Tensor<float, 2, DataLayout> result2 = tensor2.trace(dims2);
71  VERIFY_IS_EQUAL(result2.rank(), 2);
72  VERIFY_IS_EQUAL(result2.dimension(0), 5);
73  VERIFY_IS_EQUAL(result2.dimension(1), 5);
74  for (int i = 0; i < 5; ++i) {
75  for (int j = 0; j < 5; ++j) {
76  sum = 0.0f;
77  for (int k = 0; k < 7; ++k) {
78  sum += tensor2(i, j, k, k);
79  }
80  VERIFY_IS_EQUAL(result2(i, j), sum);
81  }
82  }
83 
84  array<ptrdiff_t, 2> dims3 = {{1, 0}};
85  Tensor<float, 2, DataLayout> result3 = tensor2.trace(dims3);
86  VERIFY_IS_EQUAL(result3.rank(), 2);
87  VERIFY_IS_EQUAL(result3.dimension(0), 7);
88  VERIFY_IS_EQUAL(result3.dimension(1), 7);
89  for (int i = 0; i < 7; ++i) {
90  for (int j = 0; j < 7; ++j) {
91  sum = 0.0f;
92  for (int k = 0; k < 5; ++k) {
93  sum += tensor2(k, k, i, j);
94  }
95  VERIFY_IS_EQUAL(result3(i, j), sum);
96  }
97  }
98 
99  Tensor<float, 5, DataLayout> tensor3(3, 7, 3, 7, 3);
100  tensor3.setRandom();
101  array<ptrdiff_t, 3> dims4 = {{0, 2, 4}};
102  Tensor<float, 2, DataLayout> result4 = tensor3.trace(dims4);
103  VERIFY_IS_EQUAL(result4.rank(), 2);
104  VERIFY_IS_EQUAL(result4.dimension(0), 7);
105  VERIFY_IS_EQUAL(result4.dimension(1), 7);
106  for (int i = 0; i < 7; ++i) {
107  for (int j = 0; j < 7; ++j) {
108  sum = 0.0f;
109  for (int k = 0; k < 3; ++k) {
110  sum += tensor3(k, i, k, j, k);
111  }
112  VERIFY_IS_EQUAL(result4(i, j), sum);
113  }
114  }
115 
116  Tensor<float, 5, DataLayout> tensor4(3, 7, 4, 7, 5);
117  tensor4.setRandom();
118  array<ptrdiff_t, 2> dims5 = {{1, 3}};
119  Tensor<float, 3, DataLayout> result5 = tensor4.trace(dims5);
120  VERIFY_IS_EQUAL(result5.rank(), 3);
121  VERIFY_IS_EQUAL(result5.dimension(0), 3);
122  VERIFY_IS_EQUAL(result5.dimension(1), 4);
123  VERIFY_IS_EQUAL(result5.dimension(2), 5);
124  for (int i = 0; i < 3; ++i) {
125  for (int j = 0; j < 4; ++j) {
126  for (int k = 0; k < 5; ++k) {
127  sum = 0.0f;
128  for (int l = 0; l < 7; ++l) {
129  sum += tensor4(i, l, j, l, k);
130  }
131  VERIFY_IS_EQUAL(result5(i, j, k), sum);
132  }
133  }
134  }
135 }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const
Definition: Tensor.h:99
char char char int int * k
Definition: level2_impl.h:374
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimension(), i, j, k, Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::rank(), Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_EQUAL.

◆ test_trace_in_expr()

template<int DataLayout>
static void test_trace_in_expr ( )
static
138  {
139  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 3);
140  tensor.setRandom();
141  array<ptrdiff_t, 2> dims = {{1, 3}};
142  Tensor<float, 2, DataLayout> result(2, 5);
143  result = result.constant(1.0f) - tensor.trace(dims);
144  VERIFY_IS_EQUAL(result.rank(), 2);
145  VERIFY_IS_EQUAL(result.dimension(0), 2);
146  VERIFY_IS_EQUAL(result.dimension(1), 5);
147  float sum = 0.0f;
148  for (int i = 0; i < 2; ++i) {
149  for (int j = 0; j < 5; ++j) {
150  sum = 0.0f;
151  for (int k = 0; k < 3; ++k) {
152  sum += tensor(i, k, j, k);
153  }
154  VERIFY_IS_EQUAL(result(i, j), 1.0f - sum);
155  }
156  }
157 }

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimension(), i, j, k, Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::rank(), Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_EQUAL.