1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/LU>
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace std;
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_non_invertible()
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::RealScalar RealScalar;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     LU.h
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows, cols, cols2;
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(MatrixType::RowsAtCompileTime==Dynamic)
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    rows = MatrixType::RowsAtCompileTime;
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(MatrixType::ColsAtCompileTime==Dynamic)
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols2 = internal::random<int>(2,EIGEN_TEST_MAX_SIZE);
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols2 = cols = MatrixType::ColsAtCompileTime;
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = MatrixType::ColsAtCompileTime
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::kernel_retval_base<FullPivLU<MatrixType> >::ReturnType KernelMatrixType;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::image_retval_base<FullPivLU<MatrixType> >::ReturnType ImageMatrixType;
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<typename MatrixType::Scalar, ColsAtCompileTime, ColsAtCompileTime>
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          CMatrixType;
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<typename MatrixType::Scalar, RowsAtCompileTime, RowsAtCompileTime>
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          RMatrixType;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rank = internal::random<Index>(1, (std::min)(rows, cols)-1);
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // The image of the zero matrix should consist of a single (zero) column vector
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1));
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1(rows, cols), m3(rows, cols2);
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CMatrixType m2(cols, cols2);
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  createRandomPIMatrixOfRank(rank, rows, cols, m1);
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  FullPivLU<MatrixType> lu;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // The special value 0.01 below works well in tests. Keep in mind that we're only computing the rank
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // of singular values are either 0 or 1.
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // So it's not clear at all that the epsilon should play any role there.
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lu.setThreshold(RealScalar(0.01));
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lu.compute(m1);
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType u(rows,cols);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  u = lu.matrixLU().template triangularView<Upper>();
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RMatrixType l = RMatrixType::Identity(rows,rows);
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  l.block(0,0,rows,(std::min)(rows,cols)).template triangularView<StrictlyLower>()
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    = lu.matrixLU().block(0,0,rows,(std::min)(rows,cols));
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(lu.permutationP() * m1 * lu.permutationQ(), l*u);
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  KernelMatrixType m1kernel = lu.kernel();
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ImageMatrixType m1image = lu.image(m1);
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1, lu.reconstructedMatrix());
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(rank == lu.rank());
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(cols - lu.rank() == lu.dimensionOfKernel());
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isInjective());
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isInvertible());
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isSurjective());
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((m1 * m1kernel).isMuchSmallerThan(m1));
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(m1image.fullPivLu().rank() == rank);
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1 * m1.adjoint() * m1image, m1image);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = CMatrixType::Random(cols,cols2);
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m3 = m1*m2;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = CMatrixType::Random(cols,cols2);
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test that the code, which does resize(), may be applied to an xpr
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.block(0,0,m2.rows(),m2.cols()) = lu.solve(m3);
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m3, m1*m2);
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_invertible()
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     LU.h
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int size = internal::random<int>(1,EIGEN_TEST_MAX_SIZE);
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1(size, size), m2(size, size), m3(size, size);
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  FullPivLU<MatrixType> lu;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lu.setThreshold(RealScalar(0.01));
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  do {
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    m1 = MatrixType::Random(size,size);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    lu.compute(m1);
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } while(!lu.isInvertible());
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1, lu.reconstructedMatrix());
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(0 == lu.dimensionOfKernel());
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(lu.kernel().cols() == 1); // the kernel() should consist of a single (zero) column vector
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(size == lu.rank());
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(lu.isInjective());
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(lu.isSurjective());
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(lu.isInvertible());
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(lu.image(m1).fullPivLu().isInvertible());
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m3 = MatrixType::Random(size,size);
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = lu.solve(m3);
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m3, m1*m2);
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, lu.inverse()*m3);
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_partial_piv()
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     PartialPivLU.h
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = internal::random<Index>(1,4);
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = rows;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1(cols, rows);
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m1.setRandom();
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PartialPivLU<MatrixType> plu(m1);
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1, plu.reconstructedMatrix());
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_verify_assert()
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType tmp;
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  FullPivLU<MatrixType> lu;
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.matrixLU())
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.permutationP())
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.permutationQ())
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.kernel())
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.image(tmp))
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.solve(tmp))
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.determinant())
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.rank())
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.dimensionOfKernel())
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isInjective())
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isSurjective())
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isInvertible())
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.inverse())
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PartialPivLU<MatrixType> plu;
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.matrixLU())
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.permutationP())
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.solve(tmp))
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.determinant())
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.inverse())
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_lu()
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat; i++) {
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( lu_non_invertible<Matrix3f>() );
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( lu_verify_assert<Matrix3f>() );
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( (lu_non_invertible<Matrix<double, 4, 6> >()) );
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( (lu_verify_assert<Matrix<double, 4, 6> >()) );
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_non_invertible<MatrixXf>() );
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_invertible<MatrixXf>() );
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_verify_assert<MatrixXf>() );
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_non_invertible<MatrixXd>() );
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_invertible<MatrixXd>() );
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_partial_piv<MatrixXd>() );
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_verify_assert<MatrixXd>() );
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_non_invertible<MatrixXcf>() );
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_invertible<MatrixXcf>() );
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_verify_assert<MatrixXcf>() );
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_non_invertible<MatrixXcd>() );
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_invertible<MatrixXcd>() );
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_partial_piv<MatrixXcd>() );
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_verify_assert<MatrixXcd>() );
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_7(( lu_non_invertible<Matrix<float,Dynamic,16> >() ));
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Test problem size constructors
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_9( PartialPivLU<MatrixXf>(10) );
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_9( FullPivLU<MatrixXf>(10, 20); );
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
208