30 std::fill_n(data_.get(), n_,
val);
34 : n_(init.
size()), data_(
new T[n_]) {
35 std::copy(init.begin(), init.end(), data_.get());
39 if constexpr (std::is_same_v<T, real>) {
45 std::copy_n(
o.data_.get(), n_, data_.get());
49 : n_(
o.n_), data_(std::move(
o.data_)), d_data_(
o.d_data_) {
57 data_.reset(
new T[n_]);
58 std::copy_n(
o.data_.get(), n_, data_.get());
65 if constexpr (std::is_same_v<T, real>) {
69 data_ = std::move(
o.data_);
79 T*
data() {
return data_.get(); }
80 const T*
data()
const {
return data_.get(); }
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_; }
93 if constexpr (std::is_same_v<T, real>) {
102 if constexpr (std::is_same_v<T, real>) {
113 bool on_gpu()
const {
return d_data_ !=
nullptr; }
117 std::unique_ptr<T[]> data_;
118 real* d_data_ =
nullptr;
Dense vector with optional GPU storage, templated over scalar type T.
const real * gpu_data() const
BasicVector(idx n, T val)
BasicVector & operator=(BasicVector &&o) noexcept
BasicVector & operator=(const BasicVector &o)
T operator[](idx i) const
BasicVector(BasicVector &&o) noexcept
constexpr idx size() const noexcept
BasicVector(const BasicVector &o)
BasicVector(std::initializer_list< T > init)
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.
Backend
Selects which backend handles a linalg operation.
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
void scale(Vector &v, real alpha, Backend b=default_backend)
v *= alpha
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
dot product
real norm(const Vector &x, Backend b=default_backend)
Euclidean norm.
std::complex< real > cplx
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
y += alpha * x
constexpr Backend default_backend
void add(const Vector &x, const Vector &y, Vector &z, Backend b=default_backend)
z = x + y
Backend enum for linear algebra operations.