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

Functions

template<int DataLayout>
static void test_evals ()
 
template<int DataLayout>
static void test_expr ()
 
template<int DataLayout>
static void test_modes ()
 
template<int DataLayout>
static void test_strides ()
 
 EIGEN_DECLARE_TEST (cxx11_tensor_convolution)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( cxx11_tensor_convolution  )
136  {
137  CALL_SUBTEST(test_evals<ColMajor>());
138  CALL_SUBTEST(test_evals<RowMajor>());
139  CALL_SUBTEST(test_expr<ColMajor>());
140  CALL_SUBTEST(test_expr<RowMajor>());
141  CALL_SUBTEST(test_modes<ColMajor>());
142  CALL_SUBTEST(test_modes<RowMajor>());
143  CALL_SUBTEST(test_strides<ColMajor>());
144  CALL_SUBTEST(test_strides<RowMajor>());
145 }
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST.

◆ test_evals()

template<int DataLayout>
static void test_evals ( )
static
18  {
19  Tensor<float, 2, DataLayout> input(3, 3);
21 
22  input.setRandom();
23  kernel.setRandom();
24 
25  Tensor<float, 2, DataLayout> result(2, 3);
26  result.setZero();
28  dims3[0] = 0;
29 
30  typedef TensorEvaluator<decltype(input.convolve(kernel, dims3)), DefaultDevice> Evaluator;
31  Evaluator eval(input.convolve(kernel, dims3), DefaultDevice());
32  eval.evalTo(result.data());
33  EIGEN_STATIC_ASSERT(Evaluator::NumDims == 2ul, YOU_MADE_A_PROGRAMMING_MISTAKE);
34  VERIFY_IS_EQUAL(eval.dimensions()[0], 2);
35  VERIFY_IS_EQUAL(eval.dimensions()[1], 3);
36 
37  VERIFY_IS_APPROX(result(0, 0), input(0, 0) * kernel(0) + input(1, 0) * kernel(1)); // index 0
38  VERIFY_IS_APPROX(result(0, 1), input(0, 1) * kernel(0) + input(1, 1) * kernel(1)); // index 2
39  VERIFY_IS_APPROX(result(0, 2), input(0, 2) * kernel(0) + input(1, 2) * kernel(1)); // index 4
40  VERIFY_IS_APPROX(result(1, 0), input(1, 0) * kernel(0) + input(2, 0) * kernel(1)); // index 1
41  VERIFY_IS_APPROX(result(1, 1), input(1, 1) * kernel(0) + input(2, 1) * kernel(1)); // index 3
42  VERIFY_IS_APPROX(result(1, 2), input(1, 2) * kernel(0) + input(2, 2) * kernel(1)); // index 5
43 }
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
The tensor class.
Definition: Tensor.h:68
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
std::array< T, N > array
Definition: EmulateArray.h:231
internal::nested_eval< T, 1 >::type eval(const T &xpr)
Definition: sparse_permutations.cpp:47
Definition: TensorDeviceDefault.h:19
A cost model used to limit the number of threads used for evaluating tensor expression.
Definition: TensorEvaluator.h:31

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::data(), EIGEN_STATIC_ASSERT, eval(), Eigen::TensorBase< Derived, AccessLevel >::setRandom(), Eigen::TensorBase< Derived, AccessLevel >::setZero(), VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

◆ test_expr()

template<int DataLayout>
static void test_expr ( )
static
46  {
47  Tensor<float, 2, DataLayout> input(3, 3);
48  Tensor<float, 2, DataLayout> kernel(2, 2);
49  input.setRandom();
50  kernel.setRandom();
51 
52  Tensor<float, 2, DataLayout> result(2, 2);
54  dims[0] = 0;
55  dims[1] = 1;
56  result = input.convolve(kernel, dims);
57 
58  VERIFY_IS_APPROX(result(0, 0), input(0, 0) * kernel(0, 0) + input(0, 1) * kernel(0, 1) + input(1, 0) * kernel(1, 0) +
59  input(1, 1) * kernel(1, 1));
60  VERIFY_IS_APPROX(result(0, 1), input(0, 1) * kernel(0, 0) + input(0, 2) * kernel(0, 1) + input(1, 1) * kernel(1, 0) +
61  input(1, 2) * kernel(1, 1));
62  VERIFY_IS_APPROX(result(1, 0), input(1, 0) * kernel(0, 0) + input(1, 1) * kernel(0, 1) + input(2, 0) * kernel(1, 0) +
63  input(2, 1) * kernel(1, 1));
64  VERIFY_IS_APPROX(result(1, 1), input(1, 1) * kernel(0, 0) + input(1, 2) * kernel(0, 1) + input(2, 1) * kernel(1, 0) +
65  input(2, 2) * kernel(1, 1));
66 }

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

◆ test_modes()

template<int DataLayout>
static void test_modes ( )
static
69  {
72  input(0) = 1.0f;
73  input(1) = 2.0f;
74  input(2) = 3.0f;
75  kernel(0) = 0.5f;
76  kernel(1) = 1.0f;
77  kernel(2) = 0.0f;
78 
80  dims[0] = 0;
82 
83  // Emulate VALID mode (as defined in
84  // http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html).
85  padding[0] = std::make_pair(0, 0);
87  valid = input.pad(padding).convolve(kernel, dims);
88  VERIFY_IS_EQUAL(valid.dimension(0), 1);
89  VERIFY_IS_APPROX(valid(0), 2.5f);
90 
91  // Emulate SAME mode (as defined in
92  // http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html).
93  padding[0] = std::make_pair(1, 1);
95  same = input.pad(padding).convolve(kernel, dims);
96  VERIFY_IS_EQUAL(same.dimension(0), 3);
97  VERIFY_IS_APPROX(same(0), 1.0f);
98  VERIFY_IS_APPROX(same(1), 2.5f);
99  VERIFY_IS_APPROX(same(2), 4.0f);
100 
101  // Emulate FULL mode (as defined in
102  // http://docs.scipy.org/doc/numpy/reference/generated/numpy.convolve.html).
103  padding[0] = std::make_pair(2, 2);
105  full = input.pad(padding).convolve(kernel, dims);
106  VERIFY_IS_EQUAL(full.dimension(0), 5);
107  VERIFY_IS_APPROX(full(0), 0.0f);
108  VERIFY_IS_APPROX(full(1), 1.0f);
109  VERIFY_IS_APPROX(full(2), 2.5f);
110  VERIFY_IS_APPROX(full(3), 4.0f);
111  VERIFY_IS_APPROX(full(4), 1.5f);
112 }

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimension(), VERIFY_IS_APPROX, and VERIFY_IS_EQUAL.

◆ test_strides()

template<int DataLayout>
static void test_strides ( )
static
115  {
118  input.setRandom();
119  kernel.setRandom();
120 
122  dims[0] = 0;
123  Eigen::array<ptrdiff_t, 1> stride_of_3;
124  stride_of_3[0] = 3;
125  Eigen::array<ptrdiff_t, 1> stride_of_2;
126  stride_of_2[0] = 2;
127 
129  result = input.stride(stride_of_3).convolve(kernel, dims).stride(stride_of_2);
130 
131  VERIFY_IS_EQUAL(result.dimension(0), 2);
132  VERIFY_IS_APPROX(result(0), (input(0) * kernel(0) + input(3) * kernel(1) + input(6) * kernel(2)));
133  VERIFY_IS_APPROX(result(1), (input(6) * kernel(0) + input(9) * kernel(1) + input(12) * kernel(2)));
134 }
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const TensorStridingOp< const Strides, const Derived > stride(const Strides &strides) const
Definition: TensorBase.h:1198
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index dimension(std::size_t n) const
Definition: Tensor.h:99

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