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::RealScalar RealScalar;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     LU.h
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows, cols, cols2;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(MatrixType::RowsAtCompileTime==Dynamic)
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    rows = MatrixType::RowsAtCompileTime;
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(MatrixType::ColsAtCompileTime==Dynamic)
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols2 = internal::random<int>(2,EIGEN_TEST_MAX_SIZE);
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cols2 = cols = MatrixType::ColsAtCompileTime;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ColsAtCompileTime = MatrixType::ColsAtCompileTime
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::kernel_retval_base<FullPivLU<MatrixType> >::ReturnType KernelMatrixType;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename internal::image_retval_base<FullPivLU<MatrixType> >::ReturnType ImageMatrixType;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<typename MatrixType::Scalar, ColsAtCompileTime, ColsAtCompileTime>
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          CMatrixType;
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<typename MatrixType::Scalar, RowsAtCompileTime, RowsAtCompileTime>
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          RMatrixType;
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rank = internal::random<Index>(1, (std::min)(rows, cols)-1);
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // The image of the zero matrix should consist of a single (zero) column vector
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((MatrixType::Zero(rows,cols).fullPivLu().image(MatrixType::Zero(rows,cols)).cols() == 1));
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1(rows, cols), m3(rows, cols2);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CMatrixType m2(cols, cols2);
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  createRandomPIMatrixOfRank(rank, rows, cols, m1);
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  FullPivLU<MatrixType> lu;
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // The special value 0.01 below works well in tests. Keep in mind that we're only computing the rank
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // of singular values are either 0 or 1.
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // So it's not clear at all that the epsilon should play any role there.
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lu.setThreshold(RealScalar(0.01));
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  lu.compute(m1);
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType u(rows,cols);
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  u = lu.matrixLU().template triangularView<Upper>();
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RMatrixType l = RMatrixType::Identity(rows,rows);
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  l.block(0,0,rows,(std::min)(rows,cols)).template triangularView<StrictlyLower>()
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    = lu.matrixLU().block(0,0,rows,(std::min)(rows,cols));
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(lu.permutationP() * m1 * lu.permutationQ(), l*u);
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  KernelMatrixType m1kernel = lu.kernel();
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ImageMatrixType m1image = lu.image(m1);
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1, lu.reconstructedMatrix());
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(rank == lu.rank());
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(cols - lu.rank() == lu.dimensionOfKernel());
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isInjective());
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isInvertible());
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(!lu.isSurjective());
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((m1 * m1kernel).isMuchSmallerThan(m1));
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY(m1image.fullPivLu().rank() == rank);
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1 * m1.adjoint() * m1image, m1image);
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = CMatrixType::Random(cols,cols2);
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m3 = m1*m2;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = CMatrixType::Random(cols,cols2);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test that the code, which does resize(), may be applied to an xpr
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.block(0,0,m2.rows(),m2.cols()) = lu.solve(m3);
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m3, m1*m2);
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_invertible()
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     LU.h
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
103a829215e078ace896f52702caa0c27608f40e3b0Miao Wang  DenseIndex size = MatrixType::RowsAtCompileTime;
104a829215e078ace896f52702caa0c27608f40e3b0Miao Wang  if( size==Dynamic)
105a829215e078ace896f52702caa0c27608f40e3b0Miao Wang    size = internal::random<DenseIndex>(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);
127a829215e078ace896f52702caa0c27608f40e3b0Miao Wang
128a829215e078ace896f52702caa0c27608f40e3b0Miao Wang  // Regression test for Bug 302
129a829215e078ace896f52702caa0c27608f40e3b0Miao Wang  MatrixType m4 = MatrixType::Random(size,size);
130a829215e078ace896f52702caa0c27608f40e3b0Miao Wang  VERIFY_IS_APPROX(lu.solve(m3*m4), lu.solve(m3)*m4);
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_partial_piv()
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  /* this test covers the following files:
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     PartialPivLU.h
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = internal::random<Index>(1,4);
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = rows;
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1(cols, rows);
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m1.setRandom();
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PartialPivLU<MatrixType> plu(m1);
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m1, plu.reconstructedMatrix());
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void lu_verify_assert()
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType tmp;
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  FullPivLU<MatrixType> lu;
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.matrixLU())
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.permutationP())
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.permutationQ())
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.kernel())
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.image(tmp))
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.solve(tmp))
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.determinant())
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.rank())
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.dimensionOfKernel())
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isInjective())
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isSurjective())
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.isInvertible())
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(lu.inverse())
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PartialPivLU<MatrixType> plu;
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.matrixLU())
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.permutationP())
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.solve(tmp))
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.determinant())
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(plu.inverse())
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_lu()
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat; i++) {
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( lu_non_invertible<Matrix3f>() );
180a829215e078ace896f52702caa0c27608f40e3b0Miao Wang    CALL_SUBTEST_1( lu_invertible<Matrix3f>() );
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( lu_verify_assert<Matrix3f>() );
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( (lu_non_invertible<Matrix<double, 4, 6> >()) );
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( (lu_verify_assert<Matrix<double, 4, 6> >()) );
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_non_invertible<MatrixXf>() );
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_invertible<MatrixXf>() );
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( lu_verify_assert<MatrixXf>() );
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_non_invertible<MatrixXd>() );
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_invertible<MatrixXd>() );
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_partial_piv<MatrixXd>() );
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( lu_verify_assert<MatrixXd>() );
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_non_invertible<MatrixXcf>() );
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_invertible<MatrixXcf>() );
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( lu_verify_assert<MatrixXcf>() );
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_non_invertible<MatrixXcd>() );
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_invertible<MatrixXcd>() );
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_partial_piv<MatrixXcd>() );
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( lu_verify_assert<MatrixXcd>() );
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_7(( lu_non_invertible<Matrix<float,Dynamic,16> >() ));
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Test problem size constructors
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_9( PartialPivLU<MatrixXf>(10) );
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_9( FullPivLU<MatrixXf>(10, 20); );
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
211