Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
graph_description.test.cpp
Go to the documentation of this file.
10
11#include <gtest/gtest.h>
12
13using namespace bb;
14using namespace cdg;
15
23TEST(boomerang_ultra_circuit_constructor, test_graph_for_arithmetic_gates)
24{
25 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
26
27 for (size_t i = 0; i < 16; ++i) {
28 for (size_t j = 0; j < 16; ++j) {
29 uint64_t left = static_cast<uint64_t>(j);
30 uint64_t right = static_cast<uint64_t>(i);
31 uint32_t left_idx = circuit_constructor.add_variable(fr(left));
32 uint32_t right_idx = circuit_constructor.add_variable(fr(right));
33 uint32_t result_idx = circuit_constructor.add_variable(fr(left ^ right));
34
35 uint32_t add_idx =
36 circuit_constructor.add_variable(fr(left) + fr(right) + circuit_constructor.get_variable(result_idx));
37 circuit_constructor.create_big_add_gate(
38 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) });
39 }
40 }
41
42 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
43 auto connected_components = graph.find_connected_components();
44 auto variables_in_one_gate = graph.show_variables_in_one_gate(circuit_constructor);
45 EXPECT_EQ(variables_in_one_gate.size(), 1024);
46 EXPECT_EQ(connected_components.size(), 256);
47}
48
56TEST(boomerang_ultra_circuit_constructor, test_graph_for_arithmetic_gates_with_shifts)
57{
58 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
59 for (size_t i = 0; i < 16; ++i) {
60 for (size_t j = 0; j < 16; ++j) {
61 uint64_t left = static_cast<uint64_t>(j);
62 uint64_t right = static_cast<uint64_t>(i);
63 uint32_t left_idx = circuit_constructor.add_variable(fr(left));
64 uint32_t right_idx = circuit_constructor.add_variable(fr(right));
65 uint32_t result_idx = circuit_constructor.add_variable(fr(left ^ right));
66
67 uint32_t add_idx =
68 circuit_constructor.add_variable(fr(left) + fr(right) + circuit_constructor.get_variable(result_idx));
69 circuit_constructor.create_big_add_gate(
70 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) }, true);
71 }
72 }
73
74 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
75 auto connected_components = graph.find_connected_components();
76 auto num_connected_components = connected_components.size();
77 bool result = num_connected_components == 1;
78 EXPECT_EQ(result, true);
79}
80
89TEST(boomerang_ultra_circuit_constructor, test_graph_for_boolean_gates)
90{
91 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
92
93 for (size_t i = 0; i < 20; ++i) {
94 fr a = fr::zero();
95 uint32_t a_idx = circuit_constructor.add_variable(a);
96 circuit_constructor.create_bool_gate(a_idx);
97 }
98
99 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
100 auto connected_components = graph.find_connected_components();
101 auto num_connected_components = connected_components.size();
102 auto variables_in_one_gate = graph.show_variables_in_one_gate(circuit_constructor);
103 bool result = num_connected_components == 0;
104 EXPECT_EQ(result, true);
105 EXPECT_EQ(variables_in_one_gate.size(), 20);
106}
107
116TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_add_gate)
117{
119 typedef grumpkin::g1::element element;
120 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
121
123
125 affine_element p3(element(p1) + element(p2));
126
127 uint32_t x1 = circuit_constructor.add_variable(p1.x);
128 uint32_t y1 = circuit_constructor.add_variable(p1.y);
129 uint32_t x2 = circuit_constructor.add_variable(p2.x);
130 uint32_t y2 = circuit_constructor.add_variable(p2.y);
131 uint32_t x3 = circuit_constructor.add_variable(p3.x);
132 uint32_t y3 = circuit_constructor.add_variable(p3.y);
133
134 circuit_constructor.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 });
135
136 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
137 auto connected_components = graph.find_connected_components();
138 auto num_connected_components = connected_components.size();
139 bool result = num_connected_components == 1;
140 EXPECT_EQ(result, true);
141}
142
151TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_double_gate)
152{
154 typedef grumpkin::g1::element element;
155 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
156
158 affine_element p3(element(p1).dbl());
159
160 uint32_t x1 = circuit_constructor.add_variable(p1.x);
161 uint32_t y1 = circuit_constructor.add_variable(p1.y);
162 uint32_t x3 = circuit_constructor.add_variable(p3.x);
163 uint32_t y3 = circuit_constructor.add_variable(p3.y);
164
165 circuit_constructor.create_ecc_dbl_gate({ x1, y1, x3, y3 });
166
167 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
168 auto connected_components = graph.find_connected_components();
169 auto num_connected_components = connected_components.size();
170 bool result = num_connected_components == 1;
171 EXPECT_EQ(result, true);
172}
173
183TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_together)
184{
185 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
186
188 typedef grumpkin::g1::element element;
189
192 affine_element p3(element(p1) + element(p2));
193
194 uint32_t x1 = circuit_constructor.add_variable(p1.x);
195 uint32_t y1 = circuit_constructor.add_variable(p1.y);
196 uint32_t x2 = circuit_constructor.add_variable(p2.x);
197 uint32_t y2 = circuit_constructor.add_variable(p2.y);
198 uint32_t x3 = circuit_constructor.add_variable(p3.x);
199 uint32_t y3 = circuit_constructor.add_variable(p3.y);
200
201 circuit_constructor.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 });
202 affine_element p4(element(p3).dbl());
203 uint32_t x4 = circuit_constructor.add_variable(p4.x);
204 uint32_t y4 = circuit_constructor.add_variable(p4.y);
205 circuit_constructor.create_ecc_dbl_gate({ x3, y3, x4, y4 });
206
209 affine_element p7(element(p5) + element(p6));
210
211 uint32_t x5 = circuit_constructor.add_variable(p5.x);
212 uint32_t y5 = circuit_constructor.add_variable(p5.y);
213 uint32_t x6 = circuit_constructor.add_variable(p6.x);
214 uint32_t y6 = circuit_constructor.add_variable(p6.y);
215 uint32_t x7 = circuit_constructor.add_variable(p7.x);
216 uint32_t y7 = circuit_constructor.add_variable(p7.y);
217
218 circuit_constructor.create_ecc_add_gate({ x5, y5, x6, y6, x7, y7, 1 });
219 affine_element p8(element(p7).dbl());
220 uint32_t x8 = circuit_constructor.add_variable(p8.x);
221 uint32_t y8 = circuit_constructor.add_variable(p8.y);
222 circuit_constructor.create_ecc_dbl_gate({ x7, y7, x8, y8 });
223
224 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
225 auto connected_components = graph.find_connected_components();
226 auto num_connected_components = connected_components.size();
227 bool result = num_connected_components == 2;
228 EXPECT_EQ(result, true);
229}
230
240TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints)
241{
242 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
243 fr a = fr::one();
244 fr b = fr(2);
245 fr c = fr(3);
246 fr d = fr(4);
247
248 auto a_idx = circuit_constructor.add_variable(a);
249 auto b_idx = circuit_constructor.add_variable(b);
250 auto c_idx = circuit_constructor.add_variable(c);
251 auto d_idx = circuit_constructor.add_variable(d);
252 circuit_constructor.create_sort_constraint({ a_idx, b_idx, c_idx, d_idx });
253
254 fr e = fr(5);
255 fr f = fr(6);
256 fr g = fr(7);
257 fr h = fr(8);
258 auto e_idx = circuit_constructor.add_variable(e);
259 auto f_idx = circuit_constructor.add_variable(f);
260 auto g_idx = circuit_constructor.add_variable(g);
261 auto h_idx = circuit_constructor.add_variable(h);
262 circuit_constructor.create_sort_constraint({ e_idx, f_idx, g_idx, h_idx });
263
264 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
265 auto connected_components = graph.find_connected_components();
266 EXPECT_EQ(connected_components[0].size(), 4);
267 EXPECT_EQ(connected_components[1].size(), 4);
268 EXPECT_EQ(connected_components.size(), 2);
269}
270
280TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints_with_edges)
281{
282 fr a = fr::one();
283 fr b = fr(2);
284 fr c = fr(3);
285 fr d = fr(4);
286 fr e = fr(5);
287 fr f = fr(6);
288 fr g = fr(7);
289 fr h = fr(8);
290
291 UltraCircuitBuilder circuit_constructor;
292 auto a_idx = circuit_constructor.add_variable(a);
293 auto b_idx = circuit_constructor.add_variable(b);
294 auto c_idx = circuit_constructor.add_variable(c);
295 auto d_idx = circuit_constructor.add_variable(d);
296 auto e_idx = circuit_constructor.add_variable(e);
297 auto f_idx = circuit_constructor.add_variable(f);
298 auto g_idx = circuit_constructor.add_variable(g);
299 auto h_idx = circuit_constructor.add_variable(h);
300 circuit_constructor.create_sort_constraint_with_edges(
301 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx }, a, h);
302
303 fr a1 = fr(9);
304 fr b1 = fr(10);
305 fr c1 = fr(11);
306 fr d1 = fr(12);
307 fr e1 = fr(13);
308 fr f1 = fr(14);
309 fr g1 = fr(15);
310 fr h1 = fr(16);
311
312 auto a1_idx = circuit_constructor.add_variable(a1);
313 auto b1_idx = circuit_constructor.add_variable(b1);
314 auto c1_idx = circuit_constructor.add_variable(c1);
315 auto d1_idx = circuit_constructor.add_variable(d1);
316 auto e1_idx = circuit_constructor.add_variable(e1);
317 auto f1_idx = circuit_constructor.add_variable(f1);
318 auto g1_idx = circuit_constructor.add_variable(g1);
319 auto h1_idx = circuit_constructor.add_variable(h1);
320
321 circuit_constructor.create_sort_constraint_with_edges(
322 { a1_idx, b1_idx, c1_idx, d1_idx, e1_idx, f1_idx, g1_idx, h1_idx }, a1, h1);
323 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
324 auto connected_components = graph.find_connected_components();
325 auto num_connected_components = connected_components.size();
326 bool result = num_connected_components == 2;
327 EXPECT_EQ(result, true);
328}
329
337TEST(boomerang_ultra_circuit_constructor, test_graph_with_plookup_accumulators)
338{
339 UltraCircuitBuilder circuit_builder = UltraCircuitBuilder();
340
341 fr input_value = fr::random_element();
342 const fr input_lo = static_cast<uint256_t>(input_value).slice(0, plookup::fixed_base::table::BITS_PER_LO_SCALAR);
343 const auto input_lo_index = circuit_builder.add_variable(input_lo);
344
345 const auto sequence_data_lo = plookup::get_lookup_accumulators(plookup::MultiTableId::FIXED_BASE_LEFT_LO, input_lo);
346
347 const auto lookup_witnesses = circuit_builder.create_gates_from_plookup_accumulators(
348 plookup::MultiTableId::FIXED_BASE_LEFT_LO, sequence_data_lo, input_lo_index);
349
350 const size_t num_lookups = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
351
352 EXPECT_EQ(num_lookups, lookup_witnesses[plookup::ColumnIdx::C1].size());
353
354 StaticAnalyzer graph = StaticAnalyzer(circuit_builder);
355 auto connected_components = graph.find_connected_components();
356 auto num_connected_components = connected_components.size();
357 bool result = num_connected_components == 1;
358 EXPECT_EQ(result, true);
359}
360
368TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_arithmetic_gate)
369{
370 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
371
372 for (size_t i = 0; i < 25; ++i) {
373 for (size_t j = 0; j < 25; ++j) {
374 uint64_t left = static_cast<uint64_t>(j);
375 uint64_t right = static_cast<uint64_t>(i);
376 uint32_t left_idx = circuit_constructor.add_variable(fr(left));
377 uint32_t right_idx = circuit_constructor.add_variable(fr(right));
378 uint32_t result_idx = circuit_constructor.add_variable(fr(left ^ right));
379
380 uint32_t add_idx =
381 circuit_constructor.add_variable(fr(left) + fr(right) + circuit_constructor.get_variable(result_idx));
382 circuit_constructor.create_big_add_gate(
383 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) });
384 }
385 }
386
387 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
388 auto variables_gate_counts = graph.get_variables_gate_counts();
389 bool result = true;
390 for (const auto pair : variables_gate_counts) {
391 result = result && (pair.first > 0 ? (pair.second == 1) : (pair.second == 0));
392 }
393 EXPECT_EQ(result, true);
394}
395
404TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_arithmetic_gate_with_shifts)
405{
406 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
407
408 for (size_t i = 0; i < 25; ++i) {
409 for (size_t j = 0; j < 25; ++j) {
410 uint64_t left = static_cast<uint64_t>(j);
411 uint64_t right = static_cast<uint64_t>(i);
412 uint32_t left_idx = circuit_constructor.add_variable(fr(left));
413 uint32_t right_idx = circuit_constructor.add_variable(fr(right));
414 uint32_t result_idx = circuit_constructor.add_variable(fr(left ^ right));
415
416 uint32_t add_idx =
417 circuit_constructor.add_variable(fr(left) + fr(right) + circuit_constructor.get_variable(result_idx));
418 circuit_constructor.create_big_add_gate(
419 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) }, true);
420 }
421 }
422
423 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
424 bool result = true;
425 auto variables_gate_counts = graph.get_variables_gate_counts();
426 for (const auto& pair : variables_gate_counts) {
427 if (pair.first > 0) {
428 result = result && (pair.first % 4 == 0 && pair.first != 4 ? (pair.second == 2) : (pair.second == 1));
429 } else {
430 result = result && (pair.second == 0);
431 }
432 }
433 EXPECT_EQ(result, true);
434}
435
443TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_boolean_gates)
444{
445 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
446
447 for (size_t i = 0; i < 20; ++i) {
448 fr a = fr::zero();
449 uint32_t a_idx = circuit_constructor.add_variable(a);
450 circuit_constructor.create_bool_gate(a_idx);
451 }
452
453 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
454 auto variables_gate_counts = graph.get_variables_gate_counts();
455 bool result = true;
456 for (const auto& part : variables_gate_counts) {
457 result = result && (part.first == 0 ? (part.second == 0) : (part.second == 1));
458 }
459 EXPECT_EQ(result, true);
460}
461
469TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted_constraints)
470{
471 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
472 fr a = fr::one();
473 fr b = fr(2);
474 fr c = fr(3);
475 fr d = fr(4);
476
477 auto a_idx = circuit_constructor.add_variable(a);
478 auto b_idx = circuit_constructor.add_variable(b);
479 auto c_idx = circuit_constructor.add_variable(c);
480 auto d_idx = circuit_constructor.add_variable(d);
481 circuit_constructor.create_sort_constraint({ a_idx, b_idx, c_idx, d_idx });
482
483 fr e = fr(5);
484 fr f = fr(6);
485 fr g = fr(7);
486 fr h = fr(8);
487 auto e_idx = circuit_constructor.add_variable(e);
488 auto f_idx = circuit_constructor.add_variable(f);
489 auto g_idx = circuit_constructor.add_variable(g);
490 auto h_idx = circuit_constructor.add_variable(h);
491 circuit_constructor.create_sort_constraint({ e_idx, f_idx, g_idx, h_idx });
492
493 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
494 auto variables_gate_counts = graph.get_variables_gate_counts();
495 auto connected_components = graph.find_connected_components();
496 EXPECT_EQ(connected_components.size(), 2);
497 bool result = true;
498 for (size_t i = 0; i < connected_components[0].size(); i++) {
499 result = result && (variables_gate_counts[connected_components[0][i]] == 1);
500 }
501
502 for (size_t i = 0; i < connected_components[1].size(); i++) {
503 result = result && (variables_gate_counts[connected_components[1][i]] == 1);
504 }
505 EXPECT_EQ(result, true);
506}
507
515TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted_constraints_with_edges)
516{
517 fr a = fr::one();
518 fr b = fr(2);
519 fr c = fr(3);
520 fr d = fr(4);
521 fr e = fr(5);
522 fr f = fr(6);
523 fr g = fr(7);
524 fr h = fr(8);
525
526 UltraCircuitBuilder circuit_constructor;
527 auto a_idx = circuit_constructor.add_variable(a);
528 auto b_idx = circuit_constructor.add_variable(b);
529 auto c_idx = circuit_constructor.add_variable(c);
530 auto d_idx = circuit_constructor.add_variable(d);
531 auto e_idx = circuit_constructor.add_variable(e);
532 auto f_idx = circuit_constructor.add_variable(f);
533 auto g_idx = circuit_constructor.add_variable(g);
534 auto h_idx = circuit_constructor.add_variable(h);
535 circuit_constructor.create_sort_constraint_with_edges(
536 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx }, a, h);
537
538 fr a1 = fr(9);
539 fr b1 = fr(10);
540 fr c1 = fr(11);
541 fr d1 = fr(12);
542 fr e1 = fr(13);
543 fr f1 = fr(14);
544 fr g1 = fr(15);
545 fr h1 = fr(16);
546
547 auto a1_idx = circuit_constructor.add_variable(a1);
548 auto b1_idx = circuit_constructor.add_variable(b1);
549 auto c1_idx = circuit_constructor.add_variable(c1);
550 auto d1_idx = circuit_constructor.add_variable(d1);
551 auto e1_idx = circuit_constructor.add_variable(e1);
552 auto f1_idx = circuit_constructor.add_variable(f1);
553 auto g1_idx = circuit_constructor.add_variable(g1);
554 auto h1_idx = circuit_constructor.add_variable(h1);
555
556 circuit_constructor.create_sort_constraint_with_edges(
557 { a1_idx, b1_idx, c1_idx, d1_idx, e1_idx, f1_idx, g1_idx, h1_idx }, a1, h1);
558 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
559 auto connected_components = graph.find_connected_components();
560 auto variables_gate_counts = graph.get_variables_gate_counts();
561 bool result = true;
562 for (size_t i = 0; i < connected_components[0].size(); i++) {
563 result = result && (variables_gate_counts[connected_components[0][i]] == 1);
564 }
565
566 for (size_t i = 0; i < connected_components[1].size(); i++) {
567 result = result && (variables_gate_counts[connected_components[1][i]] == 1);
568 }
569 EXPECT_EQ(connected_components.size(), 2);
570 EXPECT_EQ(result, true);
571}
572
580TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_ecc_add_gates)
581{
583 typedef grumpkin::g1::element element;
584 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
585
587
589 affine_element p3(element(p1) + element(p2));
590
591 uint32_t x1 = circuit_constructor.add_variable(p1.x);
592 uint32_t y1 = circuit_constructor.add_variable(p1.y);
593 uint32_t x2 = circuit_constructor.add_variable(p2.x);
594 uint32_t y2 = circuit_constructor.add_variable(p2.y);
595 uint32_t x3 = circuit_constructor.add_variable(p3.x);
596 uint32_t y3 = circuit_constructor.add_variable(p3.y);
597
598 circuit_constructor.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 });
599
600 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
601 auto variables_gate_counts = graph.get_variables_gate_counts();
602 auto connected_components = graph.find_connected_components();
603 bool result = (variables_gate_counts[connected_components[0][0]] == 1) &&
604 (variables_gate_counts[connected_components[0][1]] == 1) &&
605 (variables_gate_counts[connected_components[0][2]] == 1) &&
606 (variables_gate_counts[connected_components[0][3]] == 1) &&
607 (variables_gate_counts[connected_components[0][4]] == 1) &&
608 (variables_gate_counts[connected_components[0][5]] == 1);
609 EXPECT_EQ(connected_components.size(), 1);
610 EXPECT_EQ(result, true);
611}
612
621TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_ecc_dbl_gate)
622{
624 typedef grumpkin::g1::element element;
625 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
626
628 affine_element p3(element(p1).dbl());
629
630 uint32_t x1 = circuit_constructor.add_variable(p1.x);
631 uint32_t y1 = circuit_constructor.add_variable(p1.y);
632 uint32_t x3 = circuit_constructor.add_variable(p3.x);
633 uint32_t y3 = circuit_constructor.add_variable(p3.y);
634
635 circuit_constructor.create_ecc_dbl_gate({ x1, y1, x3, y3 });
636
637 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
638 auto variables_gate_counts = graph.get_variables_gate_counts();
639 auto connected_components = graph.find_connected_components();
640
641 bool result = (variables_gate_counts[connected_components[0][0]] == 1) &&
642 (variables_gate_counts[connected_components[0][1]] == 1) &&
643 (variables_gate_counts[connected_components[0][2]] == 1) &&
644 (variables_gate_counts[connected_components[0][3]] == 1);
645
646 EXPECT_EQ(connected_components.size(), 1);
647 EXPECT_EQ(result, true);
648}
649
650std::vector<uint32_t> add_variables(UltraCircuitBuilder& circuit_constructor, std::vector<fr> variables)
651{
652 std::vector<uint32_t> res;
653 for (size_t i = 0; i < variables.size(); i++) {
654 res.emplace_back(circuit_constructor.add_variable(variables[i]));
655 }
656 return res;
657}
658
666TEST(boomerang_ultra_circuit_constructor, test_graph_for_range_constraints)
667{
668 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
669 auto indices = add_variables(circuit_constructor, { 1, 2, 3, 4 });
670 for (size_t i = 0; i < indices.size(); i++) {
671 circuit_constructor.create_new_range_constraint(indices[i], 5);
672 }
673 circuit_constructor.create_sort_constraint(indices);
674 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
675 auto connected_components = graph.find_connected_components();
676 EXPECT_EQ(connected_components.size(), 1);
677}
678
686TEST(boomerang_ultra_circuit_constructor, composed_range_constraint)
687{
688 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
689 auto c = fr::random_element();
690 auto d = uint256_t(c).slice(0, 133);
691 auto e = fr(d);
692 auto a_idx = circuit_constructor.add_variable(fr(e));
693 circuit_constructor.create_add_gate(
694 { a_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e) });
695 circuit_constructor.decompose_into_default_range(a_idx, 134);
696
697 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
698 auto connected_components = graph.find_connected_components();
699 EXPECT_EQ(connected_components.size(), 1);
700}
virtual uint32_t add_variable(const FF &in)
FF get_variable(const uint32_t index) const
Get the value of the variable v_{index}.
void create_add_gate(const add_triple_< FF > &in) override
Create an addition gate, where in.a * in.a_scaling + in.b * in.b_scaling + in.c * in....
void create_ecc_dbl_gate(const ecc_dbl_gate_< FF > &in)
Create an elliptic curve doubling gate.
std::vector< uint32_t > decompose_into_default_range(const uint32_t variable_index, const uint64_t num_bits, const uint64_t target_range_bitnum=DEFAULT_PLOOKUP_RANGE_BITNUM, std::string const &msg="decompose_into_default_range")
void create_sort_constraint_with_edges(const std::vector< uint32_t > &variable_index, const FF &, const FF &)
void create_big_add_gate(const add_quad_< FF > &in, const bool use_next_gate_w_4=false)
Create a big addition gate, where in.a * in.a_scaling + in.b * in.b_scaling + in.c * in....
plookup::ReadData< uint32_t > create_gates_from_plookup_accumulators(const plookup::MultiTableId &id, const plookup::ReadData< FF > &read_values, const uint32_t key_a_index, std::optional< uint32_t > key_b_index=std::nullopt)
Perform a series of lookups, one for each 'row' in read_values.
void create_bool_gate(const uint32_t a) override
Generate an arithmetic gate equivalent to x^2 - x = 0, which forces x to be 0 or 1.
void create_ecc_add_gate(const ecc_add_gate_< FF > &in)
Create an elliptic curve addition gate.
void create_sort_constraint(const std::vector< uint32_t > &variable_index)
void create_new_range_constraint(const uint32_t variable_index, const uint64_t target_range, std::string const msg="create_new_range_constraint")
Constrain a variable to a range.
static AffineElement commit_native(const std::vector< Fq > &inputs, GeneratorContext context={})
Given a vector of fields, generate a pedersen commitment using the indexed generators.
Definition pedersen.cpp:24
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition element.hpp:33
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
Definition group.hpp:36
constexpr uint256_t slice(uint64_t start, uint64_t end) const
std::unordered_set< uint32_t > show_variables_in_one_gate(bb::UltraCircuitBuilder &ultra_circuit_builder)
this method returns a final set of variables that were in one gate
Definition graph.cpp:1190
std::vector< std::vector< uint32_t > > find_connected_components()
this methond finds all connected components in the graph described by adjacency lists
Definition graph.cpp:794
std::unordered_map< uint32_t, size_t > get_variables_gate_counts()
Definition graph.hpp:92
FF a
FF b
grumpkin::g1::affine_element affine_element
Definition c_bind.hpp:15
TEST(boomerang_ultra_circuit_constructor, test_graph_for_arithmetic_gates)
Test graph description of circuit with arithmetic gates.
std::vector< uint32_t > add_variables(UltraCircuitBuilder &circuit_constructor, std::vector< fr > variables)
ReadData< bb::fr > get_lookup_accumulators(const MultiTableId id, const fr &key_a, const fr &key_b, const bool is_2_to_1_lookup)
Given a table ID and the key(s) for a key-value lookup, return the lookup accumulators.
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
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()