Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
graph_description_bigfield.test.cpp
Go to the documentation of this file.
4
7
16#include <memory>
17#include <utility>
18
19using namespace bb;
20using namespace cdg;
21
22namespace {
24}
25
32
42void fix_bigfield_element(const fq_ct& element)
43{
44 for (size_t i = 0; i < 4; i++) {
45 element.binary_basis_limbs[i].element.fix_witness();
46 }
47 element.prime_basis_limb.fix_witness();
48}
49
61TEST(boomerang_bigfield, test_graph_description_bigfield_constructors)
62{
64 [[maybe_unused]] fq_ct constant = fq_ct(1);
65 [[maybe_unused]] fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
66 [[maybe_unused]] fr_ct small_var = witness_ct(&builder, fr(1));
67 [[maybe_unused]] fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
68 [[maybe_unused]] fq_ct r;
69
70 auto graph = StaticAnalyzer(builder);
71 auto connected_components = graph.find_connected_components();
72 EXPECT_EQ(connected_components.size(), 1);
73 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
74 EXPECT_EQ(variables_in_one_gate.size(), 1);
75}
76
84TEST(boomerang_bigfield, test_graph_description_bigfield_addition)
85{
87 [[maybe_unused]] fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
88 [[maybe_unused]] fr_ct small_var = witness_ct(&builder, fr(1));
89 [[maybe_unused]] fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
90 [[maybe_unused]] fq_ct r;
91 [[maybe_unused]] fq_ct r1;
92 [[maybe_unused]] fq_ct r2;
93
94 r = mixed + var;
96 r1 = r + mixed;
98 r2 = r + var;
100
101 auto graph = StaticAnalyzer(builder);
102 auto connected_components = graph.find_connected_components();
103 EXPECT_EQ(connected_components.size(), 1);
104 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
105 EXPECT_EQ(variables_in_one_gate.size(), 0);
106}
107
115TEST(boomerang_bigfield, test_graph_description_bigfield_substraction)
116{
118 [[maybe_unused]] fq_ct constant = fq_ct(1);
119 [[maybe_unused]] fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
120 [[maybe_unused]] fr_ct small_var = witness_ct(&builder, fr(1));
121 [[maybe_unused]] fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
122 [[maybe_unused]] fq_ct r;
123
124 r = mixed - mixed;
126 r = mixed - constant;
128 r = mixed - var;
130 r = var - mixed;
132
133 auto graph = StaticAnalyzer(builder);
134 auto connected_components = graph.find_connected_components();
135 EXPECT_EQ(connected_components.size(), 1);
136 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
137 EXPECT_EQ(variables_in_one_gate.size(), 0);
138 for (const auto& elem : variables_in_one_gate) {
139 info("elem == ", elem);
140 }
141}
142
150TEST(boomerang_bigfield, test_graph_description_bigfield_multiplication)
151{
153 [[maybe_unused]] fq_ct constant = fq_ct(1);
154 [[maybe_unused]] fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
155 [[maybe_unused]] fr_ct small_var = witness_ct(&builder, fr(1));
156 [[maybe_unused]] fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
157 [[maybe_unused]] fq_ct r;
158
159 r = var * constant;
160 r = constant * constant;
161 r = mixed * var;
162 r = mixed * constant;
163 r = mixed * mixed;
164 auto graph = StaticAnalyzer(builder);
165 auto connected_components = graph.find_connected_components();
166 EXPECT_EQ(connected_components.size(), 1);
167 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
168 EXPECT_EQ(variables_in_one_gate.size(), 0);
169}
170
180TEST(boomerang_bigfield, test_graph_description_bigfield_division)
181{
183 [[maybe_unused]] fq_ct constant = fq_ct(1);
184 [[maybe_unused]] fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
185 [[maybe_unused]] fr_ct small_var = witness_ct(&builder, fr(1));
186 [[maybe_unused]] fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
187 [[maybe_unused]] fq_ct r;
188
189 r = constant / var;
191 r = constant / constant;
192 r = mixed / mixed;
194 r = mixed / var;
196
198 auto graph = StaticAnalyzer(builder);
199 auto connected_components = graph.find_connected_components();
200 EXPECT_EQ(connected_components.size(), 1);
201 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
202 EXPECT_EQ(variables_in_one_gate.size(), 0);
203}
204
212TEST(boomerang_bigfield, test_graph_description_bigfield_mix_operations)
213{
214 auto builder = Builder();
215 fq_ct constant = fq_ct(1);
216 fq_ct var = fq_ct::create_from_u512_as_witness(&builder, 1);
217 fr_ct small_var = witness_ct(&builder, fr(1));
218 fq_ct mixed = fq_ct(1).add_to_lower_limb(small_var, 1);
219 fq_ct r;
220
221 r = mixed + mixed;
223 r = mixed - mixed;
225 r = mixed + var;
227 r = mixed + constant;
229 r = mixed - var;
231 r = mixed - constant;
233 r = var - mixed;
235
236 r = var * constant;
238 r = constant / var;
240 r = constant * constant;
241 r = constant / constant;
242
243 r = mixed * var;
245 r = mixed / var;
247 r = mixed * mixed;
249 r = mixed * constant;
251 auto graph = StaticAnalyzer(builder);
252 auto connected_components = graph.find_connected_components();
253 EXPECT_EQ(connected_components.size(), 1);
254 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
255 EXPECT_EQ(variables_in_one_gate.size(), 0);
256}
257
265TEST(boomerang_bigfield, test_graph_description_constructor_high_low_bits_and_operations)
266{
267 auto builder = Builder();
268 fq inputs[2]{ fq::random_element(), fq::random_element() };
269 fq_ct a(witness_ct(&builder, fr(uint256_t(inputs[0]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
270 witness_ct(&builder, fr(uint256_t(inputs[0]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
271 fq_ct b(witness_ct(&builder, fr(uint256_t(inputs[1]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
272 witness_ct(&builder, fr(uint256_t(inputs[1]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
273 fq_ct c = a * b;
275 fq_ct d1(witness_ct(&builder, fr(uint256_t(d).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
276 witness_ct(&builder, fr(uint256_t(d).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
277 c = c + d1;
279 auto graph = StaticAnalyzer(builder);
280 auto connected_components = graph.find_connected_components();
281 EXPECT_EQ(connected_components.size(), 1);
282 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
283 EXPECT_EQ(variables_in_one_gate.size(), 0);
284}
285
293TEST(boomerang_bigfield, test_graph_description_mul_function)
294{
295 auto builder = Builder();
296 fq inputs[2]{ fq::random_element(), fq::random_element() };
297 fq_ct a(witness_ct(&builder, fr(uint256_t(inputs[0]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
298 witness_ct(&builder, fr(uint256_t(inputs[0]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
299 fq_ct b(witness_ct(&builder, fr(uint256_t(inputs[1]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
300 witness_ct(&builder, fr(uint256_t(inputs[1]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
301 fq_ct c = a * b;
303 auto graph = StaticAnalyzer(builder);
304 auto connected_components = graph.find_connected_components();
305 EXPECT_EQ(connected_components.size(), 1);
306 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
307 EXPECT_EQ(variables_in_one_gate.size(), 0);
308}
309
317TEST(boomerang_bigfield, test_graph_description_sqr_function)
318{
319 auto builder = Builder();
320 fq input = fq::random_element();
321 fq_ct a(witness_ct(&builder, fr(uint256_t(input).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
322 witness_ct(&builder, fr(uint256_t(input).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
323 fq_ct c = a.sqr();
325 auto graph = StaticAnalyzer(builder);
326 auto connected_components = graph.find_connected_components();
327 EXPECT_EQ(connected_components.size(), 1);
328 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
329 EXPECT_EQ(variables_in_one_gate.size(), 0);
330}
331
339TEST(boomerang_bigfield, test_graph_description_madd_function)
340{
341 auto builder = Builder();
343 fq_ct a(witness_ct(&builder, fr(uint256_t(inputs[0]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
344 witness_ct(&builder, fr(uint256_t(inputs[0]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
345 fq_ct b(witness_ct(&builder, fr(uint256_t(inputs[1]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
346 witness_ct(&builder, fr(uint256_t(inputs[1]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
347 fq_ct c(witness_ct(&builder, fr(uint256_t(inputs[2]).slice(0, fq_ct::NUM_LIMB_BITS * 2))),
348 witness_ct(&builder, fr(uint256_t(inputs[2]).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4))));
349 fq_ct d = a.madd(b, { c });
351 auto graph = StaticAnalyzer(builder);
352 auto connected_components = graph.find_connected_components();
353 EXPECT_EQ(connected_components.size(), 1);
354 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
355 EXPECT_EQ(variables_in_one_gate.size(), 0);
356}
357
366TEST(boomerang_bigfield, test_graph_description_mult_madd_function)
367{
368 auto builder = Builder();
369 const size_t number_of_madds = 16;
370 fq mul_left_values[number_of_madds];
371 fq mul_right_values[number_of_madds];
372 fq to_add_values[number_of_madds];
373
374 std::vector<fq_ct> mul_left;
375 std::vector<fq_ct> mul_right;
376 std::vector<fq_ct> to_add;
377 mul_left.reserve(number_of_madds);
378 mul_right.reserve(number_of_madds);
379 to_add.reserve(number_of_madds);
380 for (size_t j = 0; j < number_of_madds; j++) {
381 mul_left_values[j] = fq::random_element();
382 mul_right_values[j] = fq::random_element();
383 mul_left.emplace_back(fq_ct::create_from_u512_as_witness(&builder, uint512_t(uint256_t(mul_left_values[j]))));
384 mul_right.emplace_back(fq_ct::create_from_u512_as_witness(&builder, uint512_t(uint256_t(mul_right_values[j]))));
385 to_add_values[j] = fq::random_element();
386 to_add.emplace_back(fq_ct::create_from_u512_as_witness(&builder, uint512_t(uint256_t(to_add_values[j]))));
387 }
388 fq_ct f = fq_ct::mult_madd(mul_left, mul_right, to_add);
390 builder.finalize_circuit(false);
391 auto graph = StaticAnalyzer(builder);
392 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
393 EXPECT_EQ(variables_in_one_gate.size(), 0);
394}
395
403TEST(boomerang_bigfield, test_graph_description_constructor_high_low_bits)
404{
405 auto builder = Builder();
406 fq mul_left_value = fq::random_element();
407 fq mul_right_value = fq::random_element();
408 // fq mul_right_value = fq::random_element();
409 [[maybe_unused]] fq_ct mul_left =
410 fq_ct::create_from_u512_as_witness(&builder, uint512_t(uint256_t(mul_left_value)));
411 [[maybe_unused]] fq_ct mul_right =
412 fq_ct::create_from_u512_as_witness(&builder, uint512_t(uint256_t(mul_right_value)));
413 fq_ct product = mul_left * mul_right;
414 fix_bigfield_element(product);
415 builder.finalize_circuit(false);
416 auto graph = StaticAnalyzer(builder);
417 auto connected_components = graph.find_connected_components();
418 auto variables_in_one_gate = graph.show_variables_in_one_gate(builder);
419 EXPECT_EQ(variables_in_one_gate.size(), 0);
420}
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
void info(Args... args)
Definition log.hpp:70
AluTraceBuilder builder
Definition alu.test.cpp:123
FF a
FF b
numeric::RNG & engine
bn254::BaseField fq_ct
TEST(boomerang_bigfield, test_graph_description_bigfield_constructors)
Test graph description for bigfield constructors.
bn254::witness_ct witness_ct
UltraCircuitBuilder Builder
void fix_bigfield_element(const fq_ct &element)
Fix a bigfield element to prevent it from being identified as a variable in one gate.
uintx< uint256_t > uint512_t
Definition uintx.hpp:307
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
Definition fr.hpp:174
C slice(C const &container, size_t start)
Definition container.hpp:9
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
Definition graph.cpp:11
StaticAnalyzer_< bb::fr > StaticAnalyzer
Definition graph.hpp:201
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
static field random_element(numeric::RNG *engine=nullptr) noexcept
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:33
Group::BaseField BaseField
Definition bn254.hpp:35
public_witness_t< CircuitBuilder > public_witness_ct
Definition bn254.hpp:42
witness_t< CircuitBuilder > witness_ct
Definition bn254.hpp:41