7#include <gtest/gtest.h>
23TEST(VectorizedForTest, ScalarIndexShift)
25 EXPECT_EQ(
shift(ScalarIndex{ 7 }, 3).i, 10u);
28TEST(VectorizedForTest, VectorIndexShift)
30 auto out =
shift(VectorIndex<5>{ { 0, 1, 2, 3, 4 } }, 10);
31 std::array<size_t, 5> expected{ 10, 11, 12, 13, 14 };
32 for (
size_t k = 0; k < 5; ++k) {
33 EXPECT_EQ(
out.idx[k], expected[k]) <<
"lane " << k;
37TEST(VectorizedForTest, ConstexprShift)
39 static_assert(
shift(ScalarIndex{ 1 }, 2).i == 3);
40 static_assert(
shift(VectorIndex<3>{ { 1, 2, 3 } }, 5).idx[2] == 8);
44TEST(VectorizedFor, ContiguousVectorIndexShift)
46 EXPECT_EQ(
shift(ContiguousVectorIndex<5>{ 7 }, 3).base, 10u);
49TEST(VectorizedForTest, PolynomialScalarReadWrite)
53 for (
size_t i = 0; i < 8; ++i) {
60 Fr r = p[ScalarIndex{ 3 }];
61 EXPECT_EQ(r, known[3]);
65 p[ScalarIndex{ 5 }] = v;
69TEST(VectorizedForTest, PolynomialVectorReadRoundTrip)
72 for (
size_t i = 0; i < 16; ++i) {
76 std::array<size_t, 5> idx{ 3, 0, 7, 15, 9 };
79 Vec v = p[VectorIndex<5>{ idx }];
80 for (
size_t L = 0; L < 5; ++L) {
81 EXPECT_EQ(v.
get(L), p[idx[L]]) <<
"lane " << L;
85TEST(VectorizedForTest, PolynomialVectorWrite)
94 std::array<size_t, 5> idx{ 2, 5, 1, 8, 0 };
95 p[VectorIndex<5>{ idx }] = v;
98 for (
size_t L = 0; L < 5; ++L) {
99 EXPECT_EQ(p[idx[L]], vals[L]) <<
"lane " << L;
103 for (
size_t i = 0; i < 16; ++i) {
104 bool is_target =
false;
105 for (
size_t L = 0; L < 5; ++L) {
112 EXPECT_TRUE(p[i].is_zero()) <<
"position " << i;
117TEST(VectorizedForTest, VectorizedForPointwiseMulExact)
119 constexpr size_t SIZE = 20;
120 Poly
a(SIZE),
b(SIZE),
out(SIZE);
121 for (
size_t i = 0; i < SIZE; ++i) {
122 a.at(i) =
Fr(i * 7 + 3);
123 b.at(i) =
Fr(i * 11 + 5);
126 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, [&](
auto ctx) {
out[ctx] =
a[ctx] *
b[ctx]; });
128 for (
size_t i = 0; i < SIZE; ++i) {
129 Fr ref =
a[i] *
b[i];
130 EXPECT_EQ(
out[i], ref) <<
"i=" << i;
134TEST(VectorizedForTest, VectorizedForTailExercised)
136 constexpr size_t SIZE = 23;
137 Poly
a(SIZE),
b(SIZE),
out(SIZE);
138 for (
size_t i = 0; i < SIZE; ++i) {
139 a.at(i) =
Fr(i * 7 + 3);
140 b.at(i) =
Fr(i * 11 + 5);
143 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, [&](
auto ctx) {
out[ctx] =
a[ctx] *
b[ctx]; });
145 for (
size_t i = 0; i < SIZE; ++i) {
146 Fr ref =
a[i] *
b[i];
147 EXPECT_EQ(
out[i], ref) <<
"i=" << i;
151TEST(VectorizedForTest, VectorizedForNonZeroStart)
153 constexpr size_t SIZE = 16;
154 Poly
a(SIZE),
out(SIZE);
155 for (
size_t i = 0; i < SIZE; ++i) {
156 a.at(i) =
Fr(i * 13 + 1);
159 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(3, 14, [&](
auto ctx) {
out[ctx] =
a[ctx] +
a[ctx]; });
161 for (
size_t i = 0; i < 3; ++i) {
162 EXPECT_TRUE(
out[i].is_zero()) <<
"i=" << i;
164 for (
size_t i = 3; i < 14; ++i) {
165 Fr ref =
a[i] +
a[i];
166 EXPECT_EQ(
out[i], ref) <<
"i=" << i;
168 for (
size_t i = 14; i < SIZE; ++i) {
169 EXPECT_TRUE(
out[i].is_zero()) <<
"i=" << i;
173TEST(VectorizedForTest, VectorizedForEmptyRange)
176 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(5, 5, [&](
auto) { ++counter; });
177 EXPECT_EQ(counter, 0u);
180 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(5, 7, [&](
auto) { ++counter; });
181 EXPECT_EQ(counter, 2u);
184TEST(VectorizedForTest, VectorizedForSelfReadMutable)
186 constexpr size_t SIZE = 20;
189 for (
size_t i = 0; i < SIZE; ++i) {
190 original[i] =
Fr(i * 7 + 3);
191 p.at(i) = original[i];
194 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, [&](
auto ctx) { p[ctx] = p[ctx] + p[ctx]; });
196 for (
size_t i = 0; i < SIZE; ++i) {
197 Fr ref = original[i] + original[i];
198 EXPECT_EQ(p[i], ref) <<
"i=" << i;
202TEST(VectorizedForTest, VectorizedForSelfReadMutableTail)
204 constexpr size_t SIZE = 23;
207 for (
size_t i = 0; i < SIZE; ++i) {
208 original[i] =
Fr(i * 7 + 3);
209 p.at(i) = original[i];
212 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, [&](
auto ctx) { p[ctx] = p[ctx] + p[ctx]; });
214 for (
size_t i = 0; i < SIZE; ++i) {
215 Fr ref = original[i] + original[i];
216 EXPECT_EQ(p[i], ref) <<
"i=" << i;
220TEST(VectorizedForTest, MixedKernelSelfPlusOther)
222 constexpr size_t SIZE = 20;
223 Poly self(SIZE), other(SIZE);
225 for (
size_t i = 0; i < SIZE; ++i) {
226 self_orig[i] =
Fr(i * 13 + 1);
227 other_vals[i] =
Fr(i * 17 + 2);
228 self.at(i) = self_orig[i];
229 other.at(i) = other_vals[i];
233 vectorized_for<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, [&](
auto ctx) { self[ctx] = self[ctx] + other[ctx] * scalar; });
235 for (
size_t i = 0; i < SIZE; ++i) {
236 Fr ref = self_orig[i] + other_vals[i] * scalar;
237 EXPECT_EQ(self[i], ref) <<
"i=" << i;
241TEST(VectorizedForTest, VectorizedForIfEvenIndices)
243 constexpr size_t SIZE = 32;
245 for (
size_t i = 0; i < SIZE; ++i) {
249 vectorized_for_if<VECTOR_FIELD_WIDTH, Fr>(
250 0, SIZE, [](
size_t i) {
return (i % 2) == 0; }, [&](
auto ctx) { p[ctx] = p[ctx] + p[ctx]; });
252 for (
size_t i = 0; i < SIZE; ++i) {
254 EXPECT_EQ(p[i],
Fr(2 * i)) <<
"i=" << i;
256 EXPECT_EQ(p[i],
Fr(i)) <<
"i=" << i;
261TEST(VectorizedForTest, VectorizedForIfAllMatch)
263 constexpr size_t SIZE = 25;
266 for (
size_t i = 0; i < SIZE; ++i) {
267 original[i] =
Fr(i * 3 + 1);
268 p.at(i) = original[i];
271 vectorized_for_if<VECTOR_FIELD_WIDTH, Fr>(
272 0, SIZE, [](
size_t) {
return true; }, [&](
auto ctx) { p[ctx] = p[ctx] + p[ctx]; });
274 for (
size_t i = 0; i < SIZE; ++i) {
275 EXPECT_EQ(p[i], original[i] + original[i]) <<
"i=" << i;
279TEST(VectorizedForTest, VectorizedForIfNoneMatch)
282 vectorized_for_if<VECTOR_FIELD_WIDTH, Fr>(0, 20, [](
size_t) {
return false; }, [&](
auto) { ++counter; });
283 EXPECT_EQ(counter, 0u);
286TEST(VectorizedForTest, VectorizedForIfTailOnly)
288 constexpr size_t SIZE = 10;
291 for (
size_t i = 0; i < SIZE; ++i) {
292 original[i] =
Fr(i * 11 + 7);
293 p.at(i) = original[i];
296 auto pred = [](
size_t i) {
return i == 1 || i == 4 || i == 7; };
297 size_t kernel_calls = 0;
298 vectorized_for_if<VECTOR_FIELD_WIDTH, Fr>(0, SIZE, pred, [&](
auto ctx) {
300 p[ctx] = p[ctx] + p[ctx];
303 EXPECT_EQ(kernel_calls, 3u);
304 for (
size_t i = 0; i < SIZE; ++i) {
306 EXPECT_EQ(p[i], original[i] + original[i]) <<
"i=" << i;
308 EXPECT_EQ(p[i], original[i]) <<
"i=" << i;
313TEST(VectorizedForTest, VectorizedForIfPredicateCallOrder)
315 std::vector<size_t> log;
316 vectorized_for_if<VECTOR_FIELD_WIDTH, Fr>(
325 std::vector<size_t> expected{ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
326 EXPECT_EQ(log, expected);
TEST(acir_formal_proofs, uint_terms_add)
Tests 128-bit unsigned addition Verifies that the ACIR implementation of addition is correct Executio...
field< Bn254FrParams > fr
void vectorized_for(size_t start, size_t end, K &&kernel)
constexpr size_t VECTOR_FIELD_WIDTH
constexpr ScalarIndex shift(ScalarIndex ctx, size_t d)
void vectorized_for_if(size_t start, size_t end, P &&predicate, K &&kernel)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > out
Field get(size_t i) const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept