Go to the documentation of this file.
33 #ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
34 #define EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
46 template<
typename Index,
int Mode,
typename LhsScalar,
bool ConjLhs,
typename RhsScalar,
bool ConjRhs,
int StorageOrder>
50 #define EIGEN_BLAS_TRMV_SPECIALIZE(Scalar) \
51 template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
52 struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
53 static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
54 const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
55 triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor>::run( \
56 _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
59 template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
60 struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor,Specialized> { \
61 static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
62 const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
63 triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor>::run( \
64 _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
74 #define EIGEN_BLAS_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX) \
75 template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
76 struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
78 IsLower = (Mode&Lower) == Lower, \
79 SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
80 IsUnitDiag = (Mode&UnitDiag) ? 1 : 0, \
81 IsZeroDiag = (Mode&ZeroDiag) ? 1 : 0, \
82 LowUp = IsLower ? Lower : Upper \
84 static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
85 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
87 if (ConjLhs || IsZeroDiag) { \
88 triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor,BuiltIn>::run( \
89 _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
92 Index size = (std::min)(_rows,_cols); \
93 Index rows = IsLower ? _rows : size; \
94 Index cols = IsLower ? size : _cols; \
96 typedef VectorX##EIGPREFIX VectorRhs; \
100 Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
102 if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
107 char trans, uplo, diag; \
108 BlasIndex m, n, lda, incx, incy; \
113 n = convert_index<BlasIndex>(size); \
114 lda = convert_index<BlasIndex>(lhsStride); \
116 incy = convert_index<BlasIndex>(resIncr); \
120 uplo = IsLower ? 'L' : 'U'; \
121 diag = IsUnitDiag ? 'U' : 'N'; \
124 BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
127 BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
129 if (size<(std::max)(rows,cols)) { \
130 if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
133 y = _res + size*resIncr; \
135 m = convert_index<BlasIndex>(rows-size); \
136 n = convert_index<BlasIndex>(size); \
141 a = _lhs + size*lda; \
142 m = convert_index<BlasIndex>(size); \
143 n = convert_index<BlasIndex>(cols-size); \
145 BLASPREFIX##gemv##BLASPOSTFIX(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)y, &incy); \
163 #define EIGEN_BLAS_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX) \
164 template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
165 struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
167 IsLower = (Mode&Lower) == Lower, \
168 SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
169 IsUnitDiag = (Mode&UnitDiag) ? 1 : 0, \
170 IsZeroDiag = (Mode&ZeroDiag) ? 1 : 0, \
171 LowUp = IsLower ? Lower : Upper \
173 static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
174 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
177 triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor,BuiltIn>::run( \
178 _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
181 Index size = (std::min)(_rows,_cols); \
182 Index rows = IsLower ? _rows : size; \
183 Index cols = IsLower ? size : _cols; \
185 typedef VectorX##EIGPREFIX VectorRhs; \
189 Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
191 if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
196 char trans, uplo, diag; \
197 BlasIndex m, n, lda, incx, incy; \
202 n = convert_index<BlasIndex>(size); \
203 lda = convert_index<BlasIndex>(lhsStride); \
205 incy = convert_index<BlasIndex>(resIncr); \
208 trans = ConjLhs ? 'C' : 'T'; \
209 uplo = IsLower ? 'U' : 'L'; \
210 diag = IsUnitDiag ? 'U' : 'N'; \
213 BLASPREFIX##trmv##BLASPOSTFIX(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
216 BLASPREFIX##axpy##BLASPOSTFIX(&n, (const BLASTYPE*)&numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
218 if (size<(std::max)(rows,cols)) { \
219 if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
222 y = _res + size*resIncr; \
223 a = _lhs + size*lda; \
224 m = convert_index<BlasIndex>(rows-size); \
225 n = convert_index<BlasIndex>(size); \
231 m = convert_index<BlasIndex>(size); \
232 n = convert_index<BlasIndex>(cols-size); \
234 BLASPREFIX##gemv##BLASPOSTFIX(&trans, &n, &m, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)y, &incy); \
255 #endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
Namespace containing all symbols from the Eigen library.
#define EIGEN_BLAS_TRMV_SPECIALIZE(Scalar)
static const double d[K][N]
#define EIGEN_BLAS_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX)
std::complex< float > scomplex
std::complex< double > dcomplex
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
#define EIGEN_BLAS_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX, BLASPOSTFIX)
constexpr descr< N - 1 > _(char const (&text)[N])
gtsam
Author(s):
autogenerated on Sat Nov 16 2024 04:09:30