MatrixViewType get_cache_block (MatrixViewType A, const typename MatrixViewType::ordinal_type cache_block_index, const bool contiguous_cache_blocks) const { typedef typename MatrixViewType::ordinal_type ordinal_type; typedef typename MatrixViewType::scalar_type scalar_type; // Total number of cache blocks. const ordinal_type num_cache_blocks = strategy_.num_cache_blocks (A.nrows(), A.ncols(), nrows_cache_block()); if (cache_block_index >= num_cache_blocks) return MatrixViewType (0, 0, NULL, 0); // empty // result[0] = starting row index of the cache block // result[1] = number of rows in the cache block // result[2] = pointer offset (A.get() + result[2]) // result[3] = leading dimension (a.k.a. stride) of the cache block std::vector<Ordinal> result = strategy_.cache_block_details (cache_block_index, A.nrows(), A.ncols(), A.lda(), nrows_cache_block(), contiguous_cache_blocks); if (result[1] == 0) // For some reason, the cache block is empty. return MatrixViewType (0, 0, NULL, 0); // We expect that ordinal_type is signed, so adding signed // (ordinal_type) to unsigned (pointer) may raise compiler // warnings. return MatrixViewType (result[1], A.ncols(), A.get() + static_cast<size_t>(result[2]), result[3]); }
triqs::arrays::vector_view <double> eigenvalues( MatrixViewType const & M, bool take_copy = false) { eigenelements_worker<MatrixViewType,false> W(take_copy ? MatrixViewType(make_clone(M)) : M); W.invoke(); return W.values(); }
std::pair<array<double,1>, typename MatrixViewType::regular_type> eigenelements( MatrixViewType const & M, bool take_copy =false) { eigenelements_worker<typename MatrixViewType::view_type, true> W(take_copy ? MatrixViewType(make_clone(M)) : M); W.invoke(); return std::make_pair(W.values(),W.vectors()); }