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