// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2014 Benoit Steiner // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #include "main.h" #include using Eigen::Tensor; using Eigen::TensorMap; static void test_assign() { std::string data1[6]; TensorMap> mat1(data1, 2, 3); std::string data2[6]; const TensorMap> mat2(data2, 2, 3); for (int i = 0; i < 6; ++i) { std::ostringstream s1; s1 << "abc" << i*3; data1[i] = s1.str(); std::ostringstream s2; s2 << "def" << i*5; data2[i] = s2.str(); } Tensor rslt1; rslt1 = mat1; Tensor rslt2; rslt2 = mat2; Tensor rslt3 = mat1; Tensor rslt4 = mat2; Tensor rslt5(mat1); Tensor rslt6(mat2); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { VERIFY_IS_EQUAL(rslt1(i,j), data1[i+2*j]); VERIFY_IS_EQUAL(rslt2(i,j), data2[i+2*j]); VERIFY_IS_EQUAL(rslt3(i,j), data1[i+2*j]); VERIFY_IS_EQUAL(rslt4(i,j), data2[i+2*j]); VERIFY_IS_EQUAL(rslt5(i,j), data1[i+2*j]); VERIFY_IS_EQUAL(rslt6(i,j), data2[i+2*j]); } } } static void test_concat() { Tensor t1(2, 3); Tensor t2(2, 3); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { std::ostringstream s1; s1 << "abc" << i + j*2; t1(i, j) = s1.str(); std::ostringstream s2; s2 << "def" << i*5 + j*32; t2(i, j) = s2.str(); } } Tensor result = t1.concatenate(t2, 1); VERIFY_IS_EQUAL(result.dimension(0), 2); VERIFY_IS_EQUAL(result.dimension(1), 6); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { VERIFY_IS_EQUAL(result(i, j), t1(i, j)); VERIFY_IS_EQUAL(result(i, j+3), t2(i, j)); } } } static void test_slices() { Tensor data(2, 6); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { std::ostringstream s1; s1 << "abc" << i + j*2; data(i, j) = s1.str(); } } const Eigen::DSizes half_size(2, 3); const Eigen::DSizes first_half(0, 0); const Eigen::DSizes second_half(0, 3); Tensor t1 = data.slice(first_half, half_size); Tensor t2 = data.slice(second_half, half_size); for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { VERIFY_IS_EQUAL(data(i, j), t1(i, j)); VERIFY_IS_EQUAL(data(i, j+3), t2(i, j)); } } } static void test_additions() { Tensor data1(3); Tensor data2(3); for (int i = 0; i < 3; ++i) { data1(i) = "abc"; std::ostringstream s1; s1 << i; data2(i) = s1.str(); } Tensor sum = data1 + data2; for (int i = 0; i < 3; ++i) { std::ostringstream concat; concat << "abc" << i; std::string expected = concat.str(); VERIFY_IS_EQUAL(sum(i), expected); } } static void test_initialization() { Tensor a(2, 3); a.setConstant(std::string("foo")); for (int i = 0; i < 2*3; ++i) { VERIFY_IS_EQUAL(a(i), std::string("foo")); } } EIGEN_DECLARE_TEST(cxx11_tensor_of_strings) { // Beware: none of this is likely to ever work on a GPU. CALL_SUBTEST(test_assign()); CALL_SUBTEST(test_concat()); CALL_SUBTEST(test_slices()); CALL_SUBTEST(test_additions()); CALL_SUBTEST(test_initialization()); }