1 #ifndef SOPT_OPERATORS_H
2 #define SOPT_OPERATORS_H
4 #include "sopt/config.h"
21 template <
typename EIGEN>
24 template <
typename EIGEN>
29 template <
typename VECTOR>
44 std::array<t_int, 3>
sizes = {{1, 1, 0}})
46 direct,
sizes, indirect,
48 assert(
sizes[0] != 0);
60 std::array<t_int, 3> isizes)
64 : details::
WrapFunction<VECTOR>(direct), indirect_(indirect) {}
66 : details::
WrapFunction<VECTOR>(c), indirect_(c.indirect_), norm_(c.norm_), sq_norm_(c.sq_norm_) {}
68 : details::
WrapFunction<VECTOR>(std::move(c)), indirect_(std::move(c.indirect_)), norm_(c.norm_), sq_norm_(c.sq_norm_) {}
71 indirect_ = c.indirect_;
73 sq_norm_ = c.sq_norm_;
77 indirect_ = std::move(c.indirect_);
79 sq_norm_ = c.sq_norm_;
123 template <
typename VECTOR>
126 std::array<t_int, 3>
const &sizes = {{1, 1, 0}}) {
127 return {direct, indirect, sizes};
138 template <
typename VECTOR>
140 std::array<t_int, 3>
const &dsizes,
142 std::array<t_int, 3>
const &isizes) {
143 return {direct, dsizes, indirect, isizes};
147 template <
typename VECTOR>
152 template <
typename VECTOR>
155 return {direct, adjoint};
160 template <
typename EIGEN>
163 using Raw =
typename std::remove_const<typename std::remove_reference<EIGEN>::type>::type;
165 using PlainMatrix =
typename Raw::PlainObject;
170 typename std::conditional<std::is_base_of<Eigen::MatrixBase<PlainMatrix>, PlainMatrix>::value,
176 template <
typename T0>
184 if ((*matrix).cols() != x.size())
185 SOPT_THROW(
"Input vector and matrix do not match: ")
186 << out.cols() <<
" columns for " << x.size() <<
" elements.";
198 std::shared_ptr<EIGEN> matrix;
201 template <
typename EIGEN>
208 template <
typename T0>
210 : matrix(std::make_shared<EIGEN>(A)) {}
217 if ((*matrix).rows() != x.size())
218 SOPT_THROW(
"Input vector and matrix adjoint do not match: ")
219 << out.cols() <<
" rows for " << x.size() <<
" elements.";
221 out = matrix->adjoint() * x;
228 std::shared_ptr<EIGEN> matrix;
233 template <
typename DERIVED>
235 Eigen::MatrixBase<DERIVED>
const &A) {
237 if (A.rows() == A.cols())
238 return {matrix, matrix.
adjoint()};
243 return {matrix, matrix.
adjoint(), {{
b,
a, 0}}};
248 template <
typename SCALAR>
Wraps an std::function to return an expression.
void operator=(WrapFunction const &c)
WrapFunction(t_Function const &func, std::array< t_int, 3 > sizes={{1, 1, 0}})
std::array< t_int, 3 > const & sizes() const
Defines relation-ship between input and output sizes.
t_int gcd(t_int a, t_int b)
Greatest common divisor.
WrapFunction< VECTOR > wrap(OperatorFunction< VECTOR > const &func, std::array< t_int, 3 > sizes={{1, 1, 0}})
Helper function to wrap functor into expression-able object.
LinearTransform< VECTOR > linear_transform(OperatorFunction< VECTOR > const &direct, OperatorFunction< VECTOR > const &indirect, std::array< t_int, 3 > const &sizes={{1, 1, 0}})
int t_int
Root of the type hierarchy for signed integers.
double t_real
Root of the type hierarchy for real numbers.
Eigen::Array< T, Eigen::Dynamic, 1 > Array
A 1-dimensional list of elements of given type.
std::function< void(VECTOR &, VECTOR const &)> OperatorFunction
Typical function out = A*x.
LinearTransform< Vector< SCALAR > > linear_transform_identity()
Helper function to create a linear transform that's just the identity.
Eigen::Matrix< T, Eigen::Dynamic, 1 > Vector
A vector of a given type.