34#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
35#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
38#include "../InternalHeaderCheck.h"
44template <
typename Index,
typename Scalar,
int AStorageOrder,
bool ConjugateA,
int ResStorageOrder,
int UpLo>
45struct general_matrix_matrix_rankupdate
46 : general_matrix_matrix_triangular_product<Index, Scalar, AStorageOrder, ConjugateA, Scalar, AStorageOrder,
47 ConjugateA, ResStorageOrder, 1, UpLo, BuiltIn> {};
50#define EIGEN_BLAS_RANKUPDATE_SPECIALIZE(Scalar) \
51 template <typename Index, int LhsStorageOrder, bool ConjugateLhs, int RhsStorageOrder, bool ConjugateRhs, int UpLo> \
52 struct general_matrix_matrix_triangular_product<Index, Scalar, LhsStorageOrder, ConjugateLhs, Scalar, \
53 RhsStorageOrder, ConjugateRhs, ColMajor, 1, UpLo, Specialized> { \
54 static EIGEN_STRONG_INLINE void run(Index size, Index depth, const Scalar* lhs, Index lhsStride, \
55 const Scalar* rhs, Index rhsStride, Scalar* res, Index resIncr, \
56 Index resStride, Scalar alpha, level3_blocking<Scalar, Scalar>& blocking) { \
57 EIGEN_IF_CONSTEXPR ((UpLo & (Lower | Upper)) == UpLo) { \
59 general_matrix_matrix_rankupdate<Index, Scalar, LhsStorageOrder, ConjugateLhs, ColMajor, UpLo>::run( \
60 size, depth, lhs, lhsStride, rhs, rhsStride, res, resStride, alpha, blocking); \
64 general_matrix_matrix_triangular_product<Index, Scalar, LhsStorageOrder, ConjugateLhs, Scalar, RhsStorageOrder, \
65 ConjugateRhs, ColMajor, 1, UpLo, BuiltIn>::run(size, depth, lhs, \
67 rhsStride, res, resIncr, \
73EIGEN_BLAS_RANKUPDATE_SPECIALIZE(
double)
74EIGEN_BLAS_RANKUPDATE_SPECIALIZE(
float)
80#define EIGEN_BLAS_RANKUPDATE_R(EIGTYPE, BLASTYPE, BLASFUNC) \
81 template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo> \
82 struct general_matrix_matrix_rankupdate<Index, EIGTYPE, AStorageOrder, ConjugateA, ColMajor, UpLo> { \
84 IsLower = (UpLo & Lower) == Lower, \
85 LowUp = IsLower ? Lower : Upper, \
86 conjA = ((AStorageOrder == ColMajor) && ConjugateA) ? 1 : 0 \
88 static EIGEN_STRONG_INLINE void run(Index size, Index depth, const EIGTYPE* lhs, Index lhsStride, \
89 const EIGTYPE* , Index , EIGTYPE* res, Index resStride, \
90 EIGTYPE alpha, level3_blocking<EIGTYPE, EIGTYPE>& ) { \
91 if (size == 0 || depth == 0) return; \
92 BlasIndex lda = convert_index<BlasIndex>(lhsStride), ldc = convert_index<BlasIndex>(resStride), \
93 n = convert_index<BlasIndex>(size), k = convert_index<BlasIndex>(depth); \
94 char uplo = ((IsLower) ? 'L' : 'U'), trans = ((AStorageOrder == RowMajor) ? 'T' : 'N'); \
96 BLASFUNC(&uplo, &trans, &n, &k, (const BLASTYPE*)&numext::real_ref(alpha), lhs, &lda, \
97 (const BLASTYPE*)&numext::real_ref(beta), res, &ldc); \
102EIGEN_BLAS_RANKUPDATE_R(
double,
double, dsyrk)
103EIGEN_BLAS_RANKUPDATE_R(
float,
float, ssyrk)
105EIGEN_BLAS_RANKUPDATE_R(
double,
double, EIGEN_BLAS_SYM(dsyrk))
106EIGEN_BLAS_RANKUPDATE_R(
float,
float, EIGEN_BLAS_SYM(ssyrk))
109#undef EIGEN_BLAS_RANKUPDATE_SPECIALIZE
110#undef EIGEN_BLAS_RANKUPDATE_R