// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2013 Christian Seiler <christian@iwakd.de>
//
// 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 <Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::RowMajor;
static void test_0d()
{
Tensor<
int,
0> scalar1;
Tensor<
int,
0, RowMajor> scalar2;
Tensor<
int,
0> scalar3;
Tensor<
int,
0, RowMajor> scalar4;
scalar3.resize();
scalar4.resize();
scalar1() =
7;
scalar2() =
13;
scalar3.setValues(
17);
scalar4.setZero();
VERIFY_IS_EQUAL(scalar1.rank(),
0);
VERIFY_IS_EQUAL(scalar1.size(),
1);
VERIFY_IS_EQUAL(scalar1(),
7);
VERIFY_IS_EQUAL(scalar2(),
13);
VERIFY_IS_EQUAL(scalar3(),
17);
VERIFY_IS_EQUAL(scalar4(),
0);
Tensor<
int,
0> scalar5(scalar1);
VERIFY_IS_EQUAL(scalar5(),
7);
VERIFY_IS_EQUAL(scalar5.data()[
0],
7);
}
static void test_1d()
{
Tensor<
int,
1> vec1(
6);
Tensor<
int,
1, RowMajor> vec2(
6);
Tensor<
int,
1> vec3;
Tensor<
int,
1, RowMajor> vec4;
vec3.resize(
6);
vec4.resize(
6);
vec1(
0) =
4; vec2(
0) =
0; vec3(
0) =
5;
vec1(
1) =
8; vec2(
1) =
1; vec3(
1) =
4;
vec1(
2) =
15; vec2(
2) =
2; vec3(
2) =
3;
vec1(
3) =
16; vec2(
3) =
3; vec3(
3) =
2;
vec1(
4) =
23; vec2(
4) =
4; vec3(
4) =
1;
vec1(
5) =
42; vec2(
5) =
5; vec3(
5) =
0;
vec4.setZero();
VERIFY_IS_EQUAL((vec1.rank()),
1);
VERIFY_IS_EQUAL((vec1.size()),
6);
VERIFY_IS_EQUAL((vec1.dimensions()[
0]),
6);
VERIFY_IS_EQUAL((vec1[
0]),
4);
VERIFY_IS_EQUAL((vec1[
1]),
8);
VERIFY_IS_EQUAL((vec1[
2]),
15);
VERIFY_IS_EQUAL((vec1[
3]),
16);
VERIFY_IS_EQUAL((vec1[
4]),
23);
VERIFY_IS_EQUAL((vec1[
5]),
42);
VERIFY_IS_EQUAL((vec2[
0]),
0);
VERIFY_IS_EQUAL((vec2[
1]),
1);
VERIFY_IS_EQUAL((vec2[
2]),
2);
VERIFY_IS_EQUAL((vec2[
3]),
3);
VERIFY_IS_EQUAL((vec2[
4]),
4);
VERIFY_IS_EQUAL((vec2[
5]),
5);
VERIFY_IS_EQUAL((vec3[
0]),
5);
VERIFY_IS_EQUAL((vec3[
1]),
4);
VERIFY_IS_EQUAL((vec3[
2]),
3);
VERIFY_IS_EQUAL((vec3[
3]),
2);
VERIFY_IS_EQUAL((vec3[
4]),
1);
VERIFY_IS_EQUAL((vec3[
5]),
0);
VERIFY_IS_EQUAL((vec4[
0]),
0);
VERIFY_IS_EQUAL((vec4[
1]),
0);
VERIFY_IS_EQUAL((vec4[
2]),
0);
VERIFY_IS_EQUAL((vec4[
3]),
0);
VERIFY_IS_EQUAL((vec4[
4]),
0);
VERIFY_IS_EQUAL((vec4[
5]),
0);
Tensor<
int,
1> vec5(vec1);
VERIFY_IS_EQUAL((vec5(
0)),
4);
VERIFY_IS_EQUAL((vec5(
1)),
8);
VERIFY_IS_EQUAL((vec5(
2)),
15);
VERIFY_IS_EQUAL((vec5(
3)),
16);
VERIFY_IS_EQUAL((vec5(
4)),
23);
VERIFY_IS_EQUAL((vec5(
5)),
42);
VERIFY_IS_EQUAL((vec5.data()[
0]),
4);
VERIFY_IS_EQUAL((vec5.data()[
1]),
8);
VERIFY_IS_EQUAL((vec5.data()[
2]),
15);
VERIFY_IS_EQUAL((vec5.data()[
3]),
16);
VERIFY_IS_EQUAL((vec5.data()[
4]),
23);
VERIFY_IS_EQUAL((vec5.data()[
5]),
42);
}
static void test_2d()
{
Tensor<
int,
2> mat1(
2,
3);
Tensor<
int,
2, RowMajor> mat2(
2,
3);
mat1(
0,
0) =
0;
mat1(
0,
1) =
1;
mat1(
0,
2) =
2;
mat1(
1,
0) =
3;
mat1(
1,
1) =
4;
mat1(
1,
2) =
5;
mat2(
0,
0) =
0;
mat2(
0,
1) =
1;
mat2(
0,
2) =
2;
mat2(
1,
0) =
3;
mat2(
1,
1) =
4;
mat2(
1,
2) =
5;
VERIFY_IS_EQUAL((mat1.rank()),
2);
VERIFY_IS_EQUAL((mat1.size()),
6);
VERIFY_IS_EQUAL((mat1.dimensions()[
0]),
2);
VERIFY_IS_EQUAL((mat1.dimensions()[
1]),
3);
VERIFY_IS_EQUAL((mat2.rank()),
2);
VERIFY_IS_EQUAL((mat2.size()),
6);
VERIFY_IS_EQUAL((mat2.dimensions()[
0]),
2);
VERIFY_IS_EQUAL((mat2.dimensions()[
1]),
3);
VERIFY_IS_EQUAL((mat1.data()[
0]),
0);
VERIFY_IS_EQUAL((mat1.data()[
1]),
3);
VERIFY_IS_EQUAL((mat1.data()[
2]),
1);
VERIFY_IS_EQUAL((mat1.data()[
3]),
4);
VERIFY_IS_EQUAL((mat1.data()[
4]),
2);
VERIFY_IS_EQUAL((mat1.data()[
5]),
5);
VERIFY_IS_EQUAL((mat2.data()[
0]),
0);
VERIFY_IS_EQUAL((mat2.data()[
1]),
1);
VERIFY_IS_EQUAL((mat2.data()[
2]),
2);
VERIFY_IS_EQUAL((mat2.data()[
3]),
3);
VERIFY_IS_EQUAL((mat2.data()[
4]),
4);
VERIFY_IS_EQUAL((mat2.data()[
5]),
5);
}
static void test_3d()
{
Tensor<
int,
3> epsilon(
3,
3,
3);
epsilon.setZero();
epsilon(
0,
1,
2) = epsilon(
2,
0,
1) = epsilon(
1,
2,
0) =
1;
epsilon(
2,
1,
0) = epsilon(
0,
2,
1) = epsilon(
1,
0,
2) = -
1;
VERIFY_IS_EQUAL((epsilon.size()),
27);
VERIFY_IS_EQUAL((epsilon.dimensions()[
0]),
3);
VERIFY_IS_EQUAL((epsilon.dimensions()[
1]),
3);
VERIFY_IS_EQUAL((epsilon.dimensions()[
2]),
3);
VERIFY_IS_EQUAL((epsilon(
0,
0,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
0,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
0,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
1,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
1,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
2,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
2,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
0,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
0,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
1,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
1,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
1,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
2,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
1,
2,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
0,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
0,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
1,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
1,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
2,
0)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
2,
1)),
0);
VERIFY_IS_EQUAL((epsilon(
2,
2,
2)),
0);
VERIFY_IS_EQUAL((epsilon(
0,
1,
2)),
1);
VERIFY_IS_EQUAL((epsilon(
2,
0,
1)),
1);
VERIFY_IS_EQUAL((epsilon(
1,
2,
0)),
1);
VERIFY_IS_EQUAL((epsilon(
2,
1,
0)), -
1);
VERIFY_IS_EQUAL((epsilon(
0,
2,
1)), -
1);
VERIFY_IS_EQUAL((epsilon(
1,
0,
2)), -
1);
array<Eigen::DenseIndex,
3> dims;
dims[
0] =
2;
dims[
1] =
3;
dims[
2] =
4;
Tensor<
int,
3> t1(dims);
Tensor<
int,
3, RowMajor> t2(dims);
VERIFY_IS_EQUAL((t1.size()),
24);
VERIFY_IS_EQUAL((t1.dimensions()[
0]),
2);
VERIFY_IS_EQUAL((t1.dimensions()[
1]),
3);
VERIFY_IS_EQUAL((t1.dimensions()[
2]),
4);
VERIFY_IS_EQUAL((t2.size()),
24);
VERIFY_IS_EQUAL((t2.dimensions()[
0]),
2);
VERIFY_IS_EQUAL((t2.dimensions()[
1]),
3);
VERIFY_IS_EQUAL((t2.dimensions()[
2]),
4);
for (
int i =
0; i <
2; i++) {
for (
int j =
0; j <
3; j++) {
for (
int k =
0; k <
4; k++) {
t1(i, j, k) =
100 * i +
10 * j + k;
t2(i, j, k) =
100 * i +
10 * j + k;
}
}
}
VERIFY_IS_EQUAL((t1.data()[
0]),
0);
VERIFY_IS_EQUAL((t1.data()[
1]),
100);
VERIFY_IS_EQUAL((t1.data()[
2]),
10);
VERIFY_IS_EQUAL((t1.data()[
3]),
110);
VERIFY_IS_EQUAL((t1.data()[
4]),
20);
VERIFY_IS_EQUAL((t1.data()[
5]),
120);
VERIFY_IS_EQUAL((t1.data()[
6]),
1);
VERIFY_IS_EQUAL((t1.data()[
7]),
101);
VERIFY_IS_EQUAL((t1.data()[
8]),
11);
VERIFY_IS_EQUAL((t1.data()[
9]),
111);
VERIFY_IS_EQUAL((t1.data()[
10]),
21);
VERIFY_IS_EQUAL((t1.data()[
11]),
121);
VERIFY_IS_EQUAL((t1.data()[
12]),
2);
VERIFY_IS_EQUAL((t1.data()[
13]),
102);
VERIFY_IS_EQUAL((t1.data()[
14]),
12);
VERIFY_IS_EQUAL((t1.data()[
15]),
112);
VERIFY_IS_EQUAL((t1.data()[
16]),
22);
VERIFY_IS_EQUAL((t1.data()[
17]),
122);
VERIFY_IS_EQUAL((t1.data()[
18]),
3);
VERIFY_IS_EQUAL((t1.data()[
19]),
103);
VERIFY_IS_EQUAL((t1.data()[
20]),
13);
VERIFY_IS_EQUAL((t1.data()[
21]),
113);
VERIFY_IS_EQUAL((t1.data()[
22]),
23);
VERIFY_IS_EQUAL((t1.data()[
23]),
123);
VERIFY_IS_EQUAL((t2.data()[
0]),
0);
VERIFY_IS_EQUAL((t2.data()[
1]),
1);
VERIFY_IS_EQUAL((t2.data()[
2]),
2);
VERIFY_IS_EQUAL((t2.data()[
3]),
3);
VERIFY_IS_EQUAL((t2.data()[
4]),
10);
VERIFY_IS_EQUAL((t2.data()[
5]),
11);
VERIFY_IS_EQUAL((t2.data()[
6]),
12);
VERIFY_IS_EQUAL((t2.data()[
7]),
13);
VERIFY_IS_EQUAL((t2.data()[
8]),
20);
VERIFY_IS_EQUAL((t2.data()[
9]),
21);
VERIFY_IS_EQUAL((t2.data()[
10]),
22);
VERIFY_IS_EQUAL((t2.data()[
11]),
23);
VERIFY_IS_EQUAL((t2.data()[
12]),
100);
VERIFY_IS_EQUAL((t2.data()[
13]),
101);
VERIFY_IS_EQUAL((t2.data()[
14]),
102);
VERIFY_IS_EQUAL((t2.data()[
15]),
103);
VERIFY_IS_EQUAL((t2.data()[
16]),
110);
VERIFY_IS_EQUAL((t2.data()[
17]),
111);
VERIFY_IS_EQUAL((t2.data()[
18]),
112);
VERIFY_IS_EQUAL((t2.data()[
19]),
113);
VERIFY_IS_EQUAL((t2.data()[
20]),
120);
VERIFY_IS_EQUAL((t2.data()[
21]),
121);
VERIFY_IS_EQUAL((t2.data()[
22]),
122);
VERIFY_IS_EQUAL((t2.data()[
23]),
123);
}
static void test_simple_assign()
{
Tensor<
int,
3> epsilon(
3,
3,
3);
epsilon.setZero();
epsilon(
0,
1,
2) = epsilon(
2,
0,
1) = epsilon(
1,
2,
0) =
1;
epsilon(
2,
1,
0) = epsilon(
0,
2,
1) = epsilon(
1,
0,
2) = -
1;
Tensor<
int,
3> e2(
3,
3,
3);
e2.setZero();
VERIFY_IS_EQUAL((e2(
1,
2,
0)),
0);
e2 = epsilon;
VERIFY_IS_EQUAL((e2(
1,
2,
0)),
1);
VERIFY_IS_EQUAL((e2(
0,
1,
2)),
1);
VERIFY_IS_EQUAL((e2(
2,
0,
1)),
1);
VERIFY_IS_EQUAL((e2(
2,
1,
0)), -
1);
VERIFY_IS_EQUAL((e2(
0,
2,
1)), -
1);
VERIFY_IS_EQUAL((e2(
1,
0,
2)), -
1);
}
static void test_resize()
{
Tensor<
int,
3> epsilon;
epsilon.resize(
2,
3,
7);
VERIFY_IS_EQUAL(epsilon.dimension(
0),
2);
VERIFY_IS_EQUAL(epsilon.dimension(
1),
3);
VERIFY_IS_EQUAL(epsilon.dimension(
2),
7);
VERIFY_IS_EQUAL(epsilon.size(),
2*
3*
7);
const int* old_data = epsilon.data();
epsilon.resize(
3,
2,
7);
VERIFY_IS_EQUAL(epsilon.dimension(
0),
3);
VERIFY_IS_EQUAL(epsilon.dimension(
1),
2);
VERIFY_IS_EQUAL(epsilon.dimension(
2),
7);
VERIFY_IS_EQUAL(epsilon.size(),
2*
3*
7);
VERIFY_IS_EQUAL(epsilon.data(), old_data);
epsilon.resize(
3,
5,
7);
VERIFY_IS_EQUAL(epsilon.dimension(
0),
3);
VERIFY_IS_EQUAL(epsilon.dimension(
1),
5);
VERIFY_IS_EQUAL(epsilon.dimension(
2),
7);
VERIFY_IS_EQUAL(epsilon.size(),
3*
5*
7);
}
EIGEN_DECLARE_TEST(cxx11_tensor_simple)
{
CALL_SUBTEST(test_0d());
CALL_SUBTEST(test_1d());
CALL_SUBTEST(test_2d());
CALL_SUBTEST(test_3d());
CALL_SUBTEST(test_simple_assign());
CALL_SUBTEST(test_resize());
}