irlba_tatami
tatami wrappers for IRLBA
Loading...
Searching...
No Matches
transposed.hpp
Go to the documentation of this file.
1#ifndef IRLBA_TATAMI_TRANSPOSED_HPP
2#define IRLBA_TATAMI_TRANSPOSED_HPP
3
4#include "tatami/tatami.hpp"
5#include "tatami_mult/tatami_mult.hpp"
6#include "irlba/irlba.hpp"
7#include "sanisizer/sanisizer.hpp"
8
9#include <memory>
10
16namespace irlba_tatami {
17
21template<class EigenVector_, typename TValue_, typename TIndex_, class TMatrix_ = tatami::Matrix<TValue_, TIndex_> >
22class TransposedWorkspace final : public irlba::Workspace<EigenVector_> {
23public:
24 TransposedWorkspace(const TMatrix_& mat, int num_threads) : my_mat(mat) {
25 opt.num_threads = num_threads;
26 }
27
28private:
29 const TMatrix_& my_mat;
30 tatami_mult::Options opt;
31
32public:
33 void multiply(const EigenVector_& right, EigenVector_& out) {
34 tatami_mult::multiply(right.data(), my_mat, out.data(), opt);
35 }
36};
37
38template<class EigenVector_, typename TValue_, typename TIndex_, class TMatrix_ = tatami::Matrix<TValue_, TIndex_> >
39class TransposedAdjointWorkspace final : public irlba::AdjointWorkspace<EigenVector_> {
40public:
41 TransposedAdjointWorkspace(const TMatrix_& mat, int num_threads) : my_mat(mat) {
42 opt.num_threads = num_threads;
43 }
44
45private:
46 const TMatrix_& my_mat;
47 tatami_mult::Options opt;
48
49public:
50 void multiply(const EigenVector_& right, EigenVector_& out) {
51 tatami_mult::multiply(my_mat, right.data(), out.data(), opt);
52 }
53};
54
55template<class EigenMatrix_, typename TValue_, typename TIndex_, class TMatrix_ = tatami::Matrix<TValue_, TIndex_> >
56class TransposedRealizeWorkspace final : public irlba::RealizeWorkspace<EigenMatrix_> {
57public:
58 TransposedRealizeWorkspace(const TMatrix_& mat, int num_threads) : my_mat(mat), my_num_threads(num_threads) {}
59
60private:
61 const TMatrix_& my_mat;
62 int my_num_threads;
63
64public:
65 const EigenMatrix_& realize(EigenMatrix_& buffer) {
66 // Copying into a transposed matrix, hence the switch of the ncol/nrow order.
67 // Both values can be cast to Eigen::Index, as we checked this in the Transposed constructor.
68 buffer.resize(my_mat.ncol(), my_mat.nrow());
69
71 my_mat,
72 !buffer.IsRowMajor,
73 buffer.data(),
74 [&]{
75 tatami::ConvertToDenseOptions opt;
76 opt.num_threads = my_num_threads;
77 return opt;
78 }()
79 );
80
81 return buffer;
82 }
83};
102template<class EigenVector_, class EigenMatrix_, typename TValue_, typename TIndex_, class TMatrixPointer_ = std::shared_ptr<const tatami::Matrix<TValue_, TIndex_> > >
103class Transposed final : public irlba::Matrix<EigenVector_, EigenMatrix_> {
104public:
110 Transposed(TMatrixPointer_ mat, int num_threads) : my_mat(std::move(mat)), my_num_threads(num_threads) {
111 // Check that these casts are safe in rows(), cols() below.
112 sanisizer::cast<Eigen::Index>(tatami::attest_for_Index(my_mat->nrow()));
113 sanisizer::cast<Eigen::Index>(tatami::attest_for_Index(my_mat->ncol()));
114 }
115
116public:
117 Eigen::Index rows() const {
118 return my_mat->ncol(); // transposed, remember.
119 }
120
121 Eigen::Index cols() const {
122 return my_mat->nrow();
123 }
124
125private:
126 TMatrixPointer_ my_mat;
127 int my_num_threads;
128
129 typedef std::remove_cv_t<std::remove_reference_t<decltype(*my_mat)> > TMatrix;
130
131public:
132 std::unique_ptr<irlba::Workspace<EigenVector_> > new_workspace() const {
133 return new_known_workspace();
134 }
135
136 std::unique_ptr<irlba::AdjointWorkspace<EigenVector_> > new_adjoint_workspace() const {
138 }
139
140 std::unique_ptr<irlba::RealizeWorkspace<EigenMatrix_> > new_realize_workspace() const {
142 }
143
144public:
148 auto new_known_workspace() const {
149 return std::make_unique<TransposedWorkspace<EigenVector_, TValue_, TIndex_, TMatrix> >(*my_mat, my_num_threads);
150 }
151
156 return std::make_unique<TransposedAdjointWorkspace<EigenVector_, TValue_, TIndex_, TMatrix> >(*my_mat, my_num_threads);
157 }
158
163 return std::make_unique<TransposedRealizeWorkspace<EigenMatrix_, TValue_, TIndex_, TMatrix> >(*my_mat, my_num_threads);
164 }
165};
166
167}
168
169#endif
Wrap a transposed tatami matrix for irlba.
Definition transposed.hpp:103
auto new_known_adjoint_workspace() const
Definition transposed.hpp:155
Transposed(TMatrixPointer_ mat, int num_threads)
Definition transposed.hpp:110
auto new_known_realize_workspace() const
Definition transposed.hpp:162
auto new_known_workspace() const
Definition transposed.hpp:148
Wrap tatami for irlba.
void convert_to_dense(const Matrix< InputValue_, InputIndex_ > &matrix, const bool row_major, StoredValue_ *const store, const ConvertToDenseOptions &options)