Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
multilinear_batching_relation_consistency.test.cpp
Go to the documentation of this file.
4
5#include <array>
6#include <gtest/gtest.h>
7
8using namespace bb;
9
10using FF = fr;
11
12namespace {
13
14constexpr size_t NUM_CLAIMS = 3;
15
16struct InputElements {
17 std::array<FF, NUM_CLAIMS> non_shifted_values{};
18 std::array<FF, NUM_CLAIMS> shifted_values{};
20
21 const FF& non_shifted(size_t idx) const { return non_shifted_values[idx]; }
22 const FF& shifted(size_t idx) const { return shifted_values[idx]; }
23 const FF& eq(size_t idx) const { return eq_values[idx]; }
24
25 static InputElements special()
26 {
28 for (size_t idx = 0; idx < NUM_CLAIMS; ++idx) {
29 result.non_shifted_values[idx] = FF(idx + 1);
30 result.shifted_values[idx] = FF(idx + 1 + NUM_CLAIMS);
31 result.eq_values[idx] = FF(idx + 1 + (2 * NUM_CLAIMS));
32 }
33 return result;
34 }
35
36 static InputElements random()
37 {
39 for (size_t idx = 0; idx < NUM_CLAIMS; ++idx) {
40 result.non_shifted_values[idx] = FF::random_element();
41 result.shifted_values[idx] = FF::random_element();
42 result.eq_values[idx] = FF::random_element();
43 }
44 return result;
45 }
46};
47
48} // namespace
49
55
56TEST_F(MultilinearBatchingRelationConsistency, AccumulateMatchesDirectComputation)
57{
58 const auto run_case = [](const InputElements& inputs, const SumcheckArrayOfValuesOverSubrelations& seed) {
59 SumcheckArrayOfValuesOverSubrelations accumulator = seed;
60 SumcheckArrayOfValuesOverSubrelations expected = seed;
61
62 RelationParameters<FF> parameters;
63 const FF gamma = FF::random_element();
64 parameters.compute_multilinear_batching_challenges(gamma, NUM_CLAIMS);
65
66 FF gamma_pow(1);
67 for (size_t idx = 0; idx < NUM_CLAIMS; ++idx) {
68 expected[0] += gamma_pow * inputs.non_shifted(idx) * inputs.eq(idx);
69 expected[1] += gamma_pow * inputs.shifted(idx) * inputs.eq(idx);
70 gamma_pow *= gamma;
71 }
72
73 Relation::accumulate(accumulator, inputs, parameters);
74
75 EXPECT_EQ(accumulator, expected);
76 };
77
78 SumcheckArrayOfValuesOverSubrelations zero_seed{ FF(0), FF(0) };
79 run_case(InputElements::special(), zero_seed);
80
81 SumcheckArrayOfValuesOverSubrelations random_seed{ FF::random_element(), FF::random_element() };
82 run_case(InputElements::random(), random_seed);
83}
84
86{
87 // Test case 1: every eq value is zero -> should skip
88 InputElements zero_eq = InputElements::random();
89 for (size_t idx = 0; idx < NUM_CLAIMS; ++idx) {
90 zero_eq.eq_values[idx] = FF(0);
91 }
92 EXPECT_TRUE(Relation::skip(zero_eq));
93
94 // Test case 2: every non_shifted and shifted value is zero -> should skip
95 InputElements zero_witnesses = InputElements::random();
96 for (size_t idx = 0; idx < NUM_CLAIMS; ++idx) {
97 zero_witnesses.non_shifted_values[idx] = FF(0);
98 zero_witnesses.shifted_values[idx] = FF(0);
99 }
100 EXPECT_TRUE(Relation::skip(zero_witnesses));
101
102 // Test case 3: each slot contributes zero for a different reason -> should skip
103 InputElements mixed_zero = InputElements::random();
104 mixed_zero.eq_values[0] = FF(0);
105 mixed_zero.non_shifted_values[1] = FF(0);
106 mixed_zero.shifted_values[1] = FF(0);
107 mixed_zero.non_shifted_values[2] = FF(0);
108 mixed_zero.shifted_values[2] = FF(0);
109 mixed_zero.eq_values[2] = FF(0);
110 EXPECT_TRUE(Relation::skip(mixed_zero));
111
112 // Test case 4: a single slot with non-zero non_shifted and non-zero eq -> should not skip
113 InputElements non_shifted_active;
114 non_shifted_active.non_shifted_values[NUM_CLAIMS - 1] = FF(1);
115 non_shifted_active.eq_values[NUM_CLAIMS - 1] = FF(1);
116 EXPECT_FALSE(Relation::skip(non_shifted_active));
117
118 // Test case 5: a single slot with non-zero shifted and non-zero eq -> should not skip
119 InputElements shifted_active;
120 shifted_active.shifted_values[0] = FF(1);
121 shifted_active.eq_values[0] = FF(1);
122 EXPECT_FALSE(Relation::skip(shifted_active));
123
124 // Test case 6: all values non-zero -> should not skip
125 EXPECT_FALSE(Relation::skip(InputElements::special()));
126}
typename Relation::SumcheckArrayOfValuesOverSubrelations SumcheckArrayOfValuesOverSubrelations
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
ArrayOfValues< FF, RelationImpl::SUBRELATION_PARTIAL_LENGTHS > SumcheckArrayOfValuesOverSubrelations
AvmProvingInputs inputs
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:160
field< Bn254FrParams > fr
Definition fr.hpp:155
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Container for parameters used by the grand product (permutation, lookup) Honk relations.
void compute_multilinear_batching_challenges(const T &batching_challenge, const size_t num_claims)
static field random_element(numeric::RNG *engine=nullptr) noexcept
typename Flavor::AllValues InputElements
VectorField result