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
22template<class EigenVector_, class Simple_>
23class SimpleWorkspace final : public Workspace<EigenVector_> {
24public:
25 SimpleWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
26
27private:
28 const Simple_& my_matrix;
29
30public:
31 void multiply(const EigenVector_& right, EigenVector_& output) {
32 output.noalias() = my_matrix * right;
33 }
34};
35
36template<class EigenVector_, class Simple_>
37class SimpleAdjointWorkspace final : public AdjointWorkspace<EigenVector_> {
38public:
39 SimpleAdjointWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
40
41private:
42 const Simple_& my_matrix;
43
44public:
45 void multiply(const EigenVector_& right, EigenVector_& output) {
46 output.noalias() = my_matrix.adjoint() * right;
47 }
48};
49
50template<class EigenMatrix_, class Simple_>
51class SimpleRealizeWorkspace final : public RealizeWorkspace<EigenMatrix_> {
52public:
53 SimpleRealizeWorkspace(const Simple_& matrix) : my_matrix(matrix) {}
54
55private:
56 const Simple_& my_matrix;
57 static constexpr bool is_same = std::is_same<EigenMatrix_, I<Simple_> >::value;
58 typename std::conditional<is_same, bool, EigenMatrix_>::type buffer;
59
60public:
61 const EigenMatrix_& realize(EigenMatrix_& buffer) {
62 if constexpr(is_same) {
63 return my_matrix;
64 } else {
65 buffer = my_matrix;
66 return buffer;
67 }
68 }
69};
88template<class EigenVector_, class EigenMatrix_, class SimplePointer_>
89class SimpleMatrix final : public Matrix<EigenVector_, EigenMatrix_> {
90public:
94 SimpleMatrix(SimplePointer_ matrix) : my_matrix(std::move(matrix)) {}
95
96private:
97 SimplePointer_ my_matrix;
98
99public:
100 Eigen::Index rows() const {
101 return my_matrix->rows();
102 }
103
104 Eigen::Index cols() const {
105 return my_matrix->cols();
106 }
107
108public:
109 std::unique_ptr<Workspace<EigenVector_> > new_workspace() const {
110 return new_known_workspace();
111 }
112
113 std::unique_ptr<AdjointWorkspace<EigenVector_> > new_adjoint_workspace() const {
115 }
116
117 std::unique_ptr<RealizeWorkspace<EigenMatrix_> > new_realize_workspace() const {
119 }
120
121public:
125 auto new_known_workspace() const {
126 return std::make_unique<SimpleWorkspace<EigenVector_, I<decltype(*my_matrix)> > >(*my_matrix);
127 }
128
133 return std::make_unique<SimpleAdjointWorkspace<EigenVector_, I<decltype(*my_matrix)> > >(*my_matrix);
134 }
135
140 return std::make_unique<SimpleRealizeWorkspace<EigenMatrix_, I<decltype(*my_matrix)> > >(*my_matrix);
141 }
142};
143
144}
145
146#endif
Interface for a matrix to use in compute().
Definition interface.hpp:142
A Matrix-compatible wrapper around a "simple" matrix.
Definition simple.hpp:89
auto new_known_adjoint_workspace() const
Definition simple.hpp:132
SimpleMatrix(SimplePointer_ matrix)
Definition simple.hpp:94
std::unique_ptr< AdjointWorkspace< EigenVector_ > > new_adjoint_workspace() const
Definition simple.hpp:113
std::unique_ptr< Workspace< EigenVector_ > > new_workspace() const
Definition simple.hpp:109
Eigen::Index rows() const
Definition simple.hpp:100
auto new_known_realize_workspace() const
Definition simple.hpp:139
Eigen::Index cols() const
Definition simple.hpp:104
std::unique_ptr< RealizeWorkspace< EigenMatrix_ > > new_realize_workspace() const
Definition simple.hpp:117
auto new_known_workspace() const
Definition simple.hpp:125
Interfaces for matrix inputs.