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 {
26 return { FF::random_element(), FF::random_element(), FF::random_element(),
27 FF::random_element(), FF::random_element(), FF::random_element() };
28 }
29};
30
31} // namespace
32
38
44
46{
47 const auto run_case =
48 [](const InputElements& inputs, const SumcheckArrayOfValuesOverSubrelations& seed, const FF& scaling_factor) {
49 SumcheckArrayOfValuesOverSubrelations accumulator = seed;
50 SumcheckArrayOfValuesOverSubrelations expected = seed;
51
52 expected[0] += inputs.w_non_shifted_accumulator * inputs.w_evaluations_accumulator * scaling_factor;
53 expected[1] += inputs.w_shifted_accumulator * inputs.w_evaluations_accumulator * scaling_factor;
54
55 const auto parameters = RelationParameters<FF>::get_random();
56 Relation::accumulate(accumulator, inputs, parameters, scaling_factor);
57
58 EXPECT_EQ(accumulator, expected);
59 };
60
61 SumcheckArrayOfValuesOverSubrelations zero_seed{ FF(0), FF(0) };
62 run_case(InputElements::special(), zero_seed, FF(1));
63
64 SumcheckArrayOfValuesOverSubrelations random_seed{ FF::random_element(), FF::random_element() };
65 run_case(InputElements::random(), random_seed, FF::random_element());
66}
67
68TEST_F(MultilinearBatchingInstanceRelationConsistency, AccumulateMatchesDirectComputation)
69{
70 const auto run_case =
71 [](const InputElements& inputs, const SumcheckArrayOfValuesOverSubrelations& seed, const FF& scaling_factor) {
72 SumcheckArrayOfValuesOverSubrelations accumulator = seed;
73 SumcheckArrayOfValuesOverSubrelations expected = seed;
74
75 expected[0] += inputs.w_non_shifted_instance * inputs.w_evaluations_instance * scaling_factor;
76 expected[1] += inputs.w_shifted_instance * inputs.w_evaluations_instance * scaling_factor;
77
78 const auto parameters = RelationParameters<FF>::get_random();
79 Relation::accumulate(accumulator, inputs, parameters, scaling_factor);
80
81 EXPECT_EQ(accumulator, expected);
82 };
83
84 SumcheckArrayOfValuesOverSubrelations zero_seed{ FF(0), FF(0) };
85 run_case(InputElements::special(), zero_seed, FF(1));
86
87 SumcheckArrayOfValuesOverSubrelations random_seed{ FF::random_element(), FF::random_element() };
88 run_case(InputElements::random(), random_seed, FF::random_element());
89}
90
92{
93 // Test case 1: w_evaluations_accumulator is zero -> should skip
94 InputElements zero_evaluations;
95 zero_evaluations.w_non_shifted_accumulator = FF::random_element();
96 zero_evaluations.w_non_shifted_instance = FF::random_element();
97 zero_evaluations.w_shifted_accumulator = FF::random_element();
98 zero_evaluations.w_shifted_instance = FF::random_element();
99 zero_evaluations.w_evaluations_accumulator = FF(0);
100 zero_evaluations.w_evaluations_instance = FF::random_element();
101
102 EXPECT_TRUE(Relation::skip(zero_evaluations));
103
104 // Test case 2: both w_non_shifted_accumulator and w_shifted_accumulator are zero -> should skip
105 InputElements zero_accumulators;
106 zero_accumulators.w_non_shifted_accumulator = FF(0);
107 zero_accumulators.w_non_shifted_instance = FF::random_element();
108 zero_accumulators.w_shifted_accumulator = FF(0);
109 zero_accumulators.w_shifted_instance = FF::random_element();
110 zero_accumulators.w_evaluations_accumulator = FF::random_element();
111 zero_accumulators.w_evaluations_instance = FF::random_element();
112
113 EXPECT_TRUE(Relation::skip(zero_accumulators));
114
115 // Test case 3: w_non_shifted_accumulator is non-zero, w_evaluations_accumulator is non-zero -> should not skip
116 InputElements non_zero_case;
117 non_zero_case.w_non_shifted_accumulator = FF(1);
118 non_zero_case.w_non_shifted_instance = FF::random_element();
119 non_zero_case.w_shifted_accumulator = FF::random_element();
120 non_zero_case.w_shifted_instance = FF::random_element();
121 non_zero_case.w_evaluations_accumulator = FF(1);
122 non_zero_case.w_evaluations_instance = FF::random_element();
123
124 EXPECT_FALSE(Relation::skip(non_zero_case));
125}
126
128{
129 // Test case 1: both w_evaluations_accumulator and w_evaluations_instance are zero -> should skip
130 InputElements zero_evaluations;
131 zero_evaluations.w_non_shifted_accumulator = FF::random_element();
132 zero_evaluations.w_non_shifted_instance = FF::random_element();
133 zero_evaluations.w_shifted_accumulator = FF::random_element();
134 zero_evaluations.w_shifted_instance = FF::random_element();
135 zero_evaluations.w_evaluations_accumulator = FF(0);
136 zero_evaluations.w_evaluations_instance = FF(0);
137
138 EXPECT_TRUE(Relation::skip(zero_evaluations));
139
140 // Test case 2: all shifted/non-shifted fields are zero -> should skip
141 InputElements zero_all_shifted;
142 zero_all_shifted.w_non_shifted_accumulator = FF(0);
143 zero_all_shifted.w_non_shifted_instance = FF(0);
144 zero_all_shifted.w_shifted_accumulator = FF(0);
145 zero_all_shifted.w_shifted_instance = FF(0);
146 zero_all_shifted.w_evaluations_accumulator = FF::random_element();
147 zero_all_shifted.w_evaluations_instance = FF::random_element();
148
149 EXPECT_TRUE(Relation::skip(zero_all_shifted));
150
151 // Test case 3: w_evaluations_accumulator is zero but w_evaluations_instance is non-zero -> should not skip
152 InputElements accumulator_eval_zero;
153 accumulator_eval_zero.w_non_shifted_accumulator = FF::random_element();
154 accumulator_eval_zero.w_non_shifted_instance = FF::random_element();
155 accumulator_eval_zero.w_shifted_accumulator = FF::random_element();
156 accumulator_eval_zero.w_shifted_instance = FF::random_element();
157 accumulator_eval_zero.w_evaluations_accumulator = FF(0);
158 accumulator_eval_zero.w_evaluations_instance = FF(1);
159
160 EXPECT_FALSE(Relation::skip(accumulator_eval_zero));
161
162 // Test case 4: w_evaluations_instance is zero but w_evaluations_accumulator is non-zero -> should not skip
163 InputElements instance_eval_zero;
164 instance_eval_zero.w_non_shifted_accumulator = FF::random_element();
165 instance_eval_zero.w_non_shifted_instance = FF::random_element();
166 instance_eval_zero.w_shifted_accumulator = FF::random_element();
167 instance_eval_zero.w_shifted_instance = FF::random_element();
168 instance_eval_zero.w_evaluations_accumulator = FF(1);
169 instance_eval_zero.w_evaluations_instance = FF(0);
170
171 EXPECT_FALSE(Relation::skip(instance_eval_zero));
172
173 // Test case 5: all non-zero -> should not skip
174 InputElements all_non_zero;
175 all_non_zero.w_non_shifted_accumulator = FF(1);
176 all_non_zero.w_non_shifted_instance = FF(1);
177 all_non_zero.w_shifted_accumulator = FF(1);
178 all_non_zero.w_shifted_instance = FF(1);
179 all_non_zero.w_evaluations_accumulator = FF(1);
180 all_non_zero.w_evaluations_instance = FF(1);
181
182 EXPECT_FALSE(Relation::skip(all_non_zero));
183}
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
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:188
typename Flavor::FF FF
field< Bn254FrParams > fr
Definition fr.hpp:174
static RelationParameters get_random()