Eigen::internal::symm_pack_rhs< Scalar, Index, nr, StorageOrder > Struct Template Reference

#include <SelfadjointMatrixMatrix.h>

Public Types

enum  { PacketSize = packet_traits<Scalar>::size }
 

Public Member Functions

void operator() (Scalar *blockB, const Scalar *rhs_, Index rhsStride, Index rows, Index cols, Index k2)
 

Member Enumeration Documentation

◆ anonymous enum

template<typename Scalar , typename Index , int nr, int StorageOrder>
anonymous enum
Enumerator
PacketSize 
@ size
Definition: GenericPacketMath.h:113
@ PacketSize
Definition: SelfadjointMatrixMatrix.h:101

Member Function Documentation

◆ operator()()

template<typename Scalar , typename Index , int nr, int StorageOrder>
void Eigen::internal::symm_pack_rhs< Scalar, Index, nr, StorageOrder >::operator() ( Scalar blockB,
const Scalar rhs_,
Index  rhsStride,
Index  rows,
Index  cols,
Index  k2 
)
inline
102  {
103  Index end_k = k2 + rows;
104  Index count = 0;
105  const_blas_data_mapper<Scalar, Index, StorageOrder> rhs(rhs_, rhsStride);
106  Index packet_cols8 = nr >= 8 ? (cols / 8) * 8 : 0;
107  Index packet_cols4 = nr >= 4 ? (cols / 4) * 4 : 0;
108 
109  // first part: normal case
110  for (Index j2 = 0; j2 < k2; j2 += nr) {
111  for (Index k = k2; k < end_k; k++) {
112  blockB[count + 0] = rhs(k, j2 + 0);
113  blockB[count + 1] = rhs(k, j2 + 1);
114  if (nr >= 4) {
115  blockB[count + 2] = rhs(k, j2 + 2);
116  blockB[count + 3] = rhs(k, j2 + 3);
117  }
118  if (nr >= 8) {
119  blockB[count + 4] = rhs(k, j2 + 4);
120  blockB[count + 5] = rhs(k, j2 + 5);
121  blockB[count + 6] = rhs(k, j2 + 6);
122  blockB[count + 7] = rhs(k, j2 + 7);
123  }
124  count += nr;
125  }
126  }
127 
128  // second part: diagonal block
129  Index end8 = nr >= 8 ? (std::min)(k2 + rows, packet_cols8) : k2;
130  if (nr >= 8) {
131  for (Index j2 = k2; j2 < end8; j2 += 8) {
132  // again we can split vertically in three different parts (transpose, symmetric, normal)
133  // transpose
134  for (Index k = k2; k < j2; k++) {
135  blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
136  blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
137  blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
138  blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
139  blockB[count + 4] = numext::conj(rhs(j2 + 4, k));
140  blockB[count + 5] = numext::conj(rhs(j2 + 5, k));
141  blockB[count + 6] = numext::conj(rhs(j2 + 6, k));
142  blockB[count + 7] = numext::conj(rhs(j2 + 7, k));
143  count += 8;
144  }
145  // symmetric
146  Index h = 0;
147  for (Index k = j2; k < j2 + 8; k++) {
148  // normal
149  for (Index w = 0; w < h; ++w) blockB[count + w] = rhs(k, j2 + w);
150 
151  blockB[count + h] = numext::real(rhs(k, k));
152 
153  // transpose
154  for (Index w = h + 1; w < 8; ++w) blockB[count + w] = numext::conj(rhs(j2 + w, k));
155  count += 8;
156  ++h;
157  }
158  // normal
159  for (Index k = j2 + 8; k < end_k; k++) {
160  blockB[count + 0] = rhs(k, j2 + 0);
161  blockB[count + 1] = rhs(k, j2 + 1);
162  blockB[count + 2] = rhs(k, j2 + 2);
163  blockB[count + 3] = rhs(k, j2 + 3);
164  blockB[count + 4] = rhs(k, j2 + 4);
165  blockB[count + 5] = rhs(k, j2 + 5);
166  blockB[count + 6] = rhs(k, j2 + 6);
167  blockB[count + 7] = rhs(k, j2 + 7);
168  count += 8;
169  }
170  }
171  }
172  if (nr >= 4) {
173  for (Index j2 = end8; j2 < (std::min)(k2 + rows, packet_cols4); j2 += 4) {
174  // again we can split vertically in three different parts (transpose, symmetric, normal)
175  // transpose
176  for (Index k = k2; k < j2; k++) {
177  blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
178  blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
179  blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
180  blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
181  count += 4;
182  }
183  // symmetric
184  Index h = 0;
185  for (Index k = j2; k < j2 + 4; k++) {
186  // normal
187  for (Index w = 0; w < h; ++w) blockB[count + w] = rhs(k, j2 + w);
188 
189  blockB[count + h] = numext::real(rhs(k, k));
190 
191  // transpose
192  for (Index w = h + 1; w < 4; ++w) blockB[count + w] = numext::conj(rhs(j2 + w, k));
193  count += 4;
194  ++h;
195  }
196  // normal
197  for (Index k = j2 + 4; k < end_k; k++) {
198  blockB[count + 0] = rhs(k, j2 + 0);
199  blockB[count + 1] = rhs(k, j2 + 1);
200  blockB[count + 2] = rhs(k, j2 + 2);
201  blockB[count + 3] = rhs(k, j2 + 3);
202  count += 4;
203  }
204  }
205  }
206 
207  // third part: transposed
208  if (nr >= 8) {
209  for (Index j2 = k2 + rows; j2 < packet_cols8; j2 += 8) {
210  for (Index k = k2; k < end_k; k++) {
211  blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
212  blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
213  blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
214  blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
215  blockB[count + 4] = numext::conj(rhs(j2 + 4, k));
216  blockB[count + 5] = numext::conj(rhs(j2 + 5, k));
217  blockB[count + 6] = numext::conj(rhs(j2 + 6, k));
218  blockB[count + 7] = numext::conj(rhs(j2 + 7, k));
219  count += 8;
220  }
221  }
222  }
223  if (nr >= 4) {
224  for (Index j2 = (std::max)(packet_cols8, k2 + rows); j2 < packet_cols4; j2 += 4) {
225  for (Index k = k2; k < end_k; k++) {
226  blockB[count + 0] = numext::conj(rhs(j2 + 0, k));
227  blockB[count + 1] = numext::conj(rhs(j2 + 1, k));
228  blockB[count + 2] = numext::conj(rhs(j2 + 2, k));
229  blockB[count + 3] = numext::conj(rhs(j2 + 3, k));
230  count += 4;
231  }
232  }
233  }
234 
235  // copy the remaining columns one at a time (=> the same with nr==1)
236  for (Index j2 = packet_cols4; j2 < cols; ++j2) {
237  // transpose
238  Index half = (std::min)(end_k, j2);
239  for (Index k = k2; k < half; k++) {
240  blockB[count] = numext::conj(rhs(j2, k));
241  count += 1;
242  }
243 
244  if (half == j2 && half < k2 + rows) {
245  blockB[count] = numext::real(rhs(j2, j2));
246  count += 1;
247  } else
248  half--;
249 
250  // normal
251  for (Index k = half + 1; k < k2 + rows; k++) {
252  blockB[count] = rhs(k, j2);
253  count += 1;
254  }
255  }
256  }
AnnoyingScalar conj(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:133
RowVector3d w
Definition: Matrix_resize_int.cpp:3
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
float real
Definition: datatypes.h:10
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
char char char int int * k
Definition: level2_impl.h:374
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83

References cols, conj(), k, max, min, rows, and w.


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