MCPcopy Create free account
hub / github.com/Simple-Robotics/proxsuite / ldlt_with_perm

Function ldlt_with_perm

test/src/sparse_factorization.cpp:73–104  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

71
72template<typename T, typename I>
73auto
74ldlt_with_perm(proxsuite::linalg::veg::Slice<I> perm_inv,
75 proxsuite::linalg::sparse::MatRef<T, I> a)
76 -> Eigen::Matrix<T, -1, -1, Eigen::ColMajor>
77{
78 using Mat = Eigen::Matrix<T, -1, -1, Eigen::ColMajor>;
79
80 VEG_ASSERT(a.nrows() == a.ncols());
81
82 proxsuite::linalg::veg::isize n = a.nrows();
83
84 Eigen::PermutationMatrix<-1, -1, I> perm_inv_eigen = to_eigen_perm(perm_inv);
85
86 auto ld_perm_eigen =
87 Mat((perm_inv_eigen *
88 Mat(::to_eigen(a).template selfadjointView<Eigen::Upper>()) *
89 perm_inv_eigen.inverse())
90 .template triangularView<Eigen::Lower>());
91 {
92 for (proxsuite::linalg::veg::isize i = 0; i < n; ++i) {
93 auto a12 = ld_perm_eigen.row(i).head(i).transpose();
94 auto l11 = ld_perm_eigen.topLeftCorner(i, i)
95 .template triangularView<Eigen::UnitLower>();
96 auto l12 = ld_perm_eigen.row(i).head(i).transpose();
97 auto d1 = ld_perm_eigen.diagonal().head(i);
98 l12 = l11.solve(a12);
99 l12 = d1.asDiagonal().inverse() * l12;
100 ld_perm_eigen(i, i) -= l12.dot(d1.asDiagonal() * l12);
101 }
102 }
103 return ld_perm_eigen;
104}
105
106using namespace proxsuite::linalg::sparse;
107using namespace proxsuite::linalg::veg;

Callers 1

Calls 7

to_eigen_permFunction · 0.85
to_eigenFunction · 0.85
nrowsMethod · 0.45
ncolsMethod · 0.45
headMethod · 0.45
rowMethod · 0.45
solveMethod · 0.45

Tested by

no test coverage detected