12b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This file is part of Eigen, a lightweight C++ template library
22b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// for linear algebra.
32b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
42b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Copyright (C) 2014 Benoit Steiner <benoit.steiner.goog@gmail.com>
52b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang//
62b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// This Source Code Form is subject to the terms of the Mozilla
72b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// Public License v. 2.0. If a copy of the MPL was not distributed
82b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
92b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include "main.h"
112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#include <Eigen/CXX11/Tensor>
132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangusing Eigen::Tensor;
152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangusing Eigen::TensorMap;
162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic void test_additions()
202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> data1(3);
222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> data2(3);
232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  for (int i = 0; i < 3; ++i) {
242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    data1(i) = std::complex<float>(i, -i);
252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    data2(i) = std::complex<float>(i, 7 * i);
262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> sum = data1 + data2;
292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  for (int i = 0; i < 3; ++i) {
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_EQUAL(sum(i),  std::complex<float>(2*i, 6*i));
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
352b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic void test_abs()
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> data1(3);
382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<double>, 1> data2(3);
392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  data1.setRandom();
402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  data2.setRandom();
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<float, 1> abs1 = data1.abs();
432b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<double, 1> abs2 = data2.abs();
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  for (int i = 0; i < 3; ++i) {
452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(abs1(i), std::abs(data1(i)));
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(abs2(i), std::abs(data2(i)));
472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic void test_conjugate()
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> data1(3);
542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<double>, 1> data2(3);
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<int, 1> data3(3);
562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  data1.setRandom();
572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  data2.setRandom();
582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  data3.setRandom();
592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 1> conj1 = data1.conjugate();
612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<double>, 1> conj2 = data2.conjugate();
622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<int, 1> conj3 = data3.conjugate();
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  for (int i = 0; i < 3; ++i) {
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(conj1(i), std::conj(data1(i)));
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(conj2(i), std::conj(data2(i)));
662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(conj3(i), data3(i));
672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangstatic void test_contractions()
712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 4> t_left(30, 50, 8, 31);
732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 5> t_right(8, 31, 7, 20, 10);
742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Tensor<std::complex<float>, 5> t_result(30, 50, 7, 20, 10);
752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  t_left.setRandom();
772b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  t_right.setRandom();
782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Map<Matrix<std::complex<float>, Dynamic, Dynamic>> MapXcf;
802b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  MapXcf m_left(t_left.data(), 1500, 248);
812b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  MapXcf m_right(t_right.data(), 248, 1400);
822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Matrix<std::complex<float>, Dynamic, Dynamic> m_result(1500, 1400);
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
842b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  // This contraction should be equivalent to a regular matrix multiplication
852b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  typedef Tensor<float, 1>::DimensionPair DimPair;
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  Eigen::array<DimPair, 2> dims;
872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  dims[0] = DimPair(2, 0);
882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  dims[1] = DimPair(3, 1);
892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  t_result = t_left.contract(t_right, dims);
902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  m_result = m_left * m_right;
912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  for (int i = 0; i < t_result.dimensions().TotalSize(); i++) {
922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    VERIFY_IS_APPROX(t_result.data()[i], m_result.data()[i]);
932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  }
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wangvoid test_cxx11_tensor_of_complex()
982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang{
992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CALL_SUBTEST(test_additions());
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CALL_SUBTEST(test_abs());
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CALL_SUBTEST(test_conjugate());
1022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  CALL_SUBTEST(test_contractions());
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang}
104