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
14struct InputElements {
15 FF batched_unshifted_accumulator;
16 FF batched_unshifted_instance;
17 FF eq_accumulator;
18 FF eq_instance;
19 FF batched_shifted_accumulator;
20 FF batched_shifted_instance;
21
22 static InputElements special() { return { FF(1), FF(2), FF(3), FF(4), FF(5), FF(6) }; }
23
24 static InputElements random()
25 {
28 }
29};
30
31} // namespace
32
38
44
46{
47 const auto run_case = [](const InputElements& inputs, const SumcheckArrayOfValuesOverSubrelations& seed) {
48 SumcheckArrayOfValuesOverSubrelations accumulator = seed;
49 SumcheckArrayOfValuesOverSubrelations expected = seed;
50
51 expected[0] += inputs.batched_unshifted_accumulator * inputs.eq_accumulator;
52 expected[1] += inputs.batched_shifted_accumulator * inputs.eq_accumulator;
53
54 Relation::accumulate(accumulator, inputs);
55
56 EXPECT_EQ(accumulator, expected);
57 };
58
59 SumcheckArrayOfValuesOverSubrelations zero_seed{ FF(0), FF(0) };
60 run_case(InputElements::special(), zero_seed);
61
62 SumcheckArrayOfValuesOverSubrelations random_seed{ FF::random_element(), FF::random_element() };
63 run_case(InputElements::random(), random_seed);
64}
65
66TEST_F(MultilinearBatchingInstanceRelationConsistency, AccumulateMatchesDirectComputation)
67{
68 const auto run_case = [](const InputElements& inputs, const SumcheckArrayOfValuesOverSubrelations& seed) {
69 SumcheckArrayOfValuesOverSubrelations accumulator = seed;
70 SumcheckArrayOfValuesOverSubrelations expected = seed;
71
72 expected[0] += inputs.batched_unshifted_instance * inputs.eq_instance;
73 expected[1] += inputs.batched_shifted_instance * inputs.eq_instance;
74
75 // const auto parameters = RelationParameters<FF>::get_random();
76 Relation::accumulate(accumulator, inputs);
77
78 EXPECT_EQ(accumulator, expected);
79 };
80
81 SumcheckArrayOfValuesOverSubrelations zero_seed{ FF(0), FF(0) };
82 run_case(InputElements::special(), zero_seed);
83
84 SumcheckArrayOfValuesOverSubrelations random_seed{ FF::random_element(), FF::random_element() };
85 run_case(InputElements::random(), random_seed);
86}
87
89{
90 // Test case 1: eq_accumulator is zero -> should skip
91 InputElements zero_eq;
92 zero_eq.batched_unshifted_accumulator = FF::random_element();
93 zero_eq.batched_unshifted_instance = FF::random_element();
94 zero_eq.batched_shifted_accumulator = FF::random_element();
95 zero_eq.batched_shifted_instance = FF::random_element();
96 zero_eq.eq_accumulator = FF(0);
97 zero_eq.eq_instance = FF::random_element();
98
99 EXPECT_TRUE(Relation::skip(zero_eq));
100
101 // Test case 2: both batched_unshifted_accumulator and batched_shifted_accumulator are zero -> should skip
102 InputElements zero_accumulators;
103 zero_accumulators.batched_unshifted_accumulator = FF(0);
104 zero_accumulators.batched_unshifted_instance = FF::random_element();
105 zero_accumulators.batched_shifted_accumulator = FF(0);
106 zero_accumulators.batched_shifted_instance = FF::random_element();
107 zero_accumulators.eq_accumulator = FF::random_element();
108 zero_accumulators.eq_instance = FF::random_element();
109
110 EXPECT_TRUE(Relation::skip(zero_accumulators));
111
112 // Test case 3: batched_unshifted_accumulator is non-zero, eq_accumulator is non-zero -> should not skip
113 InputElements non_zero_case;
114 non_zero_case.batched_unshifted_accumulator = FF(1);
115 non_zero_case.batched_unshifted_instance = FF::random_element();
116 non_zero_case.batched_shifted_accumulator = FF::random_element();
117 non_zero_case.batched_shifted_instance = FF::random_element();
118 non_zero_case.eq_accumulator = FF(1);
119 non_zero_case.eq_instance = FF::random_element();
120
121 EXPECT_FALSE(Relation::skip(non_zero_case));
122}
123
125{
126 // Test case 1: both eq_accumulator and eq_instance are zero -> should skip
127 InputElements zero_eq;
128 zero_eq.batched_unshifted_accumulator = FF::random_element();
129 zero_eq.batched_unshifted_instance = FF::random_element();
130 zero_eq.batched_shifted_accumulator = FF::random_element();
131 zero_eq.batched_shifted_instance = FF::random_element();
132 zero_eq.eq_accumulator = FF(0);
133 zero_eq.eq_instance = FF(0);
134
135 EXPECT_TRUE(Relation::skip(zero_eq));
136
137 // Test case 2: all shifted/non-shifted fields are zero -> should skip
138 InputElements zero_all_batched;
139 zero_all_batched.batched_unshifted_accumulator = FF(0);
140 zero_all_batched.batched_unshifted_instance = FF(0);
141 zero_all_batched.batched_shifted_accumulator = FF(0);
142 zero_all_batched.batched_shifted_instance = FF(0);
143 zero_all_batched.eq_accumulator = FF::random_element();
144 zero_all_batched.eq_instance = FF::random_element();
145
146 EXPECT_TRUE(Relation::skip(zero_all_batched));
147
148 // Test case 3: eq_accumulator is zero but eq_instance is non-zero -> should not skip
149 InputElements accumulator_eq_zero;
150 accumulator_eq_zero.batched_unshifted_accumulator = FF::random_element();
151 accumulator_eq_zero.batched_unshifted_instance = FF::random_element();
152 accumulator_eq_zero.batched_shifted_accumulator = FF::random_element();
153 accumulator_eq_zero.batched_shifted_instance = FF::random_element();
154 accumulator_eq_zero.eq_accumulator = FF(0);
155 accumulator_eq_zero.eq_instance = FF(1);
156
157 EXPECT_FALSE(Relation::skip(accumulator_eq_zero));
158
159 // Test case 4: eq_instance is zero but eq_accumulator is non-zero -> should not skip
160 InputElements instance_eq_zero;
161 instance_eq_zero.batched_unshifted_accumulator = FF::random_element();
162 instance_eq_zero.batched_unshifted_instance = FF::random_element();
163 instance_eq_zero.batched_shifted_accumulator = FF::random_element();
164 instance_eq_zero.batched_shifted_instance = FF::random_element();
165 instance_eq_zero.eq_accumulator = FF(1);
166 instance_eq_zero.eq_instance = FF(0);
167
168 EXPECT_FALSE(Relation::skip(instance_eq_zero));
169
170 // Test case 5: all non-zero -> should not skip
171 InputElements all_non_zero;
172 all_non_zero.batched_unshifted_accumulator = FF(1);
173 all_non_zero.batched_unshifted_instance = FF(1);
174 all_non_zero.batched_shifted_accumulator = FF(1);
175 all_non_zero.batched_shifted_instance = FF(1);
176 all_non_zero.eq_accumulator = FF(1);
177 all_non_zero.eq_instance = FF(1);
178
179 EXPECT_FALSE(Relation::skip(all_non_zero));
180}
typename Relation::SumcheckArrayOfValuesOverSubrelations SumcheckArrayOfValuesOverSubrelations
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:185
field< Bn254FrParams > fr
Definition fr.hpp:174
static field random_element(numeric::RNG *engine=nullptr) noexcept