irlba
A C++ library for IRLBA
Loading...
Searching...
No Matches
simple.hpp
Go to the documentation of this file.
1#ifndef IRLBA_MATRIX_SIMPLE_HPP
2#define IRLBA_MATRIX_SIMPLE_HPP
3
4#include <memory>
5#include <type_traits>
6
7#include "../utils.hpp"
8#include "interface.hpp"
9
10#include "Eigen/Dense"
11
17namespace irlba {
18
27template<class EigenVector_, class Simple_>
28class SimpleWorkspace final : public Workspace<EigenVector_> {
29public:
33 SimpleWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
38private:
39 const Simple_& my_matrix;
40
41public:
42 void multiply(const EigenVector_& right, EigenVector_& output) {
43 output.noalias() = my_matrix * right;
44 }
45};
46
55template<class EigenVector_, class Simple_>
56class SimpleAdjointWorkspace final : public AdjointWorkspace<EigenVector_> {
57public:
61 SimpleAdjointWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
66private:
67 const Simple_& my_matrix;
68
69public:
70 void multiply(const EigenVector_& right, EigenVector_& output) {
71 output.noalias() = my_matrix.adjoint() * right;
72 }
73};
74
83template<class EigenMatrix_, class Simple_>
84class SimpleRealizeWorkspace final : public RealizeWorkspace<EigenMatrix_> {
85public:
89 SimpleRealizeWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
94private:
95 const Simple_& my_matrix;
96 static constexpr bool is_same = std::is_same<EigenMatrix_, I<Simple_> >::value;
97 typename std::conditional<is_same, bool, EigenMatrix_>::type buffer;
98
99public:
100 const EigenMatrix_& realize(EigenMatrix_& buffer) {
101 if constexpr(is_same) {
102 return my_matrix;
103 } else {
104 buffer = my_matrix;
105 return buffer;
106 }
107 }
108};
109
124template<class EigenVector_, class EigenMatrix_, class SimplePointer_>
125class SimpleMatrix final : public Matrix<EigenVector_, EigenMatrix_> {
126public:
130 SimpleMatrix(SimplePointer_ matrix) : my_matrix(std::move(matrix)) {}
131
132private:
133 SimplePointer_ my_matrix;
134
135public:
136 Eigen::Index rows() const {
137 return my_matrix->rows();
138 }
139
140 Eigen::Index cols() const {
141 return my_matrix->cols();
142 }
143
144public:
145 std::unique_ptr<Workspace<EigenVector_> > new_workspace() const {
146 return new_known_workspace();
147 }
148
149 std::unique_ptr<AdjointWorkspace<EigenVector_> > new_adjoint_workspace() const {
151 }
152
153 std::unique_ptr<RealizeWorkspace<EigenMatrix_> > new_realize_workspace() const {
155 }
156
157public:
161 std::unique_ptr<SimpleWorkspace<EigenVector_, I<decltype(*my_matrix)> > > new_known_workspace() const {
162 return std::make_unique<SimpleWorkspace<EigenVector_, I<decltype(*my_matrix)> > >(*my_matrix);
163 }
164
168 std::unique_ptr<SimpleAdjointWorkspace<EigenVector_, I<decltype(*my_matrix)> > > new_known_adjoint_workspace() const {
169 return std::make_unique<SimpleAdjointWorkspace<EigenVector_, I<decltype(*my_matrix)> > >(*my_matrix);
170 }
171
175 std::unique_ptr<SimpleRealizeWorkspace<EigenMatrix_, I<decltype(*my_matrix)> > > new_known_realize_workspace() const {
176 return std::make_unique<SimpleRealizeWorkspace<EigenMatrix_, I<decltype(*my_matrix)> > >(*my_matrix);
177 }
178};
179
180}
181
182#endif
Workspace class for multiplying a transposed Matrix.
Definition interface.hpp:61
Interface for a matrix to use in compute().
Definition interface.hpp:142
Workspace class for realizing a Matrix.
Definition interface.hpp:99
Workspace class for multiplying a transposed SimpleMatrix.
Definition simple.hpp:56
void multiply(const EigenVector_ &right, EigenVector_ &output)
Definition simple.hpp:70
A Matrix-compatible wrapper around a "simple" matrix.
Definition simple.hpp:125
std::unique_ptr< SimpleWorkspace< EigenVector_, I< decltype(*my_matrix)> > > new_known_workspace() const
Definition simple.hpp:161
SimpleMatrix(SimplePointer_ matrix)
Definition simple.hpp:130
std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_adjoint_workspace() const
Definition simple.hpp:149
std::unique_ptr< SimpleRealizeWorkspace< EigenMatrix_, I< decltype(*my_matrix)> > > new_known_realize_workspace() const
Definition simple.hpp:175
std::unique_ptr< Workspace< EigenVector_ > > new_workspace() const
Definition simple.hpp:145
Eigen::Index rows() const
Definition simple.hpp:136
Eigen::Index cols() const
Definition simple.hpp:140
std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_realize_workspace() const
Definition simple.hpp:153
std::unique_ptr< SimpleAdjointWorkspace< EigenVector_, I< decltype(*my_matrix)> > > new_known_adjoint_workspace() const
Definition simple.hpp:168
Workspace class for realizing a SimpleMatrix.
Definition simple.hpp:84
const EigenMatrix_ & realize(EigenMatrix_ &buffer)
Definition simple.hpp:100
Workspace class for multiplying a SimpleMatrix.
Definition simple.hpp:28
void multiply(const EigenVector_ &right, EigenVector_ &output)
Definition simple.hpp:42
Workspace class for multiplying a Matrix.
Definition interface.hpp:24
Interfaces for matrix inputs.
Implements IRLBA for approximate SVD.
Definition compute.hpp:22