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

Functions

template<int DataLayout>
static void test_simple_broadcasting ()
 
template<int DataLayout>
static void test_vectorized_broadcasting ()
 
template<int DataLayout>
static void test_static_broadcasting ()
 
template<int DataLayout>
static void test_fixed_size_broadcasting ()
 
template<int DataLayout>
static void test_simple_broadcasting_one_by_n ()
 
template<int DataLayout>
static void test_simple_broadcasting_n_by_one ()
 
template<int DataLayout>
static void test_size_one_broadcasting ()
 
template<int DataLayout>
static void test_simple_broadcasting_one_by_n_by_one_1d ()
 
template<int DataLayout>
static void test_simple_broadcasting_one_by_n_by_one_2d ()
 
 EIGEN_DECLARE_TEST (cxx11_tensor_broadcasting)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( cxx11_tensor_broadcasting  )
293  {
294  CALL_SUBTEST(test_simple_broadcasting<ColMajor>());
295  CALL_SUBTEST(test_simple_broadcasting<RowMajor>());
296  CALL_SUBTEST(test_vectorized_broadcasting<ColMajor>());
297  CALL_SUBTEST(test_vectorized_broadcasting<RowMajor>());
298  CALL_SUBTEST(test_static_broadcasting<ColMajor>());
299  CALL_SUBTEST(test_static_broadcasting<RowMajor>());
300  CALL_SUBTEST(test_fixed_size_broadcasting<ColMajor>());
301  CALL_SUBTEST(test_fixed_size_broadcasting<RowMajor>());
302  CALL_SUBTEST(test_simple_broadcasting_one_by_n<RowMajor>());
303  CALL_SUBTEST(test_simple_broadcasting_n_by_one<RowMajor>());
304  CALL_SUBTEST(test_simple_broadcasting_one_by_n<ColMajor>());
305  CALL_SUBTEST(test_simple_broadcasting_n_by_one<ColMajor>());
306  CALL_SUBTEST(test_simple_broadcasting_one_by_n_by_one_1d<ColMajor>());
307  CALL_SUBTEST(test_simple_broadcasting_one_by_n_by_one_2d<ColMajor>());
308  CALL_SUBTEST(test_simple_broadcasting_one_by_n_by_one_1d<RowMajor>());
309  CALL_SUBTEST(test_simple_broadcasting_one_by_n_by_one_2d<RowMajor>());
310  CALL_SUBTEST(test_size_one_broadcasting<ColMajor>());
311  CALL_SUBTEST(test_size_one_broadcasting<RowMajor>());
312 }
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST.

◆ test_fixed_size_broadcasting()

template<int DataLayout>
static void test_fixed_size_broadcasting ( )
static
149  {
150  // Need to add a [] operator to the Size class for this to work
151 #if 0
153  t1.setRandom();
155  t2 = t2.constant(20.0f);
156 
157  Tensor<float, 1, DataLayout> t3 = t1 + t2.broadcast(Eigen::array<int, 1>{{10}});
158  for (int i = 0; i < 10; ++i) {
159  VERIFY_IS_APPROX(t3(i), t1(i) + t2(0));
160  }
161 
163  Tensor<float, 1, DataLayout> t5 = t1 + t4.broadcast(Eigen::array<int, 1>{{10}});
164  for (int i = 0; i < 10; ++i) {
165  VERIFY_IS_APPROX(t5(i), t1(i) + t2(0));
166  }
167 #endif
168 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
The fixed sized version of the tensor class.
Definition: TensorFixedSize.h:30
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar * data()
Definition: TensorFixedSize.h:68
A tensor expression mapping an existing array of data.
Definition: TensorMap.h:33
The tensor class.
Definition: Tensor.h:68
static const int DataLayout
Definition: cxx11_tensor_image_patch_sycl.cpp:24
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
std::array< T, N > array
Definition: EmulateArray.h:231

References Eigen::TensorFixedSize< Scalar_, Dimensions_, Options_, IndexType >::data(), DataLayout, i, Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_APPROX.

◆ test_simple_broadcasting()

template<int DataLayout>
static void test_simple_broadcasting ( )
static
17  {
18  Tensor<float, 4, DataLayout> tensor(2, 3, 5, 7);
19  tensor.setRandom();
20  array<ptrdiff_t, 4> broadcasts;
21  broadcasts[0] = 1;
22  broadcasts[1] = 1;
23  broadcasts[2] = 1;
24  broadcasts[3] = 1;
25 
26  Tensor<float, 4, DataLayout> no_broadcast;
27  no_broadcast = tensor.broadcast(broadcasts);
28 
29  VERIFY_IS_EQUAL(no_broadcast.dimension(0), 2);
30  VERIFY_IS_EQUAL(no_broadcast.dimension(1), 3);
31  VERIFY_IS_EQUAL(no_broadcast.dimension(2), 5);
32  VERIFY_IS_EQUAL(no_broadcast.dimension(3), 7);
33 
34  for (int i = 0; i < 2; ++i) {
35  for (int j = 0; j < 3; ++j) {
36  for (int k = 0; k < 5; ++k) {
37  for (int l = 0; l < 7; ++l) {
38  VERIFY_IS_EQUAL(tensor(i, j, k, l), no_broadcast(i, j, k, l));
39  }
40  }
41  }
42  }
43 
44  broadcasts[0] = 2;
45  broadcasts[1] = 3;
46  broadcasts[2] = 1;
47  broadcasts[3] = 4;
49  broadcast = tensor.broadcast(broadcasts);
50 
51  VERIFY_IS_EQUAL(broadcast.dimension(0), 4);
52  VERIFY_IS_EQUAL(broadcast.dimension(1), 9);
53  VERIFY_IS_EQUAL(broadcast.dimension(2), 5);
54  VERIFY_IS_EQUAL(broadcast.dimension(3), 28);
55 
56  for (int i = 0; i < 4; ++i) {
57  for (int j = 0; j < 9; ++j) {
58  for (int k = 0; k < 5; ++k) {
59  for (int l = 0; l < 28; ++l) {
60  VERIFY_IS_EQUAL(tensor(i % 2, j % 3, k % 5, l % 7), broadcast(i, j, k, l));
61  }
62  }
63  }
64  }
65 }
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
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

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

◆ test_simple_broadcasting_n_by_one()

template<int DataLayout>
static void test_simple_broadcasting_n_by_one ( )
static
199  {
200  Tensor<float, 4, DataLayout> tensor(7, 3, 5, 1);
201  tensor.setRandom();
202  array<ptrdiff_t, 4> broadcasts;
203  broadcasts[0] = 1;
204  broadcasts[1] = 1;
205  broadcasts[2] = 1;
206  broadcasts[3] = 19;
208  broadcast = tensor.broadcast(broadcasts);
209 
210  VERIFY_IS_EQUAL(broadcast.dimension(0), 7);
211  VERIFY_IS_EQUAL(broadcast.dimension(1), 3);
212  VERIFY_IS_EQUAL(broadcast.dimension(2), 5);
213  VERIFY_IS_EQUAL(broadcast.dimension(3), 19);
214 
215  for (int i = 0; i < 7; ++i) {
216  for (int j = 0; j < 3; ++j) {
217  for (int k = 0; k < 5; ++k) {
218  for (int l = 0; l < 19; ++l) {
219  VERIFY_IS_EQUAL(tensor(i % 7, j % 3, k % 5, l % 1), broadcast(i, j, k, l));
220  }
221  }
222  }
223  }
224 }

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

◆ test_simple_broadcasting_one_by_n()

template<int DataLayout>
static void test_simple_broadcasting_one_by_n ( )
static
171  {
172  Tensor<float, 4, DataLayout> tensor(1, 13, 5, 7);
173  tensor.setRandom();
174  array<ptrdiff_t, 4> broadcasts;
175  broadcasts[0] = 9;
176  broadcasts[1] = 1;
177  broadcasts[2] = 1;
178  broadcasts[3] = 1;
180  broadcast = tensor.broadcast(broadcasts);
181 
182  VERIFY_IS_EQUAL(broadcast.dimension(0), 9);
183  VERIFY_IS_EQUAL(broadcast.dimension(1), 13);
184  VERIFY_IS_EQUAL(broadcast.dimension(2), 5);
185  VERIFY_IS_EQUAL(broadcast.dimension(3), 7);
186 
187  for (int i = 0; i < 9; ++i) {
188  for (int j = 0; j < 13; ++j) {
189  for (int k = 0; k < 5; ++k) {
190  for (int l = 0; l < 7; ++l) {
191  VERIFY_IS_EQUAL(tensor(i % 1, j % 13, k % 5, l % 7), broadcast(i, j, k, l));
192  }
193  }
194  }
195  }
196 }

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

◆ test_simple_broadcasting_one_by_n_by_one_1d()

template<int DataLayout>
static void test_simple_broadcasting_one_by_n_by_one_1d ( )
static
242  {
243  Tensor<float, 3, DataLayout> tensor(1, 7, 1);
244  tensor.setRandom();
245  array<ptrdiff_t, 3> broadcasts;
246  broadcasts[0] = 5;
247  broadcasts[1] = 1;
248  broadcasts[2] = 13;
249  Tensor<float, 3, DataLayout> broadcasted;
250  broadcasted = tensor.broadcast(broadcasts);
251 
252  VERIFY_IS_EQUAL(broadcasted.dimension(0), 5);
253  VERIFY_IS_EQUAL(broadcasted.dimension(1), 7);
254  VERIFY_IS_EQUAL(broadcasted.dimension(2), 13);
255 
256  for (int i = 0; i < 5; ++i) {
257  for (int j = 0; j < 7; ++j) {
258  for (int k = 0; k < 13; ++k) {
259  VERIFY_IS_EQUAL(tensor(0, j % 7, 0), broadcasted(i, j, k));
260  }
261  }
262  }
263 }

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

◆ test_simple_broadcasting_one_by_n_by_one_2d()

template<int DataLayout>
static void test_simple_broadcasting_one_by_n_by_one_2d ( )
static
266  {
267  Tensor<float, 4, DataLayout> tensor(1, 7, 13, 1);
268  tensor.setRandom();
269  array<ptrdiff_t, 4> broadcasts;
270  broadcasts[0] = 5;
271  broadcasts[1] = 1;
272  broadcasts[2] = 1;
273  broadcasts[3] = 19;
275  broadcast = tensor.broadcast(broadcasts);
276 
277  VERIFY_IS_EQUAL(broadcast.dimension(0), 5);
278  VERIFY_IS_EQUAL(broadcast.dimension(1), 7);
279  VERIFY_IS_EQUAL(broadcast.dimension(2), 13);
280  VERIFY_IS_EQUAL(broadcast.dimension(3), 19);
281 
282  for (int i = 0; i < 5; ++i) {
283  for (int j = 0; j < 7; ++j) {
284  for (int k = 0; k < 13; ++k) {
285  for (int l = 0; l < 19; ++l) {
286  VERIFY_IS_EQUAL(tensor(0, j % 7, k % 13, 0), broadcast(i, j, k, l));
287  }
288  }
289  }
290  }
291 }

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

◆ test_size_one_broadcasting()

template<int DataLayout>
static void test_size_one_broadcasting ( )
static
227  {
229  tensor.setRandom();
230  array<ptrdiff_t, 1> broadcasts = {64};
232  broadcast = tensor.broadcast(broadcasts);
233 
234  VERIFY_IS_EQUAL(broadcast.dimension(0), broadcasts[0]);
235 
236  for (int i = 0; i < broadcasts[0]; ++i) {
237  VERIFY_IS_EQUAL(tensor(0), broadcast(i));
238  }
239 }

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

◆ test_static_broadcasting()

template<int DataLayout>
static void test_static_broadcasting ( )
static
110  {
111  Tensor<float, 3, DataLayout> tensor(8, 3, 5);
112  tensor.setRandom();
113 
116  broadcast = tensor.broadcast(broadcasts);
117 
118  VERIFY_IS_EQUAL(broadcast.dimension(0), 16);
119  VERIFY_IS_EQUAL(broadcast.dimension(1), 9);
120  VERIFY_IS_EQUAL(broadcast.dimension(2), 20);
121 
122  for (int i = 0; i < 16; ++i) {
123  for (int j = 0; j < 9; ++j) {
124  for (int k = 0; k < 20; ++k) {
125  VERIFY_IS_EQUAL(tensor(i % 8, j % 3, k % 5), broadcast(i, j, k));
126  }
127  }
128  }
129 
130  tensor.resize(11, 3, 5);
131 
132  tensor.setRandom();
133  broadcast = tensor.broadcast(broadcasts);
134 
135  VERIFY_IS_EQUAL(broadcast.dimension(0), 22);
136  VERIFY_IS_EQUAL(broadcast.dimension(1), 9);
137  VERIFY_IS_EQUAL(broadcast.dimension(2), 20);
138 
139  for (int i = 0; i < 22; ++i) {
140  for (int j = 0; j < 9; ++j) {
141  for (int k = 0; k < 20; ++k) {
142  VERIFY_IS_EQUAL(tensor(i % 11, j % 3, k % 5), broadcast(i, j, k));
143  }
144  }
145  }
146 }
Definition: TensorIndexList.h:271
Definition: TensorIndexList.h:39

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

◆ test_vectorized_broadcasting()

template<int DataLayout>
static void test_vectorized_broadcasting ( )
static
68  {
69  Tensor<float, 3, DataLayout> tensor(8, 3, 5);
70  tensor.setRandom();
71  array<ptrdiff_t, 3> broadcasts;
72  broadcasts[0] = 2;
73  broadcasts[1] = 3;
74  broadcasts[2] = 4;
75 
77  broadcast = tensor.broadcast(broadcasts);
78 
79  VERIFY_IS_EQUAL(broadcast.dimension(0), 16);
80  VERIFY_IS_EQUAL(broadcast.dimension(1), 9);
81  VERIFY_IS_EQUAL(broadcast.dimension(2), 20);
82 
83  for (int i = 0; i < 16; ++i) {
84  for (int j = 0; j < 9; ++j) {
85  for (int k = 0; k < 20; ++k) {
86  VERIFY_IS_EQUAL(tensor(i % 8, j % 3, k % 5), broadcast(i, j, k));
87  }
88  }
89  }
90 
91  tensor.resize(11, 3, 5);
92 
93  tensor.setRandom();
94  broadcast = tensor.broadcast(broadcasts);
95 
96  VERIFY_IS_EQUAL(broadcast.dimension(0), 22);
97  VERIFY_IS_EQUAL(broadcast.dimension(1), 9);
98  VERIFY_IS_EQUAL(broadcast.dimension(2), 20);
99 
100  for (int i = 0; i < 22; ++i) {
101  for (int j = 0; j < 9; ++j) {
102  for (int k = 0; k < 20; ++k) {
103  VERIFY_IS_EQUAL(tensor(i % 11, j % 3, k % 5), broadcast(i, j, k));
104  }
105  }
106  }
107 }

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