11#include <gtest/gtest.h>
23TEST(boomerang_ultra_circuit_constructor, test_graph_for_arithmetic_gates)
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);
33 uint32_t result_idx = circuit_constructor.
add_variable(
fr(left ^ right));
38 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
45 EXPECT_EQ(variables_in_one_gate.size(), 1024);
46 EXPECT_EQ(connected_components.size(), 256);
56TEST(boomerang_ultra_circuit_constructor, test_graph_for_arithmetic_gates_with_shifts)
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);
65 uint32_t result_idx = circuit_constructor.
add_variable(
fr(left ^ right));
70 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) },
true);
76 auto num_connected_components = connected_components.size();
77 bool result = num_connected_components == 1;
78 EXPECT_EQ(result,
true);
89TEST(boomerang_ultra_circuit_constructor, test_graph_for_boolean_gates)
93 for (
size_t i = 0; i < 20; ++i) {
101 auto num_connected_components = connected_components.size();
103 bool result = num_connected_components == 0;
104 EXPECT_EQ(result,
true);
105 EXPECT_EQ(variables_in_one_gate.size(), 20);
116TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_add_gate)
138 auto num_connected_components = connected_components.size();
139 bool result = num_connected_components == 1;
140 EXPECT_EQ(result,
true);
151TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_double_gate)
169 auto num_connected_components = connected_components.size();
170 bool result = num_connected_components == 1;
171 EXPECT_EQ(result,
true);
183TEST(boomerang_ultra_circuit_constructor, test_graph_for_elliptic_together)
226 auto num_connected_components = connected_components.size();
227 bool result = num_connected_components == 2;
228 EXPECT_EQ(result,
true);
240TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints)
266 EXPECT_EQ(connected_components[0].size(), 4);
267 EXPECT_EQ(connected_components[1].size(), 4);
268 EXPECT_EQ(connected_components.size(), 2);
280TEST(boomerang_ultra_circuit_constructor, test_graph_for_sort_constraints_with_edges)
301 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
a, h);
322 { a1_idx, b1_idx, c1_idx, d1_idx, e1_idx, f1_idx, g1_idx, h1_idx }, a1, h1);
325 auto num_connected_components = connected_components.size();
326 bool result = num_connected_components == 2;
327 EXPECT_EQ(result,
true);
337TEST(boomerang_ultra_circuit_constructor, test_graph_with_plookup_accumulators)
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);
348 plookup::MultiTableId::FIXED_BASE_LEFT_LO, sequence_data_lo, input_lo_index);
350 const size_t num_lookups = plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE;
352 EXPECT_EQ(num_lookups, lookup_witnesses[plookup::ColumnIdx::C1].size());
356 auto num_connected_components = connected_components.size();
357 bool result = num_connected_components == 1;
358 EXPECT_EQ(result,
true);
368TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_arithmetic_gate)
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);
378 uint32_t result_idx = circuit_constructor.
add_variable(
fr(left ^ right));
383 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
390 for (
const auto pair : variables_gate_counts) {
391 result = result && (pair.first > 0 ? (pair.second == 1) : (pair.second == 0));
393 EXPECT_EQ(result,
true);
404TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_arithmetic_gate_with_shifts)
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);
414 uint32_t result_idx = circuit_constructor.
add_variable(
fr(left ^ right));
419 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) },
true);
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));
430 result = result && (pair.second == 0);
433 EXPECT_EQ(result,
true);
443TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_boolean_gates)
447 for (
size_t i = 0; i < 20; ++i) {
456 for (
const auto& part : variables_gate_counts) {
457 result = result && (part.first == 0 ? (part.second == 0) : (part.second == 1));
459 EXPECT_EQ(result,
true);
469TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted_constraints)
496 EXPECT_EQ(connected_components.size(), 2);
498 for (
size_t i = 0; i < connected_components[0].size(); i++) {
499 result = result && (variables_gate_counts[connected_components[0][i]] == 1);
502 for (
size_t i = 0; i < connected_components[1].size(); i++) {
503 result = result && (variables_gate_counts[connected_components[1][i]] == 1);
505 EXPECT_EQ(result,
true);
515TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_sorted_constraints_with_edges)
536 { a_idx, b_idx, c_idx, d_idx, e_idx, f_idx, g_idx, h_idx },
a, h);
557 { a1_idx, b1_idx, c1_idx, d1_idx, e1_idx, f1_idx, g1_idx, h1_idx }, a1, h1);
562 for (
size_t i = 0; i < connected_components[0].size(); i++) {
563 result = result && (variables_gate_counts[connected_components[0][i]] == 1);
566 for (
size_t i = 0; i < connected_components[1].size(); i++) {
567 result = result && (variables_gate_counts[connected_components[1][i]] == 1);
569 EXPECT_EQ(connected_components.size(), 2);
570 EXPECT_EQ(result,
true);
580TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_ecc_add_gates)
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);
621TEST(boomerang_ultra_circuit_constructor, test_variables_gates_counts_for_ecc_dbl_gate)
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);
646 EXPECT_EQ(connected_components.size(), 1);
647 EXPECT_EQ(result,
true);
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]));
666TEST(boomerang_ultra_circuit_constructor, test_graph_for_range_constraints)
669 auto indices =
add_variables(circuit_constructor, { 1, 2, 3, 4 });
670 for (
size_t i = 0; i < indices.size(); i++) {
676 EXPECT_EQ(connected_components.size(), 1);
686TEST(boomerang_ultra_circuit_constructor, composed_range_constraint)
694 { a_idx, circuit_constructor.
zero_idx, circuit_constructor.
zero_idx, 1, 0, 0, -
fr(e) });
699 EXPECT_EQ(connected_components.size(), 1);
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.
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
group class. Represents an elliptic curve group element. Group is parametrised by Fq and Fr
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
std::vector< std::vector< uint32_t > > find_connected_components()
this methond finds all connected components in the graph described by adjacency lists
std::unordered_map< uint32_t, size_t > get_variables_gate_counts()
grumpkin::g1::affine_element affine_element
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
C slice(C const &container, size_t start)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
StaticAnalyzer_< bb::fr > StaticAnalyzer
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()