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
50#include <initializer_list>
55#include <unordered_set>
65template <ComponentType T>
67template <ComponentType T>
69template <ComponentType T>
73template <FiniteFieldType T>
77template <ComponentType T>
79template <ComponentType T>
81template <ComponentType T>
83template <ComponentType T>
84std::ostream& operator<<(
std::ostream& os,
const Vector<T>& rhs)
noexcept;
85double dE(
const Vector<std::complex<
double>>& lhs,
const Vector<std::complex<
double>>& rhs);
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114template <ComponentType T>
116 template <ReliablyComparableType U>
120 friend Vector unit_vector<>(size_t length, size_t i);
121 friend std::ostream& operator<< <>(
std::ostream& os,
const Vector& rhs)
noexcept;
122 friend double dE(
const Vector<std::complex<
double>>& lhs,
const Vector<std::complex<
double>>& rhs);
130
131
140 Vector(size_t n,
const T& l);
149
150
151
152
153
154
155 template <FiniteFieldType S>
160
161
162
163
164
165
166
167
173
174
175
176
177
183
184
200
201
216
217
220
221
222
223
227
228
229
230
237
238
239
240
241
242
248
249
252
253
254
255
256
264
265
266
267
274
275
281 constexpr bool is_empty()
const noexcept {
return data.empty(); }
284 constexpr bool is_zero()
const noexcept
292
293
294
295
322
323
326
327
328
329
330 template <
typename U>
335
336
337
338
342
343
344
345
352
353
354
355
367 template <
typename U>
377 template <
typename U>
382
383
384
385
386
390
391
392
393
396#ifdef CECCO_ERASURE_SUPPORT
399
400
401
402
403
404
405
406
418
419
420
421
422
444
445
457 constexpr Vector&
fill(
const T& value)
noexcept;
462
463
466
467
468
469
470
471
472
477
478
479
480
481
482
487
488
489
490
491
492
493
494
495 template <FiniteFieldType S>
500
501
502
503
504
505
506
515 mutable details::Cache<details::CacheEntry<Weight, size_t>> cache;
517 constexpr size_t calculate_weight()
const noexcept
521template <ComponentType T>
524template <ComponentType T>
527template <ComponentType T>
531template <FiniteFieldType S>
537 throw std::
invalid_argument(
"trying to construct base field vector from subfield matrix of incompatible size");
554template <ComponentType T>
556 data.resize(poly.degree() + 1);
557 for (size_t i = 0; i <= poly.degree(); ++i) {
562template <ComponentType T>
564 if (
this == &rhs)
return *
this;
570template <ComponentType T>
572 if (
this == &rhs)
return *
this;
573 data = std::move(rhs.data);
574 cache = std::move(rhs.cache);
578template <ComponentType T>
580 std::fill(data.begin(), data.end(), rhs);
597template <ComponentType T>
600 std::ranges::for_each(res.data, [](T& v) { v = -v; });
604template <ComponentType T>
606 std::ranges::for_each(data, [](T& v) { v = -v; });
607 return std::move(*
this);
610template <ComponentType T>
612 if (data.size() != rhs.data.size())
throw std::invalid_argument(
"trying to add vectors of different lengths");
613 std::transform(data.begin(), data.end(), rhs.data.begin(), data.begin(), std::plus<T>{});
618template <ComponentType T>
620 if (data.size() != rhs.data.size())
621 throw std::invalid_argument(
622 "trying to subtract vectors of different "
624 std::transform(data.begin(), data.end(), rhs.data.begin(), data.begin(), std::minus<T>{});
629template <ComponentType T>
635 std::ranges::for_each(data, [&s](T& v) { v *= s; });
641template <ComponentType T>
643 if (s == T(0))
throw std::invalid_argument(
"trying to divide components of vector by zero");
644 std::ranges::for_each(data, [&s](T& v) { v /= s; });
648template <ComponentType T>
652 return append(
std::move(tmp));
655 data.reserve(data.size() + rhs.data.size());
656 data.insert(data.end(), rhs.data.begin(), rhs.data.end());
661template <ComponentType T>
663 if (
this == &rhs)
return *
this;
665 data.reserve(data.size() + rhs.data.size());
666 data.insert(data.end(), std::make_move_iterator(rhs.data.begin()), std::make_move_iterator(rhs.data.end()));
671template <ComponentType T>
675 return prepend(
std::move(tmp));
678 data.reserve(data.size() + lhs.data.size());
679 data.insert(data.begin(), lhs.data.begin(), lhs.data.end());
684template <ComponentType T>
686 if (
this == &lhs)
return *
this;
688 data.reserve(data.size() + lhs.data.size());
689 data.insert(data.begin(), std::make_move_iterator(lhs.data.begin()), std::make_move_iterator(lhs.data.end()));
722 if (
v.
empty())
return *
this;
743#ifdef CECCO_ERASURE_SUPPORT
749 if (
v.
empty())
return *
this;
767 if (
v.
empty())
return *
this;
874 "trying to extract a subvector with incompatible "
885 "trying to extract a subvector with incompatible "
897 "trying to replace subvector with "
898 "vector of incompatible length");
910 "trying to replace subvector with "
911 "vector of incompatible length");
945#ifdef CECCO_ERASURE_SUPPORT
1104#ifdef CECCO_ERASURE_SUPPORT
1126 if (
m == 0)
throw std::
invalid_argument(
"Trying to convert vector into a matrix with zero rows");
1148
1149
1180
1181
1212
1213
1230
1231
1248
1249
1361#ifdef CECCO_ERASURE_SUPPORT
1506
1507
1508
1509
1510
1511
1516 "trying to calculate inner product of "
1517 "vectors of different lengths");
1522
1523
1524
1529 "trying to calculate Schur product of "
1530 "vectors of different lengths");
1548
1549
1550
1575
1576
1591
1592
1593
1594
1595
1596
1597
1598
1603 "trying to calculate Hamming distance between vectors of different "
1613 "trying to calculate Hamming distance between vectors of different "
1622 "trying to calculate Hamming distance between vectors of different "
1630 "trying to calculate Hamming distance between vectors of different "
1648
1649
1650
1654 "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::ComponentType.
Vector v = (vā, vā, ā¦, vāāā) over a CECCO::ComponentType.
const T & operator[](size_t i) const
Read access to component i.
constexpr bool is_zero() const noexcept
True iff every component equals T(0); also true for the empty vector.
Vector(size_t n)
Length-n vector with default-initialised components (T() = 0).
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.
Vector(const Polynomial< T > &poly)
From polynomial coefficients: component i becomes poly[i].
Matrix< T > to_matrix(size_t m) const
Reshape into an m Ć (n/m) matrix, row-major.
constexpr Vector & fill(const T &value) noexcept
Set every component to value.
Matrix< S > as_matrix() const
Expand each component into its S-coefficient column.
constexpr Vector & operator=(const T &rhs) noexcept
Set every component to rhs.
std::vector< size_t > supp() const
Sorted indices of non-zero components (empty vector for an all-zero input).
friend constexpr T inner_product(const Vector< T > &lhs, const Vector< T > &rhs)
Inner product āØlhs, rhsā© = Σᵢ lhs[i] Ā· rhs[i].
friend constexpr Vector< T > Schur_product(const Vector< T > &lhs, const Vector< T > &rhs)
Schur (component-wise) product.
constexpr Vector & rotate_right(size_t i) noexcept
Circular right shift by i positions: j ⦠(j + i) mod n.
size_t as_integer() const noexcept
Interpret as a base-q integer, where q = T::get_size().
Vector & set_component(size_t i, U &&c)
Set component i by perfect-forwarding c.
constexpr Vector(Vector &&other) noexcept
friend constexpr bool operator==(const Vector< U > &lhs, const Vector< U > &rhs) noexcept
constexpr Vector & reverse() noexcept
Reverse component order: i ⦠n ā 1 ā i.
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).
constexpr Vector operator+() const &noexcept
Unary + (lvalue): returns a copy.
Vector & randomize_nonzero() noexcept
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 &
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 & randomize() noexcept
Replace components with random values appropriate for T.
Vector(const Vector &other)
constexpr Vector & rotate_left(size_t i) noexcept
Circular left shift by i positions: j ⦠(j ā i) mod n.
Vector(const Matrix< S > &mat)
From a matrix over a subfield: each column becomes one T component.
Vector & pad_front(size_t n)
Prepend zeros so the vector has length at least n (no-op if already ā„ n).
constexpr size_t cyclic_burst_length() const noexcept
Cyclic burst length: shortest circular arc covering all non-zero positions; 0 for an all-zero or empt...
Vector(size_t n, const T &l)
Length-n vector with every component equal to l.
constexpr Vector & operator*=(const T &s) noexcept
Multiply every component by the scalar s.
Vector & set_subvector(Vector &&v, size_t i)
Rvalue overload of set_subvector (move-assigns components from v).
constexpr Vector() noexcept
Default constructor: empty vector (length 0).
constexpr Vector operator-() &&noexcept
Unary ā (rvalue): negates components in place.
Vector & append(U &&rhs)
Append after converting rhs to Vector<T>.
Vector & prepend(const Vector &rhs)
Prepend rhs: result becomes [rhs | *this].
Vector & operator/=(const T &s)
Divide every component by the scalar s.
constexpr Vector operator+() &&noexcept
Unary + (rvalue): returns the rvalue itself.
Vector(const std::initializer_list< T > &l)
From an initializer list of components, in order.
Contains implementation details not to be exposed to the user. Functions and classes here may change ...
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.
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.