Go to the documentation of this file.
   33 #ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H 
   34 #define EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H 
   42           int Mode, 
bool LhsIsTriangular,
 
   43           int LhsStorageOrder, 
bool ConjugateLhs,
 
   44           int RhsStorageOrder, 
bool ConjugateRhs,
 
   48           LhsIsTriangular,LhsStorageOrder,ConjugateLhs,
 
   49           RhsStorageOrder, ConjugateRhs, ResStorageOrder, 1, BuiltIn> {};
 
   53 #define EIGEN_BLAS_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \ 
   54 template <typename Index, int Mode, \ 
   55           int LhsStorageOrder, bool ConjugateLhs, \ 
   56           int RhsStorageOrder, bool ConjugateRhs> \ 
   57 struct product_triangular_matrix_matrix<Scalar,Index, Mode, LhsIsTriangular, \ 
   58            LhsStorageOrder,ConjugateLhs, RhsStorageOrder,ConjugateRhs,ColMajor,1,Specialized> { \ 
   59   static inline void run(Index _rows, Index _cols, Index _depth, const Scalar* _lhs, Index lhsStride,\ 
   60     const Scalar* _rhs, Index rhsStride, Scalar* res, Index resIncr, Index resStride, Scalar alpha, level3_blocking<Scalar,Scalar>& blocking) { \ 
   61       EIGEN_ONLY_USED_FOR_DEBUG(resIncr); \ 
   62       eigen_assert(resIncr == 1); \ 
   63       product_triangular_matrix_matrix_trmm<Scalar,Index,Mode, \ 
   64         LhsIsTriangular,LhsStorageOrder,ConjugateLhs, \ 
   65         RhsStorageOrder, ConjugateRhs, ColMajor>::run( \ 
   66           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \ 
   80 #define EIGEN_BLAS_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \ 
   81 template <typename Index, int Mode, \ 
   82           int LhsStorageOrder, bool ConjugateLhs, \ 
   83           int RhsStorageOrder, bool ConjugateRhs> \ 
   84 struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \ 
   85          LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \ 
   88     IsLower = (Mode&Lower) == Lower, \ 
   89     SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \ 
   90     IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \ 
   91     IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \ 
   92     LowUp = IsLower ? Lower : Upper, \ 
   93     conjA = ((LhsStorageOrder==ColMajor) && ConjugateLhs) ? 1 : 0 \ 
   97     Index _rows, Index _cols, Index _depth, \ 
   98     const EIGTYPE* _lhs, Index lhsStride, \ 
   99     const EIGTYPE* _rhs, Index rhsStride, \ 
  100     EIGTYPE* res,        Index resStride, \ 
  101     EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \ 
  103    Index diagSize  = (std::min)(_rows,_depth); \ 
  104    Index rows      = IsLower ? _rows : diagSize; \ 
  105    Index depth     = IsLower ? diagSize : _depth; \ 
  106    Index cols      = _cols; \ 
  108    typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \ 
  109    typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \ 
  112    if (rows != depth) { \ 
  117      if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \ 
  119        product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \ 
  120        LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, 1, BuiltIn>::run( \ 
  121            _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, 1, resStride, alpha, blocking); \ 
  125        Map<const MatrixLhs, 0, OuterStride<> > lhsMap(_lhs,rows,depth,OuterStride<>(lhsStride)); \ 
  126        MatrixLhs aa_tmp=lhsMap.template triangularView<Mode>(); \ 
  127        BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride()); \ 
  128        gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth, 1, true); \ 
  129        general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor,1>::run( \ 
  130        rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, 1, resStride, alpha, gemm_blocking, 0); \ 
  136    char side = 'L', transa, uplo, diag = 'N'; \ 
  139    BlasIndex m, n, lda, ldb; \ 
  142    m = convert_index<BlasIndex>(diagSize); \ 
  143    n = convert_index<BlasIndex>(cols); \ 
  146    transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \ 
  149    Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols,OuterStride<>(rhsStride)); \ 
  150    MatrixX##EIGPREFIX b_tmp; \ 
  152    if (ConjugateRhs) b_tmp = rhs.conjugate(); else b_tmp = rhs; \ 
  154    ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \ 
  157    uplo = IsLower ? 'L' : 'U'; \ 
  158    if (LhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \ 
  160    Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \ 
  163    if ((conjA!=0) || (SetDiag==0)) { \ 
  164      if (conjA) a_tmp = lhs.conjugate(); else a_tmp = lhs; \ 
  166        a_tmp.diagonal().setZero(); \ 
  167      else if (IsUnitDiag) \ 
  168        a_tmp.diagonal().setOnes();\ 
  170      lda = convert_index<BlasIndex>(a_tmp.outerStride()); \ 
  173      lda = convert_index<BlasIndex>(lhsStride); \ 
  177    BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \ 
  180    Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \ 
  181    res_tmp=res_tmp+b_tmp; \ 
  198 #define EIGEN_BLAS_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC) \ 
  199 template <typename Index, int Mode, \ 
  200           int LhsStorageOrder, bool ConjugateLhs, \ 
  201           int RhsStorageOrder, bool ConjugateRhs> \ 
  202 struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \ 
  203          LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \ 
  206     IsLower = (Mode&Lower) == Lower, \ 
  207     SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \ 
  208     IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \ 
  209     IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \ 
  210     LowUp = IsLower ? Lower : Upper, \ 
  211     conjA = ((RhsStorageOrder==ColMajor) && ConjugateRhs) ? 1 : 0 \ 
  215     Index _rows, Index _cols, Index _depth, \ 
  216     const EIGTYPE* _lhs, Index lhsStride, \ 
  217     const EIGTYPE* _rhs, Index rhsStride, \ 
  218     EIGTYPE* res,        Index resStride, \ 
  219     EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \ 
  221    Index diagSize  = (std::min)(_cols,_depth); \ 
  222    Index rows      = _rows; \ 
  223    Index depth     = IsLower ? _depth : diagSize; \ 
  224    Index cols      = IsLower ? diagSize : _cols; \ 
  226    typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \ 
  227    typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \ 
  230    if (cols != depth) { \ 
  234      if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \ 
  236        product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \ 
  237        LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, 1, BuiltIn>::run( \ 
  238            _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, 1, resStride, alpha, blocking); \ 
  242        Map<const MatrixRhs, 0, OuterStride<> > rhsMap(_rhs,depth,cols, OuterStride<>(rhsStride)); \ 
  243        MatrixRhs aa_tmp=rhsMap.template triangularView<Mode>(); \ 
  244        BlasIndex aStride = convert_index<BlasIndex>(aa_tmp.outerStride()); \ 
  245        gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth, 1, true); \ 
  246        general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor,1>::run( \ 
  247        rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, 1, resStride, alpha, gemm_blocking, 0); \ 
  253    char side = 'R', transa, uplo, diag = 'N'; \ 
  256    BlasIndex m, n, lda, ldb; \ 
  259    m = convert_index<BlasIndex>(rows); \ 
  260    n = convert_index<BlasIndex>(diagSize); \ 
  263    transa = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \ 
  266    Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \ 
  267    MatrixX##EIGPREFIX b_tmp; \ 
  269    if (ConjugateLhs) b_tmp = lhs.conjugate(); else b_tmp = lhs; \ 
  271    ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \ 
  274    uplo = IsLower ? 'L' : 'U'; \ 
  275    if (RhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \ 
  277    Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols, OuterStride<>(rhsStride)); \ 
  280    if ((conjA!=0) || (SetDiag==0)) { \ 
  281      if (conjA) a_tmp = rhs.conjugate(); else a_tmp = rhs; \ 
  283        a_tmp.diagonal().setZero(); \ 
  284      else if (IsUnitDiag) \ 
  285        a_tmp.diagonal().setOnes();\ 
  287      lda = convert_index<BlasIndex>(a_tmp.outerStride()); \ 
  290      lda = convert_index<BlasIndex>(rhsStride); \ 
  294    BLASFUNC(&side, &uplo, &transa, &diag, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \ 
  297    Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \ 
  298    res_tmp=res_tmp+b_tmp; \ 
  317 #endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H 
  
Namespace containing all symbols from the Eigen library.
static const double d[K][N]
int BLASFUNC() ctrmm(char *, char *, char *, char *, int *, int *, float *, float *, int *, float *, int *)
#define EIGEN_BLAS_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)
int BLASFUNC() ztrmm(char *, char *, char *, char *, int *, int *, double *, double *, int *, double *, int *)
int BLASFUNC() dtrmm(char *, char *, char *, char *, int *, int *, double *, double *, int *, double *, int *)
std::complex< float > scomplex
std::complex< double > dcomplex
int BLASFUNC() strmm(char *, char *, char *, char *, int *, int *, float *, float *, int *, float *, int *)
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
#define EIGEN_BLAS_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASFUNC)
#define EIGEN_BLAS_TRMM_SPECIALIZE(Scalar, LhsIsTriangular)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
gtsam
Author(s): 
autogenerated on Wed May 28 2025 03:08:31