| 71 | |
| 72 | template<typename T, typename I> |
| 73 | auto |
| 74 | ldlt_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 | |
| 106 | using namespace proxsuite::linalg::sparse; |
| 107 | using namespace proxsuite::linalg::veg; |
no test coverage detected