qr_fullpivoting.cpp File Reference
#include "main.h"
#include <Eigen/QR>
#include "solverbase.h"

Functions

template<typename MatrixType >
void qr ()
 
template<typename MatrixType >
void qr_invertible ()
 
template<typename MatrixType >
void qr_verify_assert ()
 
 EIGEN_DECLARE_TEST (qr_fullpivoting)
 

Function Documentation

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( qr_fullpivoting  )
132  {
133  for (int i = 0; i < 1; i++) {
134  CALL_SUBTEST_5(qr<Matrix3f>());
135  CALL_SUBTEST_6(qr<Matrix3d>());
136  CALL_SUBTEST_8(qr<Matrix2f>());
137  CALL_SUBTEST_1(qr<MatrixXf>());
138  CALL_SUBTEST_2(qr<MatrixXd>());
139  CALL_SUBTEST_3(qr<MatrixXcd>());
140  }
141 
142  for (int i = 0; i < g_repeat; i++) {
143  CALL_SUBTEST_1(qr_invertible<MatrixXf>());
144  CALL_SUBTEST_2(qr_invertible<MatrixXd>());
145  CALL_SUBTEST_4(qr_invertible<MatrixXcf>());
146  CALL_SUBTEST_3(qr_invertible<MatrixXcd>());
147  }
148 
149  CALL_SUBTEST_5(qr_verify_assert<Matrix3f>());
150  CALL_SUBTEST_6(qr_verify_assert<Matrix3d>());
151  CALL_SUBTEST_1(qr_verify_assert<MatrixXf>());
152  CALL_SUBTEST_2(qr_verify_assert<MatrixXd>());
153  CALL_SUBTEST_4(qr_verify_assert<MatrixXcf>());
154  CALL_SUBTEST_3(qr_verify_assert<MatrixXcd>());
155 
156  // Test problem size constructors
162 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Householder rank-revealing QR decomposition of a matrix with full pivoting.
Definition: FullPivHouseholderQR.h:63
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
static int g_repeat
Definition: main.h:191
#define CALL_SUBTEST_6(FUNC)
Definition: split_test_helper.h:34
#define CALL_SUBTEST_3(FUNC)
Definition: split_test_helper.h:16
#define CALL_SUBTEST_1(FUNC)
Definition: split_test_helper.h:4
#define CALL_SUBTEST_8(FUNC)
Definition: split_test_helper.h:46
#define CALL_SUBTEST_5(FUNC)
Definition: split_test_helper.h:28
#define CALL_SUBTEST_2(FUNC)
Definition: split_test_helper.h:10
#define CALL_SUBTEST_7(FUNC)
Definition: split_test_helper.h:40
#define CALL_SUBTEST_4(FUNC)
Definition: split_test_helper.h:22

References CALL_SUBTEST_1, CALL_SUBTEST_2, CALL_SUBTEST_3, CALL_SUBTEST_4, CALL_SUBTEST_5, CALL_SUBTEST_6, CALL_SUBTEST_7, CALL_SUBTEST_8, Eigen::g_repeat, and i.

◆ qr()

template<typename MatrixType >
void qr ( )
16  {
17  static const int Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime;
18  Index max_size = EIGEN_TEST_MAX_SIZE;
19  Index min_size = numext::maxi(1, EIGEN_TEST_MAX_SIZE / 10);
20  Index rows = Rows == Dynamic ? internal::random<Index>(min_size, max_size) : Rows,
21  cols = Cols == Dynamic ? internal::random<Index>(min_size, max_size) : Cols,
22  cols2 = Cols == Dynamic ? internal::random<Index>(min_size, max_size) : Cols,
23  rank = internal::random<Index>(1, (std::min)(rows, cols) - 1);
24 
25  typedef typename MatrixType::Scalar Scalar;
27  MatrixType m1;
30  VERIFY_IS_EQUAL(rank, qr.rank());
31  VERIFY_IS_EQUAL(cols - qr.rank(), qr.dimensionOfKernel());
32  VERIFY(!qr.isInjective());
33  VERIFY(!qr.isInvertible());
34  VERIFY(!qr.isSurjective());
35 
36  MatrixType r = qr.matrixQR();
37 
38  MatrixQType q = qr.matrixQ();
40 
41  // FIXME need better way to construct trapezoid
42  for (int i = 0; i < rows; i++)
43  for (int j = 0; j < cols; j++)
44  if (i > j) r(i, j) = Scalar(0);
45 
46  MatrixType c = qr.matrixQ() * r * qr.colsPermutation().inverse();
47 
49 
50  // stress the ReturnByValue mechanism
52  VERIFY_IS_APPROX(tmp.noalias() = qr.matrixQ() * r, (qr.matrixQ() * r).eval());
53 
54  check_solverbase<MatrixType, MatrixType>(m1, qr, rows, cols, cols2);
55 
56  {
57  MatrixType m2, m3;
58  Index size = rows;
59  do {
60  m1 = MatrixType::Random(size, size);
61  qr.compute(m1);
62  } while (!qr.isInvertible());
63  MatrixType m1_inv = qr.inverse();
64  m3 = m1 * MatrixType::Random(size, cols2);
65  m2 = qr.solve(m3);
66  VERIFY_IS_APPROX(m2, m1_inv * m3);
67  }
68 }
Matrix3d m1
Definition: IOFormat.cpp:2
MatrixType m2(n_dims)
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
#define EIGEN_TEST_MAX_SIZE
Definition: boostmultiprec.cpp:16
#define min(a, b)
Definition: datatypes.h:22
#define VERIFY_IS_APPROX(a, b)
Definition: integer_types.cpp:13
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
#define VERIFY(a)
Definition: main.h:362
#define VERIFY_IS_EQUAL(a, b)
Definition: main.h:367
#define VERIFY_IS_UNITARY(a)
Definition: main.h:378
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
void createRandomPIMatrixOfRank(Index desired_rank, Index rows, Index cols, MatrixType &m)
Definition: random_matrix_helper.h:60
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
const int Dynamic
Definition: Constants.h:25
r
Definition: UniformPSDSelfTest.py:20
int c
Definition: calibrate.py:100
Definition: Eigen_Colamd.h:49
void qr()
Definition: qr_fullpivoting.cpp:16
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2

References calibrate::c, cols, Eigen::createRandomPIMatrixOfRank(), Eigen::Dynamic, EIGEN_TEST_MAX_SIZE, i, j, m1, m2(), Eigen::numext::maxi(), min, Eigen::numext::q, UniformPSDSelfTest::r, rows, size, tmp, VERIFY, VERIFY_IS_APPROX, VERIFY_IS_EQUAL, and VERIFY_IS_UNITARY.

Referenced by qr_invertible(), and qr_verify_assert().

◆ qr_invertible()

template<typename MatrixType >
void qr_invertible ( )
71  {
72  using std::abs;
73  using std::log;
75  typedef typename MatrixType::Scalar Scalar;
76 
77  Index max_size = numext::mini(50, EIGEN_TEST_MAX_SIZE);
78  Index min_size = numext::maxi(1, EIGEN_TEST_MAX_SIZE / 10);
79  Index size = internal::random<Index>(min_size, max_size);
80 
81  MatrixType m1(size, size), m2(size, size), m3(size, size);
82  m1 = MatrixType::Random(size, size);
83 
85  // let's build a matrix more stable to inverse
86  MatrixType a = MatrixType::Random(size, size * 2);
87  m1 += a * a.adjoint();
88  }
89 
91  VERIFY(qr.isInjective());
92  VERIFY(qr.isInvertible());
93  VERIFY(qr.isSurjective());
94 
95  check_solverbase<MatrixType, MatrixType>(m1, qr, size, size, size);
96 
97  // now construct a matrix with prescribed determinant
98  m1.setZero();
99  for (int i = 0; i < size; i++) m1(i, i) = internal::random<Scalar>();
100  Scalar det = m1.diagonal().prod();
101  RealScalar absdet = abs(det);
102  m3 = qr.matrixQ(); // get a unitary
103  m1 = m3 * m1 * m3.adjoint();
104  qr.compute(m1);
105  VERIFY_IS_APPROX(det, qr.determinant());
106  VERIFY_IS_APPROX(absdet, qr.absDeterminant());
107  VERIFY_IS_APPROX(log(absdet), qr.logAbsDeterminant());
108  VERIFY_IS_APPROX(numext::sign(det), qr.signDeterminant());
109 }
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
const Scalar * a
Definition: level2_cplx_impl.h:32
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 log(const bfloat16 &a)
Definition: BFloat16.h:618
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T mini(const T &x, const T &y)
Definition: MathFunctions.h:920
squared absolute value
Definition: GlobalFunctions.h:87
T sign(T x)
Definition: cxx11_tensor_builtins_sycl.cpp:172
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217

References a, abs(), EIGEN_TEST_MAX_SIZE, i, Eigen::bfloat16_impl::log(), m1, m2(), Eigen::numext::maxi(), Eigen::numext::mini(), qr(), SYCL::sign(), size, Eigen::value, VERIFY, and VERIFY_IS_APPROX.

◆ qr_verify_assert()

template<typename MatrixType >
void qr_verify_assert ( )
112  {
113  MatrixType tmp;
114 
116  VERIFY_RAISES_ASSERT(qr.matrixQR())
120  VERIFY_RAISES_ASSERT(qr.matrixQ())
121  VERIFY_RAISES_ASSERT(qr.dimensionOfKernel())
122  VERIFY_RAISES_ASSERT(qr.isInjective())
123  VERIFY_RAISES_ASSERT(qr.isSurjective())
124  VERIFY_RAISES_ASSERT(qr.isInvertible())
127  VERIFY_RAISES_ASSERT(qr.absDeterminant())
128  VERIFY_RAISES_ASSERT(qr.logAbsDeterminant())
129  VERIFY_RAISES_ASSERT(qr.signDeterminant())
130 }
void adjoint(const MatrixType &m)
Definition: adjoint.cpp:85
void determinant(const MatrixType &m)
Definition: determinant.cpp:15
void inverse(const MatrixType &m)
Definition: inverse.cpp:64
#define VERIFY_RAISES_ASSERT(a)
Definition: main.h:329
void transpose()
Definition: skew_symmetric_matrix3.cpp:135
Update the problem specs before solve
Definition: steady_axisym_advection_diffusion.cc:353

References qr(), tmp, and VERIFY_RAISES_ASSERT.