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) 2011 Benoit Jacob <[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
12*bf2c3715SXin Li
zeroReduction(const MatrixType & m)13*bf2c3715SXin Li template<typename MatrixType> void zeroReduction(const MatrixType& m) {
14*bf2c3715SXin Li // Reductions that must hold for zero sized objects
15*bf2c3715SXin Li VERIFY(m.all());
16*bf2c3715SXin Li VERIFY(!m.any());
17*bf2c3715SXin Li VERIFY(m.prod()==1);
18*bf2c3715SXin Li VERIFY(m.sum()==0);
19*bf2c3715SXin Li VERIFY(m.norm()==0);
20*bf2c3715SXin Li VERIFY(m.squaredNorm()==0);
21*bf2c3715SXin Li VERIFY(m.count()==0);
22*bf2c3715SXin Li VERIFY(m.allFinite());
23*bf2c3715SXin Li VERIFY(!m.hasNaN());
24*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.minCoeff() );
25*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.maxCoeff() );
26*bf2c3715SXin Li Index i,j;
27*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.minCoeff(&i,&j) );
28*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.maxCoeff(&i,&j) );
29*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.reshaped().minCoeff(&i) );
30*bf2c3715SXin Li VERIFY_RAISES_ASSERT( m.reshaped().maxCoeff(&i) );
31*bf2c3715SXin Li }
32*bf2c3715SXin Li
33*bf2c3715SXin Li
zeroSizedMatrix()34*bf2c3715SXin Li template<typename MatrixType> void zeroSizedMatrix()
35*bf2c3715SXin Li {
36*bf2c3715SXin Li MatrixType t1;
37*bf2c3715SXin Li typedef typename MatrixType::Scalar Scalar;
38*bf2c3715SXin Li
39*bf2c3715SXin Li if (MatrixType::SizeAtCompileTime == Dynamic || MatrixType::SizeAtCompileTime == 0)
40*bf2c3715SXin Li {
41*bf2c3715SXin Li zeroReduction(t1);
42*bf2c3715SXin Li if (MatrixType::RowsAtCompileTime == Dynamic)
43*bf2c3715SXin Li VERIFY(t1.rows() == 0);
44*bf2c3715SXin Li if (MatrixType::ColsAtCompileTime == Dynamic)
45*bf2c3715SXin Li VERIFY(t1.cols() == 0);
46*bf2c3715SXin Li
47*bf2c3715SXin Li if (MatrixType::RowsAtCompileTime == Dynamic && MatrixType::ColsAtCompileTime == Dynamic)
48*bf2c3715SXin Li {
49*bf2c3715SXin Li
50*bf2c3715SXin Li MatrixType t2(0, 0), t3(t1);
51*bf2c3715SXin Li VERIFY(t2.rows() == 0);
52*bf2c3715SXin Li VERIFY(t2.cols() == 0);
53*bf2c3715SXin Li
54*bf2c3715SXin Li zeroReduction(t2);
55*bf2c3715SXin Li VERIFY(t1==t2);
56*bf2c3715SXin Li }
57*bf2c3715SXin Li }
58*bf2c3715SXin Li
59*bf2c3715SXin Li if(MatrixType::MaxColsAtCompileTime!=0 && MatrixType::MaxRowsAtCompileTime!=0)
60*bf2c3715SXin Li {
61*bf2c3715SXin Li Index rows = MatrixType::RowsAtCompileTime==Dynamic ? internal::random<Index>(1,10) : Index(MatrixType::RowsAtCompileTime);
62*bf2c3715SXin Li Index cols = MatrixType::ColsAtCompileTime==Dynamic ? internal::random<Index>(1,10) : Index(MatrixType::ColsAtCompileTime);
63*bf2c3715SXin Li MatrixType m(rows,cols);
64*bf2c3715SXin Li zeroReduction(m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols));
65*bf2c3715SXin Li zeroReduction(m.template block<MatrixType::RowsAtCompileTime,0>(0,0,rows,0));
66*bf2c3715SXin Li zeroReduction(m.template block<0,1>(0,0));
67*bf2c3715SXin Li zeroReduction(m.template block<1,0>(0,0));
68*bf2c3715SXin Li Matrix<Scalar,Dynamic,Dynamic> prod = m.template block<MatrixType::RowsAtCompileTime,0>(0,0,rows,0) * m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols);
69*bf2c3715SXin Li VERIFY(prod.rows()==rows && prod.cols()==cols);
70*bf2c3715SXin Li VERIFY(prod.isZero());
71*bf2c3715SXin Li prod = m.template block<1,0>(0,0) * m.template block<0,1>(0,0);
72*bf2c3715SXin Li VERIFY(prod.size()==1);
73*bf2c3715SXin Li VERIFY(prod.isZero());
74*bf2c3715SXin Li }
75*bf2c3715SXin Li }
76*bf2c3715SXin Li
zeroSizedVector()77*bf2c3715SXin Li template<typename VectorType> void zeroSizedVector()
78*bf2c3715SXin Li {
79*bf2c3715SXin Li VectorType t1;
80*bf2c3715SXin Li
81*bf2c3715SXin Li if (VectorType::SizeAtCompileTime == Dynamic || VectorType::SizeAtCompileTime==0)
82*bf2c3715SXin Li {
83*bf2c3715SXin Li zeroReduction(t1);
84*bf2c3715SXin Li VERIFY(t1.size() == 0);
85*bf2c3715SXin Li VectorType t2(DenseIndex(0)); // DenseIndex disambiguates with 0-the-null-pointer (error with gcc 4.4 and MSVC8)
86*bf2c3715SXin Li VERIFY(t2.size() == 0);
87*bf2c3715SXin Li zeroReduction(t2);
88*bf2c3715SXin Li
89*bf2c3715SXin Li VERIFY(t1==t2);
90*bf2c3715SXin Li }
91*bf2c3715SXin Li }
92*bf2c3715SXin Li
EIGEN_DECLARE_TEST(zerosized)93*bf2c3715SXin Li EIGEN_DECLARE_TEST(zerosized)
94*bf2c3715SXin Li {
95*bf2c3715SXin Li zeroSizedMatrix<Matrix2d>();
96*bf2c3715SXin Li zeroSizedMatrix<Matrix3i>();
97*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, 2, Dynamic> >();
98*bf2c3715SXin Li zeroSizedMatrix<MatrixXf>();
99*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, 0, 0> >();
100*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, Dynamic, 0, 0, 0, 0> >();
101*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, 0, Dynamic, 0, 0, 0> >();
102*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, Dynamic, Dynamic, 0, 0, 0> >();
103*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, 0, 4> >();
104*bf2c3715SXin Li zeroSizedMatrix<Matrix<float, 4, 0> >();
105*bf2c3715SXin Li
106*bf2c3715SXin Li zeroSizedVector<Vector2d>();
107*bf2c3715SXin Li zeroSizedVector<Vector3i>();
108*bf2c3715SXin Li zeroSizedVector<VectorXf>();
109*bf2c3715SXin Li zeroSizedVector<Matrix<float, 0, 1> >();
110*bf2c3715SXin Li zeroSizedVector<Matrix<float, 1, 0> >();
111*bf2c3715SXin Li }
112