2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
48#include <initializer_list>
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
79template <ComponentType T>
81template <CoefficientType T>
83template <ComponentType T>
86template <ComponentType T>
88template <ComponentType T>
90template <ComponentType T>
92template <ComponentType T>
93std::ostream& operator<<(
std::ostream& os,
const Vector<T>& rhs);
94double dE(
const Vector<std::complex<
double>>& lhs,
const Vector<std::complex<
double>>& rhs);
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123template <ComponentType T>
125 template <ReliablyComparableType U>
129 friend Vector unit_vector<>(size_t length, size_t i);
130 friend std::ostream& operator<< <>(
std::ostream& os,
const Vector& rhs);
131 friend double dE(
const Vector<std::complex<
double>>& lhs,
const Vector<std::complex<
double>>& rhs);
133 template <CoefficientType U>
141
142
149 if constexpr (ReliablyComparableType<T>) cache.
template set<Weight>(0);
153 Vector(size_t n,
const T& l);
162
163
164
165
166
167
168 template <FiniteFieldType S>
173
174
175
176
177
178
179
180
186
187
188
189
190
191
192
193
201
202
218
219
234
235
238
239
240
241
245
246
247
248
255
256
257
258
259
260
267
268
271
272
273
274
275
276
277
278
287
288
289
290
297
298
304 constexpr bool is_empty()
const noexcept {
return data.empty(); }
315
316
317
318
326#ifdef CECCO_ERASURE_SUPPORT
355
356
359
360
361
362
363 template <
typename U>
368
369
370
371
375
376
377
378
385
386
387
388
400 template <
typename U>
410 template <
typename U>
415
416
417
418
419
423
424
425
426
429#ifdef CECCO_ERASURE_SUPPORT
432
433
434
435
436
437
438
439
451
452
453
454
455
477
478
495
496
499
500
501
502
503
504
505
506
511
512
513
514
515
516
521
522
523
524
525
526
527
528
529 template <FiniteFieldType S>
534
535
536
537
538
539
540
549 mutable details::Cache<details::CacheEntry<Weight, size_t>> cache;
551 constexpr size_t calculate_weight()
const
556template <CoefficientType T>
559template <ComponentType T>
564template <ComponentType T>
567template <ComponentType T>
569 other.cache.invalidate();
573template <FiniteFieldType S>
579 throw std::
invalid_argument(
"trying to construct base field vector from subfield matrix of incompatible size");
597template <CoefficientType U>
598 requires std::same_as<
U,
T>
611template <ComponentType T>
613 if (
this == &rhs)
return *
this;
619template <ComponentType T>
621 if (
this == &rhs)
return *
this;
622 data = std::move(rhs.data);
623 cache = std::move(rhs.cache);
624 rhs.cache.invalidate();
628template <ComponentType T>
645template <ComponentType T>
648 std::ranges::for_each(res.data, [](T& v) { v = -v; });
652template <ComponentType T>
654 std::ranges::for_each(data, [](T& v) { v = -v; });
655 return std::move(*
this);
658template <ComponentType T>
660 if (data.size() != rhs.data.size())
throw std::invalid_argument(
"trying to add vectors of different lengths");
662 std::transform(data.begin(), data.end(), rhs.data.begin(), data.begin(), std::plus<T>{});
666template <ComponentType T>
668 if (data.size() != rhs.data.size())
669 throw std::invalid_argument(
670 "trying to subtract vectors of different "
673 std::transform(data.begin(), data.end(), rhs.data.begin(), data.begin(), std::minus<T>{});
677template <ComponentType T>
682 std::ranges::for_each(data, [&s](T& v) { v *= s; });
688template <ComponentType T>
702template <ComponentType T>
706 return append(
std::move(tmp));
709 data.reserve(data.size() + rhs.data.size());
710 data.insert(data.end(), rhs.data.begin(), rhs.data.end());
715template <ComponentType T>
717 if (
this == &rhs)
return *
this;
719 data.reserve(data.size() + rhs.data.size());
720 data.insert(data.end(), std::make_move_iterator(rhs.data.begin()), std::make_move_iterator(rhs.data.end()));
725template <ComponentType T>
729 return prepend(
std::move(tmp));
732 data.reserve(data.size() + lhs.data.size());
733 data.insert(data.begin(), lhs.data.begin(), lhs.data.end());
738template <ComponentType T>
740 if (
this == &lhs)
return *
this;
742 data.reserve(data.size() + lhs.data.size());
743 data.insert(data.begin(), std::make_move_iterator(lhs.data.begin()), std::make_move_iterator(lhs.data.end()));
782 if (
v.
empty())
return *
this;
801#ifdef CECCO_ERASURE_SUPPORT
807 if (
v.
empty())
return *
this;
824 if (
v.
empty())
return *
this;
933 "trying to extract a subvector with incompatible "
944 "trying to extract a subvector with incompatible "
956 "trying to replace subvector with "
957 "vector of incompatible length");
958 if (
this == &
v)
return *
this;
968 "trying to replace subvector with "
969 "vector of incompatible length");
970 if (
this == &
v)
return *
this;
1003#ifdef CECCO_ERASURE_SUPPORT
1143#ifdef CECCO_ERASURE_SUPPORT
1147 throw std::
overflow_error(
"Cannot convert vector to integer, value exceeds the size_t range!");
1181#ifdef CECCO_ERASURE_SUPPORT
1203 if (
m == 0)
throw std::
invalid_argument(
"Trying to convert vector into a matrix with zero rows");
1220
1221
1252
1253
1284
1285
1302
1303
1320
1321
1438#ifdef CECCO_ERASURE_SUPPORT
1583
1584
1585
1586
1587
1588
1593 "trying to calculate inner product of "
1594 "vectors of different lengths");
1599
1600
1601
1606 "trying to calculate Schur product of "
1607 "vectors of different lengths");
1625
1626
1627
1641 const char*
sep =
"";
1651
1652
1667
1668
1669
1670
1671
1672
1673
1674
1679 "trying to calculate Hamming distance between vectors of different "
1689 "trying to calculate Hamming distance between vectors of different "
1698 "trying to calculate Hamming distance between vectors of different "
1706 "trying to calculate Hamming distance between vectors of different "
1724
1725
1726
1730 "trying to calculate euclidean distance between vectors of different "
Dense m × n matrix over a CECCO::ComponentType.
Univariate polynomial p(x) = a₀ + a₁x + … + aₙxⁿ over a CECCO::CoefficientType.
Vector v = (v₀, v₁, …, vₙ₋₁) over a CECCO::ComponentType.
const T & operator[](size_t i) const
Read access to component i.
Vector(size_t n)
Length-n vector with zero-initialised components.
constexpr Vector & reverse()
Reverse component order: i ↦ n − 1 − i.
Vector & delete_components(const std::vector< size_t > &v)
Delete the components whose indices appear in v and compact.
constexpr bool is_pairwise_distinct() const
True iff no two components are equal.
friend Vector< T > Schur_product(const Vector< T > &lhs, const Vector< T > &rhs)
Schur (component-wise) product.
Matrix< T > to_matrix(size_t m) const
Reshape into an m × (n/m) matrix, row-major.
Matrix< S > as_matrix() const
Expand each component into its S-coefficient column.
constexpr Vector & rotate_right(size_t i)
Circular right shift by i positions: j ↦ (j + i) mod n.
constexpr Vector & fill(const T &value)
Set every component to value.
std::vector< size_t > supp() const
Sorted indices of non-zero, non-erased components (empty vector for an input with only zeros and eras...
constexpr Vector & rotate_left(size_t i)
Circular left shift by i positions: j ↦ (j − i) mod n.
constexpr bool is_zero() const
True iff every component equals T(0); also true for the empty vector.
Vector & set_component(size_t i, U &&c)
Set component i by perfect-forwarding c.
constexpr Vector & operator=(const T &rhs)
Set every component to rhs.
constexpr Vector(Vector &&other) noexcept
constexpr Vector operator+() const &
Unary + (lvalue): returns a copy.
Vector & randomize_pairwise_distinct()
Fill with pairwise distinct field elements (shuffled labels 0, …, q − 1).
Vector & set_subvector(const Vector &v, size_t i)
Overwrite components [i, i + v.get_n()) with v.
Vector & prepend(Vector &&rhs)
Rvalue overload of prepend (moves components from rhs).
Vector & append(const Vector &rhs)
Append rhs: result becomes [*this | rhs].
constexpr Vector & operator=(const Vector &rhs)
Vector & append(Vector &&rhs)
Rvalue overload of append (moves components from rhs).
Vector get_subvector(size_t i, size_t w) const &
Extract the contiguous subvector [i, i + w).
Vector & operator+=(const Vector &rhs)
Component-wise addition this[i] += rhs[i].
Vector & pad_back(size_t n)
Append zeros so the vector has length at least n (no-op if already ≥ n).
Vector & randomize_nonzero()
Like randomize but every component is guaranteed non-zero.
Vector & operator-=(const Vector &rhs)
Component-wise subtraction this[i] -= rhs[i].
Vector & delete_component(size_t i)
Delete component i (single-index convenience for delete_components).
constexpr Vector & operator*=(const T &s)
Multiply every component by the scalar s.
constexpr Vector operator-() const &
Unary − (lvalue): returns a new vector with each component negated.
constexpr Vector & operator=(Vector &&rhs) noexcept
constexpr bool is_empty() const noexcept
True iff length is 0 (distinct from a non-empty all-zero vector).
Vector & from_integer(size_t value, size_t n)
Replace *this with the length-n base-q encoding of value.
Vector & get_subvector(size_t i, size_t w) &&
In-place rvalue overload of get_subvector (truncates to [i, i + w)).
Vector & prepend(U &&lhs)
Prepend after converting lhs to Vector<T>.
constexpr size_t get_n() const noexcept
Vector length (number of components).
Vector(const Vector &other)
Vector(const Matrix< S > &mat)
From a matrix over a subfield: each column becomes one T component.
Vector & operator/=(const T &s)
Divide every component by the scalar s.
Vector & pad_front(size_t n)
Prepend zeros so the vector has length at least n (no-op if already ≥ n).
Vector(size_t n, const T &l)
Length-n vector with every component equal to l.
size_t as_integer() const
Interpret as a base-q integer, where q = T::get_size().
constexpr size_t cyclic_burst_length() const
Cyclic burst length: shortest circular arc covering all non-zero positions; 0 for an all-zero or empt...
Vector & set_subvector(Vector &&v, size_t i)
Rvalue overload of set_subvector (move-assigns components from v).
Vector & append(U &&rhs)
Append after converting rhs to Vector<T>.
friend T inner_product(const Vector< T > &lhs, const Vector< T > &rhs)
Inner product ⟨lhs, rhs⟩ = Σᵢ lhs[i] · rhs[i].
Vector & prepend(const Vector &rhs)
Prepend rhs: result becomes [rhs | *this].
friend constexpr bool operator==(const Vector< U > &lhs, const Vector< U > &rhs)
constexpr Vector() noexcept=default
Default constructor: empty vector (length 0).
Vector & randomize()
Replace components with random values appropriate for T.
constexpr Vector operator+() &&noexcept
Unary + (rvalue): returns the rvalue itself.
constexpr Vector operator-() &&
Unary − (rvalue): negates components in place.
Vector(const std::initializer_list< T > &l)
From an initializer list of components, in order.
Provides a framework for error correcting codes.
Vector< T > Schur_product(const Vector< T > &lhs, const Vector< T > &rhs)
Schur (component-wise) product.
double dE(const Vector< std::complex< double > > &lhs, const Vector< std::complex< double > > &rhs)
Euclidean distance ‖lhs − rhs‖₂ = √(Σᵢ |lhs[i] − rhs[i]|²) for complex vectors.
Vector(const Polynomial< T > &) -> Vector< T >
Deduction guide: a vector constructed from a polynomial deduces the coefficient type.
T inner_product(const Vector< T > &lhs, const Vector< T > &rhs)
Inner product ⟨lhs, rhs⟩ = Σᵢ lhs[i] · rhs[i].
Vector< T > unit_vector(size_t length, size_t i)
Length-length vector with T(1) at index i and zeros elsewhere.