38 assert(bAndX.rows() == m_matrix.cols());
40 const isize size = bAndX.rows();
42 const isize nblocks = m_structure.nsegments();
45 for (isize i = IsLower ? 0 : nblocks - 1; IsLower ? i < nblocks : i >= 0;
46 IsLower ? i += 1 : i -= 1) {
48 isize n0 = m_structure.segment_lens[i];
53 auto L_cur = IsLower ? m_matrix.bottomRightCorner(rem, rem)
54 : m_matrix.topLeftCorner(rem, rem);
55 auto b_cur = IsLower ? bAndX.bottomRows(rem)
61 auto b0 = IsLower ? b_cur.topRows(n0) : b_cur.bottomRows(n0);
62 auto b1 = IsLower ? b_cur.bottomRows(rem) : b_cur.topRows(rem);
64 auto L00 = IsLower ? L_cur.topLeftCorner(n0, n0)
65 : L_cur.bottomRightCorner(n0, n0);
67 auto L10 = IsLower ? L_cur.bottomLeftCorner(rem, n0)
68 : L_cur.topRightCorner(rem, n0);
71 bool inner_flag = backend::block_triangular_subsolve_impl<Mode>::run(
72 L00, b0, m_structure(i, i));
79 b1.noalias() -= L10 * b0;
86 for (isize p = IsLower ? i + 1 : 0; IsLower ? p < nblocks : p < i;
88 isize n_c = m_structure.segment_lens[p];
89 auto L10_blk = L10.middleRows(p0, n_c);
90 auto dst = b1.middleRows(p0, n_c);
94 backend::gemmt(dst, L10_blk, b0.transpose(), lhs_kind,
Dense,