7#include <gtest/gtest.h>
21 for (
size_t i = 0; i < 5; ++i) {
31 for (
size_t i = 0; i < 5; ++i) {
39TEST(VectorFieldTest, RoundtripConstructionPreservesValues)
41 auto input = random_five();
43 auto out = v.to_array();
44 EXPECT_TRUE(field_array_eq(input,
out));
47TEST(VectorFieldTest, AdditionMatchesScalarFieldAdd)
49 for (
int trial = 0; trial < 32; ++trial) {
50 auto a = random_five();
51 auto b = random_five();
53 for (
size_t i = 0; i < 5; ++i) {
54 expected[i] =
a[i] +
b[i];
57 auto got = (va + vb).to_array();
58 EXPECT_TRUE(field_array_eq(expected, got)) <<
"trial " << trial;
62TEST(VectorFieldTest, SubtractionMatchesScalarFieldSub)
64 for (
int trial = 0; trial < 32; ++trial) {
65 auto a = random_five();
66 auto b = random_five();
68 for (
size_t i = 0; i < 5; ++i) {
69 expected[i] =
a[i] -
b[i];
72 auto got = (va - vb).to_array();
73 EXPECT_TRUE(field_array_eq(expected, got)) <<
"trial " << trial;
77TEST(VectorFieldTest, MultiplicationMatchesScalarFieldMul)
81 for (
int trial = 0; trial < 150; ++trial) {
82 auto a = random_five();
83 auto b = random_five();
85 for (
size_t i = 0; i < 5; ++i) {
86 expected[i] =
a[i] *
b[i];
89 auto got = (va * vb).to_array();
90 EXPECT_TRUE(field_array_eq(expected, got)) <<
"trial " << trial;
94TEST(VectorFieldTest, EqualityDetectsMatchesAndMismatches)
96 auto a = random_five();
101 EXPECT_EQ(va.eq_mask(vb), 0b11111u);
105 a2[0] = a2[0] +
fr(1);
107 EXPECT_EQ(va.eq_mask(vc), 0b11110u);
111 a3[3] = a3[3] +
fr(1);
113 EXPECT_EQ(va.eq_mask(vd), 0b10111u);
116TEST(VectorFieldTest, EqualityAcceptsAliasedCoarseRepresentations)
120 auto a = random_five();
126 for (
size_t i = 0; i < 5; ++i) {
129 a_plus_p[i] =
a[i] + p_as_field;
134 EXPECT_EQ(va.eq_mask(vb), 0b11111u);
137TEST(VectorFieldTest, IsZeroDetectsZeroAndP)
147 uint32_t iz = v.is_zero_mask();
149 EXPECT_EQ(iz & 1u, 1u);
150 EXPECT_EQ(iz & 2u, 0u);
151 EXPECT_EQ(iz & 4u, 4u);
152 EXPECT_EQ(iz & 8u, 0u);
153 EXPECT_EQ(iz & 16u, 16u);
156TEST(VectorFieldTest, IsZeroAcceptsAliasedZero)
165 uint32_t iz = v.is_zero_mask();
166 EXPECT_EQ(iz, 0b01111u);
169TEST(VectorFieldTest, AddAssociativity)
171 auto a = random_five();
172 auto b = random_five();
173 auto c = random_five();
174 Vec va(
a), vb(
b), vc(c);
176 auto ab_c = ((va + vb) + vc).to_array();
177 auto a_bc = (va + (vb + vc)).to_array();
178 EXPECT_TRUE(field_array_eq(ab_c, a_bc));
181TEST(VectorFieldTest, SubToZeroIsZero)
183 auto a = random_five();
185 auto diff = (va - va).to_array();
186 for (
const auto& d : diff) {
187 EXPECT_TRUE(d.is_zero());
191TEST(VectorFieldTest, MulByOneIsIdentity)
193 auto a = random_five();
196 auto got = (va * v1).to_array();
197 EXPECT_TRUE(field_array_eq(
a, got));
200TEST(VectorFieldTest, DistributivityMulOverAdd)
202 auto a = random_five();
203 auto b = random_five();
204 auto c = random_five();
205 Vec va(
a), vb(
b), vc(c);
207 auto lhs = (va * (vb + vc)).to_array();
208 auto rhs_l = (va * vb).to_array();
209 auto rhs_r = (va * vc).to_array();
210 Vec vrl(rhs_l), vrr(rhs_r);
211 auto rhs = (vrl + vrr).to_array();
213 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
216TEST(VectorFieldTest, MultiplicationCommutative)
218 for (
int trial = 0; trial < 32; ++trial) {
219 auto a = random_five();
220 auto b = random_five();
222 auto ab = (va * vb).to_array();
223 auto ba = (vb * va).to_array();
224 EXPECT_TRUE(field_array_eq(ab, ba)) <<
"trial " << trial;
228TEST(VectorFieldTest, MultiplicationAssociative)
233 for (
int trial = 0; trial < 32; ++trial) {
234 auto a = random_five();
235 auto b = random_five();
236 auto c = random_five();
237 Vec va(
a), vb(
b), vc(c);
240 auto lhs = (ab_vec * vc).to_array();
243 auto rhs = (va * bc_vec).to_array();
245 EXPECT_TRUE(field_array_eq(
lhs,
rhs)) <<
"trial " << trial;
249TEST(VectorFieldTest, SquaringMatchesScalarMul)
255 for (
int trial = 0; trial < 64; ++trial) {
256 auto a = random_five();
258 for (
size_t i = 0; i < 5; ++i) {
259 expected[i] =
a[i] *
a[i];
262 auto got = (va * va).to_array();
263 EXPECT_TRUE(field_array_eq(expected, got)) <<
"trial " << trial;
267TEST(VectorFieldTest, MultiplicationEdgeValues)
278 auto rnd = random_five();
280 Vec vr(rnd), vm(mixed);
283 for (
size_t i = 0; i < 5; ++i) {
284 expected[i] = rnd[i] * mixed[i];
286 auto got = (vr * vm).to_array();
287 EXPECT_TRUE(field_array_eq(expected, got));
291 auto zr = (vz * vr).to_array();
292 for (
const auto& x : zr) {
293 EXPECT_TRUE(x.is_zero());
298 auto nn = (vn * vn).to_array();
299 for (
const auto& x : nn) {
304TEST(VectorFieldTest, GatherScatterRoundTrip)
307 for (
size_t i = 0; i < 16; ++i) {
310 std::array<size_t, 5> idx{ 3, 0, 7, 15, 9 };
315 for (
size_t i = 0; i < 16; ++i) {
320 for (
size_t L = 0; L < 5; ++L) {
321 EXPECT_EQ(dst[idx[L]], src[idx[L]]) <<
"lane " << L;
325TEST(VectorFieldTest, LinearMemoryCtorAndStoreToRoundTrip)
333 for (
size_t i = 0; i < 5; ++i) {
337 for (
size_t L = 0; L < 5; ++L) {
338 EXPECT_EQ(v.
get(L), src[L]) <<
"lane " << L;
341 for (
size_t i = 0; i < 5; ++i) {
345 for (
size_t L = 0; L < 5; ++L) {
346 EXPECT_EQ(dst[L], src[L]) <<
"lane " << L;
350TEST(VectorFieldTest, LinearMemoryCtorMatchesGatherForLinearIndices)
357 for (
size_t i = 0; i < 5; ++i) {
360 Vec a =
Vec::gather(src.data(), std::array<size_t, 5>{ 0, 1, 2, 3, 4 });
362 auto aa =
a.to_array();
363 auto bb =
b.to_array();
364 for (
size_t L = 0; L < 5; ++L) {
365 EXPECT_EQ(aa[L],
bb[L]) <<
"lane " << L;
369TEST(VectorFieldTest, GatherLanesMatchArray)
372 for (
size_t i = 0; i < 16; ++i) {
375 std::array<size_t, 5> idx{ 2, 5, 1, 8, 0 };
378 for (
size_t L = 0; L < 5; ++L) {
379 EXPECT_EQ(v.
get(L), src[idx[L]]) <<
"lane " << L;
383TEST(VectorFieldTest, MixedAddBroadcast)
385 auto a = random_five();
391 auto lhs = (va + s).to_array();
392 auto rhs = (va + bcast).to_array();
393 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
396 auto lhs = (s + va).to_array();
397 auto rhs = (bcast + va).to_array();
398 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
401 auto lhs = (va - s).to_array();
402 auto rhs = (va - bcast).to_array();
403 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
406 auto lhs = (s - va).to_array();
407 auto rhs = (bcast - va).to_array();
408 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
411 auto lhs = (va * s).to_array();
412 auto rhs = (va * bcast).to_array();
413 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
416 auto lhs = (s * va).to_array();
417 auto rhs = (bcast * va).to_array();
418 EXPECT_TRUE(field_array_eq(
lhs,
rhs));
422TEST(VectorFieldTest, ScalarTypeAlias)
428TEST(VectorFieldTest, CoarseInputArithmeticMatchesScalar)
437 for (
int trial = 0; trial < 150; ++trial) {
438 auto a = random_five();
439 auto b = random_five();
440 auto c = random_five();
441 auto d = random_five();
449 for (
size_t i = 0; i < 5; ++i) {
457 EXPECT_TRUE(field_array_eq(add_exp, (coarse_l + coarse_r).to_array())) <<
"add trial " << trial;
458 EXPECT_TRUE(field_array_eq(sub_exp, (coarse_l - coarse_r).to_array())) <<
"sub trial " << trial;
459 EXPECT_TRUE(field_array_eq(mul_exp, (coarse_l * coarse_r).to_array())) <<
"mul trial " << trial;
466 Vec max_coarse =
Vec(maxes) +
Vec(maxes);
467 const fr m = neg_one + neg_one;
471 for (
size_t i = 0; i < 5; ++i) {
476 EXPECT_TRUE(field_array_eq(add_exp, (max_coarse + max_coarse).to_array()));
477 EXPECT_TRUE(field_array_eq(sub_exp, (max_coarse - max_coarse).to_array()));
478 EXPECT_TRUE(field_array_eq(mul_exp, (max_coarse * max_coarse).to_array()));
481TEST(VectorFieldTest, CoarseStoreReloadRoundTrip)
489 for (
int trial = 0; trial < 64; ++trial) {
490 auto a = random_five();
491 auto b = random_five();
494 for (
size_t i = 0; i < 5; ++i) {
495 expected[i] =
a[i] +
b[i];
502 Vec reloaded(buf.data());
503 EXPECT_TRUE(field_array_eq(expected, reloaded.to_array())) <<
"store_to/ctor trial " << trial;
508 std::array<size_t, 5> idx{ 0, 1, 2, 3, 4 };
509 coarse.
scatter(buf.data(), idx);
511 EXPECT_TRUE(field_array_eq(expected, reloaded.
to_array())) <<
"scatter/gather trial " << trial;
518 Vec max_coarse =
Vec(maxes) +
Vec(maxes);
519 const fr m = neg_one + neg_one;
523 Vec reloaded(buf.data());
524 EXPECT_TRUE(field_array_eq(expected, reloaded.to_array()));
545 for (
size_t i = 0; i < 5; ++i) {
546 out[i] = fq::random_element();
553 for (
size_t i = 0; i < 5; ++i) {
561TEST(VectorFieldFqTest, RoundtripConstructionPreservesValues)
563 auto input = random_five_fq();
566 EXPECT_TRUE(field_array_eq_fq(input,
out));
569TEST(VectorFieldFqTest, AdditionMatchesScalarFieldAdd)
571 for (
int trial = 0; trial < 32; ++trial) {
572 auto a = random_five_fq();
573 auto b = random_five_fq();
575 for (
size_t i = 0; i < 5; ++i) {
576 expected[i] =
a[i] +
b[i];
579 auto got = (va + vb).to_array();
580 EXPECT_TRUE(field_array_eq_fq(expected, got)) <<
"trial " << trial;
584TEST(VectorFieldFqTest, SubtractionMatchesScalarFieldSub)
586 for (
int trial = 0; trial < 32; ++trial) {
587 auto a = random_five_fq();
588 auto b = random_five_fq();
590 for (
size_t i = 0; i < 5; ++i) {
591 expected[i] =
a[i] -
b[i];
594 auto got = (va - vb).to_array();
595 EXPECT_TRUE(field_array_eq_fq(expected, got)) <<
"trial " << trial;
599TEST(VectorFieldFqTest, MultiplicationMatchesScalarFieldMul)
604 for (
int trial = 0; trial < 150; ++trial) {
605 auto a = random_five_fq();
606 auto b = random_five_fq();
608 for (
size_t i = 0; i < 5; ++i) {
609 expected[i] =
a[i] *
b[i];
612 auto got = (va * vb).to_array();
613 EXPECT_TRUE(field_array_eq_fq(expected, got)) <<
"trial " << trial;
617TEST(VectorFieldFqTest, EqualityDetectsMatchesAndMismatches)
619 auto a = random_five_fq();
623 EXPECT_EQ(va.eq_mask(vb), 0b11111u);
626 a_flipped[0] =
a[0] + fq::one();
628 EXPECT_EQ(va.eq_mask(vc), 0b11110u);
631TEST(VectorFieldFqTest, IsZeroDetectsZeroAndP)
634 for (
auto& x : zeros) {
638 EXPECT_EQ(v_zero.is_zero_mask(), 0b11111u);
640 auto non_zero = random_five_fq();
641 non_zero[0] = fq::one();
642 VecFq v_nz(non_zero);
643 EXPECT_EQ(v_nz.is_zero_mask(), 0u);
646TEST(VectorFieldFqTest, DistributivityMulOverAdd)
648 for (
int trial = 0; trial < 32; ++trial) {
649 auto a = random_five_fq();
650 auto b = random_five_fq();
651 auto c = random_five_fq();
653 for (
size_t i = 0; i < 5; ++i) {
654 expected[i] =
a[i] * (
b[i] + c[i]);
656 VecFq va(
a), vb(
b), vc(c);
657 auto got = (va * (vb + vc)).to_array();
658 EXPECT_TRUE(field_array_eq_fq(expected, got)) <<
"trial " << trial;
662TEST(VectorFieldFqTest, MulByOneIsIdentity)
664 auto a = random_five_fq();
666 for (
auto& x : ones) {
669 VecFq va(
a), v_one(ones);
670 auto got = (va * v_one).to_array();
671 EXPECT_TRUE(field_array_eq_fq(
a, got));
674TEST(VectorFieldFqTest, ScalarTypeAlias)
683TEST(VectorFieldTest, OneIsAllOnes)
686 for (
size_t k = 0; k < 5; ++k) {
687 EXPECT_EQ(
a[k],
fr::one()) <<
"lane " << k;
691TEST(VectorFieldTest, ZeroIsAllZeros)
694 for (
size_t k = 0; k < 5; ++k) {
695 EXPECT_TRUE(
a[k].is_zero()) <<
"lane " << k;
699TEST(VectorFieldTest, ScalarBroadcastCtors)
702 auto a =
Vec(s).to_array();
703 for (
size_t k = 0; k < 5; ++k) {
704 EXPECT_EQ(
a[k], s) <<
"lane " << k;
707 auto b =
Vec(-2).to_array();
709 for (
size_t k = 0; k < 5; ++k) {
710 EXPECT_EQ(
b[k], neg2) <<
"lane " << k;
713 auto c =
Vec(uint64_t{ 42 }).to_array();
714 fr forty_two =
fr(uint64_t{ 42 });
715 for (
size_t k = 0; k < 5; ++k) {
716 EXPECT_EQ(c[k], forty_two) <<
"lane " << k;
720TEST(VectorFieldTest, SqrMatchesSelfMul)
722 for (
int trial = 0; trial < 16; ++trial) {
723 auto a = random_five();
725 for (
size_t k = 0; k < 5; ++k) {
726 expected[k] =
a[k] *
a[k];
728 auto got =
Vec(
a).
sqr().to_array();
729 EXPECT_TRUE(field_array_eq(expected, got)) <<
"trial " << trial;
733TEST(VectorFieldTest, InvertLanewise)
735 auto a = random_five();
737 for (
size_t k = 0; k < 5; ++k) {
741 EXPECT_TRUE(field_array_eq(expected, got));
744 auto prod = (
Vec(
a) *
Vec(
a).invert()).to_array();
745 for (
size_t k = 0; k < 5; ++k) {
746 EXPECT_EQ(prod[k],
fr::one()) <<
"lane " << k;
752TEST(VectorFieldFqTest, LinearMemoryCtorAndStoreToRoundTrip)
755 for (
size_t i = 0; i < 5; ++i) {
756 src[i] = fq::random_element();
759 for (
size_t L = 0; L < 5; ++L) {
760 EXPECT_EQ(v.
get(L), src[L]) <<
"lane " << L;
763 for (
size_t i = 0; i < 5; ++i) {
767 for (
size_t L = 0; L < 5; ++L) {
768 EXPECT_EQ(dst[L], src[L]) <<
"lane " << L;
772TEST(VectorFieldFqTest, LinearMemoryCtorMatchesGatherForLinearIndices)
775 for (
size_t i = 0; i < 5; ++i) {
776 src[i] = fq::random_element();
778 VecFq
a = VecFq::gather(src.data(), std::array<size_t, 5>{ 0, 1, 2, 3, 4 });
780 auto a_arr =
a.to_array();
781 auto b_arr =
b.to_array();
782 for (
size_t L = 0; L < 5; ++L) {
783 EXPECT_EQ(a_arr[L], b_arr[L]) <<
"lane " << L;
TEST(acir_formal_proofs, uint_terms_add)
Tests 128-bit unsigned addition Verifies that the ACIR implementation of addition is correct Executio...
static constexpr uint64_t modulus_0
static constexpr uint64_t modulus_3
static constexpr uint64_t modulus_2
static constexpr uint64_t modulus_1
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > lhs
bb::VectorAffineElementPushSpan< BaseParams > out
bb::VectorAffineElementPushSpan< BaseParams > rhs
static VectorField zero() noexcept
Field get(size_t i) const noexcept
std::array< Field, 5 > to_array() const noexcept
static VectorField gather(const Field *base, std::array< size_t, 5 > idx, size_t offset=0) noexcept
void store_to(Field *base) const noexcept
void scatter(Field *base, std::array< size_t, 5 > idx, size_t offset=0) const noexcept
static VectorField one() noexcept
static constexpr field one()
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept
static constexpr field zero()
bb::VectorField< bb::Bn254FrParams > Vec