irlba
A C++ library for IRLBA
Loading...
Searching...
No Matches
interface.hpp
Go to the documentation of this file.
1#ifndef IRLBA_MATRIX_INTERFACE_HPP
2#define IRLBA_MATRIX_INTERFACE_HPP
3
4#include <memory>
5
6#include "Eigen/Dense"
7
13namespace irlba {
14
23template<class EigenVector_>
24class Workspace {
25public:
29 Workspace() = default;
30 Workspace(Workspace&&) = default;
31 Workspace(const Workspace&) = default;
32 Workspace& operator=(Workspace&&) = default;
33 Workspace& operator=(const Workspace&) = default;
34 virtual ~Workspace() {}
49 virtual void multiply(const EigenVector_& right, EigenVector_& output) = 0;
50};
51
60template<class EigenVector_>
62public:
66 AdjointWorkspace() = default;
68 AdjointWorkspace(const AdjointWorkspace&) = default;
69 AdjointWorkspace& operator=(AdjointWorkspace&&) = default;
70 AdjointWorkspace& operator=(const AdjointWorkspace&) = default;
71 virtual ~AdjointWorkspace() {}
87 virtual void multiply(const EigenVector_& right, EigenVector_& output) = 0;
88};
89
98template<class EigenMatrix_>
100public:
104 RealizeWorkspace() = default;
106 RealizeWorkspace(const RealizeWorkspace&) = default;
107 RealizeWorkspace& operator=(RealizeWorkspace&&) = default;
108 RealizeWorkspace& operator=(const RealizeWorkspace&) = default;
109 virtual ~RealizeWorkspace() {}
119 virtual const EigenMatrix_& realize(EigenMatrix_& buffer) = 0;
120
125 void realize_copy(EigenMatrix_& buffer) {
126 const auto& out = realize(buffer);
127 if (&out != &buffer) {
128 buffer = out;
129 }
130 }
131};
132
141template<class EigenVector_, class EigenMatrix_>
142class Matrix {
143public:
147 Matrix() = default;
148 Matrix(Matrix&&) = default;
149 Matrix(const Matrix&) = default;
150 Matrix& operator=(Matrix&&) = default;
151 Matrix& operator=(const Matrix&) = default;
152 virtual ~Matrix() {}
157public:
161 virtual Eigen::Index rows() const = 0;
162
166 virtual Eigen::Index cols() const = 0;
167
168public:
173 virtual std::unique_ptr<Workspace<EigenVector_> > new_workspace() const = 0;
174
179 virtual std::unique_ptr<AdjointWorkspace<EigenVector_> > new_adjoint_workspace() const = 0;
180
185 virtual std::unique_ptr<RealizeWorkspace<EigenMatrix_> > new_realize_workspace() const = 0;
186
187public:
196 std::unique_ptr<Workspace<EigenVector_> > new_known_workspace() const {
197 return new_workspace();
198 }
199
208 std::unique_ptr<AdjointWorkspace<EigenVector_> > new_known_adjoint_workspace() const {
209 return new_adjoint_workspace();
210 }
211
220 std::unique_ptr<RealizeWorkspace<EigenMatrix_> > new_known_realize_workspace() const {
221 return new_realize_workspace();
222 }
223};
224
225}
226
227#endif
Workspace class for multiplying a transposed Matrix.
Definition interface.hpp:61
virtual void multiply(const EigenVector_ &right, EigenVector_ &output)=0
Interface for a matrix to use in compute().
Definition interface.hpp:142
virtual std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_adjoint_workspace() const =0
virtual std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_realize_workspace() const =0
virtual Eigen::Index rows() const =0
std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_known_adjoint_workspace() const
Definition interface.hpp:208
virtual Eigen::Index cols() const =0
virtual std::unique_ptr< Workspace< EigenVector_ > > new_workspace() const =0
std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_known_realize_workspace() const
Definition interface.hpp:220
std::unique_ptr< Workspace< EigenVector_ > > new_known_workspace() const
Definition interface.hpp:196
Workspace class for realizing a Matrix.
Definition interface.hpp:99
virtual const EigenMatrix_ & realize(EigenMatrix_ &buffer)=0
void realize_copy(EigenMatrix_ &buffer)
Definition interface.hpp:125
Workspace class for multiplying a Matrix.
Definition interface.hpp:24
virtual void multiply(const EigenVector_ &right, EigenVector_ &output)=0
Implements IRLBA for approximate SVD.
Definition compute.hpp:22