numerics
Loading...
Searching...
No Matches
vector.hpp
Go to the documentation of this file.
1/// @file vector.hpp
2/// @brief Vector operations
3#pragma once
4
5#include "core/types.hpp"
6#include "core/policy.hpp"
8#include <memory>
9#include <algorithm>
10#include <type_traits>
11
12namespace num {
13
14/// @brief Dense vector with optional GPU storage, templated over scalar type T.
15///
16/// Typical aliases:
17/// - `num::Vector` = BasicVector<real> -- real-valued, full backend dispatch including GPU
18/// - `num::CVector` = BasicVector<cplx> -- complex-valued, sequential only (no GPU)
19///
20/// All member functions are defined inline so the template is usable across translation units
21/// without explicit instantiation.
22template<typename T>
24public:
25 BasicVector() : n_(0), data_(nullptr) {}
26
27 explicit BasicVector(idx n) : n_(n), data_(new T[n]()) {}
28
29 BasicVector(idx n, T val) : n_(n), data_(new T[n]) {
30 std::fill_n(data_.get(), n_, val);
31 }
32
33 BasicVector(std::initializer_list<T> init)
34 : n_(init.size()), data_(new T[n_]) {
35 std::copy(init.begin(), init.end(), data_.get());
36 }
37
39 if constexpr (std::is_same_v<T, real>) {
40 if (d_data_) cuda::free(d_data_);
41 }
42 }
43
44 BasicVector(const BasicVector& o) : n_(o.n_), data_(new T[n_]) {
45 std::copy_n(o.data_.get(), n_, data_.get());
46 }
47
49 : n_(o.n_), data_(std::move(o.data_)), d_data_(o.d_data_) {
50 o.n_ = 0;
51 o.d_data_ = nullptr;
52 }
53
55 if (this != &o) {
56 n_ = o.n_;
57 data_.reset(new T[n_]);
58 std::copy_n(o.data_.get(), n_, data_.get());
59 }
60 return *this;
61 }
62
64 if (this != &o) {
65 if constexpr (std::is_same_v<T, real>) {
66 if (d_data_) cuda::free(d_data_);
67 }
68 n_ = o.n_;
69 data_ = std::move(o.data_);
70 d_data_ = o.d_data_;
71 o.n_ = 0;
72 o.d_data_ = nullptr;
73 }
74 return *this;
75 }
76
77 constexpr idx size() const noexcept { return n_; }
78
79 T* data() { return data_.get(); }
80 const T* data() const { return data_.get(); }
81
82 T& operator[](idx i) { return data_[i]; }
83 T operator[](idx i) const { return data_[i]; }
84
85 T* begin() { return data_.get(); }
86 T* end() { return data_.get() + n_; }
87 const T* begin() const { return data_.get(); }
88 const T* end() const { return data_.get() + n_; }
89
90 // -- GPU lifecycle (no-op for T != real) -----------------------------------
91
92 void to_gpu() {
93 if constexpr (std::is_same_v<T, real>) {
94 if (!d_data_) {
95 d_data_ = cuda::alloc(n_);
96 cuda::to_device(d_data_, data_.get(), n_);
97 }
98 }
99 }
100
101 void to_cpu() {
102 if constexpr (std::is_same_v<T, real>) {
103 if (d_data_) {
104 cuda::to_host(data_.get(), d_data_, n_);
105 cuda::free(d_data_);
106 d_data_ = nullptr;
107 }
108 }
109 }
110
111 real* gpu_data() { return d_data_; }
112 const real* gpu_data() const { return d_data_; }
113 bool on_gpu() const { return d_data_ != nullptr; }
114
115private:
116 idx n_;
117 std::unique_ptr<T[]> data_;
118 real* d_data_ = nullptr; // GPU mirror (real-typed); always nullptr for T != real
119};
120
121/// @brief Real-valued dense vector with full backend dispatch (CPU + GPU)
123
124/// @brief Complex-valued dense vector (sequential; no GPU)
126
127// -- Real-vector free functions (full backend dispatch) ------------------------
128
129/// @brief v *= alpha
131
132/// @brief z = x + y
133void add(const Vector& x, const Vector& y, Vector& z, Backend b = default_backend);
134
135/// @brief y += alpha * x
136void axpy(real alpha, const Vector& x, Vector& y, Backend b = default_backend);
137
138/// @brief dot product
139real dot(const Vector& x, const Vector& y, Backend b = default_backend);
140
141/// @brief Euclidean norm
143
144// -- Complex-vector free functions (sequential) --------------------------------
145
146/// @brief v *= alpha
147void scale(CVector& v, cplx alpha);
148
149/// @brief y += alpha * x
150void axpy(cplx alpha, const CVector& x, CVector& y);
151
152/// @brief Conjugate inner product <x, y> = Sigma conj(x_i) * y_i
153cplx dot(const CVector& x, const CVector& y);
154
155/// @brief Euclidean norm sqrt(Sigma |v_i|^2)
156real norm(const CVector& x);
157
158} // namespace num
Dense vector with optional GPU storage, templated over scalar type T.
Definition vector.hpp:23
const T * begin() const
Definition vector.hpp:87
const T * end() const
Definition vector.hpp:88
T & operator[](idx i)
Definition vector.hpp:82
const real * gpu_data() const
Definition vector.hpp:112
BasicVector(idx n, T val)
Definition vector.hpp:29
BasicVector & operator=(BasicVector &&o) noexcept
Definition vector.hpp:63
BasicVector & operator=(const BasicVector &o)
Definition vector.hpp:54
const T * data() const
Definition vector.hpp:80
bool on_gpu() const
Definition vector.hpp:113
T operator[](idx i) const
Definition vector.hpp:83
BasicVector(BasicVector &&o) noexcept
Definition vector.hpp:48
BasicVector(idx n)
Definition vector.hpp:27
real * gpu_data()
Definition vector.hpp:111
constexpr idx size() const noexcept
Definition vector.hpp:77
BasicVector(const BasicVector &o)
Definition vector.hpp:44
BasicVector(std::initializer_list< T > init)
Definition vector.hpp:33
Core type definitions.
CUDA kernel wrappers.
void to_device(real *dst, const real *src, idx n)
Copy host to device.
void free(real *ptr)
Free device memory.
real * alloc(idx n)
Allocate device memory.
void to_host(real *dst, const real *src, idx n)
Copy device to host.
double real
Definition types.hpp:10
Backend
Selects which backend handles a linalg operation.
Definition policy.hpp:19
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
std::size_t idx
Definition types.hpp:11
void scale(Vector &v, real alpha, Backend b=default_backend)
v *= alpha
Definition vector.cpp:27
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
dot product
Definition vector.cpp:57
real norm(const Vector &x, Backend b=default_backend)
Euclidean norm.
Definition vector.cpp:69
std::complex< real > cplx
Definition types.hpp:12
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
y += alpha * x
Definition vector.cpp:46
constexpr Backend default_backend
Definition policy.hpp:57
void add(const Vector &x, const Vector &y, Vector &z, Backend b=default_backend)
z = x + y
Definition vector.cpp:38
Backend enum for linear algebra operations.