numerics 0.1.0
Loading...
Searching...
No Matches
callable.hpp
Go to the documentation of this file.
1/// @file operator/callable.hpp
2/// @brief Callable adapter for matrix-free linear operators.
3#pragma once
4
6#include <utility>
7
8namespace num::operators {
9
10/// @brief Adapt any callable void(const Vector&, Vector&) to the operator
11/// protocol.
12template<class F>
13struct CallableOp final {
15 : f_(std::move(f)),
16 rows_(rows),
17 cols_(cols) {}
18
20 : CallableOp(std::move(f), n, n) {}
21
22 void apply(const Vector& x, Vector& y) const {
23 if (y.size() != rows_) {
24 y = Vector(rows_);
25 }
26 f_(x, y);
27 }
28
29 [[nodiscard]] idx rows() const noexcept { return rows_; }
30 [[nodiscard]] idx cols() const noexcept { return cols_; }
31
32 private:
33 F f_;
34 idx rows_;
35 idx cols_;
36};
37
38template<class F>
39[[nodiscard]] CallableOp<F> make_op(F f, idx rows, idx cols) {
40 return CallableOp<F>(std::move(f), rows, cols);
41}
42
43template<class F>
44[[nodiscard]] CallableOp<F> make_op(F f, idx n) {
45 return CallableOp<F>(std::move(f), n);
46}
47
48} // namespace num::operators
constexpr idx size() const noexcept
Definition vector.hpp:83
CallableOp< F > make_op(F f, idx rows, idx cols)
Definition callable.hpp:39
std::size_t idx
Definition types.hpp:11
BasicVector< real > Vector
Real-valued dense vector with full backend dispatch (CPU + GPU)
Definition vector.hpp:129
Concepts for operator-oriented numerical algorithms.
Adapt any callable void(const Vector&, Vector&) to the operator protocol.
Definition callable.hpp:13
void apply(const Vector &x, Vector &y) const
Definition callable.hpp:22
idx cols() const noexcept
Definition callable.hpp:30
CallableOp(F f, idx rows, idx cols)
Definition callable.hpp:14
idx rows() const noexcept
Definition callable.hpp:29