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

Functions

static void test_additions ()
 
static void test_abs ()
 
static void test_arg ()
 
static void test_conjugate ()
 
static void test_contractions ()
 
 EIGEN_DECLARE_TEST (cxx11_tensor_of_complex)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( cxx11_tensor_of_complex  )
102  {
108 }
static void test_conjugate()
Definition: cxx11_tensor_of_complex.cpp:59
static void test_contractions()
Definition: cxx11_tensor_of_complex.cpp:77
static void test_additions()
Definition: cxx11_tensor_of_complex.cpp:17
static void test_arg()
Definition: cxx11_tensor_of_complex.cpp:45
static void test_abs()
Definition: cxx11_tensor_of_complex.cpp:31
#define CALL_SUBTEST(FUNC)
Definition: main.h:382

References CALL_SUBTEST, test_abs(), test_additions(), test_arg(), test_conjugate(), and test_contractions().

◆ test_abs()

static void test_abs ( )
static
31  {
32  Tensor<std::complex<float>, 1> data1(3);
33  Tensor<std::complex<double>, 1> data2(3);
34  data1.setRandom();
35  data2.setRandom();
36 
37  Tensor<float, 1> abs1 = data1.abs();
38  Tensor<double, 1> abs2 = data2.abs();
39  for (int i = 0; i < 3; ++i) {
40  VERIFY_IS_APPROX(abs1(i), std::abs(data1(i)));
41  VERIFY_IS_APPROX(abs2(i), std::abs(data2(i)));
42  }
43 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
int i
Definition: BiCGSTAB_step_by_step.cpp:9
The tensor class.
Definition: Tensor.h:68
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102

References abs(), Eigen::numext::abs2(), i, Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().

◆ test_additions()

static void test_additions ( )
static
17  {
18  Tensor<std::complex<float>, 1> data1(3);
19  Tensor<std::complex<float>, 1> data2(3);
20  for (int i = 0; i < 3; ++i) {
21  data1(i) = std::complex<float>(i, -i);
22  data2(i) = std::complex<float>(i, 7 * i);
23  }
24 
25  Tensor<std::complex<float>, 1> sum = data1 + data2;
26  for (int i = 0; i < 3; ++i) {
27  VERIFY_IS_EQUAL(sum(i), std::complex<float>(2 * i, 6 * i));
28  }
29 }
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367

References i, and VERIFY_IS_EQUAL.

Referenced by EIGEN_DECLARE_TEST().

◆ test_arg()

static void test_arg ( )
static
45  {
46  Tensor<std::complex<float>, 1> data1(3);
47  Tensor<std::complex<double>, 1> data2(3);
48  data1.setRandom();
49  data2.setRandom();
50 
51  Tensor<float, 1> arg1 = data1.arg();
52  Tensor<double, 1> arg2 = data2.arg();
53  for (int i = 0; i < 3; ++i) {
54  VERIFY_IS_APPROX(arg1(i), std::arg(data1(i)));
55  VERIFY_IS_APPROX(arg2(i), std::arg(data2(i)));
56  }
57 }

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

Referenced by EIGEN_DECLARE_TEST().

◆ test_conjugate()

static void test_conjugate ( )
static
59  {
60  Tensor<std::complex<float>, 1> data1(3);
61  Tensor<std::complex<double>, 1> data2(3);
62  Tensor<int, 1> data3(3);
63  data1.setRandom();
64  data2.setRandom();
65  data3.setRandom();
66 
67  Tensor<std::complex<float>, 1> conj1 = data1.conjugate();
68  Tensor<std::complex<double>, 1> conj2 = data2.conjugate();
69  Tensor<int, 1> conj3 = data3.conjugate();
70  for (int i = 0; i < 3; ++i) {
71  VERIFY_IS_APPROX(conj1(i), std::conj(data1(i)));
72  VERIFY_IS_APPROX(conj2(i), std::conj(data2(i)));
73  VERIFY_IS_APPROX(conj3(i), data3(i));
74  }
75 }
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133

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

Referenced by EIGEN_DECLARE_TEST().

◆ test_contractions()

static void test_contractions ( )
static
77  {
78  Tensor<std::complex<float>, 4> t_left(30, 50, 8, 31);
79  Tensor<std::complex<float>, 5> t_right(8, 31, 7, 20, 10);
80  Tensor<std::complex<float>, 5> t_result(30, 50, 7, 20, 10);
81 
82  t_left.setRandom();
83  t_right.setRandom();
84 
86  MapXcf m_left(t_left.data(), 1500, 248);
87  MapXcf m_right(t_right.data(), 248, 1400);
88  Matrix<std::complex<float>, Dynamic, Dynamic> m_result(1500, 1400);
89 
90  // This contraction should be equivalent to a regular matrix multiplication
93  dims[0] = DimPair(2, 0);
94  dims[1] = DimPair(3, 1);
95  t_result = t_left.contract(t_right, dims);
96  m_result = m_left * m_right;
97  for (int i = 0; i < t_result.dimensions().TotalSize(); i++) {
98  VERIFY_IS_APPROX(t_result.data()[i], m_result.data()[i]);
99  }
100 }
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Tensor< float, 1 >::DimensionPair DimPair
Definition: cxx11_tensor_contraction.cpp:17
std::array< T, N > array
Definition: EmulateArray.h:231
const int Dynamic
Definition: Constants.h:25

References Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::data(), Eigen::PlainObjectBase< Derived >::data(), Eigen::Tensor< Scalar_, NumIndices_, Options_, IndexType_ >::dimensions(), Eigen::Dynamic, i, Eigen::TensorBase< Derived, AccessLevel >::setRandom(), and VERIFY_IS_APPROX.

Referenced by EIGEN_DECLARE_TEST().