11#ifndef EIGEN_TRIANGULAR_SOLVER_VECTOR_H
12#define EIGEN_TRIANGULAR_SOLVER_VECTOR_H
15#include "../InternalHeaderCheck.h"
21template <
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate,
int StorageOrder>
22struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheRight, Mode, Conjugate, StorageOrder> {
23 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
24 triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheLeft,
31template <
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate>
32struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheLeft, Mode, Conjugate,
RowMajor> {
34 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
35 using LhsMap = Map<const Matrix<LhsScalar, Dynamic, Dynamic, RowMajor>, 0, OuterStride<> >;
36 const LhsMap lhs(_lhs, size, size, OuterStride<>(lhsStride));
38 using LhsMapper = const_blas_data_mapper<LhsScalar, Index, RowMajor>;
39 using RhsMapper = const_blas_data_mapper<RhsScalar, Index, ColMajor>;
41 std::conditional_t<Conjugate, const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>, LhsMap>,
44 static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
45 for (Index pi = IsLower ? 0 : size; IsLower ? pi < size : pi > 0; IsLower ? pi += PanelWidth : pi -= PanelWidth) {
46 Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
48 Index r = IsLower ? pi : size - pi;
53 Index startRow = IsLower ? pi : pi - actualPanelWidth;
54 Index startCol = IsLower ? 0 : pi;
56 general_matrix_vector_product<Index, LhsScalar, LhsMapper,
RowMajor, Conjugate, RhsScalar, RhsMapper,
57 false>::run(actualPanelWidth, r,
58 LhsMapper(&lhs.coeffRef(startRow, startCol), lhsStride),
59 RhsMapper(rhs + startCol, 1), rhs + startRow, 1, RhsScalar(-1));
62 for (Index k = 0; k < actualPanelWidth; ++k) {
63 Index i = IsLower ? pi + k : pi - k - 1;
64 Index s = IsLower ? pi : i + 1;
66 rhs[i] -= (cjLhs.row(i).segment(s, k).transpose().cwiseProduct(
67 Map<
const Matrix<RhsScalar, Dynamic, 1> >(rhs + s, k)))
70 EIGEN_IF_CONSTEXPR (!(Mode &
UnitDiag)) {
71 if (!is_identically_zero(rhs[i])) rhs[i] /= cjLhs(i, i);
79template <
typename LhsScalar,
typename RhsScalar,
typename Index,
int Mode,
bool Conjugate>
80struct triangular_solve_vector<LhsScalar, RhsScalar, Index,
OnTheLeft, Mode, Conjugate,
ColMajor> {
82 static void run(Index size,
const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs) {
83 using LhsMap = Map<const Matrix<LhsScalar, Dynamic, Dynamic, ColMajor>, 0, OuterStride<> >;
84 const LhsMap lhs(_lhs, size, size, OuterStride<>(lhsStride));
85 using LhsMapper = const_blas_data_mapper<LhsScalar, Index, ColMajor>;
86 using RhsMapper = const_blas_data_mapper<RhsScalar, Index, ColMajor>;
87 std::conditional_t<Conjugate, const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>, LhsMap>,
90 static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
92 for (Index pi = IsLower ? 0 : size; IsLower ? pi < size : pi > 0; IsLower ? pi += PanelWidth : pi -= PanelWidth) {
93 Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
94 Index startBlock = IsLower ? pi : pi - actualPanelWidth;
95 Index endBlock = IsLower ? pi + actualPanelWidth : 0;
97 for (Index k = 0; k < actualPanelWidth; ++k) {
98 Index i = IsLower ? pi + k : pi - k - 1;
99 if (!is_identically_zero(rhs[i])) {
100 EIGEN_IF_CONSTEXPR (!(Mode &
UnitDiag)) rhs[i] /= cjLhs.coeff(i, i);
102 Index r = actualPanelWidth - k - 1;
103 Index s = IsLower ? i + 1 : i - r;
104 if (r > 0) Map<Matrix<RhsScalar, Dynamic, 1> >(rhs + s, r) -= rhs[i] * cjLhs.col(i).segment(s, r);
107 Index r = IsLower ? size - endBlock : startBlock;
112 general_matrix_vector_product<Index, LhsScalar, LhsMapper,
ColMajor, Conjugate, RhsScalar, RhsMapper,
113 false>::run(r, actualPanelWidth,
114 LhsMapper(&lhs.coeffRef(endBlock, startBlock), lhsStride),
115 RhsMapper(rhs + startBlock, 1), rhs + endBlock, 1, RhsScalar(-1));
@ UnitDiag
Definition Constants.h:216
@ Lower
Definition Constants.h:212
@ Upper
Definition Constants.h:214
@ ColMajor
Definition Constants.h:319
@ RowMajor
Definition Constants.h:321
@ OnTheLeft
Definition Constants.h:332
@ OnTheRight
Definition Constants.h:334