numerics 0.1.0
Loading...
Searching...
No Matches
properties.hpp
Go to the documentation of this file.
1/// @file operator/properties.hpp
2/// @brief Declared mathematical properties for linear operators.
3/// @todo Add optional sampled diagnostics for matrix-free symmetry and
4/// positive-definiteness checks.
5#pragma once
6
7#include "core/concepts.hpp"
8#include <utility>
9
10namespace num::operators {
11
12template<class Op>
13 requires LinearOperator<Op>
14class SymmetricOp final {
15public:
17
18 explicit SymmetricOp(Op op)
19 : op_(std::move(op)) {}
20
21 void apply(const Vector& x, Vector& y) const { op_.apply(x, y); }
22 [[nodiscard]] idx rows() const noexcept { return op_.rows(); }
23 [[nodiscard]] idx cols() const noexcept { return op_.cols(); }
24
25 const Op& base() const noexcept { return op_; }
26
27private:
28 Op op_;
29};
30
31template<class Op>
32 requires LinearOperator<Op>
33class SPDOp final {
34public:
36 using spd_operator_tag = void;
37
38 explicit SPDOp(Op op)
39 : op_(std::move(op)) {}
40
41 void apply(const Vector& x, Vector& y) const { op_.apply(x, y); }
42 [[nodiscard]] idx rows() const noexcept { return op_.rows(); }
43 [[nodiscard]] idx cols() const noexcept { return op_.cols(); }
44
45 const Op& base() const noexcept { return op_; }
46
47private:
48 Op op_;
49};
50
51template<class Op>
52 requires LinearOperator<Op>
53[[nodiscard]] SymmetricOp<Op> assume_symmetric(Op op) {
54 return SymmetricOp<Op>(std::move(op));
55}
56
57template<class Op>
58 requires LinearOperator<Op>
59[[nodiscard]] SPDOp<Op> assume_spd(Op op) {
60 return SPDOp<Op>(std::move(op));
61}
62
63} // namespace num::operators
const Op & base() const noexcept
void apply(const Vector &x, Vector &y) const
idx rows() const noexcept
idx cols() const noexcept
idx cols() const noexcept
const Op & base() const noexcept
idx rows() const noexcept
void apply(const Vector &x, Vector &y) const
Compile-time contract for the matrix-free product y = A*x.
Definition concepts.hpp:67
Storage and operator concepts for numerical routines.
SymmetricOp< Op > assume_symmetric(Op op)
SPDOp< Op > assume_spd(Op op)
std::size_t idx
Definition types.hpp:11