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