Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Eigen::internal::symm_pack_lhs< Scalar, Index, Pack1, Pack2_dummy, StorageOrder > Struct Template Reference

#include <src/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h>

Public Member Functions

template<int BlockRows>
void pack (Scalar *blockA, const const_blas_data_mapper< Scalar, Index, StorageOrder > &lhs, Index cols, Index i, Index &count)
 
void operator() (Scalar *blockA, const Scalar *_lhs, Index lhsStride, Index cols, Index rows)
 

Detailed Description

template<typename Scalar, typename Index, int Pack1, int Pack2_dummy, int StorageOrder>
struct Eigen::internal::symm_pack_lhs< Scalar, Index, Pack1, Pack2_dummy, StorageOrder >

Member Function Documentation

◆ operator()()

template<typename Scalar , typename Index , int Pack1, int Pack2_dummy, int StorageOrder>
void Eigen::internal::symm_pack_lhs< Scalar, Index, Pack1, Pack2_dummy, StorageOrder >::operator() ( Scalar *  blockA,
const Scalar *  _lhs,
Index  lhsStride,
Index  cols,
Index  rows 
)
inline
47 {
48 enum { PacketSize = packet_traits<Scalar>::size };
49 const_blas_data_mapper<Scalar,Index,StorageOrder> lhs(_lhs,lhsStride);
50 Index count = 0;
51 //Index peeled_mc3 = (rows/Pack1)*Pack1;
52
53 const Index peeled_mc3 = Pack1>=3*PacketSize ? (rows/(3*PacketSize))*(3*PacketSize) : 0;
54 const Index peeled_mc2 = Pack1>=2*PacketSize ? peeled_mc3+((rows-peeled_mc3)/(2*PacketSize))*(2*PacketSize) : 0;
55 const Index peeled_mc1 = Pack1>=1*PacketSize ? (rows/(1*PacketSize))*(1*PacketSize) : 0;
56
57 if(Pack1>=3*PacketSize)
58 for(Index i=0; i<peeled_mc3; i+=3*PacketSize)
59 pack<3*PacketSize>(blockA, lhs, cols, i, count);
60
61 if(Pack1>=2*PacketSize)
62 for(Index i=peeled_mc3; i<peeled_mc2; i+=2*PacketSize)
63 pack<2*PacketSize>(blockA, lhs, cols, i, count);
64
65 if(Pack1>=1*PacketSize)
66 for(Index i=peeled_mc2; i<peeled_mc1; i+=1*PacketSize)
67 pack<1*PacketSize>(blockA, lhs, cols, i, count);
68
69 // do the same with mr==1
70 for(Index i=peeled_mc1; i<rows; i++)
71 {
72 for(Index k=0; k<i; k++)
73 blockA[count++] = lhs(i, k); // normal
74
75 blockA[count++] = numext::real(lhs(i, i)); // real (diagonal)
76
77 for(Index k=i+1; k<cols; k++)
78 blockA[count++] = numext::conj(lhs(k, i)); // transposed
79 }
80 }
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:33
IGL_INLINE void count(const Eigen::SparseMatrix< XType > &X, const int dim, Eigen::SparseVector< SType > &S)
Definition count.cpp:12
size_t cols(const T &raster)
Definition MarchingSquares.hpp:60
size_t rows(const T &raster)
Definition MarchingSquares.hpp:55
@ size
Definition GenericPacketMath.h:102

◆ pack()

template<typename Scalar , typename Index , int Pack1, int Pack2_dummy, int StorageOrder>
template<int BlockRows>
void Eigen::internal::symm_pack_lhs< Scalar, Index, Pack1, Pack2_dummy, StorageOrder >::pack ( Scalar *  blockA,
const const_blas_data_mapper< Scalar, Index, StorageOrder > &  lhs,
Index  cols,
Index  i,
Index count 
)
inline
23 {
24 // normal copy
25 for(Index k=0; k<i; k++)
26 for(Index w=0; w<BlockRows; w++)
27 blockA[count++] = lhs(i+w,k); // normal
28 // symmetric copy
29 Index h = 0;
30 for(Index k=i; k<i+BlockRows; k++)
31 {
32 for(Index w=0; w<h; w++)
33 blockA[count++] = numext::conj(lhs(k, i+w)); // transposed
34
35 blockA[count++] = numext::real(lhs(k,k)); // real (diagonal)
36
37 for(Index w=h+1; w<BlockRows; w++)
38 blockA[count++] = lhs(i+w, k); // normal
39 ++h;
40 }
41 // transposed copy
42 for(Index k=i+BlockRows; k<cols; k++)
43 for(Index w=0; w<BlockRows; w++)
44 blockA[count++] = numext::conj(lhs(k, i+w)); // transposed
45 }

The documentation for this struct was generated from the following file: