From 47c65198f671307172d46d3808aa41dc8ad68ebb Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 20 Oct 2025 23:45:08 +0000 Subject: [PATCH 01/11] delete two unused methods --- .../ultra_circuit_builder.hpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index dcd7ac707c34..cdbf351a7f30 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -497,19 +497,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase&, std::vector&, std::vector&), - std::array (*get_values_from_key)(const std::array)); - plookup::BasicTable& get_table(const plookup::BasicTableId id); plookup::MultiTable& get_multitable(const plookup::MultiTableId id); From f312f64007758a9e22b842a7518b0e4ce809ba9f Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 20 Oct 2025 23:23:48 +0000 Subject: [PATCH 02/11] delete unused and error prone gate estimation methods --- .../mega_circuit_builder.hpp | 38 ---- .../ultra_circuit_builder.hpp | 164 ------------------ 2 files changed, 202 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp index 329432c44997..8436bb4690e1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp @@ -127,44 +127,6 @@ template class MegaCircuitBuilder_ : public UltraCircuitBuilder_::get_estimated_num_finalized_gates(); - auto num_goblin_ecc_op_gates = this->blocks.ecc_op.size(); - return num_ultra_gates + num_goblin_ecc_op_gates; - } - - /**x - * @brief Print the number and composition of gates in the circuit - * - */ - void print_num_estimated_finalized_gates() const override - { - size_t count = 0; - size_t rangecount = 0; - size_t romcount = 0; - size_t ramcount = 0; - size_t nnfcount = 0; - UltraCircuitBuilder_::get_num_estimated_gates_split_into_components( - count, rangecount, romcount, ramcount, nnfcount); - auto num_goblin_ecc_op_gates = this->blocks.ecc_op.size(); - - size_t total = count + romcount + ramcount + rangecount + num_goblin_ecc_op_gates; - std::cout << "gates = " << total << " (arith " << count << ", rom " << romcount << ", ram " << ramcount - << ", range " << rangecount << ", non native field gates " << nnfcount << ", goblin ecc op gates " - << num_goblin_ecc_op_gates << "), pubinp = " << this->num_public_inputs() << std::endl; - } - /** * @brief Add a witness variable to the public calldata. * diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index cdbf351a7f30..8dbb5cb7aac1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -343,106 +343,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasenum_gates; - - // each ROM gate adds +1 extra gate due to the rom reads being copied to a sorted list set - for (size_t i = 0; i < rom_ram_logic.rom_arrays.size(); ++i) { - for (size_t j = 0; j < rom_ram_logic.rom_arrays[i].state.size(); ++j) { - if (rom_ram_logic.rom_arrays[i].state[j][0] == UNINITIALIZED_MEMORY_RECORD) { - romcount += 2; - } - } - romcount += (rom_ram_logic.rom_arrays[i].records.size()); - romcount += 1; // we add an addition gate after procesing a rom array - } - - // each RAM gate adds +2 extra gates due to the ram reads being copied to a sorted list set, - // as well as an extra gate to validate timestamps - std::vector ram_timestamps; - std::vector ram_range_sizes; - std::vector ram_range_exists; - for (size_t i = 0; i < rom_ram_logic.ram_arrays.size(); ++i) { - for (size_t j = 0; j < rom_ram_logic.ram_arrays[i].state.size(); ++j) { - if (rom_ram_logic.ram_arrays[i].state[j] == UNINITIALIZED_MEMORY_RECORD) { - ramcount += NUMBER_OF_GATES_PER_RAM_ACCESS; - } - } - ramcount += (rom_ram_logic.ram_arrays[i].records.size() * NUMBER_OF_GATES_PER_RAM_ACCESS); - ramcount += NUMBER_OF_ARITHMETIC_GATES_PER_RAM_ARRAY; // we add an addition gate after procesing a ram array - - // there will be 'max_timestamp' number of range checks, need to calculate. - const auto max_timestamp = rom_ram_logic.ram_arrays[i].access_count - 1; - - // if a range check of length `max_timestamp` already exists, we are double counting. - // We record `ram_timestamps` to detect and correct for this error when we process range lists. - - ram_timestamps.push_back(max_timestamp); - size_t padding = (NUM_WIRES - (max_timestamp % NUM_WIRES)) % NUM_WIRES; - if (max_timestamp == NUM_WIRES) { - padding += NUM_WIRES; - } - const size_t ram_range_check_list_size = max_timestamp + padding; - - size_t ram_range_check_gate_count = (ram_range_check_list_size / NUM_WIRES); - ram_range_check_gate_count += 1; // we need to add 1 extra addition gates for every distinct range list - - ram_range_sizes.push_back(ram_range_check_gate_count); - ram_range_exists.push_back(false); - } - for (const auto& list : range_lists) { - auto list_size = list.second.variable_indices.size(); - size_t padding = (NUM_WIRES - (list.second.variable_indices.size() % NUM_WIRES)) % NUM_WIRES; - if (list.second.variable_indices.size() == NUM_WIRES) { - padding += NUM_WIRES; - } - list_size += padding; - - for (size_t i = 0; i < ram_timestamps.size(); ++i) { - if (list.second.target_range == ram_timestamps[i]) { - ram_range_exists[i] = true; - } - } - rangecount += (list_size / NUM_WIRES); - rangecount += 1; // we need to add 1 extra addition gates for every distinct range list - } - // update rangecount to include the ram range checks the composer will eventually be creating - for (size_t i = 0; i < ram_range_sizes.size(); ++i) { - if (!ram_range_exists[i]) { - rangecount += ram_range_sizes[i]; - } - } - std::vector nnf_copy( - cached_partial_non_native_field_multiplications); - // update nnfcount - std::sort(nnf_copy.begin(), nnf_copy.end()); - - auto last = std::unique(nnf_copy.begin(), nnf_copy.end()); - const size_t num_nnf_ops = static_cast(std::distance(nnf_copy.begin(), last)); - nnfcount = num_nnf_ops * GATES_PER_NON_NATIVE_FIELD_MULTIPLICATION_ARITHMETIC; - } /** * @brief Get the number of gates in a finalized circuit. @@ -454,36 +354,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasenum_gates; } - /** - * @brief Get the final number of gates in a circuit, which consists of the sum of: - * 1) Current number number of actual gates - * 2) Number of public inputs, as we'll need to add a gate for each of them - * 3) Number of Rom array-associated gates - * 4) Number of range-list associated gates - * 5) Number of non-native field multiplication gates. - * !!! WARNING: This function is predictive and might report an incorrect number. Make sure to finalize the circuit - * and then check the number of gates for a precise result. Kesha: it's basically voodoo - * - * @return size_t - * TODO(https://github.com/AztecProtocol/barretenberg/issues/875): This method may return an incorrect value before - * the circuit is finalized due to a failure to account for "de-duplication" when computing how many - * non-native-field gates will be present. - */ - size_t get_estimated_num_finalized_gates() const override - { - // if circuit finalized already added extra gates - if (circuit_finalized) { - return this->num_gates; - } - size_t count = 0; - size_t rangecount = 0; - size_t romcount = 0; - size_t ramcount = 0; - size_t nnfcount = 0; - get_num_estimated_gates_split_into_components(count, rangecount, romcount, ramcount, nnfcount); - return count + romcount + ramcount + rangecount + nnfcount; - } - /** * @brief Get combined size of all tables used in circuit * @@ -513,21 +383,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasenum_public_inputs(); - return std::max(get_tables_size(), num_filled_gates); - } - std::vector get_used_witnesses() const { return used_witnesses; } /** @@ -575,25 +430,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBaseget_variable(a_idx) != b && !this->failed()) { From c57daa38a94285ba2d9a3bbab5944b3bf2abc1b5 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Tue, 21 Oct 2025 22:44:07 +0000 Subject: [PATCH 03/11] add inefficient but robust method for gate counts --- .../benchmark/ultra_bench/mock_circuits.hpp | 6 +- ...cription_ultra_recursive_verifier.test.cpp | 2 +- .../ultra_circuit_builder.test.cpp | 4 +- .../cpp/src/barretenberg/common/log.hpp | 5 +- .../dsl/acir_format/acir_format.hpp | 2 +- .../dsl/acir_format/acir_integration.test.cpp | 2 +- .../civc_recursion_constraints.test.cpp | 2 - .../acir_format/ecdsa_constraints.test.cpp | 10 +-- .../honk_recursion_constraint.test.cpp | 8 +- .../circuit/ultra_circuit.test.cpp | 10 +-- .../eccvm_recursive_verifier.test.cpp | 4 +- .../stdlib/encryption/aes128/aes128.test.cpp | 2 +- .../stdlib/encryption/ecdsa/ecdsa.test.cpp | 4 +- .../encryption/schnorr/schnorr.test.cpp | 8 +- .../stdlib/hash/blake2s/blake2s.test.cpp | 4 +- .../stdlib/hash/blake3s/blake3s.test.cpp | 4 +- .../stdlib/hash/keccak/keccak.test.cpp | 12 +-- .../stdlib/hash/poseidon2/poseidon2.test.cpp | 6 +- .../stdlib/hash/sha256/sha256.test.cpp | 18 ++--- .../primitives/bigfield/bigfield.test.cpp | 4 +- .../primitives/biggroup/biggroup.test.cpp | 28 +++---- .../biggroup/biggroup_goblin.test.cpp | 2 +- .../biggroup/biggroup_secp256k1.test.cpp | 2 +- .../stdlib/primitives/bool/bool.test.cpp | 50 ++++++------ .../primitives/byte_array/byte_array.test.cpp | 8 +- .../stdlib/primitives/field/array.test.cpp | 16 ++-- .../stdlib/primitives/field/field.test.cpp | 76 +++++++++---------- .../padding_indicator_array.test.cpp | 10 +-- .../protogalaxy_recursive_verifier.test.cpp | 2 +- .../circuit_builder_base.hpp | 2 - .../circuit_builder_base_impl.hpp | 10 --- .../ultra_circuit_builder.cpp | 1 + .../ultra_circuit_builder.hpp | 15 ++++ 33 files changed, 170 insertions(+), 169 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp index e87f6c087f5c..c890b9ea3c35 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/mock_circuits.hpp @@ -26,7 +26,9 @@ template void generate_basic_arithmetic_circuit(Builder& buil // Ensure the circuit is filled but finalisation doesn't make the circuit size go to the next power of two size_t target_gate_count = (1UL << log2_num_gates); const size_t GATE_COUNT_BUFFER = 1000; // Since we're using an estimate, let's add an error term in case. - size_t passes = (target_gate_count - builder.get_estimated_num_finalized_gates() - GATE_COUNT_BUFFER) / 4; + size_t passes = (target_gate_count - builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false) - + GATE_COUNT_BUFFER) / + 4; if (static_cast(passes) <= 0) { throw_or_abort("We don't support low values of log2_num_gates."); } @@ -38,7 +40,7 @@ template void generate_basic_arithmetic_circuit(Builder& buil b = c * c; } - size_t est_gate_count = builder.get_estimated_num_finalized_gates(); + size_t est_gate_count = builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false); BB_ASSERT_LTE(est_gate_count, (1UL << log2_num_gates) - GATE_COUNT_BUFFER, "Check that the finalized gate count won't exceed the desired gate count."); diff --git a/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp index c520f8f3242c..660028e417d6 100644 --- a/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp @@ -129,7 +129,7 @@ template class BoomerangRecursiveVerifierTest : publi output.ipa_claim.set_public(); outer_circuit.ipa_proof = output.ipa_proof.get_value(); } - info("Recursive Verifier: num gates = ", outer_circuit.get_estimated_num_finalized_gates()); + info("Recursive Verifier: num gates = ", outer_circuit.get_num_finalized_gates_inefficient()); // Check for a failure flag in the recursive verifier circuit EXPECT_EQ(outer_circuit.failed(), false) << outer_circuit.err(); diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp index 61fc85866ecb..95fbea53bd52 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp @@ -39,7 +39,7 @@ TEST(UltraCircuitBuilder, CopyConstructor) UltraCircuitBuilder duplicate_builder{ builder }; - EXPECT_EQ(duplicate_builder.get_estimated_num_finalized_gates(), builder.get_estimated_num_finalized_gates()); + EXPECT_EQ(duplicate_builder.get_num_finalized_gates_inefficient(), builder.get_num_finalized_gates_inefficient()); EXPECT_TRUE(CircuitChecker::check(duplicate_builder)); } @@ -935,7 +935,7 @@ TEST(UltraCircuitBuilder, Ram) // Test the builder copy constructor for a circuit with RAM gates UltraCircuitBuilder duplicate_builder{ builder }; - EXPECT_EQ(duplicate_builder.get_estimated_num_finalized_gates(), builder.get_estimated_num_finalized_gates()); + EXPECT_EQ(duplicate_builder.get_num_finalized_gates_inefficient(), builder.get_num_finalized_gates_inefficient()); EXPECT_TRUE(CircuitChecker::check(duplicate_builder)); } diff --git a/barretenberg/cpp/src/barretenberg/common/log.hpp b/barretenberg/cpp/src/barretenberg/common/log.hpp index df8fae2d57a5..2302d1e034cc 100644 --- a/barretenberg/cpp/src/barretenberg/common/log.hpp +++ b/barretenberg/cpp/src/barretenberg/common/log.hpp @@ -11,10 +11,11 @@ #define BENCHMARK_INFO_SEPARATOR "#" #define BENCHMARK_INFO_SUFFIX "##BENCHMARK_INFO_SUFFIX##" -#define BENCH_GATE_COUNT_START(builder, op_name) uint64_t __bench_before = builder.get_estimated_num_finalized_gates(); +#define BENCH_GATE_COUNT_START(builder, op_name) \ + uint64_t __bench_before = builder.get_num_finalized_gates_inefficient(); #define BENCH_GATE_COUNT_END(builder, op_name) \ - uint64_t __bench_after = builder.get_estimated_num_finalized_gates(); \ + uint64_t __bench_after = builder.get_num_finalized_gates_inefficient(); \ std::cerr << "num gates with " << op_name << " = " << __bench_after - __bench_before << std::endl; \ benchmark_info(Builder::NAME_STRING, "Bigfield", op_name, "Gate Count", __bench_after - __bench_before); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp index 5db94669180c..d833a2b341bf 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp @@ -235,7 +235,7 @@ template class GateCounter { if (!collect_gates_per_opcode) { return 0; } - size_t new_gate_count = builder->get_estimated_num_finalized_gates(); + size_t new_gate_count = builder->get_num_finalized_gates_inefficient(); size_t diff = new_gate_count - prev_gate_count; prev_gate_count = new_gate_count; return diff; diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp index afe621936650..87710ff94933 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp @@ -51,7 +51,7 @@ class AcirIntegrationTest : public ::testing::Test { Prover prover{ prover_instance, verification_key }; #ifdef LOG_SIZES builder.blocks.summarize(); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); info("total circuit size = ", builder.get_estimated_total_circuit_size()); info("circuit size = ", prover.prover_instance->dyadic_size()); info("log circuit size = ", prover.prover_instance->log_dyadic_size()); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/civc_recursion_constraints.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/civc_recursion_constraints.test.cpp index d5d74ed822d9..18b3a9834424 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/civc_recursion_constraints.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/civc_recursion_constraints.test.cpp @@ -88,8 +88,6 @@ class CivcRecursionConstraintTest : public ::testing::Test { // Build constraints Builder builder = create_circuit(program, { .honk_recursion = 2 }); - info("Estimate finalized number of gates: ", builder.get_estimated_num_finalized_gates()); - // Construct vk auto prover_instance = std::make_shared(builder); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/ecdsa_constraints.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/ecdsa_constraints.test.cpp index 076ed732c51f..991365c0c0cb 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/ecdsa_constraints.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/ecdsa_constraints.test.cpp @@ -153,7 +153,7 @@ TYPED_TEST(EcdsaConstraintsTest, GenerateVKFromConstraints) { AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(builder); vk_from_witness = std::make_shared(prover_instance->get_precomputed()); @@ -194,7 +194,7 @@ TYPED_TEST(EcdsaConstraintsTest, EcdsaPredicate) AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); // Validate the builder EXPECT_TRUE(CircuitChecker::check(builder)); @@ -205,7 +205,7 @@ TYPED_TEST(EcdsaConstraintsTest, EcdsaPredicate) AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); // Validate the builder EXPECT_TRUE(CircuitChecker::check(builder)); @@ -216,7 +216,7 @@ TYPED_TEST(EcdsaConstraintsTest, EcdsaPredicate) AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); // Validate the builder EXPECT_TRUE(CircuitChecker::check(builder)); @@ -227,7 +227,7 @@ TYPED_TEST(EcdsaConstraintsTest, EcdsaPredicate) AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); EXPECT_TRUE(builder.failed()); } diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp index 0c0873837ca9..fd238a40705f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp @@ -284,7 +284,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint) /*dummy_witnesses=*/false, /*predicate_val=*/true); - info("estimate finalized circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates()); + info("estimate finalized circuit gates = ", layer_2_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_2_circuit); auto verification_key = @@ -306,7 +306,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestBasicDoubleHonkRecursionConstraints) auto layer_2_circuit = TestFixture::template create_outer_circuit(layer_1_circuits, false, false); - info("circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates()); + info("circuit gates = ", layer_2_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_2_circuit); auto verification_key = @@ -372,7 +372,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestOneOuterRecursiveCircuit) /*dummy_witnesses=*/false, /*predicate_val=*/true); info("created second outer circuit"); - info("number of gates in layer 3 = ", layer_3_circuit.get_estimated_num_finalized_gates()); + info("number of gates in layer 3 = ", layer_3_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_3_circuit); auto verification_key = @@ -429,7 +429,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestFullRecursiveComposition) /*dummy_witnesses=*/false, /*predicate_val=*/true); info("created third outer circuit"); - info("number of gates in layer 3 circuit = ", layer_3_circuit.get_estimated_num_finalized_gates()); + info("number of gates in layer 3 circuit = ", layer_3_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_3_circuit); auto verification_key = diff --git a/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp b/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp index 158dcf71053f..66ad8e96d668 100644 --- a/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp +++ b/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp @@ -90,7 +90,7 @@ TEST(UltraCircuitSMT, ArithmeticRelation) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_estimated_num_finalized_gates()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); cir["a"] == a.get_value(); cir["b"] == b.get_value(); @@ -122,7 +122,7 @@ TEST(UltraCircuitSMT, EllipticRelationADD) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_estimated_num_finalized_gates()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); cir["x1"] == p1.x.get_value(); cir["x2"] == p2.x.get_value(); @@ -165,7 +165,7 @@ TEST(UltraCircuitSMT, EllipticRelationDBL) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_estimated_num_finalized_gates()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); cir["x1"] == p1.x.get_value(); cir["y1"] == p1.y.get_value(); @@ -202,7 +202,7 @@ TEST(UltraCircuitSMT, OptimizedDeltaRangeRelation) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s, TermType::BVTerm); - ASSERT_EQ(cir.get_num_gates(), builder.get_estimated_num_finalized_gates()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); cir["a"] == a.get_value(); s.print_assertions(); @@ -251,7 +251,7 @@ TEST(UltraCircuitSMT, LookupRelation2) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config, /*base=*/16, /*bvsize=*/256); UltraCircuit cir(circuit_info, &s, TermType::BVTerm); - ASSERT_EQ(cir.get_num_gates(), builder.get_estimated_num_finalized_gates()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); cir["a"] == a.get_value(); cir["b"] == b.get_value(); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.test.cpp index 6bbd05fe1e5d..da4ca81fda23 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_verifier.test.cpp @@ -95,7 +95,7 @@ class ECCVMRecursiveTests : public ::testing::Test { auto [opening_claim, ipa_transcript] = verifier.verify_proof(proof); stdlib::recursion::PairingPoints::add_default_to_public_inputs(outer_circuit); - info("Recursive Verifier: num gates = ", outer_circuit.get_estimated_num_finalized_gates()); + info("Recursive Verifier: num gates = ", outer_circuit.get_num_finalized_gates_inefficient()); // Check for a failure flag in the recursive verifier circuit EXPECT_EQ(outer_circuit.failed(), false) << outer_circuit.err(); @@ -161,7 +161,7 @@ class ECCVMRecursiveTests : public ::testing::Test { RecursiveVerifier verifier{ &outer_circuit, verification_key, stdlib_verifier_transcript }; [[maybe_unused]] auto output = verifier.verify_proof(proof); stdlib::recursion::PairingPoints::add_default_to_public_inputs(outer_circuit); - info("Recursive Verifier: estimated num finalized gates = ", outer_circuit.get_estimated_num_finalized_gates()); + info("Recursive Verifier: num finalized gates = ", outer_circuit.get_num_finalized_gates_inefficient()); // Check for a failure flag in the recursive verifier circuit EXPECT_FALSE(CircuitChecker::check(outer_circuit)); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/encryption/aes128/aes128.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/encryption/aes128/aes128.test.cpp index 258b416b80b4..fa2be7bfb464 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/encryption/aes128/aes128.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/encryption/aes128/aes128.test.cpp @@ -230,7 +230,7 @@ TEST(stdlib_aes128, encrypt_64_bytes_original) EXPECT_EQ(result[i].get_value(), expected[i]); } - std::cout << "num gates = " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cout << "num gates = " << builder.get_num_finalized_gates_inefficient() << std::endl; bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp index 01690063eac5..961017dd11cc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp @@ -256,12 +256,12 @@ template class EcdsaTests : public ::testing::Test { EXPECT_EQ(signature_result.get_value(), signature_verification_result); // Log data - std::cerr << "num gates = " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "num gates = " << builder.get_num_finalized_gates_inefficient() << std::endl; benchmark_info(Builder::NAME_STRING, "ECDSA", "Signature Verification Test", "Gate Count", - builder.get_estimated_num_finalized_gates()); + builder.get_num_finalized_gates_inefficient()); // Circuit checker bool is_circuit_satisfied = CircuitChecker::check(builder); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/encryption/schnorr/schnorr.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/encryption/schnorr/schnorr.test.cpp index 0a41fecb7df2..e64b8ced8806 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/encryption/schnorr/schnorr.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/encryption/schnorr/schnorr.test.cpp @@ -48,7 +48,7 @@ TEST(stdlib_schnorr, schnorr_verify_signature) byte_array_ct message(&builder, message_string); schnorr_verify_signature(message, pub_key, sig); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); } @@ -90,7 +90,7 @@ TEST(stdlib_schnorr, verify_signature_failure) byte_array_ct message(&builder, message_string); schnorr_verify_signature(message, pub_key2_ct, sig); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool verification_result = CircuitChecker::check(builder); EXPECT_EQ(verification_result, false); @@ -125,7 +125,7 @@ TEST(stdlib_schnorr, schnorr_signature_verification_result) bool_ct signature_result = schnorr_signature_verification_result(message, pub_key, sig); EXPECT_EQ(signature_result.get_value(), true); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); @@ -168,7 +168,7 @@ TEST(stdlib_schnorr, signature_verification_result_failure) bool_ct signature_result = schnorr_signature_verification_result(message, pub_key2_ct, sig); EXPECT_EQ(signature_result.get_value(), false); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool verification_result = CircuitChecker::check(builder); EXPECT_EQ(verification_result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/blake2s/blake2s.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/blake2s/blake2s.test.cpp index 60601605cce3..38d395f509ab 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/blake2s/blake2s.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/blake2s/blake2s.test.cpp @@ -27,7 +27,7 @@ TEST(stdlib_blake2s, test_single_block_plookup) EXPECT_EQ(output.get_value(), std::vector(expected.begin(), expected.end())); - info("builder gates = ", builder.get_estimated_num_finalized_gates()); + info("builder gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -46,7 +46,7 @@ TEST(stdlib_blake2s, test_double_block_plookup) EXPECT_EQ(output.get_value(), std::vector(expected.begin(), expected.end())); - info("builder gates = ", builder.get_estimated_num_finalized_gates()); + info("builder gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/blake3s/blake3s.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/blake3s/blake3s.test.cpp index 310648b49b53..b541a0ad28b3 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/blake3s/blake3s.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/blake3s/blake3s.test.cpp @@ -24,7 +24,7 @@ TEST(stdlib_blake3s, test_single_block_plookup) EXPECT_EQ(output.get_value(), expected); - info("builder gates = ", builder.get_estimated_num_finalized_gates()); + info("builder gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -43,7 +43,7 @@ TEST(stdlib_blake3s, test_double_block_plookup) EXPECT_EQ(output.get_value(), expected); - info("builder gates = ", builder.get_estimated_num_finalized_gates()); + info("builder gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/keccak/keccak.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/keccak/keccak.test.cpp index dffce2cf9f09..51fd6afe4da1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/keccak/keccak.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/keccak/keccak.test.cpp @@ -95,7 +95,7 @@ TEST(stdlib_keccak, keccak_rho_output_table) EXPECT_EQ(static_cast(result_msb.get_value()), expected_msb); }); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -131,7 +131,7 @@ TEST(stdlib_keccak, keccak_chi_output_table) EXPECT_EQ(static_cast(normalized.get_value()), normalized_native); EXPECT_EQ(static_cast(msb.get_value()), binary_native >> 63); } - info("num gates = n", builder.get_estimated_num_finalized_gates()); + info("num gates = n", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -189,8 +189,6 @@ TEST(stdlib_keccak, test_single_block) EXPECT_EQ(output.get_value(), expected); - builder.print_num_estimated_finalized_gates(); - bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -214,8 +212,6 @@ TEST(stdlib_keccak, test_double_block) EXPECT_EQ(output.get_value(), expected); - builder.print_num_estimated_finalized_gates(); - bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -233,8 +229,6 @@ TEST(stdlib_keccak, test_permutation_opcode_single_block) EXPECT_EQ(output.get_value(), expected); - builder.print_num_estimated_finalized_gates(); - bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -255,8 +249,6 @@ TEST(stdlib_keccak, test_permutation_opcode_double_block) EXPECT_EQ(output.get_value(), expected); - builder.print_num_estimated_finalized_gates(); - bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2.test.cpp index d2d60cdd4d66..65ac34b0ef0c 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2.test.cpp @@ -59,12 +59,12 @@ template class StdlibPoseidon2 : public testing::Test { inputs_native.emplace_back(element); inputs.emplace_back(field_ct(witness_ct(&builder, element))); } - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); auto result = stdlib::poseidon2::hash(inputs); auto expected = crypto::Poseidon2::hash(inputs_native); - EXPECT_EQ(gate_count(num_inputs), builder.get_estimated_num_finalized_gates() - num_gates_start); + EXPECT_EQ(gate_count(num_inputs), builder.get_num_finalized_gates_inefficient() - num_gates_start); EXPECT_EQ(result.get_value(), expected); @@ -94,7 +94,7 @@ template class StdlibPoseidon2 : public testing::Test { builder.set_public_input(left.witness_index); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256.test.cpp index c2d38d6cb316..bb9720276b05 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/sha256/sha256.test.cpp @@ -150,7 +150,7 @@ std::array inner_block(std::array& w) // EXPECT_EQ(uint256_t(result[i].get_value()).data[0] & 0xffffffffUL, // uint256_t(expected[i]).data[0] & 0xffffffffUL); // } -// info("num gates = %zu\n", builder.get_estimated_num_finalized_gates()); +// info("num gates = %zu\n", builder.get_num_finalized_gates_inefficient()); // auto prover = composer.create_prover(); @@ -180,7 +180,7 @@ TEST(stdlib_sha256, test_plookup_55_bytes) EXPECT_EQ(uint256_t(output[5].get_value()), 0xbde22ab0U); EXPECT_EQ(uint256_t(output[6].get_value()), 0x54a8fac7U); EXPECT_EQ(uint256_t(output[7].get_value()), 0x93791fc7U); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -205,7 +205,7 @@ TEST(stdlib_sha256, test_55_bytes) EXPECT_EQ(output[5].get_value(), fr(0xbde22ab0ULL)); EXPECT_EQ(output[6].get_value(), fr(0x54a8fac7ULL)); EXPECT_EQ(output[7].get_value(), fr(0x93791fc7ULL)); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -227,7 +227,7 @@ TEST(stdlib_sha256, test_NIST_vector_one_byte_array) EXPECT_EQ(uint256_t(output[5].get_value()).data[0], (uint64_t)0x96177A9CU); EXPECT_EQ(uint256_t(output[6].get_value()).data[0], (uint64_t)0xB410FF61U); EXPECT_EQ(uint256_t(output[7].get_value()).data[0], (uint64_t)0xF20015ADU); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -252,7 +252,7 @@ TEST(stdlib_sha256, test_NIST_vector_one) EXPECT_EQ(output[5].get_value(), fr(0x96177A9CULL)); EXPECT_EQ(output[6].get_value(), fr(0xB410FF61ULL)); EXPECT_EQ(output[7].get_value(), fr(0xF20015ADULL)); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -276,7 +276,7 @@ TEST(stdlib_sha256, test_NIST_vector_two) EXPECT_EQ(output[5].get_value(), 0x64FF2167ULL); EXPECT_EQ(output[6].get_value(), 0xF6ECEDD4ULL); EXPECT_EQ(output[7].get_value(), 0x19DB06C1ULL); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -301,7 +301,7 @@ TEST(stdlib_sha256, test_NIST_vector_three) EXPECT_EQ(output[5].get_value(), 0x7dc4b5aaULL); EXPECT_EQ(output[6].get_value(), 0xe11204c0ULL); EXPECT_EQ(output[7].get_value(), 0x8ffe732bULL); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -327,7 +327,7 @@ TEST(stdlib_sha256, test_NIST_vector_four) EXPECT_EQ(output[6].get_value(), 0xbd56c61cULL); EXPECT_EQ(output[7].get_value(), 0xcccd9504ULL); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); @@ -364,7 +364,7 @@ HEAVY_TEST(stdlib_sha256, test_NIST_vector_five) EXPECT_EQ(output[6].get_value(), 0xa519105aULL); EXPECT_EQ(output[7].get_value(), 0x1eadd6e4ULL); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bigfield/bigfield.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bigfield/bigfield.test.cpp index 3602b9358954..00954e6edb3e 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bigfield/bigfield.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bigfield/bigfield.test.cpp @@ -1165,11 +1165,11 @@ template class stdlib_bigfield : public testing::Test { witness_ct(&builder, fr(uint256_t(P2.y).slice(0, fq_ct::NUM_LIMB_BITS * 2))), witness_ct(&builder, fr(uint256_t(P2.y).slice(fq_ct::NUM_LIMB_BITS * 2, fq_ct::NUM_LIMB_BITS * 4)))); - uint64_t before = builder.get_estimated_num_finalized_gates(); + uint64_t before = builder.get_num_finalized_gates_inefficient(); fq_ct lambda = (y2 - y1) / (x2 - x1); fq_ct x3 = lambda.sqr() - (x2 + x1); fq_ct y3 = (x1 - x3) * lambda - y1; - uint64_t after = builder.get_estimated_num_finalized_gates(); + uint64_t after = builder.get_num_finalized_gates_inefficient(); std::cerr << "added gates = " << after - before << std::endl; // Check the result against the native group addition diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup.test.cpp index b89bb943d713..b0677e24bde8 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup.test.cpp @@ -49,7 +49,7 @@ template class stdlib_biggroup : public testing::Test { using bool_ct = stdlib::bool_t; static constexpr auto EXPECT_CIRCUIT_CORRECTNESS = [](Builder& builder, bool expected_result = true) { - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_EQ(CircuitChecker::check(builder), expected_result); }; @@ -96,9 +96,9 @@ template class stdlib_biggroup : public testing::Test { a.set_origin_tag(submitted_value_origin_tag); b.set_origin_tag(challenge_origin_tag); - uint64_t before = builder.get_estimated_num_finalized_gates(); + uint64_t before = builder.get_num_finalized_gates_inefficient(); element_ct c = a + b; - uint64_t after = builder.get_estimated_num_finalized_gates(); + uint64_t after = builder.get_num_finalized_gates_inefficient(); // Check that the resulting tag is the union of inputs' tgs EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); @@ -599,9 +599,9 @@ template class stdlib_biggroup : public testing::Test { x.set_origin_tag(challenge_origin_tag); P.set_origin_tag(submitted_value_origin_tag); - std::cerr << "gates before mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "gates before mul " << builder.get_num_finalized_gates_inefficient() << std::endl; element_ct c = P * x; - std::cerr << "builder aftr mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "builder aftr mul " << builder.get_num_finalized_gates_inefficient() << std::endl; affine_element c_expected(element(input) * scalar); // Check the result of the multiplication has a tag that's the union of inputs' tags @@ -643,10 +643,10 @@ template class stdlib_biggroup : public testing::Test { x.set_origin_tag(challenge_origin_tag); P.set_origin_tag(submitted_value_origin_tag); - std::cerr << "gates before mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "gates before mul " << builder.get_num_finalized_gates_inefficient() << std::endl; // Multiply using specified scalar length element_ct c = P.scalar_mul(x, i); - std::cerr << "builder aftr mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "builder aftr mul " << builder.get_num_finalized_gates_inefficient() << std::endl; affine_element c_expected(element(input) * scalar); // Check the result of the multiplication has a tag that's the union of inputs' tags @@ -683,10 +683,10 @@ template class stdlib_biggroup : public testing::Test { x.set_origin_tag(challenge_origin_tag); P.set_origin_tag(submitted_value_origin_tag); - std::cerr << "gates before mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "gates before mul " << builder.get_num_finalized_gates_inefficient() << std::endl; // Multiply using specified scalar length element_ct c = P.scalar_mul(x, i); - std::cerr << "builder aftr mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "builder aftr mul " << builder.get_num_finalized_gates_inefficient() << std::endl; affine_element c_expected(element(input) * scalar); // Check the result of the multiplication has a tag that's the union of inputs' tags @@ -736,10 +736,10 @@ template class stdlib_biggroup : public testing::Test { x.set_origin_tag(challenge_origin_tag); P.set_origin_tag(submitted_value_origin_tag); - std::cerr << "gates before mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "gates before mul " << builder.get_num_finalized_gates_inefficient() << std::endl; element_ct c = P.scalar_mul(x, max_num_bits); - std::cerr << "builder aftr mul " << builder.get_estimated_num_finalized_gates() << std::endl; - num_gates = builder.get_estimated_num_finalized_gates(); + std::cerr << "builder aftr mul " << builder.get_num_finalized_gates_inefficient() << std::endl; + num_gates = builder.get_num_finalized_gates_inefficient(); // Check the result of the multiplication has a tag that's the union of inputs' tags EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); @@ -1465,9 +1465,9 @@ template class stdlib_biggroup : public testing::Test { union_tag = OriginTag(union_tag, element_tags[j], scalar_tags[j]); } - std::cerr << "gates before mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "gates before mul " << builder.get_num_finalized_gates_inefficient() << std::endl; element_ct c = element_ct::batch_mul({ P1, P2, P3, P4 }, { x1, x2, x3, x4 }, 128); - std::cerr << "builder aftr mul " << builder.get_estimated_num_finalized_gates() << std::endl; + std::cerr << "builder aftr mul " << builder.get_num_finalized_gates_inefficient() << std::endl; // Check that the resulting tag is a union of inputs' tags EXPECT_EQ(c.get_origin_tag(), union_tag); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_goblin.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_goblin.test.cpp index 6fc3ec6cbea3..3c546975cfe2 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_goblin.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_goblin.test.cpp @@ -29,7 +29,7 @@ template class stdlib_biggroup_goblin : public testing::Test { using Builder = typename Curve::Builder; static constexpr auto EXPECT_CIRCUIT_CORRECTNESS = [](Builder& builder, bool expected_result = true) { - info("builder gates = ", builder.get_estimated_num_finalized_gates()); + info("builder gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_EQ(CircuitChecker::check(builder), expected_result); }; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_secp256k1.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_secp256k1.test.cpp index f40c4efd2757..f6d2ee73e3f6 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_secp256k1.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_secp256k1.test.cpp @@ -37,7 +37,7 @@ template class stdlibBiggroupSecp256k1 : public testing::Test { using bool_ct = stdlib::bool_t; static constexpr auto EXPECT_CIRCUIT_CORRECTNESS = [](Builder& builder, bool expected_result = true) { - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_EQ(CircuitChecker::check(builder), expected_result); }; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp index f15c0ffe114d..d819132f79d9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp @@ -58,7 +58,7 @@ template class BoolTest : public ::testing::Test { bool_ct a = create_bool_ct(lhs, &builder); bool_ct b = create_bool_ct(rhs, &builder); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); if (!a.is_constant() && !b.is_constant()) { a.set_origin_tag(submitted_value_origin_tag); @@ -84,7 +84,7 @@ template class BoolTest : public ::testing::Test { EXPECT_EQ(c.get_origin_tag(), first_two_merged_tag); } - size_t diff = builder.get_estimated_num_finalized_gates() - num_gates_start; + size_t diff = builder.get_num_finalized_gates_inefficient() - num_gates_start; // An extra gate is created iff both operands are witnesses EXPECT_EQ(diff, static_cast(!a.is_constant() && !b.is_constant())); } @@ -96,7 +96,7 @@ template class BoolTest : public ::testing::Test { void test_construct_from_const_bool() { Builder builder = Builder(); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); bool_ct a_true(true); bool_ct a_false(false); EXPECT_TRUE(a_true.get_value()); @@ -104,13 +104,13 @@ template class BoolTest : public ::testing::Test { EXPECT_TRUE(a_true.is_constant() && a_false.is_constant()); EXPECT_TRUE(!a_true.is_inverted() && !a_false.is_inverted()); // No gates have been added - EXPECT_TRUE(num_gates_start == builder.get_estimated_num_finalized_gates()); + EXPECT_TRUE(num_gates_start == builder.get_num_finalized_gates_inefficient()); } void test_construct_from_witness_index() { Builder builder = Builder(); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); const size_t witness_idx_zero = builder.add_variable(bb::fr(0)); const size_t witness_idx_one = builder.add_variable(bb::fr(1)); const size_t non_bool_witness_idx = builder.add_variable(bb::fr(15)); @@ -121,7 +121,7 @@ template class BoolTest : public ::testing::Test { bool_witness = bool_ct::from_witness_index_unsafe(&builder, witness_idx_one); EXPECT_EQ(bool_witness.get_value(), true); // No gates are added. - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, 0); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - num_gates_start, 0); // Out-of-circuit failure when witness points to a non-bool value. EXPECT_THROW_OR_ABORT(bool_witness = bool_ct::from_witness_index_unsafe(&builder, non_bool_witness_idx), @@ -130,7 +130,7 @@ template class BoolTest : public ::testing::Test { void test_construct_from_witness() { Builder builder = Builder(); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); bool_ct a_true = witness_ct(&builder, 1); bool_ct a_false = witness_ct(&builder, 0); @@ -139,7 +139,7 @@ template class BoolTest : public ::testing::Test { EXPECT_TRUE(!a_true.is_constant() && !a_false.is_constant()); EXPECT_TRUE(!a_true.is_inverted() && !a_false.is_inverted()); // Each witness bool must be constrained => expect 2 gates being added - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_start == 2); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_start == 2); EXPECT_TRUE(CircuitChecker::check(builder)); // Test failure @@ -158,7 +158,7 @@ template class BoolTest : public ::testing::Test { for (size_t num_inputs = 1; num_inputs < 50; num_inputs++) { Builder builder = Builder(); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); std::vector indices; for (size_t idx = 0; idx < num_inputs; idx++) { @@ -166,14 +166,18 @@ template class BoolTest : public ::testing::Test { bool_ct(witness_ct(&builder, idx % 2), use_range_constraint).get_normalized_witness_index()); } - const size_t sorted_list_size = num_inputs + 2; + // Note: +2 comes from entries added in create_range_list for target_range == 1 + size_t sorted_list_size = num_inputs + 2; + // sorted list is padded to minimum size of 8 + sorted_list_size = std::max(sorted_list_size, 8UL); + // +4 for combination of unconstrained gates and add gates for fixing endpoints + size_t fixed_additional_gates = 4; + // Delta-range mechanism packs 4 values per gate + size_t expected = numeric::ceil_div(sorted_list_size, 4UL) + fixed_additional_gates; - // Pin down the gate numbers. The point is that it is more efficient to use this constructor to constrain a - // batch of bool_t elements. 4 is a special case, otherwise the number of gates is just - // ceil(sorted_list_size) + 2. - size_t expected = (sorted_list_size == 4) ? 4 : ((sorted_list_size + 3) / 4) + 2; + size_t actual = builder.get_num_finalized_gates_inefficient() - num_gates_start; - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, expected); + EXPECT_EQ(actual, expected); builder.create_unconstrained_gates(indices); @@ -246,7 +250,7 @@ template class BoolTest : public ::testing::Test { } else { bool result_is_constant = (!a || b).is_constant(); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); if (!a.is_constant() && !b.is_constant()) { a.set_origin_tag(submitted_value_origin_tag); @@ -257,7 +261,7 @@ template class BoolTest : public ::testing::Test { // b = 1 => bool expected = !(lhs.value ^ lhs.is_inverted) || rhs.value ^ rhs.is_inverted; - size_t diff = builder.get_estimated_num_finalized_gates() - num_gates_start; + size_t diff = builder.get_num_finalized_gates_inefficient() - num_gates_start; if (!a.is_constant() && !b.is_constant()) { EXPECT_EQ(diff, 2); @@ -296,7 +300,7 @@ template class BoolTest : public ::testing::Test { bool_ct b = create_bool_ct(rhs, &builder); bool_ct condition = create_bool_ct(predicate, &builder); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); if (!a.is_constant() && !b.is_constant()) { condition.set_origin_tag(submitted_value_origin_tag); a.set_origin_tag(challenge_origin_tag); @@ -304,7 +308,7 @@ template class BoolTest : public ::testing::Test { } bool_ct result = bool_ct::conditional_assign(condition, a, b); - size_t diff = builder.get_estimated_num_finalized_gates() - num_gates_start; + size_t diff = builder.get_num_finalized_gates_inefficient() - num_gates_start; if (!a.is_constant() && !b.is_constant()) { EXPECT_EQ(result.get_origin_tag(), first_second_third_merged_tag); } @@ -328,7 +332,7 @@ template class BoolTest : public ::testing::Test { bool_ct a = create_bool_ct(a_raw, &builder); - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); if (!a.is_constant()) { a.set_origin_tag(submitted_value_origin_tag); } @@ -338,7 +342,7 @@ template class BoolTest : public ::testing::Test { EXPECT_EQ(c.get_origin_tag(), submitted_value_origin_tag); } EXPECT_EQ(c.is_inverted(), false); - size_t diff = builder.get_estimated_num_finalized_gates() - num_gates_start; + size_t diff = builder.get_num_finalized_gates_inefficient() - num_gates_start; // Note that although `normalize()` returns value, it flips the `is_inverted()` flag of `a` if it was // `true`. EXPECT_EQ(diff, static_cast(!a.is_constant() && a_raw.is_inverted)); @@ -379,7 +383,7 @@ template class BoolTest : public ::testing::Test { { auto builder = Builder(); - auto gates_before = builder.get_estimated_num_finalized_gates(); + auto gates_before = builder.get_num_finalized_gates_inefficient(); bool_ct a = witness_ct(&builder, bb::fr::one()); bool_ct b = witness_ct(&builder, bb::fr::zero()); @@ -430,7 +434,7 @@ template class BoolTest : public ::testing::Test { bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); - auto gates_after = builder.get_estimated_num_finalized_gates(); + auto gates_after = builder.get_num_finalized_gates_inefficient(); EXPECT_EQ(gates_after - gates_before, 6UL); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/byte_array/byte_array.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/byte_array/byte_array.test.cpp index 146f9910276d..7299c28c8e8e 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/byte_array/byte_array.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/byte_array/byte_array.test.cpp @@ -105,7 +105,7 @@ template class ByteArrayTest : public ::testing::Test { { for (size_t num_bytes = 1; num_bytes < 32; num_bytes++) { Builder builder; - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); uint256_t raw_val = engine.get_random_uint256(); fr expected_val = slice_to_n_bytes(raw_val, num_bytes); @@ -124,7 +124,7 @@ template class ByteArrayTest : public ::testing::Test { EXPECT_EQ(reconstructed_field.get_origin_tag(), submitted_value_origin_tag); // Make sure no gates are added - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_start == 0); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_start == 0); } } @@ -172,7 +172,7 @@ template class ByteArrayTest : public ::testing::Test { { Builder builder; - size_t gates_start = builder.get_estimated_num_finalized_gates(); + size_t gates_start = builder.get_num_finalized_gates_inefficient(); field_ct test_val(&builder, fr::random_element()); byte_array_ct arr(test_val, 32); @@ -196,7 +196,7 @@ template class ByteArrayTest : public ::testing::Test { "byte_array: y_hi doesn't fit in 128 bits"); } // Make sure no gates are added - EXPECT_TRUE(gates_start == builder.get_estimated_num_finalized_gates()); + EXPECT_TRUE(gates_start == builder.get_num_finalized_gates_inefficient()); } void test_byte_array_input_output_consistency() diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/array.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/array.test.cpp index e536038e6c41..38af636fbab9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/array.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/array.test.cpp @@ -38,7 +38,7 @@ template class stdlib_array : public testing::Test { auto filled_len = array_length(values_ct); EXPECT_EQ(filled_len.get_value(), filled); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -52,7 +52,7 @@ template class stdlib_array : public testing::Test { EXPECT_EQ(filled_len.get_value(), 0); EXPECT_TRUE(filled_len.is_constant()); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -97,7 +97,7 @@ template class stdlib_array : public testing::Test { auto popped = array_pop(values_ct); EXPECT_EQ(popped.get_value(), values[filled - 1]); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); }; @@ -149,7 +149,7 @@ template class stdlib_array : public testing::Test { array_push(values_ct, value_ct); EXPECT_EQ(value_ct.get_value(), values_ct[filled].get_value()); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -189,7 +189,7 @@ template class stdlib_array : public testing::Test { EXPECT_EQ(num_pushes, ARRAY_LEN); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } @@ -246,7 +246,7 @@ template class stdlib_array : public testing::Test { is_empty = is_array_empty(values_ct); EXPECT_EQ(is_empty.get_value(), true); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); }; @@ -278,7 +278,7 @@ template class stdlib_array : public testing::Test { bool proof_result = false; if (!builder.failed()) { - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); proof_result = CircuitChecker::check(builder); } @@ -567,7 +567,7 @@ template class stdlib_array : public testing::Test { EXPECT_EQ(arr[2].get_values().first.get_value(), 3); EXPECT_EQ(arr[2].get_values().second.get_value(), 30); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool proof_result = CircuitChecker::check(builder); EXPECT_EQ(proof_result, true); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index 31bb84e6926a..509b25a7ef70 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -30,13 +30,13 @@ template class stdlib_field : public testing::Test { field_ct a(public_witness_ct(&builder, fr::one())); // a is a legit wire value in our circuit field_ct b(&builder, (fr::one())); // b is just a constant, and should not turn up as a wire value in our circuit - const size_t num_gates = builder.get_estimated_num_finalized_gates(); + const size_t num_gates = builder.get_num_finalized_gates_inefficient(); // This shouldn't create a constraint - we just need to scale the addition/multiplication gates that `a` is // involved in, `c` should have the same witness index as `a`, i.e. point to the same wire value field_ct c = a + b; EXPECT_TRUE(c.witness_index == a.witness_index); - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() == num_gates); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() == num_gates); field_ct d(&builder, fr::coset_generator<0>()); // like b, d is just a constant and not a wire value // by this point, we shouldn't have added any constraints in our circuit @@ -209,7 +209,7 @@ template class stdlib_field : public testing::Test { auto check_conditional_assign = [](auto& builder, bool_ct& predicate, field_ct& lhs, field_ct& rhs, bool same_elt) { - size_t num_gates_before = builder.get_estimated_num_finalized_gates(); + size_t num_gates_before = builder.get_num_finalized_gates_inefficient(); field_ct result = field_ct::conditional_assign(predicate, lhs, rhs); EXPECT_TRUE(result.get_value() == (predicate.get_value() ? lhs.get_value() : rhs.get_value())); @@ -224,7 +224,7 @@ template class stdlib_field : public testing::Test { } } - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_before == expected_num_gates); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_before == expected_num_gates); }; // Populate predicate array, ensure that both constant and witness predicates are present std::array predicates{ @@ -371,44 +371,44 @@ template class stdlib_field : public testing::Test { // Constant == witness { Builder builder; - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); field_ct a(&builder, 9); field_ct b = field_ct::from_witness(&builder, 9); a.assert_equal(b); EXPECT_TRUE(CircuitChecker::check(builder)); // 1 gate is needed to fix the constant - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, 1); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - num_gates_start, 1); } // Witness == constant { Builder builder; - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); field_ct a = field_ct::from_witness(&builder, 42); field_ct b(&builder, 42); a.assert_equal(b); EXPECT_TRUE(CircuitChecker::check(builder)); // 1 gate is needed to fix the constant - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, 1); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - num_gates_start, 1); } // Witness == witness (equal values) { Builder builder; - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); field_ct a = field_ct::from_witness(&builder, 11); field_ct b = field_ct::from_witness(&builder, 11); a.assert_equal(b); EXPECT_TRUE(CircuitChecker::check(builder)); // Both witnesses are normalized, no gates are created, only a copy constraint - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, 0); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - num_gates_start, 0); } // Witness != witness (both are not normalized) { Builder builder; - size_t num_gates_start = builder.get_estimated_num_finalized_gates(); + size_t num_gates_start = builder.get_num_finalized_gates_inefficient(); field_ct a = field_ct::from_witness(&builder, 10); a += 13; field_ct b = field_ct::from_witness(&builder, 15); @@ -416,7 +416,7 @@ template class stdlib_field : public testing::Test { a.assert_equal(b); EXPECT_FALSE(CircuitChecker::check(builder)); // Both witnesses are not normalized, we use a single `add_gate` to ensure they are equal - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - num_gates_start, 1); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - num_gates_start, 1); EXPECT_EQ(builder.err(), "field_t::assert_equal"); } } @@ -424,9 +424,9 @@ template class stdlib_field : public testing::Test { static void test_add_mul_with_constants() { Builder builder = Builder(); - auto gates_before = builder.get_estimated_num_finalized_gates(); + auto gates_before = builder.get_num_finalized_gates_inefficient(); uint64_t expected = fidget(builder); - auto gates_after = builder.get_estimated_num_finalized_gates(); + auto gates_after = builder.get_num_finalized_gates_inefficient(); auto& block = builder.blocks.arithmetic; EXPECT_EQ(builder.get_variable(block.w_o()[block.size() - 1]), fr(expected)); info("Number of gates added", gates_after - gates_before); @@ -617,12 +617,12 @@ template class stdlib_field : public testing::Test { static void test_equality() { Builder builder = Builder(); - auto gates_before = builder.get_estimated_num_finalized_gates(); + auto gates_before = builder.get_num_finalized_gates_inefficient(); field_ct a(witness_ct(&builder, 4)); field_ct b(witness_ct(&builder, 4)); bool_ct r = a == b; - auto gates_after = builder.get_estimated_num_finalized_gates(); + auto gates_after = builder.get_num_finalized_gates_inefficient(); EXPECT_EQ(r.get_value(), true); fr x = r.get_value(); @@ -642,11 +642,11 @@ template class stdlib_field : public testing::Test { { Builder builder = Builder(); - auto gates_before = builder.get_estimated_num_finalized_gates(); + auto gates_before = builder.get_num_finalized_gates_inefficient(); field_ct a(witness_ct(&builder, 4)); field_ct b(witness_ct(&builder, 3)); bool_ct r = a == b; - auto gates_after = builder.get_estimated_num_finalized_gates(); + auto gates_after = builder.get_num_finalized_gates_inefficient(); EXPECT_FALSE(r.get_value()); @@ -664,18 +664,18 @@ template class stdlib_field : public testing::Test { Builder builder = Builder(); field_ct a(witness_ct(&builder, 4)); - auto gates_before = builder.get_estimated_num_finalized_gates(); + auto gates_before = builder.get_num_finalized_gates_inefficient(); field_ct b = 3; field_ct c = 7; // Note that the lhs is constant, hence (rhs - lhs) can be computed without adding new gates, using == in // this case requires 3 constraints 1) ensure r is bool; 2) (a - b) * I + r - 1 = 0; 3) -I * r + r = 0 bool_ct r = (a * c) == (b * c + c); - auto gates_after = builder.get_estimated_num_finalized_gates(); + auto gates_after = builder.get_num_finalized_gates_inefficient(); EXPECT_EQ(gates_after - gates_before, 3UL); r = r && (b + 1 == a); EXPECT_EQ(r.get_value(), true); // The situation is as above, but we also applied && to bool_t witnesses, which adds an extra gate. - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - gates_after, 4UL); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - gates_after, 4UL); EXPECT_TRUE(CircuitChecker::check(builder)); } @@ -697,10 +697,10 @@ template class stdlib_field : public testing::Test { field_ct d(&builder, fr::zero()); field_ct e(&builder, fr::one()); // Validate that `is_zero()` check does not add any gates in this case - const size_t old_n = builder.get_estimated_num_finalized_gates(); + const size_t old_n = builder.get_num_finalized_gates_inefficient(); bool_ct d_zero = d.is_zero(); bool_ct e_zero = e.is_zero(); - const size_t new_n = builder.get_estimated_num_finalized_gates(); + const size_t new_n = builder.get_num_finalized_gates_inefficient(); EXPECT_EQ(old_n, new_n); // Create witnesses @@ -740,17 +740,17 @@ template class stdlib_field : public testing::Test { static void test_assert_is_not_zero() { Builder builder = Builder(); - size_t num_gates_before = builder.get_estimated_num_finalized_gates(); + size_t num_gates_before = builder.get_num_finalized_gates_inefficient(); field_ct a(engine.get_random_uint256()); if (a.get_value() == 0) { a += 1; } a.assert_is_not_zero(); // a is a constant, so no gates should be added - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_before == 0); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_before == 0); a = witness_ct(&builder, 17); a.assert_is_not_zero(); - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_before == 1); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_before == 1); // Ensure a is not normalized anymore a *= 2; a += 4; @@ -846,15 +846,15 @@ template class stdlib_field : public testing::Test { auto b = b_const ? make_constant(builder, 2) : make_witness(builder, 2); auto c = c_const ? make_constant(builder, 3) : make_witness(builder, 3); - size_t before = builder.get_estimated_num_finalized_gates(); + size_t before = builder.get_num_finalized_gates_inefficient(); a.madd(b, c); - size_t after = builder.get_estimated_num_finalized_gates(); + size_t after = builder.get_num_finalized_gates_inefficient(); bool gate_added = (after - before == 1); EXPECT_EQ(gate_added, expect_gate); - before = builder.get_estimated_num_finalized_gates(); + before = builder.get_num_finalized_gates_inefficient(); a.add_two(b, c); - after = builder.get_estimated_num_finalized_gates(); + after = builder.get_num_finalized_gates_inefficient(); gate_added = (after - before == 1); EXPECT_EQ(gate_added, expect_gate); @@ -873,24 +873,24 @@ template class stdlib_field : public testing::Test { const bool predicate_is_witness = !predicate.is_constant(); // Conditionally negate a constant - size_t num_gates_before = builder.get_estimated_num_finalized_gates(); + size_t num_gates_before = builder.get_num_finalized_gates_inefficient(); auto result = constant_summand.conditional_negate(predicate); auto expected_result = predicate.get_value() ? -constant_summand.get_value() : constant_summand.get_value(); EXPECT_TRUE(result.get_value() == expected_result); // Check that `result` is constant if and only if both the predicate and (*this) are constant. EXPECT_TRUE(result.is_constant() == predicate.is_constant()); // A gate is only added if the predicate is a witness - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_before == 0); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_before == 0); // Conditionally negate a witness - num_gates_before = builder.get_estimated_num_finalized_gates(); + num_gates_before = builder.get_num_finalized_gates_inefficient(); result = witness_summand.conditional_negate(predicate); expected_result = predicate.get_value() ? -witness_summand.get_value() : witness_summand.get_value(); EXPECT_TRUE(result.get_value() == expected_result); // The result must be a witness EXPECT_FALSE(result.is_constant()); // A gate is only added if the predicate is a witness - EXPECT_TRUE(builder.get_estimated_num_finalized_gates() - num_gates_before == predicate_is_witness); + EXPECT_TRUE(builder.get_num_finalized_gates_inefficient() - num_gates_before == predicate_is_witness); } } static void test_two_bit_table() @@ -1021,7 +1021,7 @@ template class stdlib_field : public testing::Test { std::vector set = { a, b, c, d, e }; a.assert_is_in_set(set); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); @@ -1041,7 +1041,7 @@ template class stdlib_field : public testing::Test { field_ct f(witness_ct(&builder, fr(6))); f.assert_is_in_set(set); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, false); } @@ -1128,7 +1128,7 @@ template class stdlib_field : public testing::Test { EXPECT_EQ(value_ct.get_witness_index() + 1, first_copy.get_witness_index()); EXPECT_EQ(value_ct.get_witness_index() + 2, second_copy.get_witness_index()); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); bool result = CircuitChecker::check(builder); EXPECT_EQ(result, true); @@ -1195,7 +1195,7 @@ template class stdlib_field : public testing::Test { size_t padding = (3 - (num_witnesses % 3)) % 3; size_t expected_num_gates = (num_witnesses + padding) / 3; - EXPECT_EQ(builder.get_estimated_num_finalized_gates() - 1, expected_num_gates); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - 1, expected_num_gates); // Check that the accumulation of constant entries does not create a witness std::vector constant_input; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/padding_indicator_array/padding_indicator_array.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/padding_indicator_array/padding_indicator_array.test.cpp index 185977aafca3..8ec59b808e82 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/padding_indicator_array/padding_indicator_array.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/padding_indicator_array/padding_indicator_array.test.cpp @@ -33,7 +33,7 @@ template class PaddingIndicatorArrayTest : public testing::Test auto result = compute_padding_indicator_array(x); EXPECT_TRUE(result[idx - 1].get_value() == 1); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); // Check that the sum of indicators is indeed x Fr sum_of_indicators = std::accumulate(result.begin(), result.end(), Fr{ 0 }); EXPECT_TRUE((sum_of_indicators == x).get_value()); @@ -53,7 +53,7 @@ template class PaddingIndicatorArrayTest : public testing::Test Fr zero = Fr::from_witness(&builder, 0); compute_padding_indicator_array(zero); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_FALSE(CircuitChecker::check(builder)); } @@ -65,7 +65,7 @@ template class PaddingIndicatorArrayTest : public testing::Test Fr N = Fr::from_witness(&builder, domain_size); compute_padding_indicator_array(N); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_TRUE(CircuitChecker::check(builder)); } @@ -80,7 +80,7 @@ template class PaddingIndicatorArrayTest : public testing::Test Fr x = Fr::from_witness(&builder, scalar_raw); compute_padding_indicator_array(x); - info("num gates = ", builder.get_estimated_num_finalized_gates()); + info("num gates = ", builder.get_num_finalized_gates_inefficient()); EXPECT_FALSE(CircuitChecker::check(builder)); } @@ -93,7 +93,7 @@ template class PaddingIndicatorArrayTest : public testing::Test Fr x = Fr::from_witness(&builder, scalar_raw); auto result = compute_padding_indicator_array(x); - return builder.get_estimated_num_finalized_gates(); + return builder.get_num_finalized_gates_inefficient(); }; // Valid input: x in [1, domain_size - 1] diff --git a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.test.cpp index 7f2be0a52a18..7893bbd180b4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/protogalaxy_verifier/protogalaxy_recursive_verifier.test.cpp @@ -569,7 +569,7 @@ TEST_F(ProtogalaxyRecursiveTests, FixedCircuitSize) auto [proof_size_2, circuit_2] = compute_circuit_size(12); EXPECT_EQ(proof_size_1, proof_size_2); - EXPECT_EQ(circuit_1.get_estimated_num_finalized_gates(), circuit_2.get_estimated_num_finalized_gates()); + EXPECT_EQ(circuit_1.get_num_finalized_gates_inefficient(), circuit_2.get_num_finalized_gates_inefficient()); EXPECT_EQ(circuit_1.blocks, circuit_2.blocks); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp index d8e20f945704..158c032c3a34 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp @@ -84,8 +84,6 @@ template class CircuitBuilderBase { bool operator==(const CircuitBuilderBase& other) const = default; virtual size_t get_num_finalized_gates() const; - virtual size_t get_estimated_num_finalized_gates() const; - virtual void print_num_estimated_finalized_gates() const; virtual size_t get_num_variables() const; // Non-owning getter for the index at which a fixed witness 0 is stored diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp index b8a26eca53ff..b1f7f412e78c 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp @@ -27,16 +27,6 @@ template size_t CircuitBuilderBase::get_num_finalized_gates( return num_gates; } -template size_t CircuitBuilderBase::get_estimated_num_finalized_gates() const -{ - return num_gates; -} - -template void CircuitBuilderBase::print_num_estimated_finalized_gates() const -{ - info(num_gates); -} - template size_t CircuitBuilderBase::get_num_variables() const { return variables.size(); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp index 1bae7614f59b..9e0cb29a93a0 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp @@ -613,6 +613,7 @@ typename UltraCircuitBuilder_::RangeList UltraCircuitBuilder_add_variable(i * DEFAULT_PLOOKUP_RANGE_STEP_SIZE); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index 8dbb5cb7aac1..5e6ad9a2f501 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -354,6 +354,21 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasenum_gates; } + /** + * @brief Get the number of gates in the finalized version of the circuit. + * @warning This method makes a copy then finalizes it and returns the + * number of gates. It is therefore inefficient and should only be used in testing/debugging scenarios. + * + * @param ensure_nonzero Whether or not to add gates to ensure all polynomials are non-zero during finalization. + * @return size_t + */ + size_t get_num_finalized_gates_inefficient(bool ensure_nonzero = true) const + { + UltraCircuitBuilder_ builder_copy = *this; + builder_copy.finalize_circuit(ensure_nonzero); + return builder_copy.get_num_finalized_gates(); + } + /** * @brief Get combined size of all tables used in circuit * From bbcbae2e308492da0dcdfd946c723d05c4a4de4b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 22 Oct 2025 04:09:17 +0000 Subject: [PATCH 04/11] cuple fixes --- .../cpp/src/barretenberg/dsl/acir_format/acir_format.hpp | 2 +- .../cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp index d833a2b341bf..4b0da4959d83 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.hpp @@ -235,7 +235,7 @@ template class GateCounter { if (!collect_gates_per_opcode) { return 0; } - size_t new_gate_count = builder->get_num_finalized_gates_inefficient(); + size_t new_gate_count = builder->get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false); size_t diff = new_gate_count - prev_gate_count; prev_gate_count = new_gate_count; return diff; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index 509b25a7ef70..730f79a26dd7 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -1195,7 +1195,7 @@ template class stdlib_field : public testing::Test { size_t padding = (3 - (num_witnesses % 3)) % 3; size_t expected_num_gates = (num_witnesses + padding) / 3; - EXPECT_EQ(builder.get_num_finalized_gates_inefficient() - 1, expected_num_gates); + EXPECT_EQ(builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false) - 1, expected_num_gates); // Check that the accumulation of constant entries does not create a witness std::vector constant_input; From 24039915115564354aba3ecfe40b5d98835c63f8 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 22 Oct 2025 04:46:24 +0000 Subject: [PATCH 05/11] fix for bool test; needs review --- .../src/barretenberg/stdlib/primitives/bool/bool.test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp index d819132f79d9..a334d8bd13e8 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp @@ -264,7 +264,7 @@ template class BoolTest : public ::testing::Test { size_t diff = builder.get_num_finalized_gates_inefficient() - num_gates_start; if (!a.is_constant() && !b.is_constant()) { - EXPECT_EQ(diff, 2); + EXPECT_EQ(diff, 1); } // Due to optimizations, the result of a => b can be a constant, in this case, the the assert_equal // reduces to an out-of-circuit ASSERT @@ -275,13 +275,13 @@ template class BoolTest : public ::testing::Test { if (!result_is_constant && a.is_constant() && !b.is_constant()) { // we only add gates if the value `true` is not flipped to `false` and we need to add a new // constant == 1, which happens iff `b` is not inverted. - EXPECT_EQ(diff, static_cast(!b.is_inverted())); + EXPECT_EQ(diff, 0); } if (!result_is_constant && !a.is_constant() && b.is_constant()) { // we only add gates if the value `true` is not flipped to `false` and we need to add a new // constant == 1, which happens iff `a` is inverted. - EXPECT_EQ(diff, static_cast(a.is_inverted())); + EXPECT_EQ(diff, 0); } EXPECT_EQ(CircuitChecker::check(builder), expected); } From 19c8899afd149684e0ebf42835c218c18f180f10 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 22 Oct 2025 16:50:00 +0000 Subject: [PATCH 06/11] update bool test comments --- .../src/barretenberg/stdlib/primitives/bool/bool.test.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp index a334d8bd13e8..9749e7b29f65 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/bool/bool.test.cpp @@ -272,15 +272,12 @@ template class BoolTest : public ::testing::Test { EXPECT_EQ(diff, 0); } + // No gates are added when one operand is constant if (!result_is_constant && a.is_constant() && !b.is_constant()) { - // we only add gates if the value `true` is not flipped to `false` and we need to add a new - // constant == 1, which happens iff `b` is not inverted. EXPECT_EQ(diff, 0); } if (!result_is_constant && !a.is_constant() && b.is_constant()) { - // we only add gates if the value `true` is not flipped to `false` and we need to add a new - // constant == 1, which happens iff `a` is inverted. EXPECT_EQ(diff, 0); } EXPECT_EQ(CircuitChecker::check(builder), expected); From fbc50fa918be3fb3c62ef05d38b7a74cbe26667b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 20 Oct 2025 21:07:38 +0000 Subject: [PATCH 07/11] WiP --- .../stdlib_circuit_builders/ultra_circuit_builder.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index 5e6ad9a2f501..273f1d0f0086 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -183,15 +183,14 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase constant_variable_indices; // The set of lookup tables used by the circuit, plus the gate data for the lookups from each table std::vector lookup_tables; // Rom/Ram logic - RomRamLogic rom_ram_logic = RomRamLogic(); + RomRamLogic rom_ram_logic; // Stores gate index of ROM/RAM reads (required by proving key) std::vector memory_read_records; From b9415a4f2f8fb1e1201a401c23c2e1e36dcb01f2 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 22 Oct 2025 19:13:48 +0000 Subject: [PATCH 08/11] fix merge issues --- .../dsl/acir_format/avm2_recursion_constraint.test.cpp | 6 +++--- .../cpp/src/barretenberg/dsl/acir_format/test_class.hpp | 2 +- .../barretenberg/dsl/acir_format/test_class_predicate.hpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.test.cpp index 3f4844fe0eb0..498e5eeee741 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.test.cpp @@ -118,7 +118,7 @@ TEST_F(AcirAvm2RecursionConstraint, TestBasicSingleAvm2RecursionConstraint) const ProgramMetadata metadata{ .honk_recursion = 1 }; auto layer_2_circuit = create_circuit(avm_verifier_program, metadata); - info("circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates()); + info("circuit gates = ", layer_2_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_2_circuit); auto verification_key = std::make_shared(prover_instance->get_precomputed()); @@ -150,7 +150,7 @@ TEST_F(AcirAvm2RecursionConstraint, TestGenerateVKFromConstraintsWithoutWitness) const ProgramMetadata metadata{ .honk_recursion = 2 }; auto layer_2_circuit = create_circuit(avm_verifier_program, metadata); - info("circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates()); + info("circuit gates = ", layer_2_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_2_circuit); expected_vk = std::make_shared(prover_instance->get_precomputed()); @@ -176,7 +176,7 @@ TEST_F(AcirAvm2RecursionConstraint, TestGenerateVKFromConstraintsWithoutWitness) const ProgramMetadata metadata{ .honk_recursion = 2 }; auto layer_2_circuit = create_circuit(avm_verifier_program, metadata); - info("circuit gates = ", layer_2_circuit.get_estimated_num_finalized_gates()); + info("circuit gates = ", layer_2_circuit.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(layer_2_circuit); actual_vk = std::make_shared(prover_instance->get_precomputed()); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class.hpp index 12bfcf75ba9f..c6218a3482ea 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class.hpp @@ -190,7 +190,7 @@ template class TestClass { { AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(builder); vk_from_witness = std::make_shared(prover_instance->get_precomputed()); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class_predicate.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class_predicate.hpp index 444b2cd4a6dd..1d807775c87f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class_predicate.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/test_class_predicate.hpp @@ -230,7 +230,7 @@ template class TestClassWithPredicate { { AcirProgram program{ constraint_system, witness_values }; auto builder = create_circuit(program); - info("Num gates: ", builder.get_estimated_num_finalized_gates()); + info("Num gates: ", builder.get_num_finalized_gates_inefficient()); auto prover_instance = std::make_shared(builder); vk_from_witness = std::make_shared(prover_instance->get_precomputed()); From 0a27805a99ea532d6ac5044a86238c50cbee5d58 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 22 Oct 2025 22:29:11 +0000 Subject: [PATCH 09/11] fix smt tests --- .../smt_verification/circuit/ultra_circuit.test.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp b/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp index 66ad8e96d668..96baa7170f53 100644 --- a/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp +++ b/barretenberg/cpp/src/barretenberg/smt_verification/circuit/ultra_circuit.test.cpp @@ -90,7 +90,7 @@ TEST(UltraCircuitSMT, ArithmeticRelation) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false)); cir["a"] == a.get_value(); cir["b"] == b.get_value(); @@ -122,7 +122,7 @@ TEST(UltraCircuitSMT, EllipticRelationADD) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false)); cir["x1"] == p1.x.get_value(); cir["x2"] == p2.x.get_value(); @@ -165,7 +165,7 @@ TEST(UltraCircuitSMT, EllipticRelationDBL) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s); - ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false)); cir["x1"] == p1.x.get_value(); cir["y1"] == p1.y.get_value(); @@ -202,7 +202,7 @@ TEST(UltraCircuitSMT, OptimizedDeltaRangeRelation) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config); UltraCircuit cir(circuit_info, &s, TermType::BVTerm); - ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false)); cir["a"] == a.get_value(); s.print_assertions(); @@ -251,7 +251,7 @@ TEST(UltraCircuitSMT, LookupRelation2) auto circuit_info = unpack_from_buffer(builder.export_circuit()); Solver s(circuit_info.modulus, ultra_solver_config, /*base=*/16, /*bvsize=*/256); UltraCircuit cir(circuit_info, &s, TermType::BVTerm); - ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient()); + ASSERT_EQ(cir.get_num_gates(), builder.get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false)); cir["a"] == a.get_value(); cir["b"] == b.get_value(); From e7ee72bf155f23483164c83595fae8bbde314a43 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 Oct 2025 14:28:48 +0000 Subject: [PATCH 10/11] fix gate count in ecdsa --- .../cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp index 13e524ea0ce7..620ca4377d2a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp @@ -371,7 +371,7 @@ TYPED_TEST(EcdsaTests, VerifySignature) size_t finalized_num_gates = TestFixture::test_verify_signature(/*random_signature=*/false, TestFixture::TamperingMode::None); - static constexpr size_t NUM_GATES_SECP256K1 = 41827; + static constexpr size_t NUM_GATES_SECP256K1 = 41581; static constexpr size_t NUM_GATES_SECP256R1 = IsMegaBuilder ? 71534 : 71532; BB_ASSERT_EQ(finalized_num_gates, Curve::type == bb::CurveType::SECP256K1 ? NUM_GATES_SECP256K1 : NUM_GATES_SECP256R1, From 32c885cbf4f0182fbdffb0933ce4fc97b72adc32 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 Oct 2025 16:10:23 +0000 Subject: [PATCH 11/11] more ecdsa test fixes --- .../cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp index 620ca4377d2a..5b62dd42cc6c 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/encryption/ecdsa/ecdsa.test.cpp @@ -372,7 +372,7 @@ TYPED_TEST(EcdsaTests, VerifySignature) size_t finalized_num_gates = TestFixture::test_verify_signature(/*random_signature=*/false, TestFixture::TamperingMode::None); static constexpr size_t NUM_GATES_SECP256K1 = 41581; - static constexpr size_t NUM_GATES_SECP256R1 = IsMegaBuilder ? 71534 : 71532; + static constexpr size_t NUM_GATES_SECP256R1 = IsMegaBuilder ? 70994 : 70992; BB_ASSERT_EQ(finalized_num_gates, Curve::type == bb::CurveType::SECP256K1 ? NUM_GATES_SECP256K1 : NUM_GATES_SECP256R1, "There has been a change in the number of gates for ECDSA verification");