Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
variable_gates_count.test.cpp
Go to the documentation of this file.
9
10#include <gtest/gtest.h>
11
12using namespace bb;
13using namespace cdg;
14
15TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_decompose)
16{
17 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
18 auto c = fr::random_element();
19 auto d = uint256_t(c).slice(0, 133);
20 auto e = fr(d);
21 auto a_idx = circuit_constructor.add_variable(fr(e));
22 circuit_constructor.create_add_gate(
23 { a_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e) });
24 circuit_constructor.decompose_into_default_range(a_idx, 134);
25
26 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
27 std::unordered_set<uint32_t> variables_in_on_gate = graph.show_variables_in_one_gate(circuit_constructor);
28 EXPECT_EQ(variables_in_on_gate.size(), 0);
29}
30
31TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_decompose2)
32{
33 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
34 auto c = fr::random_element();
35 auto d = uint256_t(c).slice(0, 41);
36 auto e = fr(d);
37 auto a_idx = circuit_constructor.add_variable(fr(e));
38 circuit_constructor.create_add_gate(
39 { a_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e) });
40 circuit_constructor.decompose_into_default_range(a_idx, 42);
41
42 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
43 auto variables_in_on_gate = graph.show_variables_in_one_gate(circuit_constructor);
44 EXPECT_EQ(variables_in_on_gate.size(), 0);
45}
46
47TEST(boomerang_utils, test_selectors_for_decompose)
48{
49 auto is_power_two = [&](const uint256_t& number) { return number > 0 && ((number & (number - 1)) == 0); };
50 const uint64_t target_range_bitnum = 14;
51 size_t i = 0;
52 const uint64_t shifts[3]{
53 target_range_bitnum * (3 * i),
54 target_range_bitnum * (3 * i + 1),
55 target_range_bitnum * (3 * i + 2),
56 };
57 uint256_t q_1 = uint256_t(1) << shifts[0];
58 uint256_t q_2 = uint256_t(1) << shifts[1];
59 uint256_t q_3 = uint256_t(1) << shifts[2];
60 bool q_1_is_power_two = is_power_two(q_1);
61 bool q_2_is_power_two = is_power_two(q_2);
62 bool q_3_is_power_two = is_power_two(q_3);
63 EXPECT_EQ(q_2 * q_2, q_1 * q_3);
64 EXPECT_EQ(q_1_is_power_two, true);
65 EXPECT_EQ(q_2_is_power_two, true);
66 EXPECT_EQ(q_3_is_power_two, true);
67}
68
69TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_two_decomposes)
70{
71 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
72 auto c1 = fr::random_element();
73 auto c2 = fr::random_element();
74 auto d1 = uint256_t(c1).slice(0, 41);
75 auto d2 = uint256_t(c2).slice(0, 41);
76 auto e1 = fr(d1);
77 auto e2 = fr(d2);
78 auto a1_idx = circuit_constructor.add_variable(fr(e1));
79 auto a2_idx = circuit_constructor.add_variable(fr(e2));
80 circuit_constructor.create_add_gate(
81 { a1_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e1) });
82 circuit_constructor.create_add_gate(
83 { a2_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e2) });
84 circuit_constructor.decompose_into_default_range(a1_idx, 42);
85 circuit_constructor.decompose_into_default_range(a2_idx, 42);
86
87 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
88 std::unordered_set<uint32_t> variables_in_one_gate = graph.show_variables_in_one_gate(circuit_constructor);
89 EXPECT_EQ(variables_in_one_gate.size(), 0);
90}
91
92TEST(boomerang_ultra_circuit_constructor, test_decompose_with_boolean_gates)
93{
94 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
95 auto c1 = fr::random_element();
96 auto c2 = fr::random_element();
97 auto d1 = uint256_t(c1).slice(0, 41);
98 auto d2 = uint256_t(c2).slice(0, 41);
99 auto e1 = fr(d1);
100 auto e2 = fr(d2);
101 auto a1_idx = circuit_constructor.add_variable(fr(e1));
102 auto a2_idx = circuit_constructor.add_variable(fr(e2));
103 circuit_constructor.decompose_into_default_range(a1_idx, 42);
104 circuit_constructor.decompose_into_default_range(a2_idx, 42);
105
106 for (size_t i = 0; i < 20; ++i) {
107 fr a = fr::zero();
108 uint32_t a_idx = circuit_constructor.add_variable(a);
109 circuit_constructor.create_bool_gate(a_idx);
110 }
111
112 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
113 std::unordered_set<uint32_t> variables_in_one_gate = graph.show_variables_in_one_gate(circuit_constructor);
114 EXPECT_EQ(variables_in_one_gate.size(), 22);
115}
116
117TEST(boomerang_ultra_circuit_constructor, test_decompose_for_6_bit_number)
118{
119 UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder();
120 auto c = fr::random_element();
121 auto d = uint256_t(c).slice(0, 5);
122 auto e = fr(d);
123 auto a_idx = circuit_constructor.add_variable(fr(d));
124 circuit_constructor.create_add_gate(
125 { a_idx, circuit_constructor.zero_idx, circuit_constructor.zero_idx, 1, 0, 0, -fr(e) });
126 circuit_constructor.decompose_into_default_range(a_idx, 6);
127
128 StaticAnalyzer graph = StaticAnalyzer(circuit_constructor);
129 std::unordered_set<uint32_t> variables_in_on_gate = graph.show_variables_in_one_gate(circuit_constructor);
130 EXPECT_EQ(variables_in_on_gate.size(), 0);
131}
virtual uint32_t add_variable(const FF &in)
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....
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_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.
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
FF a
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
Definition fr.hpp:174
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
Definition graph.cpp:11
StaticAnalyzer_< bb::fr > StaticAnalyzer
Definition graph.hpp:201
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()
TEST(boomerang_ultra_circuit_constructor, test_variable_gates_count_for_decompose)