47template <
typename _Scalar>
struct ProxSuiteLDLTWrapper :
ldlt_base<_Scalar> {
48 using Scalar = _Scalar;
51 using psldlt_t = dense_linalg::Ldlt<Scalar>;
52 using DView =
typename Base::DView;
58 ProxSuiteLDLTWrapper(isize nr, isize rhs_max_cols) : m_ldlt{} {
59 m_ldlt.reserve_uninit(nr);
63 auto req_mat = psldlt_t::solve_in_place_req(rhs_max_cols * nr);
65 StackReq req{psldlt_t::factorize_req(nr) | req_mat};
67 ldl_stack.resize_for_overwrite(req.alloc_req());
70 ProxSuiteLDLTWrapper &compute(
const ConstMatrixRef &mat) {
71 using veg::dynstack::DynStackMut;
73 DynStackMut stack{veg::from_slice_mut, ldl_stack.as_mut()};
75 m_ldlt.factorize(mat, stack);
77 m_info = Eigen::ComputationInfo::Success;
81 template <
typename Derived>
82 bool solveInPlace(Eigen::MatrixBase<Derived> &rhs)
const {
83 using veg::dynstack::DynStackMut;
84 isize nrows = rhs.rows();
85 isize ncols = rhs.cols();
86 auto perm = m_ldlt.p();
87 auto perm_inv = m_ldlt.pt();
88 DynStackMut stack{veg::from_slice_mut,
89 const_cast<StackType &
>(ldl_stack).as_mut()};
90 LDLT_TEMP_MAT_UNINIT(Scalar, work, nrows, ncols, stack);
92 work = perm_inv * rhs;
94 solve_impl(m_ldlt.ld_col(), work);
101 template <
typename Rhs>
102 typename Rhs::PlainObject solve(
const Eigen::MatrixBase<Rhs> &rhs)
const {
103 typename Rhs::PlainObject out = rhs;
108 inline DView vectorD()
const {
109 return dense_linalg::util::diagonal(m_ldlt.ld_col());
112 MatrixXs reconstructedMatrix()
const {
116 auto U = m_ldlt.lt();
118 r = D.asDiagonal() * r;