1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2018 Gael Guennebaud <[email protected]>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10 #include "main.h"
11 #include <Eigen/SparseCore>
12
13 template<int ExpectedDim,typename Xpr>
check_dim(const Xpr &)14 void check_dim(const Xpr& ) {
15 STATIC_CHECK( Xpr::NumDimensions == ExpectedDim );
16 }
17
18 #if EIGEN_HAS_CXX11
19 template<template <typename,int,int> class Object>
map_num_dimensions()20 void map_num_dimensions()
21 {
22 typedef Object<double, 1, 1> ArrayScalarType;
23 typedef Object<double, 2, 1> ArrayVectorType;
24 typedef Object<double, 1, 2> TransposeArrayVectorType;
25 typedef Object<double, 2, 2> ArrayType;
26 typedef Object<double, Eigen::Dynamic, 1> DynamicArrayVectorType;
27 typedef Object<double, 1, Eigen::Dynamic> DynamicTransposeArrayVectorType;
28 typedef Object<double, Eigen::Dynamic, Eigen::Dynamic> DynamicArrayType;
29
30 STATIC_CHECK(ArrayScalarType::NumDimensions == 0);
31 STATIC_CHECK(ArrayVectorType::NumDimensions == 1);
32 STATIC_CHECK(TransposeArrayVectorType::NumDimensions == 1);
33 STATIC_CHECK(ArrayType::NumDimensions == 2);
34 STATIC_CHECK(DynamicArrayVectorType::NumDimensions == 1);
35 STATIC_CHECK(DynamicTransposeArrayVectorType::NumDimensions == 1);
36 STATIC_CHECK(DynamicArrayType::NumDimensions == 2);
37
38 typedef Eigen::Map<ArrayScalarType> ArrayScalarMap;
39 typedef Eigen::Map<ArrayVectorType> ArrayVectorMap;
40 typedef Eigen::Map<TransposeArrayVectorType> TransposeArrayVectorMap;
41 typedef Eigen::Map<ArrayType> ArrayMap;
42 typedef Eigen::Map<DynamicArrayVectorType> DynamicArrayVectorMap;
43 typedef Eigen::Map<DynamicTransposeArrayVectorType> DynamicTransposeArrayVectorMap;
44 typedef Eigen::Map<DynamicArrayType> DynamicArrayMap;
45
46 STATIC_CHECK(ArrayScalarMap::NumDimensions == 0);
47 STATIC_CHECK(ArrayVectorMap::NumDimensions == 1);
48 STATIC_CHECK(TransposeArrayVectorMap::NumDimensions == 1);
49 STATIC_CHECK(ArrayMap::NumDimensions == 2);
50 STATIC_CHECK(DynamicArrayVectorMap::NumDimensions == 1);
51 STATIC_CHECK(DynamicTransposeArrayVectorMap::NumDimensions == 1);
52 STATIC_CHECK(DynamicArrayMap::NumDimensions == 2);
53 }
54
55 template<typename Scalar, int Rows, int Cols>
56 using TArray = Array<Scalar,Rows,Cols>;
57
58 template<typename Scalar, int Rows, int Cols>
59 using TMatrix = Matrix<Scalar,Rows,Cols>;
60
61 #endif
62
EIGEN_DECLARE_TEST(num_dimensions)63 EIGEN_DECLARE_TEST(num_dimensions)
64 {
65 int n = 10;
66 ArrayXXd A(n,n);
67 CALL_SUBTEST( check_dim<2>(A) );
68 CALL_SUBTEST( check_dim<2>(A.block(1,1,2,2)) );
69 CALL_SUBTEST( check_dim<1>(A.col(1)) );
70 CALL_SUBTEST( check_dim<1>(A.row(1)) );
71
72 MatrixXd M(n,n);
73 CALL_SUBTEST( check_dim<0>(M.row(1)*M.col(1)) );
74
75 SparseMatrix<double> S(n,n);
76 CALL_SUBTEST( check_dim<2>(S) );
77 CALL_SUBTEST( check_dim<2>(S.block(1,1,2,2)) );
78 CALL_SUBTEST( check_dim<1>(S.col(1)) );
79 CALL_SUBTEST( check_dim<1>(S.row(1)) );
80
81 SparseVector<double> s(n);
82 CALL_SUBTEST( check_dim<1>(s) );
83 CALL_SUBTEST( check_dim<1>(s.head(2)) );
84
85
86 #if EIGEN_HAS_CXX11
87 CALL_SUBTEST( map_num_dimensions<TArray>() );
88 CALL_SUBTEST( map_num_dimensions<TMatrix>() );
89 #endif
90 }
91