numerics 0.1.0
Loading...
Searching...
No Matches
array.hpp
Go to the documentation of this file.
1/// @file kernel/array.hpp
2/// @brief Elementwise vector kernels (namespace num::kernel::array)
3#pragma once
4
5#include "core/types.hpp"
6#include "core/vector.hpp"
7#include "kernel/policy.hpp"
8
10
11/// @brief Sequential: y[i] = a*x[i] + b*y[i] (single-pass; calls raw::axpby)
12void axpby(real a, const Vector& x, real b, Vector& y, seq_t) noexcept;
13
14/// @brief Parallel: y[i] = a*x[i] + b*y[i].
15void axpby(real a, const Vector& x, real b, Vector& y, par_t);
16
17inline void axpby(real a, const Vector& x, real b, Vector& y) {
18 axpby(a, x, b, y, default_policy{});
19}
20
21/// @brief Sequential: z[i] = a*x[i] + b*y[i].
22void axpbyz(real a, const Vector& x, real b, const Vector& y, Vector& z, seq_t) noexcept;
23
24/// @brief Parallel: z[i] = a*x[i] + b*y[i].
25void axpbyz(real a, const Vector& x, real b, const Vector& y, Vector& z, par_t);
26
27inline void axpbyz(real a, const Vector& x, real b, const Vector& y, Vector& z) {
28 axpbyz(a, x, b, y, z, default_policy{});
29}
30
31/// @brief In-place elementwise map: x[i] = f(x[i])
32template<typename T, typename F>
33void map(BasicVector<T>& x, F&& f) {
34 T* d = x.data();
35 const idx n = x.size();
36 for (idx i = 0; i < n; ++i) {
37 d[i] = f(d[i]);
38 }
39}
40
41/// @brief Fused binary map: z[i] = f(x[i], y[i])
42template<typename T, typename F>
43void zip_map(const BasicVector<T>& x, const BasicVector<T>& y, BasicVector<T>& z, F&& f) {
44 const idx n = x.size();
45 for (idx i = 0; i < n; ++i) {
46 z[i] = f(x[i], y[i]);
47 }
48}
49
50/// @brief Single-pass left fold: f(f(f(init, x[0]), x[1]), ..., x[n-1])
51template<typename T, typename F>
52[[nodiscard]] T reduce(const BasicVector<T>& x, T init, F&& f) {
53 const T* d = x.data();
54 const idx n = x.size();
55 T acc = init;
56 for (idx i = 0; i < n; ++i) {
57 acc = f(acc, d[i]);
58 }
59 return acc;
60}
61
62} // namespace num::kernel::array
constexpr idx size() const noexcept
Definition vector.hpp:83
Core type definitions.
Compile-time dispatch policy tags for the kernel module.
void zip_map(const BasicVector< T > &x, const BasicVector< T > &y, BasicVector< T > &z, F &&f)
Fused binary map: z[i] = f(x[i], y[i])
Definition array.hpp:43
T reduce(const BasicVector< T > &x, T init, F &&f)
Single-pass left fold: f(f(f(init, x[0]), x[1]), ..., x[n-1])
Definition array.hpp:52
void axpby(real a, const Vector &x, real b, Vector &y, seq_t) noexcept
Sequential: y[i] = a*x[i] + b*y[i] (single-pass; calls raw::axpby)
Definition array.cpp:9
void map(BasicVector< T > &x, F &&f)
In-place elementwise map: x[i] = f(x[i])
Definition array.hpp:33
void axpbyz(real a, const Vector &x, real b, const Vector &y, Vector &z, seq_t) noexcept
Sequential: z[i] = a*x[i] + b*y[i].
Definition array.cpp:27
double real
Definition types.hpp:10
std::size_t idx
Definition types.hpp:11
Parallel execution policy tag.
Definition policy.hpp:13
Sequential execution policy tag.
Definition policy.hpp:10
Dense vector storage and operations.