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 w_non_shifted_accumulator;
16 FF w_non_shifted_instance;
17 FF w_evaluations_accumulator;
18 FF w_evaluations_instance;
19 FF w_shifted_accumulator;
20 FF w_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.w_non_shifted_accumulator * inputs.w_evaluations_accumulator;
52 expected[1] += inputs.w_shifted_accumulator * inputs.w_evaluations_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.w_non_shifted_instance * inputs.w_evaluations_instance;
73 expected[1] += inputs.w_shifted_instance * inputs.w_evaluations_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: w_evaluations_accumulator is zero -> should skip
91 InputElements zero_evaluations;
92 zero_evaluations.w_non_shifted_accumulator = FF::random_element();
93 zero_evaluations.w_non_shifted_instance = FF::random_element();
94 zero_evaluations.w_shifted_accumulator = FF::random_element();
95 zero_evaluations.w_shifted_instance = FF::random_element();
96 zero_evaluations.w_evaluations_accumulator = FF(0);
97 zero_evaluations.w_evaluations_instance = FF::random_element();
98
99 EXPECT_TRUE(Relation::skip(zero_evaluations));
100
101 // Test case 2: both w_non_shifted_accumulator and w_shifted_accumulator are zero -> should skip
102 InputElements zero_accumulators;
103 zero_accumulators.w_non_shifted_accumulator = FF(0);
104 zero_accumulators.w_non_shifted_instance = FF::random_element();
105 zero_accumulators.w_shifted_accumulator = FF(0);
106 zero_accumulators.w_shifted_instance = FF::random_element();
107 zero_accumulators.w_evaluations_accumulator = FF::random_element();
108 zero_accumulators.w_evaluations_instance = FF::random_element();
109
110 EXPECT_TRUE(Relation::skip(zero_accumulators));
111
112 // Test case 3: w_non_shifted_accumulator is non-zero, w_evaluations_accumulator is non-zero -> should not skip
113 InputElements non_zero_case;
114 non_zero_case.w_non_shifted_accumulator = FF(1);
115 non_zero_case.w_non_shifted_instance = FF::random_element();
116 non_zero_case.w_shifted_accumulator = FF::random_element();
117 non_zero_case.w_shifted_instance = FF::random_element();
118 non_zero_case.w_evaluations_accumulator = FF(1);
119 non_zero_case.w_evaluations_instance = FF::random_element();
120
121 EXPECT_FALSE(Relation::skip(non_zero_case));
122}
123
125{
126 // Test case 1: both w_evaluations_accumulator and w_evaluations_instance are zero -> should skip
127 InputElements zero_evaluations;
128 zero_evaluations.w_non_shifted_accumulator = FF::random_element();
129 zero_evaluations.w_non_shifted_instance = FF::random_element();
130 zero_evaluations.w_shifted_accumulator = FF::random_element();
131 zero_evaluations.w_shifted_instance = FF::random_element();
132 zero_evaluations.w_evaluations_accumulator = FF(0);
133 zero_evaluations.w_evaluations_instance = FF(0);
134
135 EXPECT_TRUE(Relation::skip(zero_evaluations));
136
137 // Test case 2: all shifted/non-shifted fields are zero -> should skip
138 InputElements zero_all_shifted;
139 zero_all_shifted.w_non_shifted_accumulator = FF(0);
140 zero_all_shifted.w_non_shifted_instance = FF(0);
141 zero_all_shifted.w_shifted_accumulator = FF(0);
142 zero_all_shifted.w_shifted_instance = FF(0);
143 zero_all_shifted.w_evaluations_accumulator = FF::random_element();
144 zero_all_shifted.w_evaluations_instance = FF::random_element();
145
146 EXPECT_TRUE(Relation::skip(zero_all_shifted));
147
148 // Test case 3: w_evaluations_accumulator is zero but w_evaluations_instance is non-zero -> should not skip
149 InputElements accumulator_eval_zero;
150 accumulator_eval_zero.w_non_shifted_accumulator = FF::random_element();
151 accumulator_eval_zero.w_non_shifted_instance = FF::random_element();
152 accumulator_eval_zero.w_shifted_accumulator = FF::random_element();
153 accumulator_eval_zero.w_shifted_instance = FF::random_element();
154 accumulator_eval_zero.w_evaluations_accumulator = FF(0);
155 accumulator_eval_zero.w_evaluations_instance = FF(1);
156
157 EXPECT_FALSE(Relation::skip(accumulator_eval_zero));
158
159 // Test case 4: w_evaluations_instance is zero but w_evaluations_accumulator is non-zero -> should not skip
160 InputElements instance_eval_zero;
161 instance_eval_zero.w_non_shifted_accumulator = FF::random_element();
162 instance_eval_zero.w_non_shifted_instance = FF::random_element();
163 instance_eval_zero.w_shifted_accumulator = FF::random_element();
164 instance_eval_zero.w_shifted_instance = FF::random_element();
165 instance_eval_zero.w_evaluations_accumulator = FF(1);
166 instance_eval_zero.w_evaluations_instance = FF(0);
167
168 EXPECT_FALSE(Relation::skip(instance_eval_zero));
169
170 // Test case 5: all non-zero -> should not skip
171 InputElements all_non_zero;
172 all_non_zero.w_non_shifted_accumulator = FF(1);
173 all_non_zero.w_non_shifted_instance = FF(1);
174 all_non_zero.w_shifted_accumulator = FF(1);
175 all_non_zero.w_shifted_instance = FF(1);
176 all_non_zero.w_evaluations_accumulator = FF(1);
177 all_non_zero.w_evaluations_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