From 45a4d32ff698147888ed5e3c7eaf7f789cda764c Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 4 Dec 2023 22:50:36 +0000 Subject: [PATCH 01/60] feat: remove ProverPolynomials span backing --- .../zeromorph/zeromorph.hpp | 14 +- .../zeromorph/zeromorph.test.cpp | 15 +- .../src/barretenberg/common/ref_vector.hpp | 1 + .../cpp/src/barretenberg/flavor/ecc_vm.hpp | 28 +-- .../flavor/generated/AvmMini_flavor.hpp | 18 +- .../flavor/generated/Fib_flavor.hpp | 4 +- .../barretenberg/flavor/goblin_translator.hpp | 26 +-- .../src/barretenberg/flavor/goblin_ultra.hpp | 4 +- .../cpp/src/barretenberg/flavor/ultra.hpp | 4 +- .../honk/proof_system/permutation_library.hpp | 7 +- .../barretenberg/polynomials/polynomial.cpp | 164 +++++++++--------- .../barretenberg/polynomials/polynomial.hpp | 98 ++++++----- .../eccvm/eccvm_circuit_builder.hpp | 8 +- .../generated/AvmMini_circuit_builder.hpp | 8 +- .../generated/Fib_circuit_builder.hpp | 6 +- .../library/grand_product_library.hpp | 5 +- 16 files changed, 181 insertions(+), 229 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 80a8c3e4508e..c8a525f19f36 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -321,11 +321,11 @@ template class ZeroMorphProver_ { auto&& g_shift_evaluations, auto& multilinear_challenge, auto& commitment_key, - auto transcript, - const std::vector>& concatenated_polynomials = {}, + const auto& transcript, + const std::vector& concatenated_polynomials = {}, const std::vector& concatenated_evaluations = {}, // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) remove span - const std::vector>>& concatenation_groups = {}) + const std::vector>& concatenation_groups = {}) { // Generate batching challenge \rho and powers 1,...,\rho^{m-1} const FF rho = transcript->get_challenge("rho"); @@ -341,16 +341,16 @@ template class ZeroMorphProver_ { // v = sum_{i=0}^{m-1}\rho^i*f_i(u) + sum_{i=0}^{l-1}\rho^{m+i}*h_i(u). // Note: g_batched is formed from the to-be-shifted polynomials, but the batched evaluation incorporates the // evaluations produced by sumcheck of h_i = g_i_shifted. - auto batched_evaluation = FF(0); + FF batched_evaluation{ 0 }; Polynomial f_batched(N); // batched unshifted polynomials - FF batching_scalar = FF(1); + FF batching_scalar{ 1 }; for (auto [f_poly, f_eval] : zip_view(f_polynomials, f_evaluations)) { f_batched.add_scaled(f_poly, batching_scalar); batched_evaluation += batching_scalar * f_eval; batching_scalar *= rho; } - Polynomial g_batched(N); // batched to-be-shifted polynomials + Polynomial g_batched{ N }; // batched to-be-shifted polynomials for (auto [g_poly, g_shift_eval] : zip_view(g_polynomials, g_shift_evaluations)) { g_batched.add_scaled(g_poly, batching_scalar); batched_evaluation += batching_scalar * g_shift_eval; @@ -381,7 +381,7 @@ template class ZeroMorphProver_ { // Compute the full batched polynomial f = f_batched + g_batched.shifted() = f_batched + h_batched. This is the // polynomial for which we compute the quotients q_k and prove f(u) = v_batched. - auto f_polynomial = f_batched; + Polynomial f_polynomial = f_batched; f_polynomial += g_batched.shifted(); f_polynomial += concatenated_batched; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp index d8b878d24f2c..d3ac5ef52441 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp @@ -225,17 +225,6 @@ template class ZeroMorphWithConcatenationTest : public CommitmentT // Initialize an empty BaseTranscript auto prover_transcript = BaseTranscript::prover_init_empty(); - std::vector> concatenated_polynomials_views; - for (auto& poly : concatenated_polynomials) { - concatenated_polynomials_views.emplace_back(poly); - } - - std::vector>> concatenation_groups_views(concatenation_groups.size()); - for (auto [group_of_polys, group_of_views] : zip_view(concatenation_groups, concatenation_groups_views)) { - for (auto& poly : group_of_polys) { - group_of_views.emplace_back(poly); - } - } // Execute Prover protocol ZeroMorphProver::prove(f_polynomials, // unshifted g_polynomials, // to-be-shifted @@ -244,9 +233,9 @@ template class ZeroMorphWithConcatenationTest : public CommitmentT u_challenge, this->commitment_key, prover_transcript, - concatenated_polynomials_views, + concatenated_polynomials, c_evaluations, - to_vector_of_ref_vectors(concatenation_groups_views)); + to_vector_of_ref_vectors(concatenation_groups)); auto verifier_transcript = BaseTranscript::verifier_init_empty(prover_transcript); diff --git a/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp b/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp index 5304f8ea77a6..205f3d19219c 100644 --- a/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp +++ b/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp @@ -139,6 +139,7 @@ template RefVector concatenate(const RefVector& ref_vector, c return concatenated; } +/* @details Ensures a nested vector holds reference objects */ template static std::vector> to_vector_of_ref_vectors(std::vector>& vec) { std::vector> result; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 2d864059b965..4a04f2ec05b1 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -347,29 +347,6 @@ template class ECCVMBa AllValues(std::array _data_in) { this->_data = _data_in; } }; - /** - * @brief An owning container of polynomials. - * @warning When this was introduced it broke some of our design principles. - * - Execution trace builders don't handle "polynomials" because the interpretation of the execution trace - * columns as polynomials is a detail of the proving system, and trace builders are (sometimes in practice, - * always in principle) reusable for different proving protocols (e.g., Plonk and Honk). - * - Polynomial storage is handled by key classes. Polynomials aren't moved, but are accessed elsewhere by - * std::spans. - * - * We will consider revising this data model: TODO(https://github.com/AztecProtocol/barretenberg/issues/743) - */ - class AllPolynomials : public AllEntities { - public: - [[nodiscard]] size_t get_polynomial_size() const { return this->lagrange_first.size(); } - AllValues get_row(const size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; - } - }; /** * @brief A container for polynomials produced after the first round of sumcheck. * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. @@ -403,10 +380,11 @@ template class ECCVMBa using ExtendedEdges = ProverUnivariates; /** - * @brief A container for the prover polynomials handles; only stores spans. + * @brief A container for the prover polynomials. */ - class ProverPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: + [[nodiscard]] size_t get_polynomial_size() const { return this->lagrange_first.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which * represents one row in the execution trace. diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 718d61f3c892..24339ecf1716 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -240,8 +240,6 @@ class AvmMiniFlavor { using VerificationKey = VerificationKey_>; - using ProverPolynomials = AllEntities; - using FoldedPolynomials = AllEntities>; class AllValues : public AllEntities { @@ -250,19 +248,25 @@ class AvmMiniFlavor { using Base::Base; }; - class AllPolynomials : public AllEntities { + /** + * @brief A container for the prover polynomials handles. + */ + class ProverPolynomials : public AllEntities { public: - [[nodiscard]] size_t get_polynomial_size() const { return this->memTrace_m_clk.size(); } - [[nodiscard]] AllValues get_row(const size_t row_idx) const + [[nodiscard]] size_t get_polynomial_size() const { return avmMini_clk.size(); } + /** + * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which + * represents one row in the execution trace. + */ + [[nodiscard]] AllValues get_row(size_t row_idx) const { AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), get_all())) { + for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { result_field = polynomial[row_idx]; } return result; } }; - using RowPolynomials = AllEntities; class PartiallyEvaluatedMultivariates : public AllEntities { diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp index 9572fedd3ffa..0367781c9bb0 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp @@ -148,8 +148,6 @@ class FibFlavor { using VerificationKey = VerificationKey_>; - using ProverPolynomials = AllEntities; - using FoldedPolynomials = AllEntities>; class AllValues : public AllEntities { @@ -158,7 +156,7 @@ class FibFlavor { using Base::Base; }; - class AllPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: [[nodiscard]] size_t get_polynomial_size() const { return this->Fibonacci_LAST.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 248094780106..e5c3026bc859 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -1017,9 +1017,9 @@ class GoblinTranslator { using Base::Base; }; /** - * @brief A container for the prover polynomials handles; only stores spans. + * @brief A container for the prover polynomials handles. */ - class ProverPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } /** @@ -1041,28 +1041,6 @@ class GoblinTranslator { */ using ProverPolynomialIds = AllEntities; - /** - * @brief An owning container of polynomials. - * @warning When this was introduced it broke some of our design principles. - * - Execution trace builders don't handle "polynomials" because the interpretation of the execution trace - * columns as polynomials is a detail of the proving system, and trace builders are (sometimes in practice, - * always in principle) reusable for different proving protocols (e.g., Plonk and Honk). - * - Polynomial storage is handled by key classes. Polynomials aren't moved, but are accessed elsewhere by - * std::spans. - * - * We will consider revising this data model: TODO(https://github.com/AztecProtocol/barretenberg/issues/743) - */ - class AllPolynomials : public AllEntities { - public: - [[nodiscard]] AllValues get_row(const size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; - } - }; /** * @brief A container for polynomials produced after the first round of sumcheck. * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 80d1ca652e93..8f04adf39361 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -366,9 +366,9 @@ class GoblinUltra { }; /** - * @brief A container for the prover polynomials handles; only stores spans. + * @brief A container for the prover polynomials handles. */ - class ProverPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(size_t row_idx) const diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 065a70aed2f7..d0cf36b2a6e4 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -258,9 +258,9 @@ class Ultra { }; /** - * @brief A container for polynomials handles; only stores spans. + * @brief A container for polynomials handles. */ - class ProverPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp index 5c1c4392a8f2..c53b5255011d 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp @@ -154,13 +154,14 @@ void compute_permutation_grand_products(std::shared_ptr& full_polynomial = PermutationRelation::get_grand_product_polynomial(full_polynomials); - auto& key_polynomial = PermutationRelation::get_grand_product_polynomial(*key); + barretenberg::Polynomial& full_polynomial = + PermutationRelation::get_grand_product_polynomial(full_polynomials); + barretenberg::Polynomial& key_polynomial = PermutationRelation::get_grand_product_polynomial(*key); full_polynomial = key_polynomial; compute_permutation_grand_product( key->circuit_size, full_polynomials, relation_parameters); - std::span& full_polynomial_shift = + barretenberg::Polynomial& full_polynomial_shift = PermutationRelation::get_shifted_grand_product_polynomial(full_polynomials); full_polynomial_shift = key_polynomial.shifted(); }); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index 727575b7d561..b37707c84d22 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -15,6 +15,22 @@ #include namespace barretenberg { + +// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) +template std::shared_ptr _allocate_aligned_memory(const size_t n_elements) +{ + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) + return std::static_pointer_cast(get_mem_slab(sizeof(Fr) * n_elements)); +} + +template void Polynomial::allocate_backing_memory(size_t n_elements) +{ + size_ = n_elements; + // capacity() is size_ plus padding for shifted polynomials + backing_memory_ = _allocate_aligned_memory(capacity()); + coefficients_ = backing_memory_.get(); +} + /** * Constructors / Destructors **/ @@ -24,15 +40,10 @@ namespace barretenberg { * * @param initial_size The initial size of the polynomial. */ -template -Polynomial::Polynomial(size_t initial_size) - : coefficients_(nullptr) - , size_(initial_size) +template Polynomial::Polynomial(size_t initial_size) { - if (capacity() > 0) { - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); - } - memset(static_cast(coefficients_.get()), 0, sizeof(Fr) * capacity()); + allocate_backing_memory(initial_size); + memset(static_cast(coefficients_), 0, sizeof(Fr) * capacity()); } /** @@ -42,16 +53,11 @@ Polynomial::Polynomial(size_t initial_size) * @param initial_size The initial size of the polynomial. * @param flag Signals that we do not zero memory. */ -template -Polynomial::Polynomial(size_t initial_size, DontZeroMemory flag) - : coefficients_(nullptr) - , size_(initial_size) +template Polynomial::Polynomial(size_t initial_size, DontZeroMemory flag) { // Flag is unused, but we don't memset 0 if passed. (void)flag; - if (capacity() > 0) { - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); - } + allocate_backing_memory(initial_size); } template @@ -59,97 +65,92 @@ Polynomial::Polynomial(const Polynomial& other) : Polynomial(other, other.size()) {} -template -Polynomial::Polynomial(const Polynomial& other, const size_t target_size) - : size_(std::max(target_size, other.size())) +// fully copying "expensive" constructor +template Polynomial::Polynomial(const Polynomial& other, const size_t target_size) { - // info("Polynomial EXPENSIVE Copy ctor size ", size_); - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); + allocate_backing_memory(std::max(target_size, other.size())); - if (other.coefficients_ != nullptr) { - memcpy(static_cast(coefficients_.get()), - static_cast(other.coefficients_.get()), - sizeof(Fr) * other.size_); - } + memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); zero_memory_beyond(other.size_); } +// move constructor +// TODO(AD) why is this not =default? template Polynomial::Polynomial(Polynomial&& other) noexcept - : coefficients_(std::exchange(other.coefficients_, nullptr)) + : backing_memory_(std::exchange(other.backing_memory_, nullptr)) + , coefficients_(std::exchange(other.coefficients_, nullptr)) , size_(std::exchange(other.size_, 0)) -{ - // info("Move ctor Polynomial took ownership of ", coefficients_, " size ", size_); -} +{} -template -Polynomial::Polynomial(std::span coefficients) - : size_(coefficients.size()) +// span constructor +template Polynomial::Polynomial(std::span coefficients) { - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); - // info("Polynomial span ctor new buf at ", coefficients_, " size ", size_); - memcpy(static_cast(coefficients_.get()), + allocate_backing_memory(coefficients.size()); + memcpy(static_cast(coefficients_), static_cast(coefficients.data()), sizeof(Fr) * coefficients.size()); zero_memory_beyond(size_); } +// interpolation constructor template Polynomial::Polynomial(std::span interpolation_points, std::span evaluations) : Polynomial(interpolation_points.size()) { ASSERT(size_ > 0); - // info("Polynomial INTERPOLATION ctor."); - polynomial_arithmetic::compute_efficient_interpolation( - evaluations.data(), coefficients_.get(), interpolation_points.data(), size_); + evaluations.data(), coefficients_, interpolation_points.data(), size_); } -template Polynomial::~Polynomial() {} - // Assignments +// full copy "expensive" assignment template Polynomial& Polynomial::operator=(const Polynomial& other) { - // info("Polynomial EXPENSIVE copy assignment."); - size_ = other.size_; - - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); - - if (other.coefficients_ != nullptr) { - memcpy(static_cast(coefficients_.get()), - static_cast(other.coefficients_.get()), - sizeof(Fr) * other.size_); + if (this == &other) { + return *this; } + allocate_backing_memory(other.size_); + memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); zero_memory_beyond(size_); return *this; } +// move assignment +// TODO(AD): why is this not =default? template Polynomial& Polynomial::operator=(Polynomial&& other) noexcept { if (&other == this) { return *this; } - // info("Polynomial move assignment."); // simultaneously set members and clear other - coefficients_ = std::exchange(other.coefficients_, nullptr); + backing_memory_ = std::exchange(other.backing_memory_, nullptr); size_ = std::exchange(other.size_, 0); + coefficients_ = std::exchange(other.coefficients_, nullptr); return *this; } +template Polynomial& Polynomial::operator=(std::span coefficients) noexcept +{ + // move assign a Polynomial constructed with the span + *this = Polynomial{ coefficients }; + return *this; +} + // ####### template Fr Polynomial::evaluate(const Fr& z, const size_t target_size) const { - return polynomial_arithmetic::evaluate(coefficients_.get(), z, target_size); + return polynomial_arithmetic::evaluate(coefficients_, z, target_size); } template Fr Polynomial::evaluate(const Fr& z) const { - return polynomial_arithmetic::evaluate(coefficients_.get(), z, size_); + return polynomial_arithmetic::evaluate(coefficients_, z, size_); } /** @@ -169,8 +170,8 @@ template void Polynomial::zero_memory_beyond(const size_t star size_t delta = end - start_position; if (delta > 0) { - ASSERT(coefficients_); - memset(static_cast(&coefficients_.get()[start_position]), 0, sizeof(Fr) * delta); + ASSERT(backing_memory_); + memset(static_cast(&coefficients_[start_position]), 0, sizeof(Fr) * delta); } } @@ -185,7 +186,7 @@ void Polynomial::fft(const EvaluationDomain& domain) ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::fft(coefficients_.get(), domain); + polynomial_arithmetic::fft(coefficients_, domain); } template @@ -195,7 +196,7 @@ void Polynomial::partial_fft(const EvaluationDomain& domain, Fr constant ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::partial_fft(coefficients_.get(), domain, constant, is_coset); + polynomial_arithmetic::partial_fft(coefficients_, domain, constant, is_coset); } template @@ -205,7 +206,7 @@ void Polynomial::coset_fft(const EvaluationDomain& domain) ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::coset_fft(coefficients_.get(), domain); + polynomial_arithmetic::coset_fft(coefficients_, domain); } template @@ -219,7 +220,7 @@ void Polynomial::coset_fft(const EvaluationDomain& domain, ASSERT(in_place_operation_viable(extended_size)); zero_memory_beyond(extended_size); - polynomial_arithmetic::coset_fft(coefficients_.get(), domain, large_domain, domain_extension); + polynomial_arithmetic::coset_fft(coefficients_, domain, large_domain, domain_extension); } template @@ -229,7 +230,7 @@ void Polynomial::coset_fft_with_constant(const EvaluationDomain& domain, ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::coset_fft_with_constant(coefficients_.get(), domain, constant); + polynomial_arithmetic::coset_fft_with_constant(coefficients_, domain, constant); } template @@ -239,7 +240,7 @@ void Polynomial::coset_fft_with_generator_shift(const EvaluationDomain& ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::coset_fft_with_generator_shift(coefficients_.get(), domain, constant); + polynomial_arithmetic::coset_fft_with_generator_shift(coefficients_, domain, constant); } template @@ -249,7 +250,7 @@ void Polynomial::ifft(const EvaluationDomain& domain) ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::ifft(coefficients_.get(), domain); + polynomial_arithmetic::ifft(coefficients_, domain); } template @@ -259,7 +260,7 @@ void Polynomial::ifft_with_constant(const EvaluationDomain& domain, cons ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::ifft_with_constant(coefficients_.get(), domain, constant); + polynomial_arithmetic::ifft_with_constant(coefficients_, domain, constant); } template @@ -269,21 +270,21 @@ void Polynomial::coset_ifft(const EvaluationDomain& domain) ASSERT(in_place_operation_viable(domain.size)); zero_memory_beyond(domain.size); - polynomial_arithmetic::coset_ifft(coefficients_.get(), domain); + polynomial_arithmetic::coset_ifft(coefficients_, domain); } template Fr Polynomial::compute_kate_opening_coefficients(const Fr& z) requires polynomial_arithmetic::SupportsFFT { - return polynomial_arithmetic::compute_kate_opening_coefficients(coefficients_.get(), coefficients_.get(), z, size_); + return polynomial_arithmetic::compute_kate_opening_coefficients(coefficients_, coefficients_, z, size_); } template Fr Polynomial::compute_barycentric_evaluation(const Fr& z, const EvaluationDomain& domain) requires polynomial_arithmetic::SupportsFFT { - return polynomial_arithmetic::compute_barycentric_evaluation(coefficients_.get(), domain.size, z, domain); + return polynomial_arithmetic::compute_barycentric_evaluation(coefficients_, domain.size, z, domain); } template @@ -293,7 +294,7 @@ Fr Polynomial::evaluate_from_fft(const EvaluationDomain& large_domain, requires polynomial_arithmetic::SupportsFFT { - return polynomial_arithmetic::evaluate_from_fft(coefficients_.get(), large_domain, z, small_domain); + return polynomial_arithmetic::evaluate_from_fft(coefficients_, large_domain, z, small_domain); } // TODO(#723): This method is used for the transcript aggregation protocol. For convenience we currently enforce that @@ -302,7 +303,7 @@ Fr Polynomial::evaluate_from_fft(const EvaluationDomain& large_domain, template void Polynomial::set_to_right_shifted(std::span coeffs_in, size_t shift_size) { // Ensure we're not trying to shift self - ASSERT(coefficients_.get() != coeffs_in.data()); + ASSERT(coefficients_ != coeffs_in.data()); auto size_in = coeffs_in.size(); ASSERT(size_in > 0); @@ -315,15 +316,14 @@ template void Polynomial::set_to_right_shifted(std::span c } // Set size of self equal to size of input and allocate memory - size_ = size_in; - coefficients_ = allocate_aligned_memory(sizeof(Fr) * capacity()); + allocate_backing_memory(size_in); // Zero out the first shift_size-many coefficients of self - memset(static_cast(coefficients_.get()), 0, sizeof(Fr) * shift_size); + memset(static_cast(coefficients_), 0, sizeof(Fr) * shift_size); // Copy all but the last shift_size many input coeffs into self at the shift_size-th index. std::size_t num_to_copy = size_ - shift_size; - memcpy(static_cast(coefficients_.get() + shift_size), + memcpy(static_cast(coefficients_ + shift_size), static_cast(coeffs_in.data()), sizeof(Fr) * num_to_copy); zero_memory_beyond(size_); @@ -342,7 +342,7 @@ template void Polynomial::add_scaled(std::span other size_t offset = j * range_per_thread; size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; for (size_t i = offset; i < end; ++i) { - coefficients_.get()[i] += scaling_factor * other[i]; + coefficients_[i] += scaling_factor * other[i]; } }); } @@ -359,7 +359,7 @@ template Polynomial& Polynomial::operator+=(std::span Polynomial& Polynomial::operator-=(std::span Polynomial& Polynomial::operator*=(const Fr scali size_t offset = j * range_per_thread; size_t end = (j == num_threads - 1) ? offset + range_per_thread + leftovers : offset + range_per_thread; for (size_t i = offset; i < end; ++i) { - coefficients_.get()[i] *= scaling_factor; + coefficients_[i] *= scaling_factor; } }); @@ -417,10 +417,11 @@ template Fr Polynomial::evaluate_mle(std::span evalu size_t n_l = 1 << (m - 1); // temporary buffer of half the size of the polynomial - pointer tmp_ptr = allocate_aligned_memory(sizeof(Fr) * n_l); + // TODO(AD): Make this a polynomial with DontZeroMemory::FLAG + pointer tmp_ptr = _allocate_aligned_memory(sizeof(Fr) * n_l); auto tmp = tmp_ptr.get(); - Fr* prev = coefficients_.get(); + Fr* prev = coefficients_; if (shift) { ASSERT(prev[0] == Fr::zero()); prev++; @@ -485,12 +486,7 @@ template Polynomial Polynomial::partial_evaluate_mle(std:: return result; } -template typename Polynomial::pointer Polynomial::allocate_aligned_memory(const size_t size) const -{ - return std::static_pointer_cast(get_mem_slab(size)); -} - template class Polynomial; template class Polynomial; -} // namespace barretenberg +} // namespace barretenberg \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index caf74ad39dcb..68858056b796 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -17,6 +17,7 @@ template class Polynomial { using value_type = Fr; using difference_type = std::ptrdiff_t; using reference = value_type&; + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) using pointer = std::shared_ptr; using const_pointer = pointer; using iterator = Fr*; @@ -47,8 +48,9 @@ template class Polynomial { Polynomial(std::span interpolation_points, std::span evaluations); Polynomial& operator=(Polynomial&& other) noexcept; + Polynomial& operator=(std::span coefficients) noexcept; Polynomial& operator=(const Polynomial& other); - ~Polynomial(); + ~Polynomial() = default; /** * Return a shallow clone of the polynomial. i.e. underlying memory is shared. @@ -56,8 +58,9 @@ template class Polynomial { Polynomial clone() { Polynomial p; - p.coefficients_ = coefficients_; + p.backing_memory_ = backing_memory_; p.size_ = size_; + p.coefficients_ = coefficients_; return p; } @@ -65,7 +68,9 @@ template class Polynomial { void clear() { - coefficients_.reset(); + // to keep the invariant that backing_memory_ can handle capacity() we do NOT reset backing_memory_ + // backing_memory_.reset(); + coefficients_ = nullptr; size_ = 0; } @@ -81,7 +86,7 @@ template class Polynomial { } // Each coefficient must agree for (size_t i = 0; i < size(); i++) { - if (coefficients_.get()[i] != rhs.coefficients_.get()[i]) { + if (coefficients_[i] != rhs.coefficients_[i]) { return false; } } @@ -89,24 +94,24 @@ template class Polynomial { } // Const and non const versions of coefficient accessors - Fr const& operator[](const size_t i) const { return coefficients_.get()[i]; } + Fr const& operator[](const size_t i) const { return coefficients_[i]; } - Fr& operator[](const size_t i) { return coefficients_.get()[i]; } + Fr& operator[](const size_t i) { return coefficients_[i]; } Fr const& at(const size_t i) const { ASSERT(i < capacity()); - return coefficients_.get()[i]; + return coefficients_[i]; }; Fr& at(const size_t i) { ASSERT(i < capacity()); - return coefficients_.get()[i]; + return coefficients_[i]; }; - [[nodiscard]] Fr evaluate(const Fr& z, const size_t target_size) const; - [[nodiscard]] Fr evaluate(const Fr& z) const; + Fr evaluate(const Fr& z, size_t target_size) const; + Fr evaluate(const Fr& z) const; Fr compute_barycentric_evaluation(const Fr& z, const EvaluationDomain& domain) requires polynomial_arithmetic::SupportsFFT; @@ -122,9 +127,9 @@ template class Polynomial { requires polynomial_arithmetic::SupportsFFT; void coset_fft(const EvaluationDomain& domain, const EvaluationDomain& large_domain, - const size_t domain_extension) + size_t domain_extension) requires polynomial_arithmetic::SupportsFFT; - void coset_fft_with_constant(const EvaluationDomain& domain, const Fr& costant) + void coset_fft_with_constant(const EvaluationDomain& domain, const Fr& constant) requires polynomial_arithmetic::SupportsFFT; void coset_fft_with_generator_shift(const EvaluationDomain& domain, const Fr& constant) requires polynomial_arithmetic::SupportsFFT; @@ -137,7 +142,7 @@ template class Polynomial { Fr compute_kate_opening_coefficients(const Fr& z) requires polynomial_arithmetic::SupportsFFT; - bool is_empty() const { return (coefficients_ == nullptr) || (size_ == 0); } + bool is_empty() const { return size_ == 0; } /** * @brief Returns an std::span of the left-shift of self. @@ -145,12 +150,16 @@ template class Polynomial { * @details If the n coefficients of self are (0, a₁, …, aₙ₋₁), * we returns the view of the n-1 coefficients (a₁, …, aₙ₋₁). */ - std::span shifted() const + Polynomial shifted() const { ASSERT(size_ > 0); - ASSERT(coefficients_[0].is_zero()); - ASSERT(coefficients_.get()[size_].is_zero()); // relies on DEFAULT_CAPACITY_INCREASE >= 1 - return std::span{ coefficients_.get() + 1, size_ }; + ASSERT(backing_memory_[0].is_zero()); + ASSERT(coefficients_[size_].is_zero()); // relies on MAXIMUM_COEFFICIENT_SHIFT >= 1 + Polynomial p; + p.backing_memory_ = backing_memory_; + p.size_ = size_; + p.coefficients_ = coefficients_ + 1; + return p; } /** @@ -192,7 +201,7 @@ template class Polynomial { * * @param scaling_factor s */ - Polynomial& operator*=(const Fr scaling_factor); + Polynomial& operator*=(Fr scaling_factor); /** * @brief evaluates p(X) = ∑ᵢ aᵢ⋅Xⁱ considered as multi-linear extension p(X₀,…,Xₘ₋₁) = ∑ᵢ aᵢ⋅Lᵢ(X₀,…,Xₘ₋₁) @@ -238,42 +247,42 @@ template class Polynomial { void factor_roots(std::span roots) { polynomial_arithmetic::factor_roots(std::span{ *this }, roots); }; void factor_roots(const Fr& root) { polynomial_arithmetic::factor_roots(std::span{ *this }, root); }; -#ifdef __clang__ - // Needed for clang versions earlier than 14.0.3, but breaks gcc. - // Can remove once ecosystem is firmly upgraded. - operator std::span() { return std::span(coefficients_.get(), size_); } - operator std::span() const { return std::span(coefficients_.get(), size_); } -#endif - - iterator begin() { return coefficients_.get(); } - iterator end() { return coefficients_.get() + size_; } - pointer data() { return coefficients_; } + iterator begin() { return coefficients_; } + iterator end() { return coefficients_ + size_; } + pointer data() { return backing_memory_; } std::span byte_span() const { - return std::span((uint8_t*)coefficients_.get(), size_ * sizeof(fr)); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + return { reinterpret_cast(coefficients_), size_ * sizeof(Fr) }; } - const_iterator begin() const { return coefficients_.get(); } - const_iterator end() const { return coefficients_.get() + size_; } - const_pointer data() const { return coefficients_; } + const_iterator begin() const { return coefficients_; } + const_iterator end() const { return coefficients_ + size_; } + const_pointer data() const { return backing_memory_; } std::size_t size() const { return size_; } - std::size_t capacity() const { return size_ + DEFAULT_CAPACITY_INCREASE; } + std::size_t capacity() const { return size_ + MAXIMUM_COEFFICIENT_SHIFT; } private: + // allocate a fresh memory pointer for backing memory + // DOES NOT initialize memory + void allocate_backing_memory(size_t n_elements); + // safety check for in place operations bool in_place_operation_viable(size_t domain_size = 0) { return (size() >= domain_size); } - pointer allocate_aligned_memory(const size_t size) const; - - void zero_memory_beyond(const size_t start_position); + void zero_memory_beyond(size_t start_position); // When a polynomial is instantiated from a size alone, the memory allocated corresponds to - // input size + DEFAULT_CAPACITY_INCREASE. A DEFAULT_CAPACITY_INCREASE of >= 1 is required to ensure - // that polynomials can be 'shifted' via a span of the 1st to size+1th coefficients. - const static size_t DEFAULT_CAPACITY_INCREASE = 1; - - pointer coefficients_; + // input size + MAXIMUM_COEFFICIENT_SHIFT to support 'shifted' coefficients efficiently. + const static size_t MAXIMUM_COEFFICIENT_SHIFT = 1; + + // The memory + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays) + std::shared_ptr backing_memory_; + // A pointer into backing_memory_ to support std::span-like functionality. This allows for coefficient subsets + // and shifts. + Fr* coefficients_ = nullptr; // The size_ effectively represents the 'usable' length of the coefficients array but may be less than the true // 'capacity' of the array. It is not explicitly tied to the degree and is not changed by any operations on the // polynomial. @@ -291,11 +300,8 @@ template inline std::ostream& operator<<(std::ostream& os, Polynom << "]"; } -// Done -// N.B. grumpkin polynomials don't support fast fourier transforms using roots of unity! -// TODO: use template junk to disable fft methods if Fr::SUPPORTS_FFTS == false -// extern template class Polynomial; extern template class Polynomial; +// N.B. grumpkin polynomials don't support fast fourier transforms using roots of unity! extern template class Polynomial; using polynomial = Polynomial; @@ -316,4 +322,4 @@ using polynomial = Polynomial; * // cannot convert a const polynomial to a non-const span * static_assert(!std::convertible_to>); * static_assert(std::convertible_to>); - */ + */ \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp index 4abbd5bc91f0..57948e14f56e 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp @@ -39,7 +39,7 @@ template class ECCVMCircuitBuilder { using VMOperation = proof_system_eccvm::VMOperation; std::shared_ptr op_queue; using ScalarMul = proof_system_eccvm::ScalarMul; - using AllPolynomials = typename Flavor::AllPolynomials; + using ProverPolynomials = typename Flavor::ProverPolynomials; ECCVMCircuitBuilder() : op_queue(std::make_shared()){}; @@ -315,9 +315,9 @@ template class ECCVMCircuitBuilder { (reads come from msm_x/y1, msm_x/y2) * lookup_read_counts_1: stores number of times a point has been read from a Straus precomputation table (reads come from msm_x/y3, msm_x/y4) - * @return AllPolynomials + * @return ProverPolynomials */ - AllPolynomials compute_polynomials() + ProverPolynomials compute_polynomials() { const auto msms = get_msms(); const auto flattened_muls = get_flattened_scalar_muls(msms); @@ -339,7 +339,7 @@ template class ECCVMCircuitBuilder { const auto num_rows_log2 = static_cast(numeric::get_msb64(num_rows)); size_t num_rows_pow2 = 1UL << (num_rows_log2 + (1UL << num_rows_log2 == num_rows ? 0 : 1)); - AllPolynomials polys; + ProverPolynomials polys; for (auto& poly : polys.get_all()) { poly = Polynomial(num_rows_pow2); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/AvmMini_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/AvmMini_circuit_builder.hpp index 77cae117e47b..4d91532f27ae 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/AvmMini_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/AvmMini_circuit_builder.hpp @@ -51,7 +51,7 @@ class AvmMiniCircuitBuilder { // TODO: template using Polynomial = Flavor::Polynomial; - using AllPolynomials = Flavor::AllPolynomials; + using ProverPolynomials = Flavor::ProverPolynomials; static constexpr size_t num_fixed_columns = 25; static constexpr size_t num_polys = 22; @@ -59,10 +59,10 @@ class AvmMiniCircuitBuilder { void set_trace(std::vector&& trace) { rows = std::move(trace); } - AllPolynomials compute_polynomials() + ProverPolynomials compute_polynomials() { const auto num_rows = get_circuit_subgroup_size(); - AllPolynomials polys; + ProverPolynomials polys; // Allocate mem for each column for (auto& poly : polys.get_all()) { @@ -103,7 +103,7 @@ class AvmMiniCircuitBuilder { [[maybe_unused]] bool check_circuit() { - auto polys = compute_polynomials(); + ProverPolynomials polys = compute_polynomials(); const size_t num_rows = polys.get_polynomial_size(); const auto evaluate_relation = [&](const std::string& relation_name) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/Fib_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/Fib_circuit_builder.hpp index a233692ebf7f..9c274125a53f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/Fib_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/generated/Fib_circuit_builder.hpp @@ -22,7 +22,7 @@ class FibCircuitBuilder { // TODO: template using Polynomial = Flavor::Polynomial; - using AllPolynomials = Flavor::AllPolynomials; + using ProverPolynomials = Flavor::ProverPolynomials; static constexpr size_t num_fixed_columns = 6; static constexpr size_t num_polys = 4; @@ -30,10 +30,10 @@ class FibCircuitBuilder { void set_trace(std::vector&& trace) { rows = std::move(trace); } - AllPolynomials compute_polynomials() + ProverPolynomials compute_polynomials() { const auto num_rows = get_circuit_subgroup_size(); - AllPolynomials polys; + ProverPolynomials polys; // Allocate mem for each column for (auto& poly : polys.get_all()) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index e1c2ac20115c..f26dda7965a0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -155,12 +155,13 @@ void compute_grand_products(std::shared_ptr& key, // Assign the grand product polynomial to the relevant std::span member of `full_polynomials` (and its shift) // For example, for UltraPermutationRelation, this will be `full_polynomials.z_perm` // For example, for LookupRelation, this will be `full_polynomials.z_lookup` - std::span& full_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials); + barretenberg::Polynomial& full_polynomial = + GrandProdRelation::get_grand_product_polynomial(full_polynomials); auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(*key); full_polynomial = key_polynomial; compute_grand_product(key->circuit_size, full_polynomials, relation_parameters); - std::span& full_polynomial_shift = + barretenberg::Polynomial& full_polynomial_shift = GrandProdRelation::get_shifted_grand_product_polynomial(full_polynomials); full_polynomial_shift = key_polynomial.shifted(); }); From a3deafbacf830e6b795cccd3814bbdf568b3d494 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:14:30 +0000 Subject: [PATCH 02/60] Refactor --- .../barretenberg/polynomials/polynomial.cpp | 87 +++++++++++++------ .../barretenberg/polynomials/polynomial.hpp | 50 +++-------- 2 files changed, 71 insertions(+), 66 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index b37707c84d22..e9da0cb26b38 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -106,33 +106,17 @@ Polynomial::Polynomial(std::span interpolation_points, std::span Polynomial& Polynomial::operator=(const Polynomial& other) -{ - if (this == &other) { - return *this; - } - allocate_backing_memory(other.size_); - memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); - zero_memory_beyond(size_); - return *this; -} - -// move assignment -// TODO(AD): why is this not =default? -template Polynomial& Polynomial::operator=(Polynomial&& other) noexcept -{ - if (&other == this) { - return *this; - } - - // simultaneously set members and clear other - backing_memory_ = std::exchange(other.backing_memory_, nullptr); - size_ = std::exchange(other.size_, 0); - coefficients_ = std::exchange(other.coefficients_, nullptr); - - return *this; -} +// // full copy "expensive" assignment +// template Polynomial& Polynomial::operator=(const Polynomial& other) +// { +// if (this == &other) { +// return *this; +// } +// allocate_backing_memory(other.size_); +// memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); +// zero_memory_beyond(size_); +// return *this; +// } template Polynomial& Polynomial::operator=(std::span coefficients) noexcept { @@ -143,6 +127,24 @@ template Polynomial& Polynomial::operator=(std::span Polynomial Polynomial::clone() const +{ + Polynomial p; + p.backing_memory_ = backing_memory_; + p.size_ = size_; + p.coefficients_ = coefficients_; + return p; +} + +template Polynomial Polynomial::deep_clone() const +{ + Polynomial p; + p.allocate_backing_memory(size_); + memcpy(static_cast(p.coefficients_), static_cast(coefficients_), sizeof(Fr) * size_); + p.zero_memory_beyond(p.size_); + return p; +} + template Fr Polynomial::evaluate(const Fr& z, const size_t target_size) const { return polynomial_arithmetic::evaluate(coefficients_, z, target_size); @@ -153,6 +155,25 @@ template Fr Polynomial::evaluate(const Fr& z) const return polynomial_arithmetic::evaluate(coefficients_, z, size_); } +template bool Polynomial::operator==(Polynomial const& rhs) const +{ + // If either is empty, both must be + if (is_empty() || rhs.is_empty()) { + return is_empty() && rhs.is_empty(); + } + // Size must agree + if (size() != rhs.size()) { + return false; + } + // Each coefficient must agree + for (size_t i = 0; i < size(); i++) { + if (coefficients_[i] != rhs.coefficients_[i]) { + return false; + } + } + return true; +} + /** * @brief sets a block of memory to all zeroes * Used to zero out unintialized memory to ensure that, when writing to the polynomial in future, @@ -297,6 +318,18 @@ Fr Polynomial::evaluate_from_fft(const EvaluationDomain& large_domain, return polynomial_arithmetic::evaluate_from_fft(coefficients_, large_domain, z, small_domain); } +template Polynomial Polynomial::shifted() const +{ + ASSERT(size_ > 0); + ASSERT(backing_memory_[0].is_zero()); + ASSERT(coefficients_[size_].is_zero()); // relies on MAXIMUM_COEFFICIENT_SHIFT >= 1 + Polynomial p; + p.backing_memory_ = backing_memory_; + p.size_ = size_; + p.coefficients_ = coefficients_ + 1; + return p; +} + // TODO(#723): This method is used for the transcript aggregation protocol. For convenience we currently enforce that // the shift is the same size as the input but this does not need to be the case. Revisit the logic/assertions in this // method when that issue is addressed. diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 68858056b796..2fdb7ecd15f8 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -47,22 +47,21 @@ template class Polynomial { */ Polynomial(std::span interpolation_points, std::span evaluations); - Polynomial& operator=(Polynomial&& other) noexcept; + // move assignment + Polynomial& operator=(Polynomial&& other) noexcept = default; Polynomial& operator=(std::span coefficients) noexcept; - Polynomial& operator=(const Polynomial& other); + Polynomial& operator=(const Polynomial& other) = delete; ~Polynomial() = default; /** * Return a shallow clone of the polynomial. i.e. underlying memory is shared. */ - Polynomial clone() - { - Polynomial p; - p.backing_memory_ = backing_memory_; - p.size_ = size_; - p.coefficients_ = coefficients_; - return p; - } + Polynomial clone() const; + + /** + * Return a deep clone of the polynomial. i.e. underlying memory is copied. + */ + Polynomial deep_clone() const; std::array hash() const { return sha256::sha256(byte_span()); } @@ -74,24 +73,7 @@ template class Polynomial { size_ = 0; } - bool operator==(Polynomial const& rhs) const - { - // If either is empty, both must be - if (is_empty() || rhs.is_empty()) { - return is_empty() && rhs.is_empty(); - } - // Size must agree - if (size() != rhs.size()) { - return false; - } - // Each coefficient must agree - for (size_t i = 0; i < size(); i++) { - if (coefficients_[i] != rhs.coefficients_[i]) { - return false; - } - } - return true; - } + bool operator==(Polynomial const& rhs) const; // Const and non const versions of coefficient accessors Fr const& operator[](const size_t i) const { return coefficients_[i]; } @@ -150,17 +132,7 @@ template class Polynomial { * @details If the n coefficients of self are (0, a₁, …, aₙ₋₁), * we returns the view of the n-1 coefficients (a₁, …, aₙ₋₁). */ - Polynomial shifted() const - { - ASSERT(size_ > 0); - ASSERT(backing_memory_[0].is_zero()); - ASSERT(coefficients_[size_].is_zero()); // relies on MAXIMUM_COEFFICIENT_SHIFT >= 1 - Polynomial p; - p.backing_memory_ = backing_memory_; - p.size_ = size_; - p.coefficients_ = coefficients_ + 1; - return p; - } + Polynomial shifted() const; /** * @brief Set self to the right shift of input coefficients From 4716652040cffc505e4db68ac59c369b0aeb4b4b Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:33:43 +0000 Subject: [PATCH 03/60] Deep clone --- .../commitment_schemes/shplonk/shplonk.hpp | 2 +- .../cpp/src/barretenberg/flavor/ultra.hpp | 100 ++++++++---------- 2 files changed, 45 insertions(+), 57 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index e4cb18795a4c..3de62608d6a7 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -75,7 +75,7 @@ template class ShplonkProver_ { const auto& [challenge, evaluation] = opening_pairs[j]; // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) - tmp = witness_polynomials[j]; + tmp = witness_polynomials[j].deep_clone(); tmp[0] -= evaluation; tmp.factor_roots(challenge); diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index d0cf36b2a6e4..705efb0bd5aa 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -140,81 +140,69 @@ class Ultra { RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; }; + /** + * @brief Class for ShiftedEntities, containing shifted witness and table polynomials. + */ + template class ShiftedEntities { + public: + DEFINE_FLAVOR_MEMBERS(DataType, + table_1_shift, // column 0 + table_2_shift, // column 1 + table_3_shift, // column 2 + table_4_shift, // column 3 + w_l_shift, // column 4 + w_r_shift, // column 5 + w_o_shift, // column 6 + w_4_shift, // column 7 + sorted_accum_shift, // column 8 + z_perm_shift, // column 9 + z_lookup_shift) // column 10 + + RefVector get_shifted() + { + return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, + w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; + }; + }; /** * @brief A base class labelling all entities (for instance, all of the polynomials used by the prover during * sumcheck) in this Honk variant along with particular subsets of interest * @details Used to build containers for: the prover's polynomial during sumcheck; the sumcheck's folded * polynomials; the univariates consturcted during during sumcheck; the evaluations produced by sumcheck. * - * Symbolically we have: AllEntities = PrecomputedEntities + WitnessEntities + "ShiftedEntities". It could be - * implemented as such, but we have this now. + * Symbolically we have: AllEntities = PrecomputedEntities + WitnessEntities + "ShiftedEntities". + * TODO(https://github.com/AztecProtocol/barretenberg/issues/788) use normal composition */ - template class AllEntities { + template + class AllEntities : public PrecomputedEntities, + public WitnessEntities, + public ShiftedEntities { public: - DEFINE_FLAVOR_MEMBERS(DataType, - q_c, // column 0 - q_l, // column 1 - q_r, // column 2 - q_o, // column 3 - q_4, // column 4 - q_m, // column 5 - q_arith, // column 6 - q_sort, // column 7 - q_elliptic, // column 8 - q_aux, // column 9 - q_lookup, // column 10 - sigma_1, // column 11 - sigma_2, // column 12 - sigma_3, // column 13 - sigma_4, // column 14 - id_1, // column 15 - id_2, // column 16 - id_3, // column 17 - id_4, // column 18 - table_1, // column 19 - table_2, // column 20 - table_3, // column 21 - table_4, // column 22 - lagrange_first, // column 23 - lagrange_last, // column 24 - w_l, // column 25 - w_r, // column 26 - w_o, // column 27 - w_4, // column 28 - sorted_accum, // column 29 - z_perm, // column 30 - z_lookup, // column 31 - table_1_shift, // column 32 - table_2_shift, // column 33 - table_3_shift, // column 34 - table_4_shift, // column 35 - w_l_shift, // column 36 - w_r_shift, // column 37 - w_o_shift, // column 38 - w_4_shift, // column 39 - sorted_accum_shift, // column 40 - z_perm_shift, // column 41 - z_lookup_shift) // column 42 - - RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; + // get_wires inherited from WitnessEntities // Gemini-specific getters. RefVector get_unshifted() { - return { q_c, q_l, q_r, q_o, q_4, q_m, q_arith, q_sort, - q_elliptic, q_aux, q_lookup, sigma_1, sigma_2, sigma_3, sigma_4, id_1, - id_2, id_3, id_4, table_1, table_2, table_3, table_4, lagrange_first, - lagrange_last, w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup + return { this->q_c, this->q_l, this->q_r, this->q_o, + this->q_4, this->q_m, this->q_arith, this->q_sort, + this->q_elliptic, this->q_aux, this->q_lookup, this->sigma_1, + this->sigma_2, this->sigma_3, this->sigma_4, this->id_1, + this->id_2, this->id_3, this->id_4, this->table_1, + this->table_2, this->table_3, this->table_4, this->lagrange_first, + this->lagrange_last, this->w_l, this->w_r, this->w_o, + this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; }; RefVector get_to_be_shifted() { - return { table_1, table_2, table_3, table_4, w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; + return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, + this->w_o, this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; }; RefVector get_shifted() { - return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, - w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; + return { this->table_1_shift, this->table_2_shift, this->table_3_shift, this->table_4_shift, + this->w_l_shift, this->w_r_shift, this->w_o_shift, this->w_4_shift, + this->sorted_accum_shift, this->z_perm_shift, this->z_lookup_shift }; }; }; From 1cda946393ec6c4614ac3c3cf31d1ba4fd2291e0 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 22:18:12 +0000 Subject: [PATCH 04/60] use share() everywhere --- .../honk_bench/ultra_honk_rounds.bench.cpp | 2 +- .../commitment_schemes/shplonk/shplonk.hpp | 3 +- .../zeromorph/zeromorph.hpp | 8 +- .../src/barretenberg/eccvm/eccvm_composer.cpp | 2 +- .../src/barretenberg/eccvm/eccvm_prover.cpp | 117 ++---------------- .../cpp/src/barretenberg/flavor/ecc_vm.hpp | 63 +++++----- .../cpp/src/barretenberg/flavor/flavor.hpp | 4 +- .../src/barretenberg/flavor/flavor.test.cpp | 62 +--------- .../cpp/src/barretenberg/flavor/ultra.hpp | 8 ++ .../honk/proof_system/permutation_library.hpp | 2 +- .../src/barretenberg/honk/utils/testing.hpp | 4 +- .../barretenberg/polynomials/polynomial.cpp | 2 +- .../barretenberg/polynomials/polynomial.hpp | 2 +- .../polynomial_arithmetic.test.cpp | 6 +- .../proof_system/composer/composer_lib.hpp | 6 +- .../proof_system/composer/permutation_lib.hpp | 6 +- .../library/grand_product_library.hpp | 2 +- .../library/grand_product_library.test.cpp | 53 ++------ .../polynomial_store_cache.cpp | 2 +- .../sumcheck/instance/prover_instance.cpp | 81 +++--------- 20 files changed, 98 insertions(+), 337 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/honk_bench/ultra_honk_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/honk_bench/ultra_honk_rounds.bench.cpp index 46642345ef4f..a406c1a85913 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/honk_bench/ultra_honk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/honk_bench/ultra_honk_rounds.bench.cpp @@ -45,7 +45,7 @@ BBERG_PROFILE static void test_round(State& state, size_t index) noexcept for (auto _ : state) { state.PauseTiming(); honk::UltraComposer composer; - // TODO: https://github.com/AztecProtocol/barretenberg/issues/761 benchmark both sparse and dense circuits + // TODO(https://github.com/AztecProtocol/barretenberg/issues/761) benchmark both sparse and dense circuits honk::UltraProver prover = bench_utils::get_prover( composer, &bench_utils::generate_ecdsa_verification_test_circuit, 10); test_round_inner(state, prover, index); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index 3de62608d6a7..de894dbb56b4 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -120,13 +120,12 @@ template class ShplonkProver_ { // G₀ = ∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ) Fr current_nu = Fr::one(); - Polynomial tmp(G.size()); for (size_t j = 0; j < num_opening_pairs; ++j) { // (Cⱼ, xⱼ, vⱼ) const auto& [challenge, evaluation] = opening_pairs[j]; // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ) - tmp = witness_polynomials[j]; + Polynomial tmp = witness_polynomials[j].deep_clone(); tmp[0] -= evaluation; Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = ρʲ / ( r − xⱼ ) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index c8a525f19f36..cce987bfe7d4 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -74,12 +74,12 @@ template class ZeroMorphProver_ { // Compute the coefficients of q_{n-1} size_t size_q = 1 << (log_N - 1); - Polynomial q = Polynomial(size_q); + Polynomial q{ size_q }; for (size_t l = 0; l < size_q; ++l) { q[l] = polynomial[size_q + l] - polynomial[l]; } - quotients[log_N - 1] = q; + quotients[log_N - 1] = std::move(q); std::vector f_k; f_k.resize(size_q); @@ -94,13 +94,13 @@ template class ZeroMorphProver_ { } size_q = size_q / 2; - q = Polynomial(size_q); + Polynomial q{ size_q }; for (size_t l = 0; l < size_q; ++l) { q[l] = f_k[size_q + l] - f_k[l]; } - quotients[log_N - k - 1] = q; + quotients[log_N - k - 1] = std::move(q); g = f_k; } diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp index c6df4cbddb21..0814212045f4 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp @@ -84,7 +84,7 @@ std::shared_ptr ECCVMComposer_::compute_pro const size_t n = proving_key->circuit_size; typename Flavor::Polynomial lagrange_polynomial_second(n); lagrange_polynomial_second[1] = 1; - proving_key->lagrange_second = lagrange_polynomial_second; + proving_key->lagrange_second = std::move(lagrange_polynomial_second); } proving_key->contains_recursive_proof = false; diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index 16d3f3a9cfba..123e470b905e 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -29,115 +29,14 @@ ECCVMProver_::ECCVMProver_(const std::shared_ptrtranscript_add; - prover_polynomials.transcript_mul = key->transcript_mul; - prover_polynomials.transcript_eq = key->transcript_eq; - prover_polynomials.transcript_collision_check = key->transcript_collision_check; - prover_polynomials.transcript_msm_transition = key->transcript_msm_transition; - prover_polynomials.transcript_pc = key->transcript_pc; - prover_polynomials.transcript_msm_count = key->transcript_msm_count; - prover_polynomials.transcript_Px = key->transcript_Px; - prover_polynomials.transcript_Py = key->transcript_Py; - prover_polynomials.transcript_z1 = key->transcript_z1; - prover_polynomials.transcript_z2 = key->transcript_z2; - prover_polynomials.transcript_z1zero = key->transcript_z1zero; - prover_polynomials.transcript_z2zero = key->transcript_z2zero; - prover_polynomials.transcript_op = key->transcript_op; - prover_polynomials.transcript_accumulator_x = key->transcript_accumulator_x; - prover_polynomials.transcript_accumulator_y = key->transcript_accumulator_y; - prover_polynomials.transcript_msm_x = key->transcript_msm_x; - prover_polynomials.transcript_msm_y = key->transcript_msm_y; - prover_polynomials.precompute_pc = key->precompute_pc; - prover_polynomials.precompute_point_transition = key->precompute_point_transition; - prover_polynomials.precompute_round = key->precompute_round; - prover_polynomials.precompute_scalar_sum = key->precompute_scalar_sum; - prover_polynomials.precompute_s1hi = key->precompute_s1hi; - prover_polynomials.precompute_s1lo = key->precompute_s1lo; - prover_polynomials.precompute_s2hi = key->precompute_s2hi; - prover_polynomials.precompute_s2lo = key->precompute_s2lo; - prover_polynomials.precompute_s3hi = key->precompute_s3hi; - prover_polynomials.precompute_s3lo = key->precompute_s3lo; - prover_polynomials.precompute_s4hi = key->precompute_s4hi; - prover_polynomials.precompute_s4lo = key->precompute_s4lo; - prover_polynomials.precompute_skew = key->precompute_skew; - prover_polynomials.precompute_dx = key->precompute_dx; - prover_polynomials.precompute_dy = key->precompute_dy; - prover_polynomials.precompute_tx = key->precompute_tx; - prover_polynomials.precompute_ty = key->precompute_ty; - prover_polynomials.msm_transition = key->msm_transition; - prover_polynomials.msm_add = key->msm_add; - prover_polynomials.msm_double = key->msm_double; - prover_polynomials.msm_skew = key->msm_skew; - prover_polynomials.msm_accumulator_x = key->msm_accumulator_x; - prover_polynomials.msm_accumulator_y = key->msm_accumulator_y; - prover_polynomials.msm_pc = key->msm_pc; - prover_polynomials.msm_size_of_msm = key->msm_size_of_msm; - prover_polynomials.msm_count = key->msm_count; - prover_polynomials.msm_round = key->msm_round; - prover_polynomials.msm_add1 = key->msm_add1; - prover_polynomials.msm_add2 = key->msm_add2; - prover_polynomials.msm_add3 = key->msm_add3; - prover_polynomials.msm_add4 = key->msm_add4; - prover_polynomials.msm_x1 = key->msm_x1; - prover_polynomials.msm_y1 = key->msm_y1; - prover_polynomials.msm_x2 = key->msm_x2; - prover_polynomials.msm_y2 = key->msm_y2; - prover_polynomials.msm_x3 = key->msm_x3; - prover_polynomials.msm_y3 = key->msm_y3; - prover_polynomials.msm_x4 = key->msm_x4; - prover_polynomials.msm_y4 = key->msm_y4; - prover_polynomials.msm_collision_x1 = key->msm_collision_x1; - prover_polynomials.msm_collision_x2 = key->msm_collision_x2; - prover_polynomials.msm_collision_x3 = key->msm_collision_x3; - prover_polynomials.msm_collision_x4 = key->msm_collision_x4; - prover_polynomials.msm_lambda1 = key->msm_lambda1; - prover_polynomials.msm_lambda2 = key->msm_lambda2; - prover_polynomials.msm_lambda3 = key->msm_lambda3; - prover_polynomials.msm_lambda4 = key->msm_lambda4; - prover_polynomials.msm_slice1 = key->msm_slice1; - prover_polynomials.msm_slice2 = key->msm_slice2; - prover_polynomials.msm_slice3 = key->msm_slice3; - prover_polynomials.msm_slice4 = key->msm_slice4; - prover_polynomials.transcript_accumulator_empty = key->transcript_accumulator_empty; - prover_polynomials.transcript_reset_accumulator = key->transcript_reset_accumulator; - prover_polynomials.precompute_select = key->precompute_select; - prover_polynomials.lookup_read_counts_0 = key->lookup_read_counts_0; - prover_polynomials.lookup_read_counts_1 = key->lookup_read_counts_1; - prover_polynomials.transcript_mul_shift = key->transcript_mul.shifted(); - prover_polynomials.transcript_msm_count_shift = key->transcript_msm_count.shifted(); - prover_polynomials.transcript_accumulator_x_shift = key->transcript_accumulator_x.shifted(); - prover_polynomials.transcript_accumulator_y_shift = key->transcript_accumulator_y.shifted(); - prover_polynomials.precompute_scalar_sum_shift = key->precompute_scalar_sum.shifted(); - prover_polynomials.precompute_s1hi_shift = key->precompute_s1hi.shifted(); - prover_polynomials.precompute_dx_shift = key->precompute_dx.shifted(); - prover_polynomials.precompute_dy_shift = key->precompute_dy.shifted(); - prover_polynomials.precompute_tx_shift = key->precompute_tx.shifted(); - prover_polynomials.precompute_ty_shift = key->precompute_ty.shifted(); - prover_polynomials.msm_transition_shift = key->msm_transition.shifted(); - prover_polynomials.msm_add_shift = key->msm_add.shifted(); - prover_polynomials.msm_double_shift = key->msm_double.shifted(); - prover_polynomials.msm_skew_shift = key->msm_skew.shifted(); - prover_polynomials.msm_accumulator_x_shift = key->msm_accumulator_x.shifted(); - prover_polynomials.msm_accumulator_y_shift = key->msm_accumulator_y.shifted(); - prover_polynomials.msm_count_shift = key->msm_count.shifted(); - prover_polynomials.msm_round_shift = key->msm_round.shifted(); - prover_polynomials.msm_add1_shift = key->msm_add1.shifted(); - prover_polynomials.msm_pc_shift = key->msm_pc.shifted(); - prover_polynomials.precompute_pc_shift = key->precompute_pc.shifted(); - prover_polynomials.transcript_pc_shift = key->transcript_pc.shifted(); - prover_polynomials.precompute_round_shift = key->precompute_round.shifted(); - prover_polynomials.transcript_accumulator_empty_shift = key->transcript_accumulator_empty.shifted(); - prover_polynomials.precompute_select_shift = key->precompute_select.shifted(); - prover_polynomials.lagrange_first = key->lagrange_first; - prover_polynomials.lagrange_second = key->lagrange_second; - prover_polynomials.lagrange_last = key->lagrange_last; - - prover_polynomials.lookup_inverses = key->lookup_inverses; + // this will be initialized properly later key->z_perm = Polynomial(key->circuit_size); - prover_polynomials.z_perm = key->z_perm; - prover_polynomials.z_perm_shift = key->z_perm; // this will be initialized properly later + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + prover_poly = key_poly.clone(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); + } } /** @@ -186,7 +85,7 @@ template void ECCVMProver_::execute_log_derivative_ lookup_library::compute_logderivative_inverse( prover_polynomials, relation_parameters, key->circuit_size); transcript->send_to_verifier(commitment_labels.lookup_inverses, commitment_key->commit(key->lookup_inverses)); - prover_polynomials.lookup_inverses = key->lookup_inverses; + prover_polynomials.lookup_inverses = key->lookup_inverses.clone(); } /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 4a04f2ec05b1..0eca22f2eacd 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -240,6 +240,38 @@ template class ECCVMBa precompute_select_shift, // column 24 z_perm_shift); // column 25 }; + + template + static RefVector get_to_be_shifted(PrecomputedAndWitnessEntitiesSuperset& entities) + { + // NOTE: must match order of ShiftedEntities above! + return { entities.transcript_mul, + entities.transcript_msm_count, + entities.transcript_accumulator_x, + entities.transcript_accumulator_y, + entities.precompute_scalar_sum, + entities.precompute_s1hi, + entities.precompute_dx, + entities.precompute_dy, + entities.precompute_tx, + entities.precompute_ty, + entities.msm_transition, + entities.msm_add, + entities.msm_double, + entities.msm_skew, + entities.msm_accumulator_x, + entities.msm_accumulator_y, + entities.msm_count, + entities.msm_round, + entities.msm_add1, + entities.msm_pc, + entities.precompute_pc, + entities.transcript_pc, + entities.precompute_round, + entities.transcript_accumulator_empty, + entities.precompute_select, + entities.z_perm }; + } /** * @brief A base class labelling all entities (for instance, all of the polynomials used by the prover during * sumcheck) in this Honk variant along with particular subsets of interest @@ -272,35 +304,7 @@ template class ECCVMBa return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); }; - RefVector get_to_be_shifted() - { - return { this->transcript_mul, - this->transcript_msm_count, - this->transcript_accumulator_x, - this->transcript_accumulator_y, - this->precompute_scalar_sum, - this->precompute_s1hi, - this->precompute_dx, - this->precompute_dy, - this->precompute_tx, - this->precompute_ty, - this->msm_transition, - this->msm_add, - this->msm_double, - this->msm_skew, - this->msm_accumulator_x, - this->msm_accumulator_y, - this->msm_count, - this->msm_round, - this->msm_add1, - this->msm_pc, - this->precompute_pc, - this->transcript_pc, - this->precompute_round, - this->transcript_accumulator_empty, - this->precompute_select, - this->z_perm }; - } + RefVector get_to_be_shifted() { return ECCVMBase::get_to_be_shifted(*this); } RefVector get_shifted() { return ShiftedEntities::get_all(); }; }; @@ -316,6 +320,7 @@ template class ECCVMBa using Base = ProvingKey_, WitnessEntities>; using Base::Base; + RefVector get_to_be_shifted() { return ECCVMBase::get_to_be_shifted(*this); } // The plookup wires that store plookup read data. std::array get_table_column_wires() { return {}; }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index d2b16d473cff..b71bb1776ecc 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -105,7 +105,9 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { std::vector recursive_proof_public_input_indices; barretenberg::EvaluationDomain evaluation_domain; - auto precomputed_polynomials_get_all() { return PrecomputedPolynomials::get_all(); } + auto get_all() { return concatenate(get_witness_polynomials(), get_precomputed_polynomials()); } + auto get_witness_polynomials() { return WitnessPolynomials::get_all(); } + auto get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } ProvingKey_() = default; ProvingKey_(const size_t circuit_size, const size_t num_public_inputs) { diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp index ad4692dc26b1..07d93358de21 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.test.cpp @@ -38,66 +38,6 @@ TEST(Flavor, Getters) prover_polynomials.get_shifted().size() + prover_polynomials.get_unshifted().size()); // Commitment lables are stored in the flavor. EXPECT_EQ(commitment_labels.w_r, "W_R"); - - auto get_test_polynomial = [](size_t& idx) { - Flavor::Polynomial poly(4); - for (size_t i = 0; i < 4; i++) { - poly[i] = idx++; - }; - return poly; - }; - - size_t idx = 0; - auto w_l = get_test_polynomial(idx); - auto w_r = get_test_polynomial(idx); - auto w_o = get_test_polynomial(idx); - auto w_4 = get_test_polynomial(idx); - auto z_perm = get_test_polynomial(idx); - auto z_perm_shift = get_test_polynomial(idx); - auto q_m = get_test_polynomial(idx); - auto q_l = get_test_polynomial(idx); - auto q_r = get_test_polynomial(idx); - auto q_o = get_test_polynomial(idx); - auto q_c = get_test_polynomial(idx); - auto sigma_1 = get_test_polynomial(idx); - auto sigma_2 = get_test_polynomial(idx); - auto sigma_3 = get_test_polynomial(idx); - auto id_1 = get_test_polynomial(idx); - auto id_2 = get_test_polynomial(idx); - auto id_3 = get_test_polynomial(idx); - auto lagrange_first = get_test_polynomial(idx); - auto lagrange_last = get_test_polynomial(idx); - - prover_polynomials.w_l = w_l; - prover_polynomials.w_r = w_r; - prover_polynomials.w_o = w_o; - prover_polynomials.w_4 = w_4; - prover_polynomials.z_perm = z_perm; - prover_polynomials.z_perm_shift = z_perm_shift; - prover_polynomials.q_m = q_m; - prover_polynomials.q_l = q_l; - prover_polynomials.q_r = q_r; - prover_polynomials.q_o = q_o; - prover_polynomials.q_c = q_c; - prover_polynomials.sigma_1 = sigma_1; - prover_polynomials.sigma_2 = sigma_2; - prover_polynomials.sigma_3 = sigma_3; - prover_polynomials.id_1 = id_1; - prover_polynomials.id_2 = id_2; - prover_polynomials.id_3 = id_3; - prover_polynomials.lagrange_first = lagrange_first; - prover_polynomials.lagrange_last = lagrange_last; - - // You can set polynomial values directly through the symbol names - // and then access the values through the getters. - idx = 0; - for (auto& poly : prover_polynomials.get_wires()) { - EXPECT_EQ(poly[0], 4 * idx); - EXPECT_EQ(poly[1], 4 * idx + 1); - EXPECT_EQ(poly[2], 4 * idx + 2); - EXPECT_EQ(poly[3], 4 * idx + 3); - ++idx; - }; } TEST(Flavor, AllEntitiesSpecialMemberFunctions) @@ -115,7 +55,7 @@ TEST(Flavor, AllEntitiesSpecialMemberFunctions) // Test some special member functions. - polynomials_A.w_l = random_poly; + polynomials_A.w_l = random_poly.share(); ASSERT_EQ(random_poly, polynomials_A.w_l); diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 705efb0bd5aa..de82adba3213 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -178,6 +178,9 @@ class Ultra { public WitnessEntities, public ShiftedEntities { public: + DEFINE_COMPOUND_GET_ALL(PrecomputedEntities::get_all(), + WitnessEntities::get_all(), + ShiftedEntities::get_all()); // get_wires inherited from WitnessEntities // Gemini-specific getters. RefVector get_unshifted() @@ -221,6 +224,11 @@ class Ultra { std::vector memory_read_records; std::vector memory_write_records; + RefVector get_to_be_shifted() + { + return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, + this->w_o, this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; + }; // The plookup wires that store plookup read data. std::array get_table_column_wires() { return { w_l, w_r, w_o }; }; }; diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp index c53b5255011d..d4a5721d13b4 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp @@ -157,7 +157,7 @@ void compute_permutation_grand_products(std::shared_ptr& full_polynomial = PermutationRelation::get_grand_product_polynomial(full_polynomials); barretenberg::Polynomial& key_polynomial = PermutationRelation::get_grand_product_polynomial(*key); - full_polynomial = key_polynomial; + full_polynomial = key_polynomial.share(); compute_permutation_grand_product( key->circuit_size, full_polynomials, relation_parameters); diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp index 37c056609eef..4f41d40b06a2 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp @@ -29,7 +29,7 @@ get_sequential_prover_polynomials(const size_t log_circuit_size, const size_t st ProverPolynomials prover_polynomials; for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage)) { - prover_poly = storage_poly; + prover_poly = storage_poly.clone(); } return std::pair(std::move(storage), prover_polynomials); @@ -55,7 +55,7 @@ get_zero_prover_polynomials(const size_t log_circuit_size) ProverPolynomials prover_polynomials; for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage)) { - prover_poly = storage_poly; + prover_poly = storage_poly.clone(); } return std::pair(std::move(storage), prover_polynomials); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index e9da0cb26b38..232c688c7d79 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -127,7 +127,7 @@ template Polynomial& Polynomial::operator=(std::span Polynomial Polynomial::clone() const +template Polynomial Polynomial::share() const { Polynomial p; p.backing_memory_ = backing_memory_; diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 2fdb7ecd15f8..3e4b594a565b 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -56,7 +56,7 @@ template class Polynomial { /** * Return a shallow clone of the polynomial. i.e. underlying memory is shared. */ - Polynomial clone() const; + Polynomial share() const; /** * Return a deep clone of the polynomial. i.e. underlying memory is copied. diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp index b0a57e135d8d..f01ae586b983 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp @@ -642,7 +642,7 @@ TEST(polynomials, divide_by_vanishing_polynomial) polynomial_arithmetic::sub(&R[0], &C[0], &R[0], large_domain); polynomial R_copy(2 * n); - R_copy = R; + R_copy = R.deep_clone(); polynomial_arithmetic::divide_by_pseudo_vanishing_polynomial({ &R[0] }, small_domain, large_domain, 3); R.coset_ifft(large_domain); @@ -1219,7 +1219,7 @@ TYPED_TEST(PolynomialTests, move_construct_and_assign) coeff = FF::random_element(); } - // construct a new poly FFom the original via the move constructor + // construct a new poly from the original via the move constructor Polynomial polynomial_b(std::move(polynomial_a)); // verifiy that source poly is appropriately destroyed @@ -1264,7 +1264,7 @@ TYPED_TEST(PolynomialTests, default_construct_then_assign) EXPECT_EQ(poly.is_empty(), true); // fill the empty poly using the assignment operator - poly = interesting_poly; + poly = interesting_poly.deep_clone(); // coefficients and size should be equal in value for (size_t i = 0; i < num_coeffs; ++i) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp index 728a5cbfda33..2f62a86d2583 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp @@ -35,13 +35,13 @@ void construct_selector_polynomials(const typename Flavor::CircuitBuilder& circu for (size_t i = 0; i < num_ecc_op_gates; ++i) { ecc_op_selector[i + op_gate_offset] = 1; } - proving_key->lagrange_ecc_op = ecc_op_selector; + proving_key->lagrange_ecc_op = ecc_op_selector.share(); } // TODO(#398): Loose coupling here! Would rather build up pk from arithmetization if constexpr (IsHonkFlavor) { for (auto [poly, selector_values] : - zip_view(proving_key->precomputed_polynomials_get_all(), circuit_constructor.selectors.get())) { + zip_view(proving_key->get_precomputed_polynomials(), circuit_constructor.selectors.get())) { ASSERT(proving_key->circuit_size >= selector_values.size()); // Copy the selector values for all gates, keeping the rows at which we store public inputs as 0. @@ -50,7 +50,7 @@ void construct_selector_polynomials(const typename Flavor::CircuitBuilder& circu for (size_t i = 0; i < selector_values.size(); ++i) { selector_poly_lagrange[i + gate_offset] = selector_values[i]; } - poly = selector_poly_lagrange; + poly = std::move(selector_poly_lagrange); } } else if constexpr (IsPlonkFlavor) { size_t selector_idx = 0; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp index 90a7f0152f05..2a2bfab2f0c3 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp @@ -409,7 +409,7 @@ void compute_plonk_permutation_lagrange_polynomials_from_mapping( std::string index = std::to_string(i + 1); barretenberg::polynomial polynomial_lagrange(key->circuit_size); compute_standard_plonk_lagrange_polynomial(polynomial_lagrange, mappings[i], key->small_domain); - key->polynomial_store.put(label + "_" + index + "_lagrange", std::move(polynomial_lagrange)); + key->polynomial_store.put(label + "_" + index + "_lagrange", polynomial_lagrange.share()); } } @@ -476,10 +476,10 @@ template inline void compute_first_and_last_lagrange_polynomia typename Flavor::Polynomial lagrange_polynomial_0(n); typename Flavor::Polynomial lagrange_polynomial_n_min_1(n); lagrange_polynomial_0[0] = 1; - proving_key->lagrange_first = lagrange_polynomial_0; + proving_key->lagrange_first = std::move(lagrange_polynomial_0); lagrange_polynomial_n_min_1[n - 1] = 1; - proving_key->lagrange_last = lagrange_polynomial_n_min_1; + proving_key->lagrange_last = std::move(lagrange_polynomial_n_min_1); } /** diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index f26dda7965a0..56eb2a21b3b2 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -158,7 +158,7 @@ void compute_grand_products(std::shared_ptr& key, barretenberg::Polynomial& full_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials); auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(*key); - full_polynomial = key_polynomial; + full_polynomial = key_polynomial.clone(); compute_grand_product(key->circuit_size, full_polynomials, relation_parameters); barretenberg::Polynomial& full_polynomial_shift = diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index a3a3408c3a9a..b80890b405e6 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -90,28 +90,9 @@ template class GrandProductTests : public testing::Test { }; typename Flavor::ProverPolynomials prover_polynomials; - prover_polynomials.w_l = proving_key->w_l; - prover_polynomials.w_r = proving_key->w_r; - prover_polynomials.w_o = proving_key->w_o; - prover_polynomials.q_m = proving_key->q_m; - prover_polynomials.q_l = proving_key->q_l; - prover_polynomials.q_r = proving_key->q_r; - prover_polynomials.q_o = proving_key->q_o; - prover_polynomials.q_c = proving_key->q_c; - prover_polynomials.sigma_1 = proving_key->sigma_1; - prover_polynomials.sigma_2 = proving_key->sigma_2; - prover_polynomials.sigma_3 = proving_key->sigma_3; - prover_polynomials.id_1 = proving_key->id_1; - prover_polynomials.id_2 = proving_key->id_2; - prover_polynomials.id_3 = proving_key->id_3; - prover_polynomials.lagrange_first = proving_key->lagrange_first; - prover_polynomials.lagrange_last = proving_key->lagrange_last; - if constexpr (Flavor::NUM_WIRES == 4) { - prover_polynomials.w_4 = proving_key->w_4; - prover_polynomials.sigma_4 = proving_key->sigma_4; - prover_polynomials.id_4 = proving_key->id_4; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + prover_poly = key_poly.clone(); } - prover_polynomials.z_perm = proving_key->z_perm; // Method 1: Compute z_perm using 'compute_grand_product_polynomial' as the prover would in practice constexpr size_t PERMUTATION_RELATION_INDEX = 0; @@ -237,7 +218,7 @@ template class GrandProductTests : public testing::Test { auto lookup_index_selector = get_random_polynomial(circuit_size); auto lookup_selector = get_random_polynomial(circuit_size); - proving_key->sorted_accum = sorted_batched; + proving_key->sorted_accum = std::move(sorted_batched); populate_span(proving_key->q_r, column_1_step_size); populate_span(proving_key->q_m, column_2_step_size); populate_span(proving_key->q_c, column_3_step_size); @@ -257,30 +238,10 @@ template class GrandProductTests : public testing::Test { .lookup_grand_product_delta = 1, }; - Flavor::ProverPolynomials prover_polynomials; - prover_polynomials.w_l = proving_key->w_l; - prover_polynomials.w_r = proving_key->w_r; - prover_polynomials.w_o = proving_key->w_o; - prover_polynomials.w_l_shift = proving_key->w_l.shifted(); - prover_polynomials.w_r_shift = proving_key->w_r.shifted(); - prover_polynomials.w_o_shift = proving_key->w_o.shifted(); - prover_polynomials.sorted_accum = proving_key->sorted_accum; - prover_polynomials.sorted_accum_shift = proving_key->sorted_accum.shifted(); - prover_polynomials.table_1 = proving_key->table_1; - prover_polynomials.table_2 = proving_key->table_2; - prover_polynomials.table_3 = proving_key->table_3; - prover_polynomials.table_4 = proving_key->table_4; - prover_polynomials.table_1_shift = proving_key->table_1.shifted(); - prover_polynomials.table_2_shift = proving_key->table_2.shifted(); - prover_polynomials.table_3_shift = proving_key->table_3.shifted(); - prover_polynomials.table_4_shift = proving_key->table_4.shifted(); - prover_polynomials.q_m = proving_key->q_m; - prover_polynomials.q_r = proving_key->q_r; - prover_polynomials.q_o = proving_key->q_o; - prover_polynomials.q_c = proving_key->q_c; - prover_polynomials.q_lookup = proving_key->q_lookup; - prover_polynomials.z_perm = proving_key->z_perm; - prover_polynomials.z_lookup = proving_key->z_lookup; + typename Flavor::ProverPolynomials prover_polynomials; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + prover_poly = key_poly.share(); + } // Method 1: Compute z_lookup using the prover library method constexpr size_t LOOKUP_RELATION_INDEX = 1; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store_cache.cpp b/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store_cache.cpp index 5d06bdbb41ae..7bf6912c651d 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store_cache.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store_cache.cpp @@ -31,7 +31,7 @@ PolynomialStoreCache::Polynomial PolynomialStoreCache::get(std::string const& ke auto it = cache_.find(key); if (it != cache_.end()) { // info("cache get hit ", key); - return it->second.clone(); + return it->second.share(); } // info("cache get miss ", key); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 3a62affd0ace..ea9524daa2dd 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -172,10 +172,10 @@ template void ProverInstance_::construct_ecc_op_wire_poly } } - proving_key->ecc_op_wire_1 = op_wire_polynomials[0]; - proving_key->ecc_op_wire_2 = op_wire_polynomials[1]; - proving_key->ecc_op_wire_3 = op_wire_polynomials[2]; - proving_key->ecc_op_wire_4 = op_wire_polynomials[3]; + proving_key->ecc_op_wire_1 = op_wire_polynomials[0].clone(); + proving_key->ecc_op_wire_2 = op_wire_polynomials[1].clone(); + proving_key->ecc_op_wire_3 = op_wire_polynomials[2].clone(); + proving_key->ecc_op_wire_4 = op_wire_polynomials[3].clone(); } /** @@ -256,10 +256,10 @@ std::shared_ptr ProverInstance_::compute_pr // Polynomial memory is zeroed out when constructed with size hint, so we don't have to initialize trailing // space - proving_key->table_1 = poly_q_table_column_1; - proving_key->table_2 = poly_q_table_column_2; - proving_key->table_3 = poly_q_table_column_3; - proving_key->table_4 = poly_q_table_column_4; + proving_key->table_1 = poly_q_table_column_1.share(); + proving_key->table_2 = poly_q_table_column_2.share(); + proving_key->table_3 = poly_q_table_column_3.share(); + proving_key->table_4 = poly_q_table_column_4.share(); proving_key->recursive_proof_public_input_indices = std::vector(recursive_proof_public_input_indices.begin(), recursive_proof_public_input_indices.end()); @@ -273,7 +273,7 @@ std::shared_ptr ProverInstance_::compute_pr for (size_t i = 0; i < databus_id.size(); ++i) { databus_id[i] = i; } - proving_key->databus_id = databus_id; + proving_key->databus_id = std::move(databus_id); } return proving_key; @@ -281,65 +281,12 @@ std::shared_ptr ProverInstance_::compute_pr template void ProverInstance_::initialize_prover_polynomials() { - prover_polynomials.q_c = proving_key->q_c; - prover_polynomials.q_l = proving_key->q_l; - prover_polynomials.q_r = proving_key->q_r; - prover_polynomials.q_o = proving_key->q_o; - prover_polynomials.q_m = proving_key->q_m; - prover_polynomials.sigma_1 = proving_key->sigma_1; - prover_polynomials.sigma_2 = proving_key->sigma_2; - prover_polynomials.sigma_3 = proving_key->sigma_3; - prover_polynomials.id_1 = proving_key->id_1; - prover_polynomials.id_2 = proving_key->id_2; - prover_polynomials.id_3 = proving_key->id_3; - prover_polynomials.lagrange_first = proving_key->lagrange_first; - prover_polynomials.lagrange_last = proving_key->lagrange_last; - prover_polynomials.w_l = proving_key->w_l; - prover_polynomials.w_r = proving_key->w_r; - prover_polynomials.w_o = proving_key->w_o; - - prover_polynomials.q_4 = proving_key->q_4; - prover_polynomials.q_arith = proving_key->q_arith; - prover_polynomials.q_sort = proving_key->q_sort; - prover_polynomials.q_elliptic = proving_key->q_elliptic; - prover_polynomials.q_aux = proving_key->q_aux; - prover_polynomials.q_lookup = proving_key->q_lookup; - prover_polynomials.sigma_4 = proving_key->sigma_4; - prover_polynomials.id_4 = proving_key->id_4; - prover_polynomials.table_1 = proving_key->table_1; - prover_polynomials.table_2 = proving_key->table_2; - prover_polynomials.table_3 = proving_key->table_3; - prover_polynomials.table_4 = proving_key->table_4; - prover_polynomials.table_1_shift = proving_key->table_1.shifted(); - prover_polynomials.table_2_shift = proving_key->table_2.shifted(); - prover_polynomials.table_3_shift = proving_key->table_3.shifted(); - prover_polynomials.table_4_shift = proving_key->table_4.shifted(); - prover_polynomials.w_l_shift = proving_key->w_l.shifted(); - prover_polynomials.w_r_shift = proving_key->w_r.shifted(); - prover_polynomials.w_o_shift = proving_key->w_o.shifted(); - - if constexpr (IsGoblinFlavor) { - prover_polynomials.ecc_op_wire_1 = proving_key->ecc_op_wire_1; - prover_polynomials.ecc_op_wire_2 = proving_key->ecc_op_wire_2; - prover_polynomials.ecc_op_wire_3 = proving_key->ecc_op_wire_3; - prover_polynomials.ecc_op_wire_4 = proving_key->ecc_op_wire_4; - prover_polynomials.lagrange_ecc_op = proving_key->lagrange_ecc_op; - // DataBus polynomials - prover_polynomials.calldata = proving_key->calldata; - prover_polynomials.calldata_read_counts = proving_key->calldata_read_counts; - prover_polynomials.lookup_inverses = proving_key->lookup_inverses; - prover_polynomials.q_busread = proving_key->q_busread; - prover_polynomials.databus_id = proving_key->databus_id; - prover_polynomials.q_poseidon2_external = proving_key->q_poseidon2_external; - prover_polynomials.q_poseidon2_internal = proving_key->q_poseidon2_internal; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + prover_poly = key_poly.clone(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); } - - // These polynomials have not yet been computed; initialize them so prover_polynomials is "full" and we can use - // utilities like get_row() - prover_polynomials.z_perm = proving_key->z_perm; - prover_polynomials.z_lookup = proving_key->z_lookup; - prover_polynomials.z_perm_shift = proving_key->z_perm.shifted(); - prover_polynomials.z_lookup_shift = proving_key->z_lookup.shifted(); std::span public_wires_source = prover_polynomials.w_r; From 00eba293a58e10a765e3e5711043813c254090df Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:18:47 -0500 Subject: [PATCH 05/60] Update zeromorph.hpp --- .../barretenberg/commitment_schemes/zeromorph/zeromorph.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index cce987bfe7d4..40fac5530d32 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -79,7 +79,7 @@ template class ZeroMorphProver_ { q[l] = polynomial[size_q + l] - polynomial[l]; } - quotients[log_N - 1] = std::move(q); + quotients[log_N - 1] = q.share(); std::vector f_k; f_k.resize(size_q); @@ -100,7 +100,7 @@ template class ZeroMorphProver_ { q[l] = f_k[size_q + l] - f_k[l]; } - quotients[log_N - k - 1] = std::move(q); + quotients[log_N - k - 1] = q.share(); g = f_k; } @@ -710,4 +710,4 @@ template class ZeroMorphVerifier_ { } }; -} // namespace proof_system::honk::pcs::zeromorph \ No newline at end of file +} // namespace proof_system::honk::pcs::zeromorph From f2cda37417d4699536e696101768d5f5ea9174e0 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:19:06 -0500 Subject: [PATCH 06/60] Update eccvm_composer.cpp --- barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp index 0814212045f4..97202fa2da4c 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_composer.cpp @@ -84,7 +84,7 @@ std::shared_ptr ECCVMComposer_::compute_pro const size_t n = proving_key->circuit_size; typename Flavor::Polynomial lagrange_polynomial_second(n); lagrange_polynomial_second[1] = 1; - proving_key->lagrange_second = std::move(lagrange_polynomial_second); + proving_key->lagrange_second = lagrange_polynomial_second.share(); } proving_key->contains_recursive_proof = false; @@ -119,4 +119,4 @@ std::shared_ptr ECCVMComposer_::comput } template class ECCVMComposer_; -} // namespace proof_system::honk \ No newline at end of file +} // namespace proof_system::honk From 6f831eacd82262cf50b96bd4d0225e183df6b38a Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:20:00 -0500 Subject: [PATCH 07/60] Update composer_lib.hpp --- .../cpp/src/barretenberg/proof_system/composer/composer_lib.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp index 2f62a86d2583..9882e89c2dad 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp @@ -50,7 +50,7 @@ void construct_selector_polynomials(const typename Flavor::CircuitBuilder& circu for (size_t i = 0; i < selector_values.size(); ++i) { selector_poly_lagrange[i + gate_offset] = selector_values[i]; } - poly = std::move(selector_poly_lagrange); + poly = selector_poly_lagrange.share(); } } else if constexpr (IsPlonkFlavor) { size_t selector_idx = 0; From c115f4be3cb214bb91f86e30054e7d90295a9f99 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:20:55 -0500 Subject: [PATCH 08/60] Update permutation_lib.hpp --- .../proof_system/composer/permutation_lib.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp index 2a2bfab2f0c3..8383586d3cbe 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/permutation_lib.hpp @@ -440,8 +440,8 @@ void compute_monomial_and_coset_fft_polynomials_from_lagrange(std::string label, barretenberg::polynomial sigma_fft(sigma_polynomial, key->large_domain.size); sigma_fft.coset_fft(key->large_domain); - key->polynomial_store.put(prefix, std::move(sigma_polynomial)); - key->polynomial_store.put(prefix + "_fft", std::move(sigma_fft)); + key->polynomial_store.put(prefix, sigma_polynomial.share()); + key->polynomial_store.put(prefix + "_fft", sigma_fft.share()); } } @@ -476,10 +476,10 @@ template inline void compute_first_and_last_lagrange_polynomia typename Flavor::Polynomial lagrange_polynomial_0(n); typename Flavor::Polynomial lagrange_polynomial_n_min_1(n); lagrange_polynomial_0[0] = 1; - proving_key->lagrange_first = std::move(lagrange_polynomial_0); + proving_key->lagrange_first = lagrange_polynomial_0.share(); lagrange_polynomial_n_min_1[n - 1] = 1; - proving_key->lagrange_last = std::move(lagrange_polynomial_n_min_1); + proving_key->lagrange_last = lagrange_polynomial_n_min_1.share(); } /** From 793fad5ec35a60bc18bfaf9eb878f2ac42e86867 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 17:21:28 -0500 Subject: [PATCH 09/60] Update grand_product_library.test.cpp --- .../proof_system/library/grand_product_library.test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index b80890b405e6..6008c7db312e 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -218,7 +218,7 @@ template class GrandProductTests : public testing::Test { auto lookup_index_selector = get_random_polynomial(circuit_size); auto lookup_selector = get_random_polynomial(circuit_size); - proving_key->sorted_accum = std::move(sorted_batched); + proving_key->sorted_accum = sorted_batched.share(); populate_span(proving_key->q_r, column_1_step_size); populate_span(proving_key->q_m, column_2_step_size); populate_span(proving_key->q_c, column_3_step_size); @@ -338,4 +338,4 @@ TYPED_TEST(GrandProductTests, GrandProductLookup) TestFixture::test_lookup_grand_product_construction(); } -} // namespace grand_product_library_tests \ No newline at end of file +} // namespace grand_product_library_tests From efbec21b756270cd703768c3364ecaddacc557d0 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 22:22:11 +0000 Subject: [PATCH 10/60] use share() everywhere --- .../cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index ea9524daa2dd..7513f9f456a5 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -273,7 +273,7 @@ std::shared_ptr ProverInstance_::compute_pr for (size_t i = 0; i < databus_id.size(); ++i) { databus_id[i] = i; } - proving_key->databus_id = std::move(databus_id); + proving_key->databus_id = databus_id.share(); } return proving_key; From a223c98fe65049fb034fb66a68bf725c489a8655 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 22:59:26 +0000 Subject: [PATCH 11/60] fix: build --- .../src/barretenberg/eccvm/eccvm_prover.cpp | 4 +- .../flavor/generated/AvmMini_flavor.hpp | 9 + .../flavor/generated/Fib_flavor.hpp | 7 + .../src/barretenberg/flavor/goblin_ultra.hpp | 5 + .../honk/proof_system/permutation_library.hpp | 8 +- .../src/barretenberg/honk/utils/testing.hpp | 4 +- .../library/grand_product_library.hpp | 2 +- .../library/grand_product_library.test.cpp | 2 +- .../polynomial_store/polynomial_store.cpp | 2 +- .../protogalaxy/combiner.test.cpp | 6 +- .../sumcheck/instance/prover_instance.cpp | 28 +-- .../barretenberg/sumcheck/sumcheck.test.cpp | 47 +--- .../goblin_translator_composer.cpp | 84 +------ .../goblin_translator_prover.cpp | 217 +----------------- .../ultra_honk/protogalaxy.test.cpp | 47 +--- .../ultra_honk/relation_correctness.test.cpp | 18 +- .../vm/generated/AvmMini_composer.cpp | 26 +-- .../vm/generated/AvmMini_prover.cpp | 43 +--- .../vm/generated/Fib_composer.cpp | 8 +- .../barretenberg/vm/generated/Fib_prover.cpp | 22 +- 20 files changed, 93 insertions(+), 496 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index 123e470b905e..e22dc73baa8b 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -32,7 +32,7 @@ ECCVMProver_::ECCVMProver_(const std::shared_ptrz_perm = Polynomial(key->circuit_size); for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { - prover_poly = key_poly.clone(); + prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { prover_poly = key_poly.shifted(); @@ -85,7 +85,7 @@ template void ECCVMProver_::execute_log_derivative_ lookup_library::compute_logderivative_inverse( prover_polynomials, relation_parameters, key->circuit_size); transcript->send_to_verifier(commitment_labels.lookup_inverses, commitment_key->commit(key->lookup_inverses)); - prover_polynomials.lookup_inverses = key->lookup_inverses.clone(); + prover_polynomials.lookup_inverses = key->lookup_inverses.share(); } /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 24339ecf1716..091b9a4ecca1 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -234,6 +234,15 @@ class AvmMiniFlavor { using Base = ProvingKey_, WitnessEntities>; using Base::Base; + RefVector get_to_be_shifted() + { + return { + memTrace_m_rw, + memTrace_m_addr, + memTrace_m_val, + + }; + }; // The plookup wires that store plookup read data. std::array get_table_column_wires() { return {}; }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp index 0367781c9bb0..48512888327b 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp @@ -142,6 +142,13 @@ class FibFlavor { using Base = ProvingKey_, WitnessEntities>; using Base::Base; + RefVector get_to_be_shifted() + { + return { + Fibonacci_x, + Fibonacci_y, + }; + }; // The plookup wires that store plookup read data. std::array get_table_column_wires() { return {}; }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 8f04adf39361..29e666a52d16 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -314,6 +314,11 @@ class GoblinUltra { size_t num_ecc_op_gates; // needed to determine public input offset + RefVector get_to_be_shifted() + { + return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, + this->w_o, this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; + }; // The plookup wires that store plookup read data. std::array get_table_column_wires() { return { w_l, w_r, w_o }; }; }; diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp index d4a5721d13b4..3f2ff03a604e 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp @@ -422,13 +422,13 @@ template inline void compute_lagrange_polynomials_for_goblin_t lagrange_polynomial_odd_in_minicircuit[i] = 1; lagrange_polynomial_even_in_minicircut[i + 1] = 1; } - proving_key->lagrange_odd_in_minicircuit = lagrange_polynomial_odd_in_minicircuit; + proving_key->lagrange_odd_in_minicircuit = lagrange_polynomial_odd_in_minicircuit.share(); - proving_key->lagrange_even_in_minicircuit = lagrange_polynomial_even_in_minicircut; + proving_key->lagrange_even_in_minicircuit = lagrange_polynomial_even_in_minicircut.share(); lagrange_polynomial_second[1] = 1; lagrange_polynomial_second_to_last_in_minicircuit[Flavor::MINI_CIRCUIT_SIZE - 2] = 1; - proving_key->lagrange_second_to_last_in_minicircuit = lagrange_polynomial_second_to_last_in_minicircuit; - proving_key->lagrange_second = lagrange_polynomial_second; + proving_key->lagrange_second_to_last_in_minicircuit = lagrange_polynomial_second_to_last_in_minicircuit.share(); + proving_key->lagrange_second = lagrange_polynomial_second.share(); } } // namespace proof_system::honk::permutation_library \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp index 4f41d40b06a2..8d36841d1f34 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp @@ -29,7 +29,7 @@ get_sequential_prover_polynomials(const size_t log_circuit_size, const size_t st ProverPolynomials prover_polynomials; for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage)) { - prover_poly = storage_poly.clone(); + prover_poly = storage_poly.share(); } return std::pair(std::move(storage), prover_polynomials); @@ -55,7 +55,7 @@ get_zero_prover_polynomials(const size_t log_circuit_size) ProverPolynomials prover_polynomials; for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage)) { - prover_poly = storage_poly.clone(); + prover_poly = storage_poly.share(); } return std::pair(std::move(storage), prover_polynomials); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index 56eb2a21b3b2..8ab5d29cbc51 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -158,7 +158,7 @@ void compute_grand_products(std::shared_ptr& key, barretenberg::Polynomial& full_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials); auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(*key); - full_polynomial = key_polynomial.clone(); + full_polynomial = key_polynomial.share(); compute_grand_product(key->circuit_size, full_polynomials, relation_parameters); barretenberg::Polynomial& full_polynomial_shift = diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index 6008c7db312e..312ec117ceb0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -91,7 +91,7 @@ template class GrandProductTests : public testing::Test { typename Flavor::ProverPolynomials prover_polynomials; for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { - prover_poly = key_poly.clone(); + prover_poly = key_poly.share(); } // Method 1: Compute z_perm using 'compute_grand_product_polynomial' as the prover would in practice diff --git a/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store.cpp b/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store.cpp index 1cfad444e9f1..8712f4c4f92d 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/polynomial_store/polynomial_store.cpp @@ -26,7 +26,7 @@ template barretenberg::Polynomial PolynomialStore::get(std { // info("poly store get: ", key); // Take a shallow copy of the polynomial. Compiler will move the shallow copy to call site. - auto p = polynomial_map.at(key).clone(); + auto p = polynomial_map.at(key).share(); // info("got ", key, ": ", p.hash()); return p; }; diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index dce50d0220ca..c9d8cdcb2d59 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -45,7 +45,7 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1, idx * 128); restrict_to_standard_arithmetic_relation(prover_polynomials); storage_arrays[idx] = std::move(storage); - instance->prover_polynomials = prover_polynomials; + instance->prover_polynomials = std::move(prover_polynomials); instance_data[idx] = instance; } @@ -80,7 +80,7 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1); restrict_to_standard_arithmetic_relation(prover_polynomials); storage_arrays[idx] = std::move(storage); - instance->prover_polynomials = prover_polynomials; + instance->prover_polynomials = std::move(prover_polynomials); instance_data[idx] = instance; } @@ -171,7 +171,7 @@ TEST(Protogalaxy, CombinerOn4Instances) auto [storage, prover_polynomials] = proof_system::honk::get_zero_prover_polynomials( /*log_circuit_size=*/1); storage_arrays[idx] = std::move(storage); - instance->prover_polynomials = prover_polynomials; + instance->prover_polynomials = std::move(prover_polynomials); instance_data[idx] = instance; } diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 7513f9f456a5..e875f1fa64a8 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -55,10 +55,10 @@ template void ProverInstance_::compute_witness(Circuit& c // Construct the conventional wire polynomials auto wire_polynomials = construct_wire_polynomials_base(circuit, dyadic_circuit_size); - proving_key->w_l = wire_polynomials[0]; - proving_key->w_r = wire_polynomials[1]; - proving_key->w_o = wire_polynomials[2]; - proving_key->w_4 = wire_polynomials[3]; + proving_key->w_l = wire_polynomials[0].share(); + proving_key->w_r = wire_polynomials[1].share(); + proving_key->w_o = wire_polynomials[2].share(); + proving_key->w_4 = wire_polynomials[3].share(); // If Goblin, construct the ECC op queue wire and databus polynomials if constexpr (IsGoblinFlavor) { @@ -172,10 +172,10 @@ template void ProverInstance_::construct_ecc_op_wire_poly } } - proving_key->ecc_op_wire_1 = op_wire_polynomials[0].clone(); - proving_key->ecc_op_wire_2 = op_wire_polynomials[1].clone(); - proving_key->ecc_op_wire_3 = op_wire_polynomials[2].clone(); - proving_key->ecc_op_wire_4 = op_wire_polynomials[3].clone(); + proving_key->ecc_op_wire_1 = op_wire_polynomials[0].share(); + proving_key->ecc_op_wire_2 = op_wire_polynomials[1].share(); + proving_key->ecc_op_wire_3 = op_wire_polynomials[2].share(); + proving_key->ecc_op_wire_4 = op_wire_polynomials[3].share(); } /** @@ -198,8 +198,8 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) calldata_read_counts[idx] = circuit.get_variable(circuit.calldata_read_counts[idx]); } - proving_key->calldata = public_calldata; - proving_key->calldata_read_counts = calldata_read_counts; + proving_key->calldata = public_calldata.share(); + proving_key->calldata_read_counts = calldata_read_counts.share(); } template @@ -282,7 +282,7 @@ std::shared_ptr ProverInstance_::compute_pr template void ProverInstance_::initialize_prover_polynomials() { for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { - prover_poly = key_poly.clone(); + prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { prover_poly = key_poly.shifted(); @@ -307,12 +307,12 @@ template void ProverInstance_::compute_sorted_accumulator relation_parameters.eta = eta; // Compute sorted witness-table accumulator compute_sorted_list_accumulator(eta); - prover_polynomials.sorted_accum = proving_key->sorted_accum; + prover_polynomials.sorted_accum = proving_key->sorted_accum.share(); prover_polynomials.sorted_accum_shift = proving_key->sorted_accum.shifted(); // Finalize fourth wire polynomial by adding lookup memory records add_plookup_memory_records_to_wire_4(eta); - prover_polynomials.w_4 = proving_key->w_4; + prover_polynomials.w_4 = proving_key->w_4.share(); prover_polynomials.w_4_shift = proving_key->w_4.shifted(); } @@ -344,7 +344,7 @@ template void ProverInstance_::compute_sorted_list_accumu T0 += sorted_polynomials[0][i]; sorted_list_accumulator[i] = T0; } - proving_key->sorted_accum = sorted_list_accumulator; + proving_key->sorted_accum = sorted_list_accumulator.share(); } /** diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp index 2eaa93341a83..ac2f53ccd02b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp @@ -33,50 +33,9 @@ barretenberg::Polynomial random_poly(size_t size) ProverPolynomials construct_ultra_full_polynomials(auto& input_polynomials) { ProverPolynomials full_polynomials; - full_polynomials.q_c = input_polynomials[0]; - full_polynomials.q_l = input_polynomials[1]; - full_polynomials.q_r = input_polynomials[2]; - full_polynomials.q_o = input_polynomials[3]; - full_polynomials.q_4 = input_polynomials[4]; - full_polynomials.q_m = input_polynomials[5]; - full_polynomials.q_arith = input_polynomials[6]; - full_polynomials.q_sort = input_polynomials[7]; - full_polynomials.q_elliptic = input_polynomials[8]; - full_polynomials.q_aux = input_polynomials[9]; - full_polynomials.q_lookup = input_polynomials[10]; - full_polynomials.sigma_1 = input_polynomials[11]; - full_polynomials.sigma_2 = input_polynomials[12]; - full_polynomials.sigma_3 = input_polynomials[13]; - full_polynomials.sigma_4 = input_polynomials[14]; - full_polynomials.id_1 = input_polynomials[15]; - full_polynomials.id_2 = input_polynomials[16]; - full_polynomials.id_3 = input_polynomials[17]; - full_polynomials.id_4 = input_polynomials[18]; - full_polynomials.table_1 = input_polynomials[19]; - full_polynomials.table_2 = input_polynomials[20]; - full_polynomials.table_3 = input_polynomials[21]; - full_polynomials.table_4 = input_polynomials[22]; - full_polynomials.lagrange_first = input_polynomials[23]; - full_polynomials.lagrange_last = input_polynomials[24]; - full_polynomials.w_l = input_polynomials[25]; - full_polynomials.w_r = input_polynomials[26]; - full_polynomials.w_o = input_polynomials[27]; - full_polynomials.w_4 = input_polynomials[28]; - full_polynomials.sorted_accum = input_polynomials[29]; - full_polynomials.z_perm = input_polynomials[30]; - full_polynomials.z_lookup = input_polynomials[31]; - full_polynomials.table_1_shift = input_polynomials[32]; - full_polynomials.table_2_shift = input_polynomials[33]; - full_polynomials.table_3_shift = input_polynomials[34]; - full_polynomials.table_4_shift = input_polynomials[35]; - full_polynomials.w_l_shift = input_polynomials[36]; - full_polynomials.w_r_shift = input_polynomials[37]; - full_polynomials.w_o_shift = input_polynomials[38]; - full_polynomials.w_4_shift = input_polynomials[39]; - full_polynomials.sorted_accum_shift = input_polynomials[40]; - full_polynomials.z_perm_shift = input_polynomials[41]; - full_polynomials.z_lookup_shift = input_polynomials[42]; - + for (auto [full_poly, input_poly] : zip_view(full_polynomials.get_all(), input_polynomials)) { + full_poly = input_poly.share(); + } return full_polynomials; } diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp index ba6345c2a647..f31ea42ddd09 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp @@ -100,87 +100,9 @@ void GoblinTranslatorComposer::compute_witness(CircuitBuilder& circuit_builder) auto wire_polynomials = construct_wire_polynomials_base_goblin_translator(circuit_builder, dyadic_circuit_size); // Most of the witness polynomials are the original wire polynomials - proving_key->op = wire_polynomials[0]; - proving_key->x_lo_y_hi = wire_polynomials[1]; - proving_key->x_hi_z_1 = wire_polynomials[2]; - proving_key->y_lo_z_2 = wire_polynomials[3]; - proving_key->p_x_low_limbs = wire_polynomials[4]; - proving_key->p_x_low_limbs_range_constraint_0 = wire_polynomials[5]; - proving_key->p_x_low_limbs_range_constraint_1 = wire_polynomials[6]; - proving_key->p_x_low_limbs_range_constraint_2 = wire_polynomials[7]; - proving_key->p_x_low_limbs_range_constraint_3 = wire_polynomials[8]; - proving_key->p_x_low_limbs_range_constraint_4 = wire_polynomials[9]; - proving_key->p_x_low_limbs_range_constraint_tail = wire_polynomials[10]; - proving_key->p_x_high_limbs = wire_polynomials[11]; - proving_key->p_x_high_limbs_range_constraint_0 = wire_polynomials[12]; - proving_key->p_x_high_limbs_range_constraint_1 = wire_polynomials[13]; - proving_key->p_x_high_limbs_range_constraint_2 = wire_polynomials[14]; - proving_key->p_x_high_limbs_range_constraint_3 = wire_polynomials[15]; - proving_key->p_x_high_limbs_range_constraint_4 = wire_polynomials[16]; - proving_key->p_x_high_limbs_range_constraint_tail = wire_polynomials[17]; - proving_key->p_y_low_limbs = wire_polynomials[18]; - proving_key->p_y_low_limbs_range_constraint_0 = wire_polynomials[19]; - proving_key->p_y_low_limbs_range_constraint_1 = wire_polynomials[20]; - proving_key->p_y_low_limbs_range_constraint_2 = wire_polynomials[21]; - proving_key->p_y_low_limbs_range_constraint_3 = wire_polynomials[22]; - proving_key->p_y_low_limbs_range_constraint_4 = wire_polynomials[23]; - proving_key->p_y_low_limbs_range_constraint_tail = wire_polynomials[24]; - proving_key->p_y_high_limbs = wire_polynomials[25]; - proving_key->p_y_high_limbs_range_constraint_0 = wire_polynomials[26]; - proving_key->p_y_high_limbs_range_constraint_1 = wire_polynomials[27]; - proving_key->p_y_high_limbs_range_constraint_2 = wire_polynomials[28]; - proving_key->p_y_high_limbs_range_constraint_3 = wire_polynomials[29]; - proving_key->p_y_high_limbs_range_constraint_4 = wire_polynomials[30]; - proving_key->p_y_high_limbs_range_constraint_tail = wire_polynomials[31]; - proving_key->z_low_limbs = wire_polynomials[32]; - proving_key->z_low_limbs_range_constraint_0 = wire_polynomials[33]; - proving_key->z_low_limbs_range_constraint_1 = wire_polynomials[34]; - proving_key->z_low_limbs_range_constraint_2 = wire_polynomials[35]; - proving_key->z_low_limbs_range_constraint_3 = wire_polynomials[36]; - proving_key->z_low_limbs_range_constraint_4 = wire_polynomials[37]; - proving_key->z_low_limbs_range_constraint_tail = wire_polynomials[38]; - proving_key->z_high_limbs = wire_polynomials[39]; - proving_key->z_high_limbs_range_constraint_0 = wire_polynomials[40]; - proving_key->z_high_limbs_range_constraint_1 = wire_polynomials[41]; - proving_key->z_high_limbs_range_constraint_2 = wire_polynomials[42]; - proving_key->z_high_limbs_range_constraint_3 = wire_polynomials[43]; - proving_key->z_high_limbs_range_constraint_4 = wire_polynomials[44]; - proving_key->z_high_limbs_range_constraint_tail = wire_polynomials[45]; - proving_key->accumulators_binary_limbs_0 = wire_polynomials[46]; - proving_key->accumulators_binary_limbs_1 = wire_polynomials[47]; - proving_key->accumulators_binary_limbs_2 = wire_polynomials[48]; - proving_key->accumulators_binary_limbs_3 = wire_polynomials[49]; - proving_key->accumulator_low_limbs_range_constraint_0 = wire_polynomials[50]; - proving_key->accumulator_low_limbs_range_constraint_1 = wire_polynomials[51]; - proving_key->accumulator_low_limbs_range_constraint_2 = wire_polynomials[52]; - proving_key->accumulator_low_limbs_range_constraint_3 = wire_polynomials[53]; - proving_key->accumulator_low_limbs_range_constraint_4 = wire_polynomials[54]; - proving_key->accumulator_low_limbs_range_constraint_tail = wire_polynomials[55]; - proving_key->accumulator_high_limbs_range_constraint_0 = wire_polynomials[56]; - proving_key->accumulator_high_limbs_range_constraint_1 = wire_polynomials[57]; - proving_key->accumulator_high_limbs_range_constraint_2 = wire_polynomials[58]; - proving_key->accumulator_high_limbs_range_constraint_3 = wire_polynomials[59]; - proving_key->accumulator_high_limbs_range_constraint_4 = wire_polynomials[60]; - proving_key->accumulator_high_limbs_range_constraint_tail = wire_polynomials[61]; - proving_key->quotient_low_binary_limbs = wire_polynomials[62]; - proving_key->quotient_high_binary_limbs = wire_polynomials[63]; - proving_key->quotient_low_limbs_range_constraint_0 = wire_polynomials[64]; - proving_key->quotient_low_limbs_range_constraint_1 = wire_polynomials[65]; - proving_key->quotient_low_limbs_range_constraint_2 = wire_polynomials[66]; - proving_key->quotient_low_limbs_range_constraint_3 = wire_polynomials[67]; - proving_key->quotient_low_limbs_range_constraint_4 = wire_polynomials[68]; - proving_key->quotient_low_limbs_range_constraint_tail = wire_polynomials[69]; - proving_key->quotient_high_limbs_range_constraint_0 = wire_polynomials[70]; - proving_key->quotient_high_limbs_range_constraint_1 = wire_polynomials[71]; - proving_key->quotient_high_limbs_range_constraint_2 = wire_polynomials[72]; - proving_key->quotient_high_limbs_range_constraint_3 = wire_polynomials[73]; - proving_key->quotient_high_limbs_range_constraint_4 = wire_polynomials[74]; - proving_key->quotient_high_limbs_range_constraint_tail = wire_polynomials[75]; - proving_key->relation_wide_limbs = wire_polynomials[76]; - proving_key->relation_wide_limbs_range_constraint_0 = wire_polynomials[77]; - proving_key->relation_wide_limbs_range_constraint_1 = wire_polynomials[78]; - proving_key->relation_wide_limbs_range_constraint_2 = wire_polynomials[79]; - proving_key->relation_wide_limbs_range_constraint_3 = wire_polynomials[80]; + for (auto [key_poly, wire_poly] : zip_view(proving_key->get_all(), wire_polynomials)) { + key_poly = wire_poly.share(); + } // We construct concatenated versions of range constraint polynomials, where several polynomials are concatenated // into one. These polynomials are not commited to. diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index cd3e010b0d9b..ad6807a988cf 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -33,217 +33,12 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrop; - prover_polynomials.x_lo_y_hi = key->x_lo_y_hi; - prover_polynomials.x_hi_z_1 = key->x_hi_z_1; - prover_polynomials.y_lo_z_2 = key->y_lo_z_2; - prover_polynomials.p_x_low_limbs = key->p_x_low_limbs; - prover_polynomials.p_x_low_limbs_range_constraint_0 = key->p_x_low_limbs_range_constraint_0; - prover_polynomials.p_x_low_limbs_range_constraint_1 = key->p_x_low_limbs_range_constraint_1; - prover_polynomials.p_x_low_limbs_range_constraint_2 = key->p_x_low_limbs_range_constraint_2; - prover_polynomials.p_x_low_limbs_range_constraint_3 = key->p_x_low_limbs_range_constraint_3; - prover_polynomials.p_x_low_limbs_range_constraint_4 = key->p_x_low_limbs_range_constraint_4; - prover_polynomials.p_x_low_limbs_range_constraint_tail = key->p_x_low_limbs_range_constraint_tail; - prover_polynomials.p_x_high_limbs = key->p_x_high_limbs; - prover_polynomials.p_x_high_limbs_range_constraint_0 = key->p_x_high_limbs_range_constraint_0; - prover_polynomials.p_x_high_limbs_range_constraint_1 = key->p_x_high_limbs_range_constraint_1; - prover_polynomials.p_x_high_limbs_range_constraint_2 = key->p_x_high_limbs_range_constraint_2; - prover_polynomials.p_x_high_limbs_range_constraint_3 = key->p_x_high_limbs_range_constraint_3; - prover_polynomials.p_x_high_limbs_range_constraint_4 = key->p_x_high_limbs_range_constraint_4; - prover_polynomials.p_x_high_limbs_range_constraint_tail = key->p_x_high_limbs_range_constraint_tail; - prover_polynomials.p_y_low_limbs = key->p_y_low_limbs; - prover_polynomials.p_y_low_limbs_range_constraint_0 = key->p_y_low_limbs_range_constraint_0; - prover_polynomials.p_y_low_limbs_range_constraint_1 = key->p_y_low_limbs_range_constraint_1; - prover_polynomials.p_y_low_limbs_range_constraint_2 = key->p_y_low_limbs_range_constraint_2; - prover_polynomials.p_y_low_limbs_range_constraint_3 = key->p_y_low_limbs_range_constraint_3; - prover_polynomials.p_y_low_limbs_range_constraint_4 = key->p_y_low_limbs_range_constraint_4; - prover_polynomials.p_y_low_limbs_range_constraint_tail = key->p_y_low_limbs_range_constraint_tail; - prover_polynomials.p_y_high_limbs = key->p_y_high_limbs; - prover_polynomials.p_y_high_limbs_range_constraint_0 = key->p_y_high_limbs_range_constraint_0; - prover_polynomials.p_y_high_limbs_range_constraint_1 = key->p_y_high_limbs_range_constraint_1; - prover_polynomials.p_y_high_limbs_range_constraint_2 = key->p_y_high_limbs_range_constraint_2; - prover_polynomials.p_y_high_limbs_range_constraint_3 = key->p_y_high_limbs_range_constraint_3; - prover_polynomials.p_y_high_limbs_range_constraint_4 = key->p_y_high_limbs_range_constraint_4; - prover_polynomials.p_y_high_limbs_range_constraint_tail = key->p_y_high_limbs_range_constraint_tail; - prover_polynomials.z_low_limbs = key->z_low_limbs; - prover_polynomials.z_low_limbs_range_constraint_0 = key->z_low_limbs_range_constraint_0; - prover_polynomials.z_low_limbs_range_constraint_1 = key->z_low_limbs_range_constraint_1; - prover_polynomials.z_low_limbs_range_constraint_2 = key->z_low_limbs_range_constraint_2; - prover_polynomials.z_low_limbs_range_constraint_3 = key->z_low_limbs_range_constraint_3; - prover_polynomials.z_low_limbs_range_constraint_4 = key->z_low_limbs_range_constraint_4; - prover_polynomials.z_low_limbs_range_constraint_tail = key->z_low_limbs_range_constraint_tail; - prover_polynomials.z_high_limbs = key->z_high_limbs; - prover_polynomials.z_high_limbs_range_constraint_0 = key->z_high_limbs_range_constraint_0; - prover_polynomials.z_high_limbs_range_constraint_1 = key->z_high_limbs_range_constraint_1; - prover_polynomials.z_high_limbs_range_constraint_2 = key->z_high_limbs_range_constraint_2; - prover_polynomials.z_high_limbs_range_constraint_3 = key->z_high_limbs_range_constraint_3; - prover_polynomials.z_high_limbs_range_constraint_4 = key->z_high_limbs_range_constraint_4; - prover_polynomials.z_high_limbs_range_constraint_tail = key->z_high_limbs_range_constraint_tail; - prover_polynomials.accumulators_binary_limbs_0 = key->accumulators_binary_limbs_0; - prover_polynomials.accumulators_binary_limbs_1 = key->accumulators_binary_limbs_1; - prover_polynomials.accumulators_binary_limbs_2 = key->accumulators_binary_limbs_2; - prover_polynomials.accumulators_binary_limbs_3 = key->accumulators_binary_limbs_3; - prover_polynomials.accumulator_low_limbs_range_constraint_0 = key->accumulator_low_limbs_range_constraint_0; - prover_polynomials.accumulator_low_limbs_range_constraint_1 = key->accumulator_low_limbs_range_constraint_1; - prover_polynomials.accumulator_low_limbs_range_constraint_2 = key->accumulator_low_limbs_range_constraint_2; - prover_polynomials.accumulator_low_limbs_range_constraint_3 = key->accumulator_low_limbs_range_constraint_3; - prover_polynomials.accumulator_low_limbs_range_constraint_4 = key->accumulator_low_limbs_range_constraint_4; - prover_polynomials.accumulator_low_limbs_range_constraint_tail = key->accumulator_low_limbs_range_constraint_tail; - prover_polynomials.accumulator_high_limbs_range_constraint_0 = key->accumulator_high_limbs_range_constraint_0; - prover_polynomials.accumulator_high_limbs_range_constraint_1 = key->accumulator_high_limbs_range_constraint_1; - prover_polynomials.accumulator_high_limbs_range_constraint_2 = key->accumulator_high_limbs_range_constraint_2; - prover_polynomials.accumulator_high_limbs_range_constraint_3 = key->accumulator_high_limbs_range_constraint_3; - prover_polynomials.accumulator_high_limbs_range_constraint_4 = key->accumulator_high_limbs_range_constraint_4; - prover_polynomials.accumulator_high_limbs_range_constraint_tail = key->accumulator_high_limbs_range_constraint_tail; - prover_polynomials.quotient_low_binary_limbs = key->quotient_low_binary_limbs; - prover_polynomials.quotient_high_binary_limbs = key->quotient_high_binary_limbs; - prover_polynomials.quotient_low_limbs_range_constraint_0 = key->quotient_low_limbs_range_constraint_0; - prover_polynomials.quotient_low_limbs_range_constraint_1 = key->quotient_low_limbs_range_constraint_1; - prover_polynomials.quotient_low_limbs_range_constraint_2 = key->quotient_low_limbs_range_constraint_2; - prover_polynomials.quotient_low_limbs_range_constraint_3 = key->quotient_low_limbs_range_constraint_3; - prover_polynomials.quotient_low_limbs_range_constraint_4 = key->quotient_low_limbs_range_constraint_4; - prover_polynomials.quotient_low_limbs_range_constraint_tail = key->quotient_low_limbs_range_constraint_tail; - prover_polynomials.quotient_high_limbs_range_constraint_0 = key->quotient_high_limbs_range_constraint_0; - prover_polynomials.quotient_high_limbs_range_constraint_1 = key->quotient_high_limbs_range_constraint_1; - prover_polynomials.quotient_high_limbs_range_constraint_2 = key->quotient_high_limbs_range_constraint_2; - prover_polynomials.quotient_high_limbs_range_constraint_3 = key->quotient_high_limbs_range_constraint_3; - prover_polynomials.quotient_high_limbs_range_constraint_4 = key->quotient_high_limbs_range_constraint_4; - prover_polynomials.quotient_high_limbs_range_constraint_tail = key->quotient_high_limbs_range_constraint_tail; - prover_polynomials.relation_wide_limbs = key->relation_wide_limbs; - prover_polynomials.relation_wide_limbs_range_constraint_0 = key->relation_wide_limbs_range_constraint_0; - prover_polynomials.relation_wide_limbs_range_constraint_1 = key->relation_wide_limbs_range_constraint_1; - prover_polynomials.relation_wide_limbs_range_constraint_2 = key->relation_wide_limbs_range_constraint_2; - prover_polynomials.relation_wide_limbs_range_constraint_3 = key->relation_wide_limbs_range_constraint_3; - prover_polynomials.concatenated_range_constraints_0 = key->concatenated_range_constraints_0; - prover_polynomials.concatenated_range_constraints_1 = key->concatenated_range_constraints_1; - prover_polynomials.concatenated_range_constraints_2 = key->concatenated_range_constraints_2; - prover_polynomials.concatenated_range_constraints_3 = key->concatenated_range_constraints_3; - prover_polynomials.ordered_range_constraints_0 = key->ordered_range_constraints_0; - prover_polynomials.ordered_range_constraints_1 = key->ordered_range_constraints_1; - prover_polynomials.ordered_range_constraints_2 = key->ordered_range_constraints_2; - prover_polynomials.ordered_range_constraints_3 = key->ordered_range_constraints_3; - prover_polynomials.ordered_range_constraints_4 = key->ordered_range_constraints_4; - prover_polynomials.x_lo_y_hi_shift = key->x_lo_y_hi.shifted(); - prover_polynomials.x_hi_z_1_shift = key->x_hi_z_1.shifted(); - prover_polynomials.y_lo_z_2_shift = key->y_lo_z_2.shifted(); - prover_polynomials.p_x_low_limbs_shift = key->p_x_low_limbs.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_0_shift = key->p_x_low_limbs_range_constraint_0.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_1_shift = key->p_x_low_limbs_range_constraint_1.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_2_shift = key->p_x_low_limbs_range_constraint_2.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_3_shift = key->p_x_low_limbs_range_constraint_3.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_4_shift = key->p_x_low_limbs_range_constraint_4.shifted(); - prover_polynomials.p_x_low_limbs_range_constraint_tail_shift = key->p_x_low_limbs_range_constraint_tail.shifted(); - prover_polynomials.p_x_high_limbs_shift = key->p_x_high_limbs.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_0_shift = key->p_x_high_limbs_range_constraint_0.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_1_shift = key->p_x_high_limbs_range_constraint_1.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_2_shift = key->p_x_high_limbs_range_constraint_2.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_3_shift = key->p_x_high_limbs_range_constraint_3.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_4_shift = key->p_x_high_limbs_range_constraint_4.shifted(); - prover_polynomials.p_x_high_limbs_range_constraint_tail_shift = key->p_x_high_limbs_range_constraint_tail.shifted(); - prover_polynomials.p_y_low_limbs_shift = key->p_y_low_limbs.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_0_shift = key->p_y_low_limbs_range_constraint_0.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_1_shift = key->p_y_low_limbs_range_constraint_1.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_2_shift = key->p_y_low_limbs_range_constraint_2.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_3_shift = key->p_y_low_limbs_range_constraint_3.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_4_shift = key->p_y_low_limbs_range_constraint_4.shifted(); - prover_polynomials.p_y_low_limbs_range_constraint_tail_shift = key->p_y_low_limbs_range_constraint_tail.shifted(); - prover_polynomials.p_y_high_limbs_shift = key->p_y_high_limbs.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_0_shift = key->p_y_high_limbs_range_constraint_0.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_1_shift = key->p_y_high_limbs_range_constraint_1.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_2_shift = key->p_y_high_limbs_range_constraint_2.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_3_shift = key->p_y_high_limbs_range_constraint_3.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_4_shift = key->p_y_high_limbs_range_constraint_4.shifted(); - prover_polynomials.p_y_high_limbs_range_constraint_tail_shift = key->p_y_high_limbs_range_constraint_tail.shifted(); - prover_polynomials.z_low_limbs_shift = key->z_low_limbs.shifted(); - prover_polynomials.z_low_limbs_range_constraint_0_shift = key->z_low_limbs_range_constraint_0.shifted(); - prover_polynomials.z_low_limbs_range_constraint_1_shift = key->z_low_limbs_range_constraint_1.shifted(); - prover_polynomials.z_low_limbs_range_constraint_2_shift = key->z_low_limbs_range_constraint_2.shifted(); - prover_polynomials.z_low_limbs_range_constraint_3_shift = key->z_low_limbs_range_constraint_3.shifted(); - prover_polynomials.z_low_limbs_range_constraint_4_shift = key->z_low_limbs_range_constraint_4.shifted(); - prover_polynomials.z_low_limbs_range_constraint_tail_shift = key->z_low_limbs_range_constraint_tail.shifted(); - prover_polynomials.z_high_limbs_shift = key->z_high_limbs.shifted(); - prover_polynomials.z_high_limbs_range_constraint_0_shift = key->z_high_limbs_range_constraint_0.shifted(); - prover_polynomials.z_high_limbs_range_constraint_1_shift = key->z_high_limbs_range_constraint_1.shifted(); - prover_polynomials.z_high_limbs_range_constraint_2_shift = key->z_high_limbs_range_constraint_2.shifted(); - prover_polynomials.z_high_limbs_range_constraint_3_shift = key->z_high_limbs_range_constraint_3.shifted(); - prover_polynomials.z_high_limbs_range_constraint_4_shift = key->z_high_limbs_range_constraint_4.shifted(); - prover_polynomials.z_high_limbs_range_constraint_tail_shift = key->z_high_limbs_range_constraint_tail.shifted(); - prover_polynomials.accumulators_binary_limbs_0_shift = key->accumulators_binary_limbs_0.shifted(); - prover_polynomials.accumulators_binary_limbs_1_shift = key->accumulators_binary_limbs_1.shifted(); - prover_polynomials.accumulators_binary_limbs_2_shift = key->accumulators_binary_limbs_2.shifted(); - prover_polynomials.accumulators_binary_limbs_3_shift = key->accumulators_binary_limbs_3.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_0_shift = - key->accumulator_low_limbs_range_constraint_0.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_1_shift = - key->accumulator_low_limbs_range_constraint_1.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_2_shift = - key->accumulator_low_limbs_range_constraint_2.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_3_shift = - key->accumulator_low_limbs_range_constraint_3.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_4_shift = - key->accumulator_low_limbs_range_constraint_4.shifted(); - prover_polynomials.accumulator_low_limbs_range_constraint_tail_shift = - key->accumulator_low_limbs_range_constraint_tail.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_0_shift = - key->accumulator_high_limbs_range_constraint_0.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_1_shift = - key->accumulator_high_limbs_range_constraint_1.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_2_shift = - key->accumulator_high_limbs_range_constraint_2.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_3_shift = - key->accumulator_high_limbs_range_constraint_3.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_4_shift = - key->accumulator_high_limbs_range_constraint_4.shifted(); - prover_polynomials.accumulator_high_limbs_range_constraint_tail_shift = - key->accumulator_high_limbs_range_constraint_tail.shifted(); - prover_polynomials.quotient_low_binary_limbs_shift = key->quotient_low_binary_limbs.shifted(); - prover_polynomials.quotient_high_binary_limbs_shift = key->quotient_high_binary_limbs.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_0_shift = - key->quotient_low_limbs_range_constraint_0.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_1_shift = - key->quotient_low_limbs_range_constraint_1.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_2_shift = - key->quotient_low_limbs_range_constraint_2.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_3_shift = - key->quotient_low_limbs_range_constraint_3.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_4_shift = - key->quotient_low_limbs_range_constraint_4.shifted(); - prover_polynomials.quotient_low_limbs_range_constraint_tail_shift = - key->quotient_low_limbs_range_constraint_tail.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_0_shift = - key->quotient_high_limbs_range_constraint_0.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_1_shift = - key->quotient_high_limbs_range_constraint_1.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_2_shift = - key->quotient_high_limbs_range_constraint_2.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_3_shift = - key->quotient_high_limbs_range_constraint_3.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_4_shift = - key->quotient_high_limbs_range_constraint_4.shifted(); - prover_polynomials.quotient_high_limbs_range_constraint_tail_shift = - key->quotient_high_limbs_range_constraint_tail.shifted(); - prover_polynomials.relation_wide_limbs_shift = key->relation_wide_limbs.shifted(); - prover_polynomials.relation_wide_limbs_range_constraint_0_shift = - key->relation_wide_limbs_range_constraint_0.shifted(); - prover_polynomials.relation_wide_limbs_range_constraint_1_shift = - key->relation_wide_limbs_range_constraint_1.shifted(); - prover_polynomials.relation_wide_limbs_range_constraint_2_shift = - key->relation_wide_limbs_range_constraint_2.shifted(); - prover_polynomials.relation_wide_limbs_range_constraint_3_shift = - key->relation_wide_limbs_range_constraint_3.shifted(); - prover_polynomials.ordered_range_constraints_0_shift = key->ordered_range_constraints_0.shifted(); - prover_polynomials.ordered_range_constraints_1_shift = key->ordered_range_constraints_1.shifted(); - prover_polynomials.ordered_range_constraints_2_shift = key->ordered_range_constraints_2.shifted(); - prover_polynomials.ordered_range_constraints_3_shift = key->ordered_range_constraints_3.shifted(); - prover_polynomials.ordered_range_constraints_4_shift = key->ordered_range_constraints_4.shifted(); - prover_polynomials.lagrange_first = key->lagrange_first; - prover_polynomials.lagrange_last = key->lagrange_last; - prover_polynomials.lagrange_odd_in_minicircuit = key->lagrange_odd_in_minicircuit; - prover_polynomials.lagrange_even_in_minicircuit = key->lagrange_even_in_minicircuit; - prover_polynomials.lagrange_second = key->lagrange_second; - prover_polynomials.lagrange_second_to_last_in_minicircuit = key->lagrange_second_to_last_in_minicircuit; - prover_polynomials.ordered_extra_range_constraints_numerator = key->ordered_extra_range_constraints_numerator; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); + } } /** diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp index fac96d16cc68..f59f4b5bcb2c 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp @@ -34,50 +34,9 @@ barretenberg::Polynomial get_random_polynomial(size_t size) ProverPolynomials construct_ultra_full_polynomials(auto& input_polynomials) { ProverPolynomials full_polynomials; - full_polynomials.q_c = input_polynomials[0]; - full_polynomials.q_l = input_polynomials[1]; - full_polynomials.q_r = input_polynomials[2]; - full_polynomials.q_o = input_polynomials[3]; - full_polynomials.q_4 = input_polynomials[4]; - full_polynomials.q_m = input_polynomials[5]; - full_polynomials.q_arith = input_polynomials[6]; - full_polynomials.q_sort = input_polynomials[7]; - full_polynomials.q_elliptic = input_polynomials[8]; - full_polynomials.q_aux = input_polynomials[9]; - full_polynomials.q_lookup = input_polynomials[10]; - full_polynomials.sigma_1 = input_polynomials[11]; - full_polynomials.sigma_2 = input_polynomials[12]; - full_polynomials.sigma_3 = input_polynomials[13]; - full_polynomials.sigma_4 = input_polynomials[14]; - full_polynomials.id_1 = input_polynomials[15]; - full_polynomials.id_2 = input_polynomials[16]; - full_polynomials.id_3 = input_polynomials[17]; - full_polynomials.id_4 = input_polynomials[18]; - full_polynomials.table_1 = input_polynomials[19]; - full_polynomials.table_2 = input_polynomials[20]; - full_polynomials.table_3 = input_polynomials[21]; - full_polynomials.table_4 = input_polynomials[22]; - full_polynomials.lagrange_first = input_polynomials[23]; - full_polynomials.lagrange_last = input_polynomials[24]; - full_polynomials.w_l = input_polynomials[25]; - full_polynomials.w_r = input_polynomials[26]; - full_polynomials.w_o = input_polynomials[27]; - full_polynomials.w_4 = input_polynomials[28]; - full_polynomials.sorted_accum = input_polynomials[29]; - full_polynomials.z_perm = input_polynomials[30]; - full_polynomials.z_lookup = input_polynomials[31]; - full_polynomials.table_1_shift = input_polynomials[32]; - full_polynomials.table_2_shift = input_polynomials[33]; - full_polynomials.table_3_shift = input_polynomials[34]; - full_polynomials.table_4_shift = input_polynomials[35]; - full_polynomials.w_l_shift = input_polynomials[36]; - full_polynomials.w_r_shift = input_polynomials[37]; - full_polynomials.w_o_shift = input_polynomials[38]; - full_polynomials.w_4_shift = input_polynomials[39]; - full_polynomials.sorted_accum_shift = input_polynomials[40]; - full_polynomials.z_perm_shift = input_polynomials[41]; - full_polynomials.z_lookup_shift = input_polynomials[42]; - + for (auto [prover_poly, input_poly] : zip_view(full_polynomials.get_all(), input_polynomials)) { + prover_poly = input_poly.share(); + } return full_polynomials; } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 6dfcbe4c4eb9..9bd2ee0861ee 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -401,7 +401,7 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorPermutationRelationCorrectness) } Polynomial temporary_polynomial(circuit_size); polynomial_container.push_back(temporary_polynomial); - polynomial_get_all[i] = polynomial_container[i]; + polynomial_get_all[i] = polynomial_container[i].share(); } // Fill in lagrange polynomials used in the permutation relation @@ -528,7 +528,7 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorGenPermSortRelationCorrectness) ordered_range_constraints_index = i; } polynomial_container.push_back(temporary_polynomial); - polynomial_get_all[i] = polynomial_container[i]; + polynomial_get_all[i] = polynomial_container[i].share(); } // Construct lagrange polynomials that are needed for Goblin Translator's GenPermSort Relation @@ -635,15 +635,15 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorExtraRelationsCorrectness) for (auto& id : shifted_ids) { shifted_id_set.emplace(id); } - // Assign spans to non-shifted prover polynomials + // Assign to non-shifted prover polynomials auto polynomial_get_all = prover_polynomials.get_all(); for (size_t i = 0; i < polynomial_get_all.size(); i++) { if (!shifted_id_set.contains(i)) { - polynomial_get_all[i] = polynomial_container[i]; + polynomial_get_all[i] = polynomial_container[i].share(); } } - // Assign shifted spans to shifted prover polynomials using ids + // Assign to shifted prover polynomials using ids for (size_t i = 0; i < shifted_ids.size(); i++) { auto shifted_id = shifted_ids[i]; auto to_be_shifted_id = prover_polynomial_ids.get_to_be_shifted()[i]; @@ -737,7 +737,7 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorDecompositionRelationCorrectnes // Assign spans to non-shifted prover polynomials for (size_t i = 0; i < polynomial_get_all.size(); i++) { if (!shifted_id_set.contains(i)) { - polynomial_get_all[i] = polynomial_container[i]; + polynomial_get_all[i] = polynomial_container[i].share(); } } @@ -1153,14 +1153,14 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorNonNativeRelationCorrectness) for (auto& id : shifted_ids) { shifted_id_set.emplace(id); } - // Assign spans to non-shifted prover polynomials + // Assign to non-shifted prover polynomials for (size_t i = 0; i < polynomial_get_all.size(); i++) { if (!shifted_id_set.contains(i)) { - polynomial_get_all[i] = polynomial_container[i]; + polynomial_get_all[i] = polynomial_container[i].share(); } } - // Assign shifted spans to shifted prover polynomials using ids + // Assign to shifted prover polynomials using ids for (size_t i = 0; i < shifted_ids.size(); i++) { auto shifted_id = shifted_ids[i]; auto to_be_shifted_id = prover_polynomial_ids.get_to_be_shifted()[i]; diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp index 6b6bb8f5550e..0e4a8789ca7e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp @@ -17,28 +17,10 @@ void AvmMiniComposer::compute_witness(CircuitConstructor& circuit) auto polynomials = circuit.compute_polynomials(); - proving_key->avmMini_clk = polynomials.avmMini_clk; - proving_key->avmMini_first = polynomials.avmMini_first; - proving_key->memTrace_m_clk = polynomials.memTrace_m_clk; - proving_key->memTrace_m_sub_clk = polynomials.memTrace_m_sub_clk; - proving_key->memTrace_m_addr = polynomials.memTrace_m_addr; - proving_key->memTrace_m_val = polynomials.memTrace_m_val; - proving_key->memTrace_m_lastAccess = polynomials.memTrace_m_lastAccess; - proving_key->memTrace_m_rw = polynomials.memTrace_m_rw; - proving_key->avmMini_subop = polynomials.avmMini_subop; - proving_key->avmMini_ia = polynomials.avmMini_ia; - proving_key->avmMini_ib = polynomials.avmMini_ib; - proving_key->avmMini_ic = polynomials.avmMini_ic; - proving_key->avmMini_mem_op_a = polynomials.avmMini_mem_op_a; - proving_key->avmMini_mem_op_b = polynomials.avmMini_mem_op_b; - proving_key->avmMini_mem_op_c = polynomials.avmMini_mem_op_c; - proving_key->avmMini_rwa = polynomials.avmMini_rwa; - proving_key->avmMini_rwb = polynomials.avmMini_rwb; - proving_key->avmMini_rwc = polynomials.avmMini_rwc; - proving_key->avmMini_mem_idx_a = polynomials.avmMini_mem_idx_a; - proving_key->avmMini_mem_idx_b = polynomials.avmMini_mem_idx_b; - proving_key->avmMini_mem_idx_c = polynomials.avmMini_mem_idx_c; - proving_key->avmMini_last = polynomials.avmMini_last; + for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) { + // TODO(AD): can this be shared instead? + key_poly = prover_poly.deep_clone(); + } computed_witness = true; } diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp index 913dc1219887..84e344621358 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp @@ -29,43 +29,12 @@ AvmMiniProver::AvmMiniProver(std::shared_ptr input_key, : key(input_key) , commitment_key(commitment_key) { - // TODO: take every polynomial and assign it to the key!! - - prover_polynomials.avmMini_clk = key->avmMini_clk; - prover_polynomials.avmMini_first = key->avmMini_first; - prover_polynomials.memTrace_m_clk = key->memTrace_m_clk; - prover_polynomials.memTrace_m_sub_clk = key->memTrace_m_sub_clk; - prover_polynomials.memTrace_m_addr = key->memTrace_m_addr; - prover_polynomials.memTrace_m_val = key->memTrace_m_val; - prover_polynomials.memTrace_m_lastAccess = key->memTrace_m_lastAccess; - prover_polynomials.memTrace_m_rw = key->memTrace_m_rw; - prover_polynomials.avmMini_subop = key->avmMini_subop; - prover_polynomials.avmMini_ia = key->avmMini_ia; - prover_polynomials.avmMini_ib = key->avmMini_ib; - prover_polynomials.avmMini_ic = key->avmMini_ic; - prover_polynomials.avmMini_mem_op_a = key->avmMini_mem_op_a; - prover_polynomials.avmMini_mem_op_b = key->avmMini_mem_op_b; - prover_polynomials.avmMini_mem_op_c = key->avmMini_mem_op_c; - prover_polynomials.avmMini_rwa = key->avmMini_rwa; - prover_polynomials.avmMini_rwb = key->avmMini_rwb; - prover_polynomials.avmMini_rwc = key->avmMini_rwc; - prover_polynomials.avmMini_mem_idx_a = key->avmMini_mem_idx_a; - prover_polynomials.avmMini_mem_idx_b = key->avmMini_mem_idx_b; - prover_polynomials.avmMini_mem_idx_c = key->avmMini_mem_idx_c; - prover_polynomials.avmMini_last = key->avmMini_last; - - prover_polynomials.memTrace_m_addr = key->memTrace_m_addr; - prover_polynomials.memTrace_m_addr_shift = key->memTrace_m_addr.shifted(); - - prover_polynomials.memTrace_m_rw = key->memTrace_m_rw; - prover_polynomials.memTrace_m_rw_shift = key->memTrace_m_rw.shifted(); - - prover_polynomials.memTrace_m_val = key->memTrace_m_val; - prover_polynomials.memTrace_m_val_shift = key->memTrace_m_val.shifted(); - - // prover_polynomials.lookup_inverses = key->lookup_inverses; - // key->z_perm = Polynomial(key->circuit_size); - // prover_polynomials.z_perm = key->z_perm; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); + } } /** diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/Fib_composer.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/Fib_composer.cpp index 7a78c264e75a..42b7917d0467 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/Fib_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/Fib_composer.cpp @@ -17,10 +17,10 @@ void FibComposer::compute_witness(CircuitConstructor& circuit) auto polynomials = circuit.compute_polynomials(); - proving_key->Fibonacci_LAST = polynomials.Fibonacci_LAST; - proving_key->Fibonacci_FIRST = polynomials.Fibonacci_FIRST; - proving_key->Fibonacci_x = polynomials.Fibonacci_x; - proving_key->Fibonacci_y = polynomials.Fibonacci_y; + for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) { + // TODO(AD): can this be shared instead? + key_poly = prover_poly.deep_clone(); + } computed_witness = true; } diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/Fib_prover.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/Fib_prover.cpp index b8cd3fe89077..4bce66f6bcbb 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/Fib_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/Fib_prover.cpp @@ -28,22 +28,12 @@ FibProver::FibProver(std::shared_ptr input_key, std::shared_ : key(input_key) , commitment_key(commitment_key) { - // TODO: take every polynomial and assign it to the key!! - - prover_polynomials.Fibonacci_LAST = key->Fibonacci_LAST; - prover_polynomials.Fibonacci_FIRST = key->Fibonacci_FIRST; - prover_polynomials.Fibonacci_x = key->Fibonacci_x; - prover_polynomials.Fibonacci_y = key->Fibonacci_y; - - prover_polynomials.Fibonacci_x = key->Fibonacci_x; - prover_polynomials.Fibonacci_x_shift = key->Fibonacci_x.shifted(); - - prover_polynomials.Fibonacci_y = key->Fibonacci_y; - prover_polynomials.Fibonacci_y_shift = key->Fibonacci_y.shifted(); - - // prover_polynomials.lookup_inverses = key->lookup_inverses; - // key->z_perm = Polynomial(key->circuit_size); - // prover_polynomials.z_perm = key->z_perm; + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); + } } /** From d1299d99c09077240c831526b1eafd0b92ee381b Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 6 Dec 2023 23:06:22 +0000 Subject: [PATCH 12/60] Passing polynomial tests --- .../cpp/src/barretenberg/polynomials/polynomial.cpp | 13 ++++++++++++- .../cpp/src/barretenberg/polynomials/polynomial.hpp | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index 232c688c7d79..ab3b37a9504a 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -75,7 +75,6 @@ template Polynomial::Polynomial(const Polynomial& other, c } // move constructor -// TODO(AD) why is this not =default? template Polynomial::Polynomial(Polynomial&& other) noexcept : backing_memory_(std::exchange(other.backing_memory_, nullptr)) @@ -126,6 +125,18 @@ template Polynomial& Polynomial::operator=(std::span Polynomial& Polynomial::operator=(Polynomial&& other) noexcept +{ + if (&other == this) { + return *this; + } + + // simultaneously set members and clear other + backing_memory_ = std::exchange(other.backing_memory_, nullptr); + coefficients_ = std::exchange(other.coefficients_, nullptr); + size_ = std::exchange(other.size_, 0); + return *this; +} template Polynomial Polynomial::share() const { diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 3e4b594a565b..74ade70000e3 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -48,7 +48,7 @@ template class Polynomial { Polynomial(std::span interpolation_points, std::span evaluations); // move assignment - Polynomial& operator=(Polynomial&& other) noexcept = default; + Polynomial& operator=(Polynomial&& other) noexcept; Polynomial& operator=(std::span coefficients) noexcept; Polynomial& operator=(const Polynomial& other) = delete; ~Polynomial() = default; From 78ff9af3f171091791df30a2eac96e072f2db811 Mon Sep 17 00:00:00 2001 From: ludamad Date: Thu, 7 Dec 2023 15:25:15 +0000 Subject: [PATCH 13/60] refactor(bb): less auto in zeromorph --- .../zeromorph/zeromorph.hpp | 21 ++++++++++--------- .../zeromorph/zeromorph.test.cpp | 6 ++---- .../barretenberg/polynomials/polynomial.cpp | 2 +- .../serialize/msgpack_schema.test.cpp | 10 ++++----- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 40fac5530d32..e87ec9861c93 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/commitment_schemes/commitment_key.hpp" #include "barretenberg/common/ref_vector.hpp" #include "barretenberg/common/zip_view.hpp" #include "barretenberg/polynomials/polynomial.hpp" @@ -59,7 +60,7 @@ template class ZeroMorphProver_ { * @param u_challenge Multivariate challenge u = (u_0, ..., u_{d-1}) * @return std::vector The quotients q_k */ - static std::vector compute_multilinear_quotients(Polynomial polynomial, std::span u_challenge) + static std::vector compute_multilinear_quotients(Polynomial polynomial, std::span u_challenge) { size_t log_N = numeric::get_msb(polynomial.size()); // The size of the multilinear challenge must equal the log of the polynomial size @@ -206,7 +207,7 @@ template class ZeroMorphProver_ { Polynomial& g_batched, std::vector& quotients, FF v_evaluation, - std::span u_challenge, + std::span u_challenge, FF x_challenge, std::vector concatenation_groups_batched = {}) { @@ -315,13 +316,13 @@ template class ZeroMorphProver_ { * @param commitment_key * @param transcript */ - static void prove(const auto& f_polynomials, - const auto& g_polynomials, - auto&& f_evaluations, - auto&& g_shift_evaluations, - auto& multilinear_challenge, - auto& commitment_key, - const auto& transcript, + static void prove(const std::vector& f_polynomials, + const std::vector& g_polynomials, + const std::vector& f_evaluations, + const std::vector& g_shift_evaluations, + const std::vector& multilinear_challenge, + const std::shared_ptr>& commitment_key, + const std::shared_ptr& transcript, const std::vector& concatenated_polynomials = {}, const std::vector& concatenated_evaluations = {}, // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) remove span @@ -331,7 +332,7 @@ template class ZeroMorphProver_ { const FF rho = transcript->get_challenge("rho"); // Extract multilinear challenge u and claimed multilinear evaluations from Sumcheck output - std::span u_challenge = multilinear_challenge; + std::span u_challenge = multilinear_challenge; size_t log_N = u_challenge.size(); size_t N = 1 << log_N; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp index d3ac5ef52441..11b13d9c43a1 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp @@ -37,12 +37,10 @@ template class ZeroMorphTest : public CommitmentTest { */ bool execute_zeromorph_protocol(size_t NUM_UNSHIFTED, size_t NUM_SHIFTED) { - bool verified = false; - size_t N = 16; size_t log_N = numeric::get_msb(N); - auto u_challenge = this->random_evaluation_point(log_N); + std::vector u_challenge = this->random_evaluation_point(log_N); // Construct some random multilinear polynomials f_i and their evaluations v_i = f_i(u) std::vector f_polynomials; // unshifted polynomials @@ -94,7 +92,7 @@ template class ZeroMorphTest : public CommitmentTest { auto pairing_points = ZeroMorphVerifier::verify( f_commitments, g_commitments, v_evaluations, w_evaluations, u_challenge, verifier_transcript); - verified = this->vk()->pairing_check(pairing_points[0], pairing_points[1]); + bool verified = this->vk()->pairing_check(pairing_points[0], pairing_points[1]); // The prover and verifier manifests should agree EXPECT_EQ(prover_transcript->get_manifest(), verifier_transcript->get_manifest()); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index ab3b37a9504a..070c118e2766 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -332,7 +332,7 @@ Fr Polynomial::evaluate_from_fft(const EvaluationDomain& large_domain, template Polynomial Polynomial::shifted() const { ASSERT(size_ > 0); - ASSERT(backing_memory_[0].is_zero()); + ASSERT(coefficients_[0].is_zero()); ASSERT(coefficients_[size_].is_zero()); // relies on MAXIMUM_COEFFICIENT_SHIFT >= 1 Polynomial p; p.backing_memory_ = backing_memory_; diff --git a/barretenberg/cpp/src/barretenberg/serialize/msgpack_schema.test.cpp b/barretenberg/cpp/src/barretenberg/serialize/msgpack_schema.test.cpp index 9a035daf83b2..e9f836175783 100644 --- a/barretenberg/cpp/src/barretenberg/serialize/msgpack_schema.test.cpp +++ b/barretenberg/cpp/src/barretenberg/serialize/msgpack_schema.test.cpp @@ -77,10 +77,10 @@ TEST(msgpack_tests, msgpack_schema_sanity) { EXPECT_EQ( msgpack_schema_to_string(good_example), - "{\"__typename\":\"GoodExample\",\"a\":[\"alias\",[\"Fr\",\"bin32\"]],\"b\":[\"alias\",[\"Fr\",\"bin32\"]]}\n"); + "{\"__typename\":\"GoodExample\",\"a\":[\"alias\",[\"fr\",\"bin32\"]],\"b\":[\"alias\",[\"fr\",\"bin32\"]]}\n"); EXPECT_EQ(msgpack_schema_to_string(complicated_schema), - "{\"__typename\":\"ComplicatedSchema\",\"array\":[\"vector\",[[\"array\",[[\"alias\",[\"Fr\",\"bin32\"]]," - "20]]]],\"good_or_not\":[\"optional\",[{\"__typename\":\"GoodExample\",\"a\":[\"alias\",[\"Fr\"," - "\"bin32\"]],\"b\":[\"alias\",[\"Fr\",\"bin32\"]]}]],\"bare\":[\"alias\",[\"Fr\",\"bin32\"]],\"huh\":[" - "\"variant\",[[\"alias\",[\"Fr\",\"bin32\"]],\"GoodExample\"]]}\n"); + "{\"__typename\":\"ComplicatedSchema\",\"array\":[\"vector\",[[\"array\",[[\"alias\",[\"fr\",\"bin32\"]]," + "20]]]],\"good_or_not\":[\"optional\",[{\"__typename\":\"GoodExample\",\"a\":[\"alias\",[\"fr\"," + "\"bin32\"]],\"b\":[\"alias\",[\"fr\",\"bin32\"]]}]],\"bare\":[\"alias\",[\"fr\",\"bin32\"]],\"huh\":[" + "\"variant\",[[\"alias\",[\"fr\",\"bin32\"]],\"GoodExample\"]]}\n"); } From 8ee015290a1102d9d7523927de4237eea66e54f8 Mon Sep 17 00:00:00 2001 From: ludamad Date: Thu, 7 Dec 2023 19:24:51 +0000 Subject: [PATCH 14/60] Remove copy constructing of ProverPolynomials --- .../commitment_schemes/gemini/gemini.cpp | 4 ++-- .../src/barretenberg/commitment_schemes/ipa/ipa.hpp | 2 +- .../src/barretenberg/commitment_schemes/kzg/kzg.hpp | 2 +- .../commitment_schemes/shplonk/shplonk.test.cpp | 2 +- .../commitment_schemes/zeromorph/zeromorph.hpp | 8 ++++++-- .../commitment_schemes/zeromorph/zeromorph.test.cpp | 6 +++--- barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp | 4 ++++ .../flavor/generated/AvmMini_flavor.hpp | 4 ++++ .../barretenberg/flavor/generated/Fib_flavor.hpp | 4 ++++ .../src/barretenberg/flavor/goblin_translator.hpp | 4 ++++ .../cpp/src/barretenberg/flavor/goblin_ultra.hpp | 4 ++++ barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 4 ++++ .../cpp/src/barretenberg/honk/utils/testing.hpp | 4 ++-- .../sumcheck/instance/prover_instance.hpp | 13 ++++++++++--- .../cpp/src/barretenberg/sumcheck/sumcheck.hpp | 2 +- .../barretenberg/ultra_honk/protogalaxy.test.cpp | 2 +- .../ultra_honk/relation_correctness.test.cpp | 8 ++++---- 17 files changed, 56 insertions(+), 21 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp index 5e3c91504b26..2643f7498af4 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp @@ -77,7 +77,7 @@ std::vector> Gemi Polynomial& batched_G = gemini_polynomials.emplace_back(std::move(batched_to_be_shifted)); constexpr size_t offset_to_folded = 2; // Offset because of F an G // A₀(X) = F(X) + G↺(X) = F(X) + G(X)/X. - Polynomial A_0(batched_F); + Polynomial A_0 = batched_F.deep_clone(); A_0 += batched_G.shifted(); // Allocate everything before parallel computation @@ -159,7 +159,7 @@ ProverOutput GeminiProver_::compute_fold_polynomial_evaluations( batched_G *= r_inv; // Construct A₀₊ = F + G/r and A₀₋ = F - G/r in place in gemini_polynomials - Polynomial tmp = batched_F; + Polynomial tmp = batched_F.deep_clone(); Polynomial& A_0_pos = gemini_polynomials[0]; // A₀₊(X) = F(X) + G(X)/r, s.t. A₀₊(r) = A₀(r) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp index 85cfb13e6684..9194836d52d3 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp @@ -49,7 +49,7 @@ template class IPA { ASSERT((poly_degree > 0) && (!(poly_degree & (poly_degree - 1))) && "The poly_degree should be positive and a power of two"); - auto a_vec = polynomial; + auto a_vec = polynomial.deep_clone(); auto srs_elements = ck->srs->get_monomial_points(); std::vector G_vec_local(poly_degree); // The SRS stored in the commitment key is the result after applying the pippenger point table so the diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp index e0cfc6e6477a..1c5ef9c8e038 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp @@ -33,7 +33,7 @@ template class KZG { const Polynomial& polynomial, const std::shared_ptr& prover_trancript) { - Polynomial quotient(polynomial); + Polynomial quotient = polynomial.deep_clone(); quotient[0] -= opening_pair.evaluation; // Computes the coefficients for the quotient polynomial q(X) = (p(X) - v) / (X - r) through an FFT quotient.factor_roots(opening_pair.challenge); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp index aa3734fe4e13..12232f946a85 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.test.cpp @@ -44,7 +44,7 @@ TYPED_TEST(ShplonkTest, ShplonkSimple) // Aggregate polynomials and their opening pairs std::vector opening_pairs = { { r1, eval1 }, { r2, eval2 } }; - std::vector polynomials = { poly1, poly2 }; + std::vector polynomials = { poly1.share(), poly2.share() }; // Execute the shplonk prover functionality const Fr nu_challenge = prover_transcript->get_challenge("Shplonk:nu"); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index e87ec9861c93..da0b3dde8402 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -215,7 +215,7 @@ template class ZeroMorphProver_ { size_t log_N = quotients.size(); // Initialize Z_x with x * \sum_{i=0}^{m-1} f_i + \sum_{i=0}^{l-1} g_i - auto result = g_batched; + auto result = g_batched.deep_clone(); result.add_scaled(f_batched, x_challenge); // Compute Z_x -= v * x * \Phi_n(x) @@ -351,12 +351,16 @@ template class ZeroMorphProver_ { batching_scalar *= rho; } + int i = 0; Polynomial g_batched{ N }; // batched to-be-shifted polynomials for (auto [g_poly, g_shift_eval] : zip_view(g_polynomials, g_shift_evaluations)) { + std::cout << "I:" << (i++) << " gp " << g_poly << " batch " << batching_scalar << std::endl; + std::cout << "I:" << (i++) << g_batched << std::endl; g_batched.add_scaled(g_poly, batching_scalar); batched_evaluation += batching_scalar * g_shift_eval; batching_scalar *= rho; }; + std::cout << "Iafter:" << (i++) << g_batched << std::endl; size_t num_groups = concatenation_groups.size(); size_t num_chunks_per_group = concatenation_groups.empty() ? 0 : concatenation_groups[0].size(); @@ -382,7 +386,7 @@ template class ZeroMorphProver_ { // Compute the full batched polynomial f = f_batched + g_batched.shifted() = f_batched + h_batched. This is the // polynomial for which we compute the quotients q_k and prove f(u) = v_batched. - Polynomial f_polynomial = f_batched; + Polynomial f_polynomial = f_batched.deep_clone(); f_polynomial += g_batched.shifted(); f_polynomial += concatenated_batched; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp index 11b13d9c43a1..d0d18a539612 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp @@ -462,8 +462,8 @@ TYPED_TEST(ZeroMorphTest, PartiallyEvaluatedQuotientZ) auto rho = Fr::random_element(); // compute batched polynomial and evaluation - auto f_batched = multilinear_f; - auto g_batched = multilinear_g; + auto f_batched = multilinear_f.deep_clone(); + auto g_batched = multilinear_g.deep_clone(); g_batched *= rho; auto v_batched = v_evaluation + rho * w_evaluation; @@ -480,7 +480,7 @@ TYPED_TEST(ZeroMorphTest, PartiallyEvaluatedQuotientZ) f_batched, g_batched, quotients, v_batched, u_challenge, x_challenge); // Compute Z_x directly - auto Z_x_expected = g_batched; + auto Z_x_expected = g_batched.deep_clone(); Z_x_expected.add_scaled(f_batched, x_challenge); Z_x_expected[0] -= v_batched * x_challenge * this->Phi(x_challenge, log_N); for (size_t k = 0; k < log_N; ++k) { diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 0eca22f2eacd..6437ec336113 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -389,6 +389,10 @@ template class ECCVMBa */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials() = default; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return this->lagrange_first.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 091b9a4ecca1..1a685fe19e23 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -262,6 +262,10 @@ class AvmMiniFlavor { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials() = default; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return avmMini_clk.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp index 48512888327b..d8bb3562db5b 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/Fib_flavor.hpp @@ -165,6 +165,10 @@ class FibFlavor { class ProverPolynomials : public AllEntities { public: + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials() = default; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return this->Fibonacci_LAST.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index e5c3026bc859..f796a8d038d4 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -1021,6 +1021,10 @@ class GoblinTranslator { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials() = default; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 29e666a52d16..1f0f6acb82a0 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -375,6 +375,10 @@ class GoblinUltra { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials() = default; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index de82adba3213..3dcb3453bda0 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -258,6 +258,10 @@ class Ultra { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials() = default; + ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp index 8d36841d1f34..cb9dc7f07114 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp @@ -32,7 +32,7 @@ get_sequential_prover_polynomials(const size_t log_circuit_size, const size_t st prover_poly = storage_poly.share(); } - return std::pair(std::move(storage), prover_polynomials); + return std::pair(std::move(storage), std::move(prover_polynomials)); } template @@ -58,7 +58,7 @@ get_zero_prover_polynomials(const size_t log_circuit_size) prover_poly = storage_poly.share(); } - return std::pair(std::move(storage), prover_polynomials); + return std::pair(std::move(storage), std::move(prover_polynomials)); } } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 5f12dc0c1dd1..04a7f98e5a91 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/common/container.hpp" #include "barretenberg/flavor/flavor.hpp" #include "barretenberg/flavor/goblin_ultra.hpp" #include "barretenberg/flavor/ultra.hpp" @@ -58,11 +59,17 @@ template class ProverInstance_ { compute_witness(circuit); } - ProverInstance_(FoldingResult result) + ProverInstance_(const FoldingResult& result) : verification_key(std::move(result.verification_key)) - , prover_polynomials(result.folded_prover_polynomials) , public_inputs(result.folded_public_inputs) - , folding_parameters(result.folding_parameters){}; + , folding_parameters(result.folding_parameters) + { + ProverPolynomials polynomials; + for (auto [poly, folded_poly] : zip_view(polynomials.get_all(), result.folded_prover_polynomials.get_all())) { + poly = folded_poly.share(); + } + prover_polynomials = std::move(polynomials); + }; ProverInstance_() = default; ~ProverInstance_() = default; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index bfd9c2d7f545..e2a0a703cf6b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -70,7 +70,7 @@ template class SumcheckProver { * * @details */ - SumcheckOutput prove(ProverPolynomials full_polynomials, + SumcheckOutput prove(ProverPolynomials& full_polynomials, const proof_system::RelationParameters& relation_parameters, FF alpha) // pass by value, not by reference { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp index f59f4b5bcb2c..4ab7773f1bbd 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp @@ -119,7 +119,7 @@ TEST_F(ProtoGalaxyTests, PerturbatorPolynomial) } auto accumulator = std::make_shared( - FoldingResult{ .folded_prover_polynomials = full_polynomials, + FoldingResult{ .folded_prover_polynomials = std::move(full_polynomials), .folded_public_inputs = std::vector{}, .verification_key = std::make_shared(), .folding_parameters = { betas, target_sum } }); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 9bd2ee0861ee..1c1cde522ad7 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -31,7 +31,7 @@ void ensure_non_zero(auto& polynomial) * @tparam relation_idx Index into a tuple of provided relations * @tparam Flavor */ -template void check_relation(auto circuit_size, auto polynomials, auto params) +template void check_relation(auto circuit_size, auto& polynomials, auto params) { using AllValues = typename Flavor::AllValues; for (size_t i = 0; i < circuit_size; i++) { @@ -67,7 +67,7 @@ template void check_relation(auto circuit_s * @tparam Flavor */ template -void check_linearly_dependent_relation(auto circuit_size, auto polynomials, auto params) +void check_linearly_dependent_relation(auto circuit_size, auto& polynomials, auto params) { using AllValues = typename Flavor::AllValues; // Define the appropriate SumcheckArrayOfValuesOverSubrelations type for this relation and initialize to zero @@ -292,7 +292,7 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; - auto prover_polynomials = instance->prover_polynomials; + auto& prover_polynomials = instance->prover_polynomials; auto params = instance->relation_parameters; // Check that each relation is satisfied across each row of the prover polynomials check_relation>(circuit_size, prover_polynomials, params); @@ -352,7 +352,7 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; - auto prover_polynomials = instance->prover_polynomials; + auto& prover_polynomials = instance->prover_polynomials; auto params = instance->relation_parameters; // Check that each relation is satisfied across each row of the prover polynomials From 88cb0b42f55fa0c3084ec317a461e85ad9da066a Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 8 Dec 2023 21:00:18 +0000 Subject: [PATCH 15/60] feat(bb): debug log --- .../zeromorph/zeromorph.hpp | 17 +++ .../cpp/src/barretenberg/common/debug_log.cpp | 12 ++ .../cpp/src/barretenberg/common/debug_log.hpp | 103 ++++++++++++++++++ .../src/barretenberg/common/ref_vector.hpp | 2 +- .../barretenberg/flavor/goblin_translator.hpp | 8 +- .../barretenberg/numeric/random/engine.cpp | 7 ++ .../barretenberg/transcript/transcript.hpp | 4 + 7 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 barretenberg/cpp/src/barretenberg/common/debug_log.cpp create mode 100644 barretenberg/cpp/src/barretenberg/common/debug_log.hpp diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 80a8c3e4508e..288086d7ea9c 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/ref_vector.hpp" #include "barretenberg/common/zip_view.hpp" #include "barretenberg/polynomials/polynomial.hpp" @@ -61,6 +62,7 @@ template class ZeroMorphProver_ { */ static std::vector compute_multilinear_quotients(Polynomial polynomial, std::span u_challenge) { + DEBUG_LOG(polynomial, u_challenge); size_t log_N = numeric::get_msb(polynomial.size()); // The size of the multilinear challenge must equal the log of the polynomial size ASSERT(log_N == u_challenge.size()); @@ -80,6 +82,7 @@ template class ZeroMorphProver_ { } quotients[log_N - 1] = q; + DEBUG_LOG("before loop", quotients); std::vector f_k; f_k.resize(size_q); @@ -123,6 +126,7 @@ template class ZeroMorphProver_ { FF y_challenge, size_t N) { + DEBUG_LOG(quotients, y_challenge, N); // Batched lifted degree quotient polynomial auto result = Polynomial(N); @@ -161,6 +165,7 @@ template class ZeroMorphProver_ { FF y_challenge, FF x_challenge) { + DEBUG_LOG(batched_quotient, quotients, y_challenge, x_challenge); size_t N = batched_quotient.size(); size_t log_N = quotients.size(); @@ -210,6 +215,8 @@ template class ZeroMorphProver_ { FF x_challenge, std::vector concatenation_groups_batched = {}) { + DEBUG_LOG( + f_batched, g_batched, quotients, v_evaluation, u_challenge, x_challenge, concatenation_groups_batched); size_t N = f_batched.size(); size_t log_N = quotients.size(); @@ -278,6 +285,7 @@ template class ZeroMorphProver_ { FF x_challenge, FF z_challenge) { + DEBUG_LOG(zeta_x, Z_x, x_challenge, z_challenge); // We cannot commit to polynomials with size > N_max size_t N = zeta_x.size(); ASSERT(N <= N_max); @@ -327,6 +335,15 @@ template class ZeroMorphProver_ { // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) remove span const std::vector>>& concatenation_groups = {}) { + DEBUG_LOG(f_polynomials, + g_polynomials, + g_shift_evaluations, + multilinear_challenge, + commitment_key, + transcript, + concatenated_polynomials, + concatenated_evaluations, + concatenation_groups); // Generate batching challenge \rho and powers 1,...,\rho^{m-1} const FF rho = transcript->get_challenge("rho"); diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp new file mode 100644 index 000000000000..5e169924f3d6 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp @@ -0,0 +1,12 @@ +#include "debug_log.hpp" +#include + +namespace barretenberg { +void _debug_log_check_abort_condition(const std::string& log_str) +{ + const char* abort_cond = std::getenv("DEBUG_LOG_ABORT"); + if (abort_cond != nullptr && log_str.find(abort_cond) != std::string::npos) { + throw std::runtime_error("Abort condition met: " + log_str); + } +} +} // namespace barretenberg \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.hpp b/barretenberg/cpp/src/barretenberg/common/debug_log.hpp new file mode 100644 index 000000000000..91670eba768f --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.hpp @@ -0,0 +1,103 @@ +#pragma once + +/** + * @details + * To be used to create a verbose trace of execution. This helps with comparing runs that should have had the same + * result, but don't. It is less useful for other kinds of correctness, but if we know what values we expect (or not) it + * still can be useful. + * + * Compilation: cmake -DCMAKE_CXX_FLAGS="-DBBERG_DEBUG_LOG" ... + * Then, compare outputs of the program with another run of the same program (it's good to remove sources of randomness, + * if present). Once you have a divergence you can use the environment variable DEBUG_LOG_ABORT=... with a string + * pattern to abort the program, stopping in a debugger. + */ + +#ifdef BBERG_DEBUG_LOG + +#include +#include +#include +namespace barretenberg { +/** + * Throws an std::runtime_error if we would print a log that includes the env variable DEBUG_LOG_ABORT. + * This is primarily intended to be used with a debugger to then poke around execution and see differences in a + * comparison log. Does nothing if DEBUG_LOG_ABORT is not set. + * Should be run with MULTITHREADING=OFF for best results, and with no non-determinism (the BBERG_DEBUG_LOG flag + * currently turns off some determinism). + * @param log_str The log string to be checked against the environment variable. + */ +void _debug_log_check_abort_condition(const std::string& log_str); + +template +concept Printable = requires(T a) { std::cout << a; }; +template +concept ContainerLike = requires(T a) { + a.begin(); + a.size(); + }; + +template const char* _summarize(const T* /*unused*/) +{ + return "(?)"; +} + +template const T& _summarize(const T* x) +{ + return *x; +} + +// fallback for non-printable containers +template +std::string _summarize(const T* x) + requires(!Printable) +{ + std::ostringstream ss; + if (x->size() == 0) { + ss << "[]"; + } else { + ss << "[" << _summarize(&*x->begin()) << "...]"; + } + return ss.str(); +} + +/** + * Logs multiple values to standard output. + * + * @param args The values to be logged. + */ +template void _debug_log(const char* func_name, const char* arg_string, const FuncArgs&... args) +{ + // shut off recursive DEBUG_LOG + static size_t debug_log_calls = 0; + if (debug_log_calls > 0) { + return; + } + debug_log_calls++; + std::ostringstream ss; + ss << func_name << " " << arg_string << " = "; + // Using fold expression to append args to stringstream + ((ss << _summarize(&args) << " "), ...); + std::string log_str = ss.str(); + // Want to be able to catch offending statements in a debugger, this throws if we match an env variable pattern + _debug_log_check_abort_condition(log_str); + std::cout << log_str << std::endl; + debug_log_calls--; +} +} // namespace barretenberg +/** + * Logs function parameters. This macro should be placed at the beginning of function + * bodies to log their parameters. + * + * @param ... The parameters to be logged. + */ +#define DEBUG_LOG(...) \ + if (!std::is_constant_evaluated()) { /*we are not in a compile-time constexpr*/ \ + barretenberg::_debug_log(__FUNCTION__, #__VA_ARGS__, __VA_ARGS__); \ + } + +#else // If BBERG_DEBUG_LOG is not defined + +// Define empty macros and functions +#define DEBUG_LOG(...) + +#endif // BBERG_DEBUG_LOG diff --git a/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp b/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp index 5304f8ea77a6..7b9765763ef7 100644 --- a/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp +++ b/barretenberg/cpp/src/barretenberg/common/ref_vector.hpp @@ -146,4 +146,4 @@ template static std::vector> to_vector_of_ref_vectors( result.push_back(RefVector{ inner }); } return result; -} +} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 248094780106..79befb926b6e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -962,11 +962,11 @@ class GoblinTranslator { { os << "{ "; std::ios_base::fmtflags f(os.flags()); - for (size_t i = 0; i < NUM_ALL_ENTITIES - 1; i++) { - os << "e[" << std::setw(2) << i << "] = " << (a._data[i]) << ",\n"; + auto entities = a.get_all(); + for (size_t i = 0; i < entities.size() - 1; i++) { + os << "e[" << std::setw(2) << i << "] = " << (entities[i]) << ",\n"; } - os << "e[" << std::setw(2) << (NUM_ALL_ENTITIES - 1) << "] = " << std::get(a._data) - << " }"; + os << "e[" << std::setw(2) << (entities.size() - 1) << "] = " << entities[entities.size() - 1] << " }"; os.flags(f); return os; diff --git a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp index ff31c6136d8f..a07d29972d0d 100644 --- a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp +++ b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp @@ -10,8 +10,15 @@ namespace { auto generate_random_data() { std::array random_data; +#ifdef BBERG_DEBUG_LOG + // if we are debug logging, don't actually use randomness, defeats the intended use-case of comparing runs + for (size_t i = 0; i < 32; i++) { + random_data[i] = static_cast(i + 1); + } +#else std::random_device source; std::generate(std::begin(random_data), std::end(random_data), std::ref(source)); +#endif return random_data; } } // namespace diff --git a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp index e734829460c2..f9baa1427ff7 100644 --- a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp +++ b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp @@ -1,5 +1,6 @@ #pragma once +#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/serialize.hpp" #include "barretenberg/crypto/blake3s/blake3s.hpp" #include "barretenberg/crypto/pedersen_hash/pedersen.hpp" @@ -269,6 +270,7 @@ class BaseTranscript { */ template void send_to_verifier(const std::string& label, const T& element) { + DEBUG_LOG(label, element); using serialize::write; // TODO(Adrian): Ensure that serialization of affine elements (including point at infinity) is consistent. // TODO(Adrian): Consider restricting serialization (via concepts) to types T for which sizeof(T) reliably @@ -301,6 +303,7 @@ class BaseTranscript { BaseTranscript::consume_prover_element_bytes(label, element_bytes); T element = from_buffer(element_bytes); + DEBUG_LOG(label, element); #ifdef LOG_INTERACTIONS if constexpr (Loggable) { @@ -344,6 +347,7 @@ class BaseTranscript { #if defined LOG_CHALLENGES || defined LOG_INTERACTIONS info("challenge: ", label, ": ", result); #endif + DEBUG_LOG(label, result); return result; } From 3714e2e7316d9fb33e1323f6380d163782aaa350 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:13:45 +0000 Subject: [PATCH 16/60] Debug log --- .../barretenberg/commitment_schemes/zeromorph/zeromorph.hpp | 5 +++-- barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 288086d7ea9c..99d4a6c3d8cb 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -82,7 +82,7 @@ template class ZeroMorphProver_ { } quotients[log_N - 1] = q; - DEBUG_LOG("before loop", quotients); + DEBUG_LOG(quotients[log_N - 1], log_N - 1); std::vector f_k; f_k.resize(size_q); @@ -97,7 +97,7 @@ template class ZeroMorphProver_ { } size_q = size_q / 2; - q = Polynomial(size_q); + q = Polynomial{ size_q }; for (size_t l = 0; l < size_q; ++l) { q[l] = f_k[size_q + l] - f_k[l]; @@ -410,6 +410,7 @@ template class ZeroMorphProver_ { q_k_commitments.reserve(log_N); for (size_t idx = 0; idx < log_N; ++idx) { q_k_commitments[idx] = commitment_key->commit(quotients[idx]); + DEBUG_LOG(idx, quotients[idx], q_k_commitments[idx]); std::string label = "ZM:C_q_" + std::to_string(idx); transcript->send_to_verifier(label, q_k_commitments[idx]); } diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index caf74ad39dcb..667c5349ede4 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -282,6 +282,9 @@ template class Polynomial { template inline std::ostream& operator<<(std::ostream& os, Polynomial const& p) { + if (p.size() < 2) { + return os << "[ data " << p[0] << "]"; + } return os << "[ data\n" << " " << p[0] << ",\n" << " " << p[1] << ",\n" From 603924edc3feb75d994ee822d1d4a3c59aa40bf1 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:16:50 +0000 Subject: [PATCH 17/60] Fix bug --- .../src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index da0b3dde8402..a618b9cd5fc1 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -95,7 +95,7 @@ template class ZeroMorphProver_ { } size_q = size_q / 2; - Polynomial q{ size_q }; + q = Polynomial{ size_q }; for (size_t l = 0; l < size_q; ++l) { q[l] = f_k[size_q + l] - f_k[l]; From cdda93ba47148ad7353d09ac24a7a9f9616b285c Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:23:11 +0000 Subject: [PATCH 18/60] Fix bug --- barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 10 +--------- .../cpp/src/barretenberg/protogalaxy/combiner.test.cpp | 8 -------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 8085d087b73d..4cf004e8d09e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -197,15 +197,7 @@ class Ultra { }; }; - RefVector get_precomputed() - { - return { q_m, q_c, q_l, q_r, q_o, q_4, q_arith, q_sort, - q_elliptic, q_aux, q_lookup, sigma_1, sigma_2, sigma_3, sigma_4, id_1, - id_2, id_3, id_4, table_1, table_2, table_3, table_4, lagrange_first, - lagrange_last - - }; - } + RefVector get_precomputed() { return PrecomputedEntities::get_all(); } RefVector get_witness() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; RefVector get_to_be_shifted() diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index 6b845eac6533..438f1cf895e4 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -83,12 +83,8 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1); restrict_to_standard_arithmetic_relation(prover_polynomials); storage_arrays[idx] = std::move(storage); -<<<<<<< HEAD instance->prover_polynomials = std::move(prover_polynomials); -======= - instance->prover_polynomials = prover_polynomials; instance->instance_size = 2; ->>>>>>> origin/master instance_data[idx] = instance; } @@ -179,12 +175,8 @@ TEST(Protogalaxy, CombinerOn4Instances) auto [storage, prover_polynomials] = proof_system::honk::get_zero_prover_polynomials( /*log_circuit_size=*/1); storage_arrays[idx] = std::move(storage); -<<<<<<< HEAD instance->prover_polynomials = std::move(prover_polynomials); -======= - instance->prover_polynomials = prover_polynomials; instance->instance_size = 2; ->>>>>>> origin/master instance_data[idx] = instance; } From 67de11447f09e7a540bb6074a79f63c8361b7fd3 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 12:24:17 -0500 Subject: [PATCH 19/60] Update debug_log.cpp --- barretenberg/cpp/src/barretenberg/common/debug_log.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp index 5e169924f3d6..6826f1e45e97 100644 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp @@ -1,5 +1,7 @@ #include "debug_log.hpp" #include +#include +#include namespace barretenberg { void _debug_log_check_abort_condition(const std::string& log_str) @@ -9,4 +11,4 @@ void _debug_log_check_abort_condition(const std::string& log_str) throw std::runtime_error("Abort condition met: " + log_str); } } -} // namespace barretenberg \ No newline at end of file +} // namespace barretenberg From 6958c13b2b40079d67bd057339f25f259a9dc69c Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:30:49 +0000 Subject: [PATCH 20/60] Witness --- .../src/barretenberg/flavor/goblin_ultra.hpp | 18 +----------------- .../cpp/src/barretenberg/flavor/ultra.hpp | 6 +++--- .../sumcheck/instance/prover_instance.hpp | 15 --------------- .../ultra_honk/protogalaxy.test.cpp | 2 +- 4 files changed, 5 insertions(+), 36 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index e175d721cbb7..699d12a74035 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -286,23 +286,7 @@ class GoblinUltra { this->lookup_inverses }; }; - RefVector get_witness() - { - return { this->w_l, - this->w_r, - this->w_o, - this->w_4, - this->sorted_accum, - this->z_perm, - this->z_lookup, - this->ecc_op_wire_1, - this->ecc_op_wire_2, - this->ecc_op_wire_3, - this->ecc_op_wire_4, - this->calldata, - this->calldata_read_counts, - this->lookup_inverses }; - }; + RefVector get_witness() { return WitnessEntities::get_all(); }; RefVector get_to_be_shifted() { return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 4cf004e8d09e..72112b3d3da8 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -137,7 +137,7 @@ class Ultra { z_perm, // column 5 z_lookup) // column 6 - RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; + RefVector get_wires() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; }; /** @@ -198,8 +198,8 @@ class Ultra { }; RefVector get_precomputed() { return PrecomputedEntities::get_all(); } - - RefVector get_witness() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; + // get_wires is inherited + RefVector get_Witness() { return WitnessEntities::get_all(); } RefVector get_to_be_shifted() { return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index aaefa1158072..9c68d05fd887 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -63,21 +63,6 @@ template class ProverInstance_ { compute_witness(circuit); } -<<<<<<< HEAD - ProverInstance_(const FoldingResult& result) - : verification_key(std::move(result.verification_key)) - , public_inputs(result.folded_public_inputs) - , folding_parameters(result.folding_parameters) - { - ProverPolynomials polynomials; - for (auto [poly, folded_poly] : zip_view(polynomials.get_all(), result.folded_prover_polynomials.get_all())) { - poly = folded_poly.share(); - } - prover_polynomials = std::move(polynomials); - }; - -======= ->>>>>>> origin/master ProverInstance_() = default; ~ProverInstance_() = default; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp index bc6f3c8df9de..75995bf429e6 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/protogalaxy.test.cpp @@ -268,7 +268,7 @@ TEST_F(ProtoGalaxyTests, ComputeNewAccumulator) accumulator->witness_commitments = construct_witness_commitments(); accumulator->instance_size = instance_size; accumulator->log_instance_size = log_instance_size; - accumulator->prover_polynomials = full_polynomials; + accumulator->prover_polynomials = std::move(full_polynomials); accumulator->folding_parameters = { betas, target_sum }; accumulator->relation_parameters = relation_parameters; accumulator->alpha = alpha; From 94210935cb1896adeb8f5238db4165cf2a0d8804 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 12:31:44 -0500 Subject: [PATCH 21/60] Update debug_log.cpp --- barretenberg/cpp/src/barretenberg/common/debug_log.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp index 6826f1e45e97..3a4aef382488 100644 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp @@ -2,7 +2,7 @@ #include #include #include - +#ifdef BBERG_DEBUG_LOG namespace barretenberg { void _debug_log_check_abort_condition(const std::string& log_str) { @@ -12,3 +12,4 @@ void _debug_log_check_abort_condition(const std::string& log_str) } } } // namespace barretenberg +#endif From 79e5b374aa70f2fbf490e1589a9ee45582994e04 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:35:50 +0000 Subject: [PATCH 22/60] post merge fixes --- barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 2 +- .../barretenberg/protogalaxy/protogalaxy_prover.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 72112b3d3da8..dc71b9a530d2 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -199,7 +199,7 @@ class Ultra { RefVector get_precomputed() { return PrecomputedEntities::get_all(); } // get_wires is inherited - RefVector get_Witness() { return WitnessEntities::get_all(); } + RefVector get_witness() { return WitnessEntities::get_all(); } RefVector get_to_be_shifted() { return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 4a95f231d525..85e1879789c4 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -217,14 +217,14 @@ std::shared_ptr ProtoGalaxyProver_prover_polynomials.get_all(); - for (auto [acc_poly_view, inst_poly_view] : zip_view(acc_poly_views, inst_poly_views)) { - for (size_t poly_idx = 0; poly_idx < inst_poly_view.size(); poly_idx++) { - (acc_poly_view)[poly_idx] += (inst_poly_view)[poly_idx] * lagranges[inst_idx]; + for (auto [acc_poly, inst_poly] : + zip_view(acc_prover_polynomials.get_all(), instances[inst_idx]->prover_polynomials.get_all())) { + for (auto [acc_field, inst_field] : zip_view(acc_poly, inst_poly)) { + acc_field += inst_field * lagranges[inst_idx]; } } } - next_accumulator->prover_polynomials = acc_prover_polynomials; + next_accumulator->prover_polynomials = std::move(acc_prover_polynomials); // Fold the witness commtiments and send them to the verifier auto witness_labels = next_accumulator->commitment_labels.get_witness(); From c48ca7a8d495947c6a8cd5bf2557ead5b8087594 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:39:23 +0000 Subject: [PATCH 23/60] post merge fixes --- .../cpp/src/barretenberg/flavor/toy_avm.hpp | 23 ------------------- .../cpp/src/barretenberg/flavor/ultra.hpp | 23 ------------------- .../src/barretenberg/honk/utils/testing.hpp | 8 +++---- .../toy_avm/toy_avm_circuit_builder.hpp | 8 +++---- .../protogalaxy/combiner.test.cpp | 6 ++--- .../protogalaxy/protogalaxy_prover.cpp | 16 +++---------- .../protogalaxy/protogalaxy_prover.hpp | 2 +- 7 files changed, 15 insertions(+), 71 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp index ba0c7c2b465d..b34fc6c028f9 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp @@ -213,29 +213,6 @@ class ToyAVM { using Base::Base; }; - /** - * @brief An owning container of polynomials. - * @warning When this was introduced it broke some of our design principles. - * - Execution trace builders don't handle "polynomials" because the interpretation of the execution trace - * columns as polynomials is a detail of the proving system, and trace builders are (sometimes in practice, - * always in principle) reusable for different proving protocols (e.g., Plonk and Honk). - * - Polynomial storage is handled by key classes. Polynomials aren't moved, but are accessed elsewhere by - * std::spans. - * - * We will consider revising this data model: TODO(https://github.com/AztecProtocol/barretenberg/issues/743) - */ - class AllPolynomials : public AllEntities { - public: - [[nodiscard]] size_t get_polynomial_size() const { return this->lagrange_first.size(); } - AllValues get_row(const size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; - } - }; /** * @brief A container for polynomials handles; only stores spans. */ diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index dc71b9a530d2..35943ad56a1e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -277,29 +277,6 @@ class Ultra { } }; - /** - * @brief An owning container of polynomials. - * @warning When this was introduced it broke some of our design principles. - * - Execution trace builders don't handle "polynomials" because the interpretation of the execution trace - * columns as polynomials is a detail of the proving system, and trace builders are (sometimes in practice, - * always in principle) reusable for different proving protocols (e.g., Plonk and Honk). - * - Polynomial storage is handled by key classes. Polynomials aren't moved, but are accessed elsewhere by - * std::spans. - * - * We will consider revising this data model: TODO(https://github.com/AztecProtocol/barretenberg/issues/743) - */ - class AllPolynomials : public AllEntities { - public: - [[nodiscard]] AllValues get_row(const size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; - } - }; - /** * @brief A container for storing the partially evaluated multivariates produced by sumcheck. */ diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp index bd8fa3d61307..15efb3237acc 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp @@ -9,14 +9,14 @@ namespace proof_system::honk { * function returns an array of data pointed to by the ProverPolynomials. */ template -std::pair get_sequential_prover_polynomials( +std::pair get_sequential_prover_polynomials( const size_t log_circuit_size, const size_t starting_value) { using FF = typename Flavor::FF; using ProverPolynomials = typename Flavor::ProverPolynomials; using Polynomial = typename Flavor::Polynomial; - typename Flavor::AllPolynomials storage; + typename Flavor::ProverPolynomials storage; size_t circuit_size = 1 << log_circuit_size; size_t value_idx = starting_value; for (auto& polynomial : storage.get_all()) { @@ -35,14 +35,14 @@ std::pair g } template -std::pair get_zero_prover_polynomials( +std::pair get_zero_prover_polynomials( const size_t log_circuit_size) { using FF = typename Flavor::FF; using ProverPolynomials = typename Flavor::ProverPolynomials; using Polynomial = typename Flavor::Polynomial; - typename Flavor::AllPolynomials storage; + typename Flavor::ProverPolynomials storage; size_t circuit_size = 1 << log_circuit_size; for (auto& polynomial : storage.get_all()) { polynomial = Polynomial(circuit_size); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp index 659187b41313..94291bdf2a3b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp @@ -28,7 +28,7 @@ template class ToyAVMCircuitBuilder { static constexpr size_t NUM_POLYNOMIALS = Flavor::NUM_ALL_ENTITIES; static constexpr size_t NUM_WIRES = Flavor::NUM_WIRES; - using AllPolynomials = typename Flavor::AllPolynomials; + using ProverPolynomials = typename Flavor::ProverPolynomials; size_t num_gates = 0; std::array, NUM_WIRES> wires; ToyAVMCircuitBuilder() = default; @@ -44,15 +44,15 @@ template class ToyAVMCircuitBuilder { /** * @brief Compute the AVM Template flavor polynomial data required to generate a proof * - * @return AllPolynomials + * @return ProverPolynomials */ - AllPolynomials compute_polynomials() + ProverPolynomials compute_polynomials() { const auto num_gates_log2 = static_cast(numeric::get_msb64(num_gates)); size_t num_gates_pow2 = 1UL << (num_gates_log2 + (1UL << num_gates_log2 == num_gates ? 0 : 1)); - AllPolynomials polys; + ProverPolynomials polys; for (auto& poly : polys.get_all()) { poly = Polynomial(num_gates_pow2); } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index 438f1cf895e4..511bc0fe9800 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -37,7 +37,7 @@ TEST(Protogalaxy, CombinerOn2Instances) // relation. if (is_random_input) { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; + std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; @@ -73,7 +73,7 @@ TEST(Protogalaxy, CombinerOn2Instances) EXPECT_EQ(result, expected_result); } else { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; + std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; @@ -166,7 +166,7 @@ TEST(Protogalaxy, CombinerOn4Instances) auto run_test = [&]() { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; + std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 85e1879789c4..80c33a1aab45 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -198,20 +198,10 @@ std::shared_ptr ProtoGalaxyProver_send_to_verifier("next_gate_challenge_" + std::to_string(idx), instances.next_gate_challenges[idx]); } - // Allocate space, initialised to 0, for the prover polynomials of the next accumulator - AllPolynomials storage; - for (auto& polynomial : storage.get_all()) { - polynomial = typename Flavor::Polynomial(instances[0]->instance_size); - for (auto& value : polynomial) { - value = FF(0); - } - } + // Initialize prover polynomials ProverPolynomials acc_prover_polynomials; - size_t poly_idx = 0; - auto prover_polynomial_pointers = acc_prover_polynomials.get_all(); - for (auto& polynomial : storage.get_all()) { - prover_polynomial_pointers[poly_idx] = polynomial; - poly_idx++; + for (auto& polynomial : acc_prover_polynomials.get_all()) { + polynomial = typename Flavor::Polynomial(instances[0]->instance_size); } // Fold the prover polynomials diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp index 9c881d82a891..9131925dcf02 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp @@ -28,7 +28,7 @@ template class ProtoGalaxyProver_ { using CommitmentKey = typename Flavor::CommitmentKey; using WitnessCommitments = typename Flavor::WitnessCommitments; using Commitment = typename Flavor::Commitment; - using AllPolynomials = typename Flavor::AllPolynomials; + using ProverPolynomials = typename Flavor::ProverPolynomials; using BaseUnivariate = Univariate; // The length of ExtendedUnivariate is the largest length (==max_relation_degree + 1) of a univariate polynomial From 092a962810e670588094a71641a29c66e68c7371 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:45:07 +0000 Subject: [PATCH 24/60] post merge fixes --- .../src/barretenberg/flavor/goblin_ultra.hpp | 23 ------------------- .../cpp/src/barretenberg/flavor/toy_avm.hpp | 2 +- .../toy_avm/toy_avm_circuit_builder.hpp | 2 +- .../protogalaxy/protogalaxy_prover.hpp | 1 - 4 files changed, 2 insertions(+), 26 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 699d12a74035..a1fd40b80e6d 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -418,29 +418,6 @@ class GoblinUltra { } }; - /** - * @brief An owning container of polynomials. - * @warning When this was introduced it broke some of our design principles. - * - Execution trace builders don't handle "polynomials" because the interpretation of the execution trace - * columns as polynomials is a detail of the proving system, and trace builders are (sometimes in practice, - * always in principle) reusable for different proving protocols (e.g., Plonk and Honk). - * - Polynomial storage is handled by key classes. Polynomials aren't moved, but are accessed elsewhere by - * std::spans. - * - * We will consider revising this data model: TODO(https://github.com/AztecProtocol/barretenberg/issues/743) - */ - class AllPolynomials : public AllEntities { - public: - [[nodiscard]] AllValues get_row(const size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; - } - }; - /** * @brief A container for the witness commitments. */ diff --git a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp index b34fc6c028f9..8957d7f2c93f 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp @@ -216,7 +216,7 @@ class ToyAVM { /** * @brief A container for polynomials handles; only stores spans. */ - class ProverPolynomials : public AllEntities { + class ProverPolynomials : public AllEntities { public: [[nodiscard]] size_t get_polynomial_size() const { return enable_tuple_set_permutation.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp index 94291bdf2a3b..93199a9dda0c 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/toy_avm/toy_avm_circuit_builder.hpp @@ -53,7 +53,7 @@ template class ToyAVMCircuitBuilder { size_t num_gates_pow2 = 1UL << (num_gates_log2 + (1UL << num_gates_log2 == num_gates ? 0 : 1)); ProverPolynomials polys; - for (auto& poly : polys.get_all()) { + for (Polynomial& poly : polys.get_all()) { poly = Polynomial(num_gates_pow2); } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp index 9131925dcf02..83aa42ae4ffe 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp @@ -28,7 +28,6 @@ template class ProtoGalaxyProver_ { using CommitmentKey = typename Flavor::CommitmentKey; using WitnessCommitments = typename Flavor::WitnessCommitments; using Commitment = typename Flavor::Commitment; - using ProverPolynomials = typename Flavor::ProverPolynomials; using BaseUnivariate = Univariate; // The length of ExtendedUnivariate is the largest length (==max_relation_degree + 1) of a univariate polynomial From 9b20fd48aa867baef41ffb4acb5c4e398c537348 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:46:46 +0000 Subject: [PATCH 25/60] output --- .../barretenberg/commitment_schemes/zeromorph/zeromorph.hpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index a618b9cd5fc1..a11b45bf9d41 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -354,18 +354,14 @@ template class ZeroMorphProver_ { int i = 0; Polynomial g_batched{ N }; // batched to-be-shifted polynomials for (auto [g_poly, g_shift_eval] : zip_view(g_polynomials, g_shift_evaluations)) { - std::cout << "I:" << (i++) << " gp " << g_poly << " batch " << batching_scalar << std::endl; - std::cout << "I:" << (i++) << g_batched << std::endl; g_batched.add_scaled(g_poly, batching_scalar); batched_evaluation += batching_scalar * g_shift_eval; batching_scalar *= rho; }; - std::cout << "Iafter:" << (i++) << g_batched << std::endl; size_t num_groups = concatenation_groups.size(); size_t num_chunks_per_group = concatenation_groups.empty() ? 0 : concatenation_groups[0].size(); // Concatenated polynomials - // std::vector concatenated_polynomials; Polynomial concatenated_batched(N); // construct concatention_groups_batched From 75258a7e45a5af457c9a299635753af6de2ebd29 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:49:43 +0000 Subject: [PATCH 26/60] output --- .../cpp/src/barretenberg/flavor/ecc_vm.hpp | 5 ++++- .../flavor/generated/AvmMini_flavor.hpp | 7 +++++-- .../barretenberg/flavor/goblin_translator.hpp | 5 ++++- .../src/barretenberg/flavor/goblin_ultra.hpp | 7 +++++-- .../cpp/src/barretenberg/flavor/toy_avm.hpp | 7 +++++++ .../cpp/src/barretenberg/flavor/ultra.hpp | 7 +++++-- .../src/barretenberg/polynomials/polynomial.cpp | 17 ----------------- .../src/barretenberg/polynomials/polynomial.hpp | 4 +++- 8 files changed, 33 insertions(+), 26 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 6437ec336113..fb245aa9d3ec 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -389,10 +389,13 @@ template class ECCVMBa */ class ProverPolynomials : public AllEntities { public: + // Define all operations as default, except only all move construction/assignment ProverPolynomials() = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; - ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return this->lagrange_first.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 1a685fe19e23..59ccbcf94409 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -262,10 +262,13 @@ class AvmMiniFlavor { */ class ProverPolynomials : public AllEntities { public: - ProverPolynomials(const ProverPolynomials& o) = delete; + // Define all operations as default, except only all move construction/assignment ProverPolynomials() = default; - ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return avmMini_clk.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index f796a8d038d4..4221a25996c9 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -1021,10 +1021,13 @@ class GoblinTranslator { */ class ProverPolynomials : public AllEntities { public: + // Define all operations as default, except only all move construction/assignment ProverPolynomials() = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; - ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } /** * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index a1fd40b80e6d..031c1bd397bb 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -403,10 +403,13 @@ class GoblinUltra { */ class ProverPolynomials : public AllEntities { public: - ProverPolynomials(const ProverPolynomials& o) = delete; + // Define all operations as default, except only all move construction/assignment ProverPolynomials() = default; - ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp index 8957d7f2c93f..6c72f420ccb8 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp @@ -218,6 +218,13 @@ class ToyAVM { */ class ProverPolynomials : public AllEntities { public: + // Define all operations as default, except only all move construction/assignment + ProverPolynomials() = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return enable_tuple_set_permutation.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 35943ad56a1e..d3ad7d1d2279 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -262,10 +262,13 @@ class Ultra { */ class ProverPolynomials : public AllEntities { public: - ProverPolynomials(const ProverPolynomials& o) = delete; + // Define all operations as default, except only all move construction/assignment ProverPolynomials() = default; - ProverPolynomials(ProverPolynomials&& o) = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const { diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index 070c118e2766..bf98832aa362 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -60,11 +60,6 @@ template Polynomial::Polynomial(size_t initial_size, DontZeroM allocate_backing_memory(initial_size); } -template -Polynomial::Polynomial(const Polynomial& other) - : Polynomial(other, other.size()) -{} - // fully copying "expensive" constructor template Polynomial::Polynomial(const Polynomial& other, const size_t target_size) { @@ -105,18 +100,6 @@ Polynomial::Polynomial(std::span interpolation_points, std::span Polynomial& Polynomial::operator=(const Polynomial& other) -// { -// if (this == &other) { -// return *this; -// } -// allocate_backing_memory(other.size_); -// memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); -// zero_memory_beyond(size_); -// return *this; -// } - template Polynomial& Polynomial::operator=(std::span coefficients) noexcept { // move assign a Polynomial constructed with the span diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 74ade70000e3..7bfec00072f6 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -27,7 +27,8 @@ template class Polynomial { Polynomial(size_t initial_size); // Constructor that does not initialize values, use with caution to save time. Polynomial(size_t initial_size, DontZeroMemory flag); - Polynomial(const Polynomial& other); + // We want to be explicit about when creating polynomials, use = .share() or .deep_clone() + Polynomial(const Polynomial& other) = delete; Polynomial(const Polynomial& other, size_t target_size); Polynomial(Polynomial&& other) noexcept; @@ -50,6 +51,7 @@ template class Polynomial { // move assignment Polynomial& operator=(Polynomial&& other) noexcept; Polynomial& operator=(std::span coefficients) noexcept; + // We want to be explicit about when creating polynomials, use = .share() or .deep_clone() Polynomial& operator=(const Polynomial& other) = delete; ~Polynomial() = default; From 08c6bb43502d9fac19a021e0f7ac03ee0737c968 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:50:42 +0000 Subject: [PATCH 27/60] reinstate polynomial copies --- .../src/barretenberg/polynomials/polynomial.cpp | 17 +++++++++++++++++ .../src/barretenberg/polynomials/polynomial.hpp | 6 ++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index bf98832aa362..d165e4e602c6 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -60,6 +60,11 @@ template Polynomial::Polynomial(size_t initial_size, DontZeroM allocate_backing_memory(initial_size); } +template +Polynomial::Polynomial(const Polynomial& other) + : Polynomial(other, other.size()) +{} + // fully copying "expensive" constructor template Polynomial::Polynomial(const Polynomial& other, const size_t target_size) { @@ -100,6 +105,18 @@ Polynomial::Polynomial(std::span interpolation_points, std::span Polynomial& Polynomial::operator=(const Polynomial& other) +{ + if (this == &other) { + return *this; + } + allocate_backing_memory(other.size_); + memcpy(static_cast(coefficients_), static_cast(other.coefficients_), sizeof(Fr) * other.size_); + zero_memory_beyond(size_); + return *this; +} + template Polynomial& Polynomial::operator=(std::span coefficients) noexcept { // move assign a Polynomial constructed with the span diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 7bfec00072f6..bbd8a2d73cb3 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -27,8 +27,7 @@ template class Polynomial { Polynomial(size_t initial_size); // Constructor that does not initialize values, use with caution to save time. Polynomial(size_t initial_size, DontZeroMemory flag); - // We want to be explicit about when creating polynomials, use = .share() or .deep_clone() - Polynomial(const Polynomial& other) = delete; + Polynomial(const Polynomial& other); Polynomial(const Polynomial& other, size_t target_size); Polynomial(Polynomial&& other) noexcept; @@ -51,8 +50,7 @@ template class Polynomial { // move assignment Polynomial& operator=(Polynomial&& other) noexcept; Polynomial& operator=(std::span coefficients) noexcept; - // We want to be explicit about when creating polynomials, use = .share() or .deep_clone() - Polynomial& operator=(const Polynomial& other) = delete; + Polynomial& operator=(const Polynomial& other); ~Polynomial() = default; /** From d85b8110e7e8d20672342822b7be48d5a441b788 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:54:00 +0000 Subject: [PATCH 28/60] consistency: dont use deep_clone --- .../barretenberg/commitment_schemes/gemini/gemini.cpp | 4 ++-- .../cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp | 2 +- .../cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp | 2 +- .../barretenberg/commitment_schemes/shplonk/shplonk.hpp | 4 ++-- .../commitment_schemes/zeromorph/zeromorph.hpp | 4 ++-- .../commitment_schemes/zeromorph/zeromorph.test.cpp | 6 +++--- .../cpp/src/barretenberg/polynomials/polynomial.cpp | 9 --------- .../cpp/src/barretenberg/polynomials/polynomial.hpp | 5 ----- .../polynomials/polynomial_arithmetic.test.cpp | 4 ++-- .../src/barretenberg/vm/generated/AvmMini_composer.cpp | 2 +- 10 files changed, 14 insertions(+), 28 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp index 2643f7498af4..bbed763a388c 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/gemini/gemini.cpp @@ -77,7 +77,7 @@ std::vector> Gemi Polynomial& batched_G = gemini_polynomials.emplace_back(std::move(batched_to_be_shifted)); constexpr size_t offset_to_folded = 2; // Offset because of F an G // A₀(X) = F(X) + G↺(X) = F(X) + G(X)/X. - Polynomial A_0 = batched_F.deep_clone(); + Polynomial A_0 = batched_F; A_0 += batched_G.shifted(); // Allocate everything before parallel computation @@ -159,7 +159,7 @@ ProverOutput GeminiProver_::compute_fold_polynomial_evaluations( batched_G *= r_inv; // Construct A₀₊ = F + G/r and A₀₋ = F - G/r in place in gemini_polynomials - Polynomial tmp = batched_F.deep_clone(); + Polynomial tmp = batched_F; Polynomial& A_0_pos = gemini_polynomials[0]; // A₀₊(X) = F(X) + G(X)/r, s.t. A₀₊(r) = A₀(r) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp index 9194836d52d3..85cfb13e6684 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp @@ -49,7 +49,7 @@ template class IPA { ASSERT((poly_degree > 0) && (!(poly_degree & (poly_degree - 1))) && "The poly_degree should be positive and a power of two"); - auto a_vec = polynomial.deep_clone(); + auto a_vec = polynomial; auto srs_elements = ck->srs->get_monomial_points(); std::vector G_vec_local(poly_degree); // The SRS stored in the commitment key is the result after applying the pippenger point table so the diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp index ffa490d1d490..3c34333f45e8 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp @@ -33,7 +33,7 @@ template class KZG { const Polynomial& polynomial, const std::shared_ptr& prover_trancript) { - Polynomial quotient = polynomial.deep_clone(); + Polynomial quotient = polynomial; quotient[0] -= opening_pair.evaluation; // Computes the coefficients for the quotient polynomial q(X) = (p(X) - v) / (X - r) through an FFT quotient.factor_roots(opening_pair.challenge); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index de894dbb56b4..0c621bc75919 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -75,7 +75,7 @@ template class ShplonkProver_ { const auto& [challenge, evaluation] = opening_pairs[j]; // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ ) - tmp = witness_polynomials[j].deep_clone(); + tmp = witness_polynomials[j]; tmp[0] -= evaluation; tmp.factor_roots(challenge); @@ -125,7 +125,7 @@ template class ShplonkProver_ { const auto& [challenge, evaluation] = opening_pairs[j]; // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ) - Polynomial tmp = witness_polynomials[j].deep_clone(); + Polynomial tmp = witness_polynomials[j]; tmp[0] -= evaluation; Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = ρʲ / ( r − xⱼ ) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index a11b45bf9d41..58a0c53ba7e0 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -215,7 +215,7 @@ template class ZeroMorphProver_ { size_t log_N = quotients.size(); // Initialize Z_x with x * \sum_{i=0}^{m-1} f_i + \sum_{i=0}^{l-1} g_i - auto result = g_batched.deep_clone(); + auto result = g_batched; result.add_scaled(f_batched, x_challenge); // Compute Z_x -= v * x * \Phi_n(x) @@ -382,7 +382,7 @@ template class ZeroMorphProver_ { // Compute the full batched polynomial f = f_batched + g_batched.shifted() = f_batched + h_batched. This is the // polynomial for which we compute the quotients q_k and prove f(u) = v_batched. - Polynomial f_polynomial = f_batched.deep_clone(); + Polynomial f_polynomial = f_batched; f_polynomial += g_batched.shifted(); f_polynomial += concatenated_batched; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp index d0d18a539612..11b13d9c43a1 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.test.cpp @@ -462,8 +462,8 @@ TYPED_TEST(ZeroMorphTest, PartiallyEvaluatedQuotientZ) auto rho = Fr::random_element(); // compute batched polynomial and evaluation - auto f_batched = multilinear_f.deep_clone(); - auto g_batched = multilinear_g.deep_clone(); + auto f_batched = multilinear_f; + auto g_batched = multilinear_g; g_batched *= rho; auto v_batched = v_evaluation + rho * w_evaluation; @@ -480,7 +480,7 @@ TYPED_TEST(ZeroMorphTest, PartiallyEvaluatedQuotientZ) f_batched, g_batched, quotients, v_batched, u_challenge, x_challenge); // Compute Z_x directly - auto Z_x_expected = g_batched.deep_clone(); + auto Z_x_expected = g_batched; Z_x_expected.add_scaled(f_batched, x_challenge); Z_x_expected[0] -= v_batched * x_challenge * this->Phi(x_challenge, log_N); for (size_t k = 0; k < log_N; ++k) { diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp index d165e4e602c6..b5427deeee16 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.cpp @@ -147,15 +147,6 @@ template Polynomial Polynomial::share() const return p; } -template Polynomial Polynomial::deep_clone() const -{ - Polynomial p; - p.allocate_backing_memory(size_); - memcpy(static_cast(p.coefficients_), static_cast(coefficients_), sizeof(Fr) * size_); - p.zero_memory_beyond(p.size_); - return p; -} - template Fr Polynomial::evaluate(const Fr& z, const size_t target_size) const { return polynomial_arithmetic::evaluate(coefficients_, z, target_size); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index bbd8a2d73cb3..40550a93ac23 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -58,11 +58,6 @@ template class Polynomial { */ Polynomial share() const; - /** - * Return a deep clone of the polynomial. i.e. underlying memory is copied. - */ - Polynomial deep_clone() const; - std::array hash() const { return sha256::sha256(byte_span()); } void clear() diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp index f01ae586b983..84a02cbc65a7 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial_arithmetic.test.cpp @@ -642,7 +642,7 @@ TEST(polynomials, divide_by_vanishing_polynomial) polynomial_arithmetic::sub(&R[0], &C[0], &R[0], large_domain); polynomial R_copy(2 * n); - R_copy = R.deep_clone(); + R_copy = R; polynomial_arithmetic::divide_by_pseudo_vanishing_polynomial({ &R[0] }, small_domain, large_domain, 3); R.coset_ifft(large_domain); @@ -1264,7 +1264,7 @@ TYPED_TEST(PolynomialTests, default_construct_then_assign) EXPECT_EQ(poly.is_empty(), true); // fill the empty poly using the assignment operator - poly = interesting_poly.deep_clone(); + poly = interesting_poly; // coefficients and size should be equal in value for (size_t i = 0; i < num_coeffs; ++i) { diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp index 0e4a8789ca7e..578150c33050 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp @@ -19,7 +19,7 @@ void AvmMiniComposer::compute_witness(CircuitConstructor& circuit) for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) { // TODO(AD): can this be shared instead? - key_poly = prover_poly.deep_clone(); + key_poly = prover_poly; } computed_witness = true; From 0d1ca176425e90c86c49d21f63858d55a849adcb Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 17:59:23 +0000 Subject: [PATCH 29/60] Remove stuff --- .../zeromorph/zeromorph.hpp | 2 - .../honk/proof_system/permutation_library.hpp | 3 -- .../ultra_honk/relation_correctness.test.cpp | 46 ++++--------------- 3 files changed, 10 insertions(+), 41 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 58a0c53ba7e0..7ce5f6558516 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -325,7 +325,6 @@ template class ZeroMorphProver_ { const std::shared_ptr& transcript, const std::vector& concatenated_polynomials = {}, const std::vector& concatenated_evaluations = {}, - // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) remove span const std::vector>& concatenation_groups = {}) { // Generate batching challenge \rho and powers 1,...,\rho^{m-1} @@ -351,7 +350,6 @@ template class ZeroMorphProver_ { batching_scalar *= rho; } - int i = 0; Polynomial g_batched{ N }; // batched to-be-shifted polynomials for (auto [g_poly, g_shift_eval] : zip_view(g_polynomials, g_shift_evaluations)) { g_batched.add_scaled(g_poly, batching_scalar); diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp index 3f2ff03a604e..eb14f30c0633 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/permutation_library.hpp @@ -186,9 +186,6 @@ void compute_permutation_grand_products(std::shared_ptr void compute_concatenated_polynomials(StorageHandle* proving_key) { - // TODO(AD): use RefVector here, see https://github.com/AztecProtocol/barretenberg/issues/743 - // RefVector makes PolynomialHandle now redundant. Can scale back use of auto then too. - // using PolynomialHandle = typename Flavor::PolynomialHandle; // Concatenation groups are vectors of polynomials that are concatenated together auto concatenation_groups = proving_key->get_concatenation_groups(); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 1c1cde522ad7..5cc43dad5fc1 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -390,18 +390,8 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorPermutationRelationCorrectness) // Create storage for polynomials ProverPolynomials prover_polynomials; - std::vector polynomial_container; - auto polynomial_get_all = prover_polynomials.get_all(); - size_t z_perm_index = 0; - for (size_t i = 0; i < polynomial_get_all.size(); i++) { - // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) wouldn't be needed if ProverPolynomials held - // memory - if (&prover_polynomials.z_perm == &polynomial_get_all[i]) { - z_perm_index = i; - } - Polynomial temporary_polynomial(circuit_size); - polynomial_container.push_back(temporary_polynomial); - polynomial_get_all[i] = polynomial_container[i].share(); + for (Polynomial& prover_poly : prover_polynomials.get_all()) { + prover_poly = Polynomial{ circuit_size }; } // Fill in lagrange polynomials used in the permutation relation @@ -491,7 +481,7 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorPermutationRelationCorrectness) // Compute the grand product polynomial grand_product_library::compute_grand_product>( circuit_size, prover_polynomials, params); - prover_polynomials.z_perm_shift = polynomial_container[z_perm_index].shifted(); + prover_polynomials.z_perm_shift = prover_polynomials.z_perm.shifted(); using Relations = typename Flavor::Relations; @@ -515,20 +505,9 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorGenPermSortRelationCorrectness) proof_system::RelationParameters params; ProverPolynomials prover_polynomials; - std::vector polynomial_container; - - auto polynomial_get_all = prover_polynomials.get_all(); - size_t ordered_range_constraints_index = 0; // Allocate polynomials - for (size_t i = 0; i < polynomial_get_all.size(); i++) { - Polynomial temporary_polynomial(circuit_size); - // TODO(https://github.com/AztecProtocol/barretenberg/issues/743) wouldn't be needed if ProverPolynomials held - // memory - if (&prover_polynomials.ordered_range_constraints_0 == &polynomial_get_all[i]) { - ordered_range_constraints_index = i; - } - polynomial_container.push_back(temporary_polynomial); - polynomial_get_all[i] = polynomial_container[i].share(); + for (Polynomial& polynomial : prover_polynomials.get_all()) { + polynomial = Polynomial{ circuit_size }; } // Construct lagrange polynomials that are needed for Goblin Translator's GenPermSort Relation @@ -573,16 +552,11 @@ TEST_F(RelationCorrectnessTests, GoblinTranslatorGenPermSortRelationCorrectness) }); // Get shifted polynomials - prover_polynomials.ordered_range_constraints_0_shift = - polynomial_container[ordered_range_constraints_index].shifted(); - prover_polynomials.ordered_range_constraints_1_shift = - polynomial_container[ordered_range_constraints_index + 1].shifted(); - prover_polynomials.ordered_range_constraints_2_shift = - polynomial_container[ordered_range_constraints_index + 2].shifted(); - prover_polynomials.ordered_range_constraints_3_shift = - polynomial_container[ordered_range_constraints_index + 3].shifted(); - prover_polynomials.ordered_range_constraints_4_shift = - polynomial_container[ordered_range_constraints_index + 4].shifted(); + prover_polynomials.ordered_range_constraints_0_shift = prover_polynomials.ordered_range_constraints_0.shifted(); + prover_polynomials.ordered_range_constraints_1_shift = prover_polynomials.ordered_range_constraints_1.shifted(); + prover_polynomials.ordered_range_constraints_2_shift = prover_polynomials.ordered_range_constraints_2.shifted(); + prover_polynomials.ordered_range_constraints_3_shift = prover_polynomials.ordered_range_constraints_3.shifted(); + prover_polynomials.ordered_range_constraints_4_shift = prover_polynomials.ordered_range_constraints_4.shifted(); using Relations = typename Flavor::Relations; From 20f9f18ae7e4ec077e7e04443c7b99e1233f0cda Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 18:05:52 +0000 Subject: [PATCH 30/60] Remove storage cruft --- .../src/barretenberg/honk/utils/testing.hpp | 34 +++++-------------- .../barretenberg/honk/utils/testing.test.cpp | 17 ---------- .../protogalaxy/combiner.test.cpp | 12 ++----- 3 files changed, 12 insertions(+), 51 deletions(-) delete mode 100644 barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp index 15efb3237acc..d0eed0fca88c 100644 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/utils/testing.hpp @@ -9,54 +9,38 @@ namespace proof_system::honk { * function returns an array of data pointed to by the ProverPolynomials. */ template -std::pair get_sequential_prover_polynomials( - const size_t log_circuit_size, const size_t starting_value) +typename Flavor::ProverPolynomials get_sequential_prover_polynomials(const size_t log_circuit_size, + const size_t starting_value) { using FF = typename Flavor::FF; - using ProverPolynomials = typename Flavor::ProverPolynomials; using Polynomial = typename Flavor::Polynomial; - typename Flavor::ProverPolynomials storage; + typename Flavor::ProverPolynomials prover_polynomials; size_t circuit_size = 1 << log_circuit_size; size_t value_idx = starting_value; - for (auto& polynomial : storage.get_all()) { + for (auto& polynomial : prover_polynomials.get_all()) { polynomial = Polynomial(circuit_size); for (auto& value : polynomial) { value = FF(value_idx++); } } - - ProverPolynomials prover_polynomials; - for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage.get_all())) { - prover_poly = storage_poly.share(); - } - - return std::pair(std::move(storage), std::move(prover_polynomials)); + return prover_polynomials; } -template -std::pair get_zero_prover_polynomials( - const size_t log_circuit_size) +template typename Flavor::ProverPolynomials get_zero_prover_polynomials(const size_t log_circuit_size) { using FF = typename Flavor::FF; - using ProverPolynomials = typename Flavor::ProverPolynomials; using Polynomial = typename Flavor::Polynomial; - typename Flavor::ProverPolynomials storage; + typename Flavor::ProverPolynomials prover_polynomials; size_t circuit_size = 1 << log_circuit_size; - for (auto& polynomial : storage.get_all()) { + for (auto& polynomial : prover_polynomials.get_all()) { polynomial = Polynomial(circuit_size); for (auto& value : polynomial) { value = FF(0); } } - - ProverPolynomials prover_polynomials; - for (auto [prover_poly, storage_poly] : zip_view(prover_polynomials.get_all(), storage.get_all())) { - prover_poly = storage_poly.share(); - } - - return std::pair(std::move(storage), std::move(prover_polynomials)); + return prover_polynomials; } } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp b/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp deleted file mode 100644 index 3e150e4a2d5d..000000000000 --- a/barretenberg/cpp/src/barretenberg/honk/utils/testing.test.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "testing.hpp" -#include "barretenberg/flavor/ultra.hpp" -#include - -namespace barretenberg::test_testing_utils { - -TEST(HonkTestingUtils, ProverPolynomials) -{ - using Flavor = proof_system::honk::flavor::Ultra; - auto [storage, prover_polynomials] = - proof_system::honk::get_sequential_prover_polynomials(/*log_circuit_size=*/2, /*starting_value=*/0); - auto& first_polynomial = prover_polynomials.get_all()[0]; - EXPECT_EQ(storage.get_all()[0][0], first_polynomial[0]); - EXPECT_EQ(storage.get_all()[0][1], first_polynomial[1]); -}; - -} // namespace barretenberg::test_testing_utils diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index 511bc0fe9800..d69b45a9ef21 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -37,16 +37,14 @@ TEST(Protogalaxy, CombinerOn2Instances) // relation. if (is_random_input) { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; for (size_t idx = 0; idx < NUM_INSTANCES; idx++) { auto instance = std::make_shared(); - auto [storage, prover_polynomials] = proof_system::honk::get_sequential_prover_polynomials( + auto prover_polynomials = proof_system::honk::get_sequential_prover_polynomials( /*log_circuit_size=*/1, idx * 128); restrict_to_standard_arithmetic_relation(prover_polynomials); - storage_arrays[idx] = std::move(storage); instance->prover_polynomials = std::move(prover_polynomials); instance->instance_size = 2; instance_data[idx] = instance; @@ -73,16 +71,14 @@ TEST(Protogalaxy, CombinerOn2Instances) EXPECT_EQ(result, expected_result); } else { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; for (size_t idx = 0; idx < NUM_INSTANCES; idx++) { auto instance = std::make_shared(); - auto [storage, prover_polynomials] = proof_system::honk::get_zero_prover_polynomials( + auto prover_polynomials = proof_system::honk::get_zero_prover_polynomials( /*log_circuit_size=*/1); restrict_to_standard_arithmetic_relation(prover_polynomials); - storage_arrays[idx] = std::move(storage); instance->prover_polynomials = std::move(prover_polynomials); instance->instance_size = 2; instance_data[idx] = instance; @@ -166,15 +162,13 @@ TEST(Protogalaxy, CombinerOn4Instances) auto run_test = [&]() { std::vector> instance_data(NUM_INSTANCES); - std::array storage_arrays; ProtoGalaxyProver prover; std::vector pow_betas = { FF(1), FF(2) }; for (size_t idx = 0; idx < NUM_INSTANCES; idx++) { auto instance = std::make_shared(); - auto [storage, prover_polynomials] = proof_system::honk::get_zero_prover_polynomials( + auto prover_polynomials = proof_system::honk::get_zero_prover_polynomials( /*log_circuit_size=*/1); - storage_arrays[idx] = std::move(storage); instance->prover_polynomials = std::move(prover_polynomials); instance->instance_size = 2; instance_data[idx] = instance; From e59569446e755121fdc60983e709ea01f2641723 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 19:04:40 +0000 Subject: [PATCH 31/60] fix --- barretenberg/cpp/src/barretenberg/flavor/flavor.hpp | 3 ++- barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 11 +---------- .../library/grand_product_library.test.cpp | 1 + 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index b71bb1776ecc..bdfd9468f04c 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -105,7 +105,8 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { std::vector recursive_proof_public_input_indices; barretenberg::EvaluationDomain evaluation_domain; - auto get_all() { return concatenate(get_witness_polynomials(), get_precomputed_polynomials()); } + // This order matters! must match get_unshifted in entity classes + auto get_all() { return concatenate(get_precomputed_polynomials(), get_witness_polynomials()); } auto get_witness_polynomials() { return WitnessPolynomials::get_all(); } auto get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } ProvingKey_() = default; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index d3ad7d1d2279..a55f3bcbcfd3 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -185,16 +185,7 @@ class Ultra { // Gemini-specific getters. RefVector get_unshifted() { - return { this->q_c, this->q_l, this->q_r, this->q_o, - this->q_4, this->q_m, this->q_arith, this->q_sort, - this->q_elliptic, this->q_aux, this->q_lookup, this->sigma_1, - this->sigma_2, this->sigma_3, this->sigma_4, this->id_1, - this->id_2, this->id_3, this->id_4, this->table_1, - this->table_2, this->table_3, this->table_4, this->lagrange_first, - this->lagrange_last, this->w_l, this->w_r, this->w_o, - this->w_4, this->sorted_accum, this->z_perm, this->z_lookup - - }; + return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); }; RefVector get_precomputed() { return PrecomputedEntities::get_all(); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index 312ec117ceb0..1a0fb1a32ae0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -242,6 +242,7 @@ template class GrandProductTests : public testing::Test { for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { prover_poly = key_poly.share(); } + EXPECT_EQ(&proving_key->z_lookup[0], &prover_polynomials.z_lookup[0]); // Method 1: Compute z_lookup using the prover library method constexpr size_t LOOKUP_RELATION_INDEX = 1; From b2cb0d87d4ee85b353f590bf47b40ef8b60ba4c1 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 19:06:23 +0000 Subject: [PATCH 32/60] format --- barretenberg/cpp/src/barretenberg/common/debug_log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp index 3a4aef382488..1cff205f8325 100644 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp @@ -1,7 +1,7 @@ #include "debug_log.hpp" #include -#include #include +#include #ifdef BBERG_DEBUG_LOG namespace barretenberg { void _debug_log_check_abort_condition(const std::string& log_str) From 6af9aafc2bf2ff6a3c8979ad7566915ace426dba Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 19:43:06 +0000 Subject: [PATCH 33/60] debugs --- barretenberg/cpp/src/barretenberg/common/debug_log.hpp | 6 ++++++ .../proof_system/library/grand_product_library.hpp | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.hpp b/barretenberg/cpp/src/barretenberg/common/debug_log.hpp index 91670eba768f..c045ab626947 100644 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.hpp +++ b/barretenberg/cpp/src/barretenberg/common/debug_log.hpp @@ -95,9 +95,15 @@ template void _debug_log(const char* func_name, const cha barretenberg::_debug_log(__FUNCTION__, #__VA_ARGS__, __VA_ARGS__); \ } +#define DEBUG_LOG_ALL(container) \ + for (auto& x : (container)) { \ + barretenberg::_debug_log(__FUNCTION__, #container, x); \ + } + #else // If BBERG_DEBUG_LOG is not defined // Define empty macros and functions #define DEBUG_LOG(...) +#define DEBUG_LOG_ALL(container) #endif // BBERG_DEBUG_LOG diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index 8ab5d29cbc51..ecbd62dcdfdf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -1,5 +1,6 @@ #pragma once #include "barretenberg/common/constexpr_utils.hpp" +#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/thread.hpp" #include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" #include "barretenberg/polynomials/polynomial.hpp" @@ -81,6 +82,9 @@ void compute_grand_product(const size_t circuit_size, } }); + DEBUG_LOG_ALL(numerator); + DEBUG_LOG_ALL(denominator); + // Step (2) // Compute the accumulating product of the numerator and denominator terms. // This step is split into three parts for efficient multithreading: @@ -107,6 +111,9 @@ void compute_grand_product(const size_t circuit_size, partial_denominators[thread_idx] = denominator[end - 1]; }); + DEBUG_LOG_ALL(partial_numerators); + DEBUG_LOG_ALL(partial_numerators); + parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = thread_idx * block_size; const size_t end = (thread_idx + 1) * block_size; @@ -138,6 +145,8 @@ void compute_grand_product(const size_t circuit_size, grand_product_polynomial[i + 1] = numerator[i] * denominator[i]; } }); + + DEBUG_LOG_ALL(grand_product_polynomial); } template From 3157f168e43f1b110c6ebfd28122811a90369377 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 19:54:08 +0000 Subject: [PATCH 34/60] Fix attempts --- .../proof_system/library/grand_product_library.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index ecbd62dcdfdf..dfc7efe1ffa8 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -65,15 +65,14 @@ void compute_grand_product(const size_t circuit_size, // Populate `numerator` and `denominator` with the algebra described by Relation const size_t num_threads = circuit_size >= get_num_cpus_pow2() ? get_num_cpus_pow2() : 1; const size_t block_size = circuit_size / num_threads; - auto full_polynomial_pointers = full_polynomials.get_all(); + auto full_polynomials_unshifted = full_polynomials.get_unshifted(); parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = thread_idx * block_size; const size_t end = (thread_idx + 1) * block_size; for (size_t i = start; i < end; ++i) { - typename Flavor::AllValues evaluations; - auto evaluations_pointer = evaluations.get_all(); - for (size_t k = 0; k < Flavor::NUM_ALL_ENTITIES; ++k) { - evaluations_pointer[k] = full_polynomial_pointers[k].size() > i ? full_polynomial_pointers[k][i] : 0; + typename Flavor::AllValues evaluations{}; + for (auto [eval, full_poly] : zip_view(evaluations.get_all(), full_polynomials_unshifted)) { + eval = full_poly[i]; } numerator[i] = GrandProdRelation::template compute_grand_product_numerator( evaluations, relation_parameters); From 20d3932ad034e34e718fea877334cb5c1e71d6c7 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 21:44:04 +0000 Subject: [PATCH 35/60] Fix attempts --- .../barretenberg/polynomials/polynomial.hpp | 5 ++++- .../library/grand_product_library.hpp | 18 +++++++++++------- .../library/grand_product_library.test.cpp | 9 ++++++++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp index 8365904bad23..d8424e445fda 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/polynomial.hpp @@ -258,7 +258,10 @@ template class Polynomial { template inline std::ostream& operator<<(std::ostream& os, Polynomial const& p) { - if (p.size() < 2) { + if (p.size() == 0) { + return os << "[]"; + } + if (p.size() == 1) { return os << "[ data " << p[0] << "]"; } return os << "[ data\n" diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index dfc7efe1ffa8..0607398cfe53 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -2,6 +2,7 @@ #include "barretenberg/common/constexpr_utils.hpp" #include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/thread.hpp" +#include "barretenberg/common/zip_view.hpp" #include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" #include "barretenberg/polynomials/polynomial.hpp" #include "barretenberg/relations/relation_parameters.hpp" @@ -52,27 +53,30 @@ void compute_grand_product(const size_t circuit_size, typename Flavor::ProverPolynomials& full_polynomials, proof_system::RelationParameters& relation_parameters) { + DEBUG_LOG_ALL(full_polynomials.get_all()); using FF = typename Flavor::FF; using Polynomial = typename Flavor::Polynomial; using Accumulator = std::tuple_element_t<0, typename GrandProdRelation::SumcheckArrayOfValuesOverSubrelations>; // Allocate numerator/denominator polynomials that will serve as scratch space // TODO(zac) we can re-use the permutation polynomial as the numerator polynomial. Reduces readability - Polynomial numerator = Polynomial{ circuit_size }; - Polynomial denominator = Polynomial{ circuit_size }; + Polynomial numerator{ circuit_size }; + Polynomial denominator{ circuit_size }; + + DEBUG_LOG(full_polynomials.w_l, full_polynomials.w_r, full_polynomials.q_lookup); // Step (1) // Populate `numerator` and `denominator` with the algebra described by Relation const size_t num_threads = circuit_size >= get_num_cpus_pow2() ? get_num_cpus_pow2() : 1; const size_t block_size = circuit_size / num_threads; - auto full_polynomials_unshifted = full_polynomials.get_unshifted(); + auto full_polynomials_view = full_polynomials.get_all(); parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = thread_idx * block_size; const size_t end = (thread_idx + 1) * block_size; for (size_t i = start; i < end; ++i) { - typename Flavor::AllValues evaluations{}; - for (auto [eval, full_poly] : zip_view(evaluations.get_all(), full_polynomials_unshifted)) { - eval = full_poly[i]; + typename Flavor::AllValues evaluations; + for (auto [eval, full_poly] : zip_view(evaluations.get_all(), full_polynomials_view)) { + eval = full_poly.size() > i ? full_poly[i] : 0; } numerator[i] = GrandProdRelation::template compute_grand_product_numerator( evaluations, relation_parameters); @@ -111,7 +115,7 @@ void compute_grand_product(const size_t circuit_size, }); DEBUG_LOG_ALL(partial_numerators); - DEBUG_LOG_ALL(partial_numerators); + DEBUG_LOG_ALL(partial_denominators); parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = thread_idx * block_size; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index 1a0fb1a32ae0..8574fd6c278f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -242,7 +242,14 @@ template class GrandProductTests : public testing::Test { for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { prover_poly = key_poly.share(); } + for (auto [prover_poly, key_poly] : + zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { + prover_poly = key_poly.shifted(); + } + // Test a few assignments EXPECT_EQ(&proving_key->z_lookup[0], &prover_polynomials.z_lookup[0]); + EXPECT_EQ(&proving_key->sigma_1[0], &prover_polynomials.sigma_1[0]); + EXPECT_EQ(&proving_key->lagrange_last[0], &prover_polynomials.lagrange_last[0]); // Method 1: Compute z_lookup using the prover library method constexpr size_t LOOKUP_RELATION_INDEX = 1; @@ -285,7 +292,7 @@ template class GrandProductTests : public testing::Test { // q_lookup * f + γ accumulators[0][i] = lookup_selector[i] * f_i + gamma; - // t = t_1 + ηt_2 + η²t_3 + η³t_4 + // t = t_1 + ηt_2 + η²t_3 + η³t_41 FF table_i_plus_1 = tables[0][shift_idx] + eta * tables[1][shift_idx] + eta_sqr * tables[2][shift_idx] + eta_cube * tables[3][shift_idx]; From c763a10d2b18341491ca6291983fed678961c4c3 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 21:44:56 +0000 Subject: [PATCH 36/60] Fix attempts --- .../barretenberg/proof_system/library/grand_product_library.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index 0607398cfe53..8e4aae5bc327 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -63,8 +63,6 @@ void compute_grand_product(const size_t circuit_size, Polynomial numerator{ circuit_size }; Polynomial denominator{ circuit_size }; - DEBUG_LOG(full_polynomials.w_l, full_polynomials.w_r, full_polynomials.q_lookup); - // Step (1) // Populate `numerator` and `denominator` with the algebra described by Relation const size_t num_threads = circuit_size >= get_num_cpus_pow2() ? get_num_cpus_pow2() : 1; From e22455878ea7134b6321a51d332437e5c8448511 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 21:53:01 +0000 Subject: [PATCH 37/60] revert debug tools --- .../zeromorph/zeromorph.hpp | 18 --- .../cpp/src/barretenberg/common/debug_log.cpp | 15 --- .../cpp/src/barretenberg/common/debug_log.hpp | 109 ------------------ .../barretenberg/numeric/random/engine.cpp | 7 -- .../library/grand_product_library.hpp | 9 -- .../barretenberg/transcript/transcript.hpp | 4 - 6 files changed, 162 deletions(-) delete mode 100644 barretenberg/cpp/src/barretenberg/common/debug_log.cpp delete mode 100644 barretenberg/cpp/src/barretenberg/common/debug_log.hpp diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index ab8c8d6e1236..fa51507787b7 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -1,6 +1,5 @@ #pragma once #include "barretenberg/commitment_schemes/commitment_key.hpp" -#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/ref_vector.hpp" #include "barretenberg/common/zip_view.hpp" #include "barretenberg/polynomials/polynomial.hpp" @@ -63,7 +62,6 @@ template class ZeroMorphProver_ { */ static std::vector compute_multilinear_quotients(Polynomial polynomial, std::span u_challenge) { - DEBUG_LOG(polynomial, u_challenge); size_t log_N = numeric::get_msb(polynomial.size()); // The size of the multilinear challenge must equal the log of the polynomial size ASSERT(log_N == u_challenge.size()); @@ -83,7 +81,6 @@ template class ZeroMorphProver_ { } quotients[log_N - 1] = q.share(); - DEBUG_LOG(quotients[log_N - 1], log_N - 1); std::vector f_k; f_k.resize(size_q); @@ -127,7 +124,6 @@ template class ZeroMorphProver_ { FF y_challenge, size_t N) { - DEBUG_LOG(quotients, y_challenge, N); // Batched lifted degree quotient polynomial auto result = Polynomial(N); @@ -167,7 +163,6 @@ template class ZeroMorphProver_ { FF y_challenge, FF x_challenge) { - DEBUG_LOG(batched_quotient, quotients, y_challenge, x_challenge); size_t N = batched_quotient.size(); size_t log_N = quotients.size(); @@ -217,8 +212,6 @@ template class ZeroMorphProver_ { FF x_challenge, std::vector concatenation_groups_batched = {}) { - DEBUG_LOG( - f_batched, g_batched, quotients, v_evaluation, u_challenge, x_challenge, concatenation_groups_batched); size_t N = f_batched.size(); size_t log_N = quotients.size(); @@ -288,7 +281,6 @@ template class ZeroMorphProver_ { FF x_challenge, FF z_challenge) { - DEBUG_LOG(zeta_x, Z_x, x_challenge, z_challenge); // We cannot commit to polynomials with size > N_max size_t N = zeta_x.size(); ASSERT(N <= N_max); @@ -337,15 +329,6 @@ template class ZeroMorphProver_ { const std::vector& concatenated_evaluations = {}, const std::vector>& concatenation_groups = {}) { - DEBUG_LOG(f_polynomials, - g_polynomials, - g_shift_evaluations, - multilinear_challenge, - commitment_key, - transcript, - concatenated_polynomials, - concatenated_evaluations, - concatenation_groups); // Generate batching challenge \rho and powers 1,...,\rho^{m-1} const FF rho = transcript->get_challenge("rho"); @@ -411,7 +394,6 @@ template class ZeroMorphProver_ { q_k_commitments.reserve(log_N); for (size_t idx = 0; idx < log_N; ++idx) { q_k_commitments[idx] = commitment_key->commit(quotients[idx]); - DEBUG_LOG(idx, quotients[idx], q_k_commitments[idx]); std::string label = "ZM:C_q_" + std::to_string(idx); transcript->send_to_verifier(label, q_k_commitments[idx]); } diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp b/barretenberg/cpp/src/barretenberg/common/debug_log.cpp deleted file mode 100644 index 1cff205f8325..000000000000 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "debug_log.hpp" -#include -#include -#include -#ifdef BBERG_DEBUG_LOG -namespace barretenberg { -void _debug_log_check_abort_condition(const std::string& log_str) -{ - const char* abort_cond = std::getenv("DEBUG_LOG_ABORT"); - if (abort_cond != nullptr && log_str.find(abort_cond) != std::string::npos) { - throw std::runtime_error("Abort condition met: " + log_str); - } -} -} // namespace barretenberg -#endif diff --git a/barretenberg/cpp/src/barretenberg/common/debug_log.hpp b/barretenberg/cpp/src/barretenberg/common/debug_log.hpp deleted file mode 100644 index c045ab626947..000000000000 --- a/barretenberg/cpp/src/barretenberg/common/debug_log.hpp +++ /dev/null @@ -1,109 +0,0 @@ -#pragma once - -/** - * @details - * To be used to create a verbose trace of execution. This helps with comparing runs that should have had the same - * result, but don't. It is less useful for other kinds of correctness, but if we know what values we expect (or not) it - * still can be useful. - * - * Compilation: cmake -DCMAKE_CXX_FLAGS="-DBBERG_DEBUG_LOG" ... - * Then, compare outputs of the program with another run of the same program (it's good to remove sources of randomness, - * if present). Once you have a divergence you can use the environment variable DEBUG_LOG_ABORT=... with a string - * pattern to abort the program, stopping in a debugger. - */ - -#ifdef BBERG_DEBUG_LOG - -#include -#include -#include -namespace barretenberg { -/** - * Throws an std::runtime_error if we would print a log that includes the env variable DEBUG_LOG_ABORT. - * This is primarily intended to be used with a debugger to then poke around execution and see differences in a - * comparison log. Does nothing if DEBUG_LOG_ABORT is not set. - * Should be run with MULTITHREADING=OFF for best results, and with no non-determinism (the BBERG_DEBUG_LOG flag - * currently turns off some determinism). - * @param log_str The log string to be checked against the environment variable. - */ -void _debug_log_check_abort_condition(const std::string& log_str); - -template -concept Printable = requires(T a) { std::cout << a; }; -template -concept ContainerLike = requires(T a) { - a.begin(); - a.size(); - }; - -template const char* _summarize(const T* /*unused*/) -{ - return "(?)"; -} - -template const T& _summarize(const T* x) -{ - return *x; -} - -// fallback for non-printable containers -template -std::string _summarize(const T* x) - requires(!Printable) -{ - std::ostringstream ss; - if (x->size() == 0) { - ss << "[]"; - } else { - ss << "[" << _summarize(&*x->begin()) << "...]"; - } - return ss.str(); -} - -/** - * Logs multiple values to standard output. - * - * @param args The values to be logged. - */ -template void _debug_log(const char* func_name, const char* arg_string, const FuncArgs&... args) -{ - // shut off recursive DEBUG_LOG - static size_t debug_log_calls = 0; - if (debug_log_calls > 0) { - return; - } - debug_log_calls++; - std::ostringstream ss; - ss << func_name << " " << arg_string << " = "; - // Using fold expression to append args to stringstream - ((ss << _summarize(&args) << " "), ...); - std::string log_str = ss.str(); - // Want to be able to catch offending statements in a debugger, this throws if we match an env variable pattern - _debug_log_check_abort_condition(log_str); - std::cout << log_str << std::endl; - debug_log_calls--; -} -} // namespace barretenberg -/** - * Logs function parameters. This macro should be placed at the beginning of function - * bodies to log their parameters. - * - * @param ... The parameters to be logged. - */ -#define DEBUG_LOG(...) \ - if (!std::is_constant_evaluated()) { /*we are not in a compile-time constexpr*/ \ - barretenberg::_debug_log(__FUNCTION__, #__VA_ARGS__, __VA_ARGS__); \ - } - -#define DEBUG_LOG_ALL(container) \ - for (auto& x : (container)) { \ - barretenberg::_debug_log(__FUNCTION__, #container, x); \ - } - -#else // If BBERG_DEBUG_LOG is not defined - -// Define empty macros and functions -#define DEBUG_LOG(...) -#define DEBUG_LOG_ALL(container) - -#endif // BBERG_DEBUG_LOG diff --git a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp index a07d29972d0d..ff31c6136d8f 100644 --- a/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp +++ b/barretenberg/cpp/src/barretenberg/numeric/random/engine.cpp @@ -10,15 +10,8 @@ namespace { auto generate_random_data() { std::array random_data; -#ifdef BBERG_DEBUG_LOG - // if we are debug logging, don't actually use randomness, defeats the intended use-case of comparing runs - for (size_t i = 0; i < 32; i++) { - random_data[i] = static_cast(i + 1); - } -#else std::random_device source; std::generate(std::begin(random_data), std::end(random_data), std::ref(source)); -#endif return random_data; } } // namespace diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index 8e4aae5bc327..e6d19799b7f4 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -53,7 +53,6 @@ void compute_grand_product(const size_t circuit_size, typename Flavor::ProverPolynomials& full_polynomials, proof_system::RelationParameters& relation_parameters) { - DEBUG_LOG_ALL(full_polynomials.get_all()); using FF = typename Flavor::FF; using Polynomial = typename Flavor::Polynomial; using Accumulator = std::tuple_element_t<0, typename GrandProdRelation::SumcheckArrayOfValuesOverSubrelations>; @@ -83,9 +82,6 @@ void compute_grand_product(const size_t circuit_size, } }); - DEBUG_LOG_ALL(numerator); - DEBUG_LOG_ALL(denominator); - // Step (2) // Compute the accumulating product of the numerator and denominator terms. // This step is split into three parts for efficient multithreading: @@ -112,9 +108,6 @@ void compute_grand_product(const size_t circuit_size, partial_denominators[thread_idx] = denominator[end - 1]; }); - DEBUG_LOG_ALL(partial_numerators); - DEBUG_LOG_ALL(partial_denominators); - parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = thread_idx * block_size; const size_t end = (thread_idx + 1) * block_size; @@ -146,8 +139,6 @@ void compute_grand_product(const size_t circuit_size, grand_product_polynomial[i + 1] = numerator[i] * denominator[i]; } }); - - DEBUG_LOG_ALL(grand_product_polynomial); } template diff --git a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp index f9baa1427ff7..e734829460c2 100644 --- a/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp +++ b/barretenberg/cpp/src/barretenberg/transcript/transcript.hpp @@ -1,6 +1,5 @@ #pragma once -#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/serialize.hpp" #include "barretenberg/crypto/blake3s/blake3s.hpp" #include "barretenberg/crypto/pedersen_hash/pedersen.hpp" @@ -270,7 +269,6 @@ class BaseTranscript { */ template void send_to_verifier(const std::string& label, const T& element) { - DEBUG_LOG(label, element); using serialize::write; // TODO(Adrian): Ensure that serialization of affine elements (including point at infinity) is consistent. // TODO(Adrian): Consider restricting serialization (via concepts) to types T for which sizeof(T) reliably @@ -303,7 +301,6 @@ class BaseTranscript { BaseTranscript::consume_prover_element_bytes(label, element_bytes); T element = from_buffer(element_bytes); - DEBUG_LOG(label, element); #ifdef LOG_INTERACTIONS if constexpr (Loggable) { @@ -347,7 +344,6 @@ class BaseTranscript { #if defined LOG_CHALLENGES || defined LOG_INTERACTIONS info("challenge: ", label, ": ", result); #endif - DEBUG_LOG(label, result); return result; } From e6fe2666043a74e6cee8d6c07213320fc619c50c Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 21:53:56 +0000 Subject: [PATCH 38/60] revert debug tools --- .../barretenberg/proof_system/library/grand_product_library.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index e6d19799b7f4..e4afe8fe7ab3 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -1,6 +1,5 @@ #pragma once #include "barretenberg/common/constexpr_utils.hpp" -#include "barretenberg/common/debug_log.hpp" #include "barretenberg/common/thread.hpp" #include "barretenberg/common/zip_view.hpp" #include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" From aece6e50426ff83c5dc0de8fe9257e6f03ac4a39 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 23:05:38 +0000 Subject: [PATCH 39/60] Fix ultra witnesses --- barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 2 +- barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index a55f3bcbcfd3..6be7b0afc00a 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -137,7 +137,7 @@ class Ultra { z_perm, // column 5 z_lookup) // column 6 - RefVector get_wires() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; + RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; }; /** diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp index 7ec78a737992..900a11c51dc7 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp @@ -89,7 +89,7 @@ template class SumcheckProverRound { size_t edge_idx) { for (auto [extended_edge, multivariate] : zip_view(extended_edges.get_all(), multivariates.get_all())) { - auto edge = barretenberg::Univariate({ multivariate[edge_idx], multivariate[edge_idx + 1] }); + barretenberg::Univariate edge{ multivariate[edge_idx], multivariate[edge_idx + 1] }; extended_edge = edge.template extend_to(); } } From e686afba66abba59964a2881c76d855d028163e0 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 23:22:38 +0000 Subject: [PATCH 40/60] Update --- barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp index 900a11c51dc7..2a52cd665f72 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp @@ -89,7 +89,7 @@ template class SumcheckProverRound { size_t edge_idx) { for (auto [extended_edge, multivariate] : zip_view(extended_edges.get_all(), multivariates.get_all())) { - barretenberg::Univariate edge{ multivariate[edge_idx], multivariate[edge_idx + 1] }; + barretenberg::Univariate edge({ multivariate[edge_idx], multivariate[edge_idx + 1] }); extended_edge = edge.template extend_to(); } } From d1a6117fb863bc6dd006083071df94f1666c3338 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 18:31:39 -0500 Subject: [PATCH 41/60] Update prover_instance.hpp --- .../cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 9c68d05fd887..5c688ffecd5f 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -1,5 +1,4 @@ #pragma once -#include "barretenberg/common/container.hpp" #include "barretenberg/flavor/flavor.hpp" #include "barretenberg/flavor/goblin_ultra.hpp" #include "barretenberg/flavor/ultra.hpp" @@ -108,4 +107,4 @@ template class ProverInstance_ { extern template class ProverInstance_; extern template class ProverInstance_; -} // namespace proof_system::honk \ No newline at end of file +} // namespace proof_system::honk From bc7a9aac817b0aa8f6ff7aace794fa1d8209f9cc Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 23:34:31 +0000 Subject: [PATCH 42/60] Fix attempts --- .../src/barretenberg/commitment_schemes/shplonk/shplonk.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp index 0c621bc75919..e4cb18795a4c 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/shplonk/shplonk.hpp @@ -120,12 +120,13 @@ template class ShplonkProver_ { // G₀ = ∑ⱼ ρʲ ⋅ vⱼ / ( r − xⱼ ) Fr current_nu = Fr::one(); + Polynomial tmp(G.size()); for (size_t j = 0; j < num_opening_pairs; ++j) { // (Cⱼ, xⱼ, vⱼ) const auto& [challenge, evaluation] = opening_pairs[j]; // tmp = ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( r − xⱼ ) - Polynomial tmp = witness_polynomials[j]; + tmp = witness_polynomials[j]; tmp[0] -= evaluation; Fr scaling_factor = current_nu * inverse_vanishing_evals[j]; // = ρʲ / ( r − xⱼ ) From bc852ea443070e861674d5bd251c65837946eb0b Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 23:36:50 +0000 Subject: [PATCH 43/60] Fix attempts --- .../zeromorph/zeromorph.hpp | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index fa51507787b7..034bf007d20b 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -111,10 +111,10 @@ template class ZeroMorphProver_ { /** * @brief Construct batched, lifted-degree univariate quotient \hat{q} = \sum_k y^k * X^{N - d_k - 1} * q_k * @details The purpose of the batched lifted-degree quotient is to reduce the individual degree checks - * deg(q_k) <= 2^k - 1 to a single degree check on \hat{q}. This is done by first shifting each of the q_k to - * the right (i.e. multiplying by an appropriate power of X) so that each is degree N-1, then batching them all - * together using powers of the provided challenge. Note: In practice, we do not actually compute the shifted - * q_k, we simply accumulate them into \hat{q} at the appropriate offset. + * deg(q_k) <= 2^k - 1 to a single degree check on \hat{q}. This is done by first shifting each of the q_k to the + * right (i.e. multiplying by an appropriate power of X) so that each is degree N-1, then batching them all together + * using powers of the provided challenge. Note: In practice, we do not actually compute the shifted q_k, we simply + * accumulate them into \hat{q} at the appropriate offset. * * @param quotients Polynomials q_k, interpreted as univariates; deg(q_k) = 2^k - 1 * @param N circuit size @@ -131,9 +131,8 @@ template class ZeroMorphProver_ { size_t k = 0; auto scalar = FF(1); // y^k for (auto& quotient : quotients) { - // Rather than explicitly computing the shifts of q_k by N - d_k - 1 (i.e. multiplying q_k by X^{N - d_k - // - 1}) then accumulating them, we simply accumulate y^k*q_k into \hat{q} at the index offset N - d_k - - // 1 + // Rather than explicitly computing the shifts of q_k by N - d_k - 1 (i.e. multiplying q_k by X^{N - d_k - + // 1}) then accumulating them, we simply accumulate y^k*q_k into \hat{q} at the index offset N - d_k - 1 auto deg_k = static_cast((1 << k) - 1); size_t offset = N - deg_k - 1; for (size_t idx = 0; idx < deg_k + 1; ++idx) { @@ -195,8 +194,8 @@ template class ZeroMorphProver_ { * * and concatenation_term = \sum_{i=0}^{num_chunks_per_group}(x^{i * min_N + 1}concatenation_groups_batched_{i}) * - * @note The concatenation term arises from an implementation detail in the Goblin Translator and is not part of - * the conventional ZM protocol + * @note The concatenation term arises from an implementation detail in the Goblin Translator and is not part of the + * conventional ZM protocol * @param input_polynomial * @param quotients * @param v_evaluation @@ -247,8 +246,7 @@ template class ZeroMorphProver_ { // If necessary, add to Z_x the contribution related to concatenated polynomials: // \sum_{i=0}^{num_chunks_per_group}(x^{i * min_n + 1}concatenation_groups_batched_{i}). // We are effectively reconstructing concatenated polynomials from their chunks now that we know x - // Note: this is an implementation detail related to Goblin Translator and is not part of the standard - // protocol. + // Note: this is an implementation detail related to Goblin Translator and is not part of the standard protocol. if (!concatenation_groups_batched.empty()) { size_t MINICIRCUIT_N = N / concatenation_groups_batched.size(); auto x_to_minicircuit_N = @@ -295,13 +293,13 @@ template class ZeroMorphProver_ { // TODO(#742): To complete the degree check, we need to commit to (q_{\zeta} + z*q_Z)*X^{N_max - N - 1}. // Verification then requires a pairing check similar to the standard KZG check but with [1]_2 replaced by - // [X^{N_max - N -1}]_2. Two issues: A) we do not have an SRS with these G2 elements (so need to generate a - // fake setup until we can do the real thing), and B) its not clear to me how to update our pairing - // algorithms to do this type of pairing. For now, simply construct q_{\zeta} + z*q_Z without the shift and - // do a standard KZG pairing check. When we're ready, all we have to do to make this fully legit is commit - // to the shift here and update the pairing check accordingly. Note: When this is implemented properly, it - // doesnt make sense to store the (massive) shifted polynomial of size N_max. Ideally would only store the - // unshifted version and just compute the shifted commitment directly via a new method. + // [X^{N_max - N -1}]_2. Two issues: A) we do not have an SRS with these G2 elements (so need to generate a fake + // setup until we can do the real thing), and B) its not clear to me how to update our pairing algorithms to do + // this type of pairing. For now, simply construct q_{\zeta} + z*q_Z without the shift and do a standard KZG + // pairing check. When we're ready, all we have to do to make this fully legit is commit to the shift here and + // update the pairing check accordingly. Note: When this is implemented properly, it doesnt make sense to store + // the (massive) shifted polynomial of size N_max. Ideally would only store the unshifted version and just + // compute the shifted commitment directly via a new method. auto batched_shifted_quotient = batched_quotient; return batched_shifted_quotient; @@ -380,8 +378,8 @@ template class ZeroMorphProver_ { batching_scalar *= rho; } - // Compute the full batched polynomial f = f_batched + g_batched.shifted() = f_batched + h_batched. This is - // the polynomial for which we compute the quotients q_k and prove f(u) = v_batched. + // Compute the full batched polynomial f = f_batched + g_batched.shifted() = f_batched + h_batched. This is the + // polynomial for which we compute the quotients q_k and prove f(u) = v_batched. Polynomial f_polynomial = f_batched; f_polynomial += g_batched.shifted(); f_polynomial += concatenated_batched; @@ -506,8 +504,8 @@ template class ZeroMorphVerifier_ { * concatenation_term = \sum{i=0}^{o-1}\sum_{j=0}^{num_chunks_per_group}(rho^{m+l+i} * x^{j * min_N + 1} * * concatenation_groups_commitments_{i}_{j}) * - * @note The concatenation term arises from an implementation detail in the Goblin Translator and is not part of - * the conventional ZM protocol + * @note The concatenation term arises from an implementation detail in the Goblin Translator and is not part of the + * conventional ZM protocol * @param f_commitments Commitments to unshifted polynomials [f_i] * @param g_commitments Commitments to to-be-shifted polynomials [g_i] * @param C_q_k Commitments to q_k @@ -563,8 +561,7 @@ template class ZeroMorphVerifier_ { } // If applicable, add contribution from concatenated polynomial commitments - // Note: this is an implementation detail related to Goblin Translator and is not part of the standard - // protocol. + // Note: this is an implementation detail related to Goblin Translator and is not part of the standard protocol. if (!concatenation_groups_commitments.empty()) { size_t CONCATENATION_INDEX = concatenation_groups_commitments[0].size(); size_t MINICIRCUIT_N = N / CONCATENATION_INDEX; From 3c03f3e93e5ec171e6b556a029d3b58a78029daf Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 11 Dec 2023 23:49:23 +0000 Subject: [PATCH 44/60] fix --- .../proof_system/library/grand_product_library.test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index 8574fd6c278f..d1e67eabae1e 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -292,7 +292,7 @@ template class GrandProductTests : public testing::Test { // q_lookup * f + γ accumulators[0][i] = lookup_selector[i] * f_i + gamma; - // t = t_1 + ηt_2 + η²t_3 + η³t_41 + // t = t_1 + ηt_2 + η²t_3 + η³t_4 FF table_i_plus_1 = tables[0][shift_idx] + eta * tables[1][shift_idx] + eta_sqr * tables[2][shift_idx] + eta_cube * tables[3][shift_idx]; From d81bc7bb255b611422ed2159c0428558145fa44d Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 03:39:05 +0000 Subject: [PATCH 45/60] shifty --- .../sumcheck/instance/prover_instance.cpp | 63 +++++++++++++++++-- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index f6b9070d9136..3b0c32ac901b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -281,13 +281,66 @@ std::shared_ptr ProverInstance_::compute_pr template void ProverInstance_::initialize_prover_polynomials() { - for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { - prover_poly = key_poly.shifted(); + prover_polynomials.q_c = proving_key->q_c.share(); + prover_polynomials.q_l = proving_key->q_l.share(); + prover_polynomials.q_r = proving_key->q_r.share(); + prover_polynomials.q_o = proving_key->q_o.share(); + prover_polynomials.q_m = proving_key->q_m.share(); + prover_polynomials.sigma_1 = proving_key->sigma_1.share(); + prover_polynomials.sigma_2 = proving_key->sigma_2.share(); + prover_polynomials.sigma_3 = proving_key->sigma_3.share(); + prover_polynomials.id_1 = proving_key->id_1.share(); + prover_polynomials.id_2 = proving_key->id_2.share(); + prover_polynomials.id_3 = proving_key->id_3.share(); + prover_polynomials.lagrange_first = proving_key->lagrange_first.share(); + prover_polynomials.lagrange_last = proving_key->lagrange_last.share(); + prover_polynomials.w_l = proving_key->w_l.share(); + prover_polynomials.w_r = proving_key->w_r.share(); + prover_polynomials.w_o = proving_key->w_o.share(); + + prover_polynomials.q_4 = proving_key->q_4.share(); + prover_polynomials.q_arith = proving_key->q_arith.share(); + prover_polynomials.q_sort = proving_key->q_sort.share(); + prover_polynomials.q_elliptic = proving_key->q_elliptic.share(); + prover_polynomials.q_aux = proving_key->q_aux.share(); + prover_polynomials.q_lookup = proving_key->q_lookup.share(); + prover_polynomials.sigma_4 = proving_key->sigma_4.share(); + prover_polynomials.id_4 = proving_key->id_4.share(); + prover_polynomials.table_1 = proving_key->table_1.share(); + prover_polynomials.table_2 = proving_key->table_2.share(); + prover_polynomials.table_3 = proving_key->table_3.share(); + prover_polynomials.table_4 = proving_key->table_4.share(); + prover_polynomials.table_1_shift = proving_key->table_1.shifted(); + prover_polynomials.table_2_shift = proving_key->table_2.shifted(); + prover_polynomials.table_3_shift = proving_key->table_3.shifted(); + prover_polynomials.table_4_shift = proving_key->table_4.shifted(); + prover_polynomials.w_l_shift = proving_key->w_l.shifted(); + prover_polynomials.w_r_shift = proving_key->w_r.shifted(); + prover_polynomials.w_o_shift = proving_key->w_o.shifted(); + + if constexpr (IsGoblinFlavor) { + prover_polynomials.ecc_op_wire_1 = proving_key->ecc_op_wire_1.share(); + prover_polynomials.ecc_op_wire_2 = proving_key->ecc_op_wire_2.share(); + prover_polynomials.ecc_op_wire_3 = proving_key->ecc_op_wire_3.share(); + prover_polynomials.ecc_op_wire_4 = proving_key->ecc_op_wire_4.share(); + prover_polynomials.lagrange_ecc_op = proving_key->lagrange_ecc_op.share(); + // DataBus polynomials + prover_polynomials.calldata = proving_key->calldata.share(); + prover_polynomials.calldata_read_counts = proving_key->calldata_read_counts.share(); + prover_polynomials.lookup_inverses = proving_key->lookup_inverses.share(); + prover_polynomials.q_busread = proving_key->q_busread.share(); + prover_polynomials.databus_id = proving_key->databus_id.share(); + prover_polynomials.q_poseidon2_external = proving_key->q_poseidon2_external.share(); + prover_polynomials.q_poseidon2_internal = proving_key->q_poseidon2_internal.share(); } + // These polynomials have not yet been computed; initialize them so prover_polynomials is "full" and we can use + // utilities like get_row() + prover_polynomials.z_perm = proving_key->z_perm.share(); + prover_polynomials.z_lookup = proving_key->z_lookup.share(); + prover_polynomials.z_perm_shift = proving_key->z_perm.shifted(); + prover_polynomials.z_lookup_shift = proving_key->z_lookup.shifted(); + std::span public_wires_source = prover_polynomials.w_r; // Determine public input offsets in the circuit relative to the 0th index for Ultra flavors From 63fd313dd4d78c802c3604d2916eb2449f40e067 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 11:13:18 +0000 Subject: [PATCH 46/60] no commitment handle --- .../cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp | 1 - .../cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp | 1 - barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 1 - barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp | 1 - 4 files changed, 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 59ccbcf94409..9a887fc673eb 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -29,7 +29,6 @@ class AvmMiniFlavor { using PolynomialHandle = std::span; using GroupElement = G1::element; using Commitment = G1::affine_element; - using CommitmentHandle = G1::affine_element; using CommitmentKey = pcs::CommitmentKey; using VerifierCommitmentKey = pcs::VerifierCommitmentKey; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp index fb6e0751361a..c82f68c463b6 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp @@ -44,7 +44,6 @@ template class GoblinUltraRecursive_ { using Curve = plonk::stdlib::bn254; using GroupElement = typename Curve::Element; using Commitment = typename Curve::Element; - using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; using NativeVerificationKey = flavor::GoblinUltra::VerificationKey; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 6be7b0afc00a..a7f7040fb774 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -25,7 +25,6 @@ class Ultra { using FF = Curve::ScalarField; using GroupElement = Curve::Element; using Commitment = Curve::AffineElement; - using CommitmentHandle = Curve::AffineElement; using PCS = pcs::kzg::KZG; using Polynomial = barretenberg::Polynomial; using PolynomialHandle = std::span; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp index df0ac96c120b..02a754981e28 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp @@ -52,7 +52,6 @@ template class UltraRecursive_ { using Curve = plonk::stdlib::bn254; using GroupElement = typename Curve::Element; using Commitment = typename Curve::Element; - using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; using NativeVerificationKey = flavor::Ultra::VerificationKey; From 8977c3cc2c70981cc41833b17eabe6a491f515d4 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 13:29:01 +0000 Subject: [PATCH 47/60] fix: polynomial alignment --- .../src/barretenberg/eccvm/eccvm_prover.cpp | 2 + .../cpp/src/barretenberg/flavor/flavor.hpp | 22 ++++++- .../src/barretenberg/flavor/flavor_macros.hpp | 21 +++++- .../src/barretenberg/flavor/goblin_ultra.hpp | 45 +------------ .../library/grand_product_library.test.cpp | 12 ++++ .../sumcheck/instance/prover_instance.cpp | 66 +++---------------- .../goblin_translator_prover.cpp | 2 + .../vm/generated/AvmMini_prover.cpp | 4 ++ 8 files changed, 67 insertions(+), 107 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index a6f93eb04562..f43a46d64f15 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -32,9 +32,11 @@ ECCVMProver_::ECCVMProver_(const std::shared_ptrz_perm = Polynomial(key->circuit_size); for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly)); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == (flavor_get_label(*key, key_poly) + "_shift")); prover_poly = key_poly.shifted(); } } diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index bdfd9468f04c..959580c53c9a 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -64,7 +64,9 @@ */ #pragma once +#include "barretenberg/common/ref_vector.hpp" #include "barretenberg/common/std_array.hpp" +#include "barretenberg/common/std_vector.hpp" #include "barretenberg/common/zip_view.hpp" #include "barretenberg/polynomials/barycentric.hpp" #include "barretenberg/polynomials/evaluation_domain.hpp" @@ -105,10 +107,14 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { std::vector recursive_proof_public_input_indices; barretenberg::EvaluationDomain evaluation_domain; + std::vector get_labels() const + { + return concatenate(PrecomputedPolynomials::get_labels(), WitnessPolynomials::get_labels()); + } // This order matters! must match get_unshifted in entity classes - auto get_all() { return concatenate(get_precomputed_polynomials(), get_witness_polynomials()); } - auto get_witness_polynomials() { return WitnessPolynomials::get_all(); } - auto get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } + RefVector get_all() { return concatenate(get_precomputed_polynomials(), get_witness_polynomials()); } + RefVector get_witness_polynomials() { return WitnessPolynomials::get_all(); } + RefVector get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } ProvingKey_() = default; ProvingKey_(const size_t circuit_size, const size_t num_public_inputs) { @@ -302,5 +308,15 @@ template concept UltraFlavor = IsAnyOf concept ECCVMFlavor = IsAnyOf; +template +inline std::string flavor_get_label(Container&& container, const Element& element) { + for (auto [label, data] : zip_view(container.get_labels(), container.get_all())) { + if (&data == &element) { + return label; + } + } + return "(unknown label)"; +} + // clang-format on } // namespace proof_system diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp index d25bb4eb513e..300577aeb45f 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp @@ -36,7 +36,16 @@ template auto _refs_to_pointer_array(Refs&... refs) */ #define DEFINE_FLAVOR_MEMBERS(DataType, ...) \ DataType __VA_ARGS__; \ - DEFINE_REF_VIEW(__VA_ARGS__) + DEFINE_REF_VIEW(__VA_ARGS__) \ + barretenberg / cpp / src / barretenberg / flavor / \ + flavor_macros.hpp std::vector get_labels() const \ + { \ + return std::split_and_trim(#__VA_ARGS__, ','); \ + } \ + constexpr std::size_t size() const \ + { \ + return barretenberg::detail::_va_count(__VA_ARGS__); \ + } #define DEFINE_COMPOUND_GET_ALL(...) \ [[nodiscard]] auto get_all() \ @@ -45,5 +54,13 @@ template auto _refs_to_pointer_array(Refs&... refs) } \ [[nodiscard]] auto get_all() const \ { \ - return concatenate(__VA_ARGS__); \ + return barretenberg::detail::_concatenate_base_class_get_all_const(*this); \ + } \ + constexpr std::size_t size() const \ + { \ + return barretenberg::detail::_sum_base_class_size(*this); \ + } \ + std::vector get_labels() const \ + { \ + return barretenberg::detail::_concatenate_base_class_get_labels(*this); \ } diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 031c1bd397bb..0e7016b222f9 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -240,50 +240,7 @@ class GoblinUltra { // Gemini-specific getters. RefVector get_unshifted() { - return { this->q_c, - this->q_l, - this->q_r, - this->q_o, - this->q_4, - this->q_m, - this->q_arith, - this->q_sort, - this->q_elliptic, - this->q_aux, - this->q_lookup, - this->q_busread, - this->q_poseidon2_external, - this->q_poseidon2_internal, - this->sigma_1, - this->sigma_2, - this->sigma_3, - this->sigma_4, - this->id_1, - this->id_2, - this->id_3, - this->id_4, - this->table_1, - this->table_2, - this->table_3, - this->table_4, - this->lagrange_first, - this->lagrange_last, - this->lagrange_ecc_op, - this->databus_id, - this->w_l, - this->w_r, - this->w_o, - this->w_4, - this->sorted_accum, - this->z_perm, - this->z_lookup, - this->ecc_op_wire_1, - this->ecc_op_wire_2, - this->ecc_op_wire_3, - this->ecc_op_wire_4, - this->calldata, - this->calldata_read_counts, - this->lookup_inverses }; + return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); }; RefVector get_witness() { return WitnessEntities::get_all(); }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index d1e67eabae1e..c4f48b979d88 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -91,8 +91,16 @@ template class GrandProductTests : public testing::Test { typename Flavor::ProverPolynomials prover_polynomials; for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + proof_system::flavor_get_label(*proving_key, key_poly)); prover_poly = key_poly.share(); } + for (auto [prover_poly, key_poly] : + zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + (proof_system::flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); + } // Method 1: Compute z_perm using 'compute_grand_product_polynomial' as the prover would in practice constexpr size_t PERMUTATION_RELATION_INDEX = 0; @@ -240,10 +248,14 @@ template class GrandProductTests : public testing::Test { typename Flavor::ProverPolynomials prover_polynomials; for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + proof_system::flavor_get_label(*proving_key, key_poly)); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + proof_system::flavor_get_label(*proving_key, key_poly) + "_shift"); prover_poly = key_poly.shifted(); } // Test a few assignments diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 3b0c32ac901b..836a4728bd6f 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -281,65 +281,15 @@ std::shared_ptr ProverInstance_::compute_pr template void ProverInstance_::initialize_prover_polynomials() { - prover_polynomials.q_c = proving_key->q_c.share(); - prover_polynomials.q_l = proving_key->q_l.share(); - prover_polynomials.q_r = proving_key->q_r.share(); - prover_polynomials.q_o = proving_key->q_o.share(); - prover_polynomials.q_m = proving_key->q_m.share(); - prover_polynomials.sigma_1 = proving_key->sigma_1.share(); - prover_polynomials.sigma_2 = proving_key->sigma_2.share(); - prover_polynomials.sigma_3 = proving_key->sigma_3.share(); - prover_polynomials.id_1 = proving_key->id_1.share(); - prover_polynomials.id_2 = proving_key->id_2.share(); - prover_polynomials.id_3 = proving_key->id_3.share(); - prover_polynomials.lagrange_first = proving_key->lagrange_first.share(); - prover_polynomials.lagrange_last = proving_key->lagrange_last.share(); - prover_polynomials.w_l = proving_key->w_l.share(); - prover_polynomials.w_r = proving_key->w_r.share(); - prover_polynomials.w_o = proving_key->w_o.share(); - - prover_polynomials.q_4 = proving_key->q_4.share(); - prover_polynomials.q_arith = proving_key->q_arith.share(); - prover_polynomials.q_sort = proving_key->q_sort.share(); - prover_polynomials.q_elliptic = proving_key->q_elliptic.share(); - prover_polynomials.q_aux = proving_key->q_aux.share(); - prover_polynomials.q_lookup = proving_key->q_lookup.share(); - prover_polynomials.sigma_4 = proving_key->sigma_4.share(); - prover_polynomials.id_4 = proving_key->id_4.share(); - prover_polynomials.table_1 = proving_key->table_1.share(); - prover_polynomials.table_2 = proving_key->table_2.share(); - prover_polynomials.table_3 = proving_key->table_3.share(); - prover_polynomials.table_4 = proving_key->table_4.share(); - prover_polynomials.table_1_shift = proving_key->table_1.shifted(); - prover_polynomials.table_2_shift = proving_key->table_2.shifted(); - prover_polynomials.table_3_shift = proving_key->table_3.shifted(); - prover_polynomials.table_4_shift = proving_key->table_4.shifted(); - prover_polynomials.w_l_shift = proving_key->w_l.shifted(); - prover_polynomials.w_r_shift = proving_key->w_r.shifted(); - prover_polynomials.w_o_shift = proving_key->w_o.shifted(); - - if constexpr (IsGoblinFlavor) { - prover_polynomials.ecc_op_wire_1 = proving_key->ecc_op_wire_1.share(); - prover_polynomials.ecc_op_wire_2 = proving_key->ecc_op_wire_2.share(); - prover_polynomials.ecc_op_wire_3 = proving_key->ecc_op_wire_3.share(); - prover_polynomials.ecc_op_wire_4 = proving_key->ecc_op_wire_4.share(); - prover_polynomials.lagrange_ecc_op = proving_key->lagrange_ecc_op.share(); - // DataBus polynomials - prover_polynomials.calldata = proving_key->calldata.share(); - prover_polynomials.calldata_read_counts = proving_key->calldata_read_counts.share(); - prover_polynomials.lookup_inverses = proving_key->lookup_inverses.share(); - prover_polynomials.q_busread = proving_key->q_busread.share(); - prover_polynomials.databus_id = proving_key->databus_id.share(); - prover_polynomials.q_poseidon2_external = proving_key->q_poseidon2_external.share(); - prover_polynomials.q_poseidon2_internal = proving_key->q_poseidon2_internal.share(); + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*proving_key, key_poly)); + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == + (flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); } - - // These polynomials have not yet been computed; initialize them so prover_polynomials is "full" and we can use - // utilities like get_row() - prover_polynomials.z_perm = proving_key->z_perm.share(); - prover_polynomials.z_lookup = proving_key->z_lookup.share(); - prover_polynomials.z_perm_shift = proving_key->z_perm.shifted(); - prover_polynomials.z_lookup_shift = proving_key->z_lookup.shifted(); std::span public_wires_source = prover_polynomials.w_r; diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index a9fcd4e715f6..aae817c10b7b 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -34,9 +34,11 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrget_all())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly)); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly) + "_shift"); prover_poly = key_poly.shifted(); } } diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp index 1de37ec236be..d13c8d92c1a1 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_prover.cpp @@ -30,9 +30,13 @@ AvmMiniProver::AvmMiniProver(std::shared_ptr input_key, , commitment_key(commitment_key) { for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), key->get_all())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + proof_system::flavor_get_label(*key, key_poly)); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { + ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == + proof_system::flavor_get_label(*key, key_poly) + "_shift"); prover_poly = key_poly.shifted(); } } From 45309052cee9074a7960adbba54aed091881e650 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 15:36:06 +0000 Subject: [PATCH 48/60] The bug --- .../cpp/src/barretenberg/flavor/ultra.hpp | 92 +++++++++++++++---- .../barretenberg/flavor/ultra_recursive.hpp | 3 +- 2 files changed, 74 insertions(+), 21 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index a7f7040fb774..9b0f54db9bc7 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -25,6 +25,7 @@ class Ultra { using FF = Curve::ScalarField; using GroupElement = Curve::Element; using Commitment = Curve::AffineElement; + using CommitmentHandle = Curve::AffineElement; using PCS = pcs::kzg::KZG; using Polynomial = barretenberg::Polynomial; using PolynomialHandle = std::span; @@ -136,7 +137,7 @@ class Ultra { z_perm, // column 5 z_lookup) // column 6 - RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; + RefVector get_wires() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; }; /** @@ -163,43 +164,94 @@ class Ultra { w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; }; + /** * @brief A base class labelling all entities (for instance, all of the polynomials used by the prover during * sumcheck) in this Honk variant along with particular subsets of interest * @details Used to build containers for: the prover's polynomial during sumcheck; the sumcheck's folded * polynomials; the univariates consturcted during during sumcheck; the evaluations produced by sumcheck. * - * Symbolically we have: AllEntities = PrecomputedEntities + WitnessEntities + "ShiftedEntities". - * TODO(https://github.com/AztecProtocol/barretenberg/issues/788) use normal composition + * Symbolically we have: AllEntities = PrecomputedEntities + WitnessEntities + "ShiftedEntities". It could be + * implemented as such, but we have this now. */ - template - class AllEntities : public PrecomputedEntities, - public WitnessEntities, - public ShiftedEntities { + template class AllEntities { public: - DEFINE_COMPOUND_GET_ALL(PrecomputedEntities::get_all(), - WitnessEntities::get_all(), - ShiftedEntities::get_all()); - // get_wires inherited from WitnessEntities + DEFINE_FLAVOR_MEMBERS(DataType, + q_c, // column 0 + q_l, // column 1 + q_r, // column 2 + q_o, // column 3 + q_4, // column 4 + q_m, // column 5 + q_arith, // column 6 + q_sort, // column 7 + q_elliptic, // column 8 + q_aux, // column 9 + q_lookup, // column 10 + sigma_1, // column 11 + sigma_2, // column 12 + sigma_3, // column 13 + sigma_4, // column 14 + id_1, // column 15 + id_2, // column 16 + id_3, // column 17 + id_4, // column 18 + table_1, // column 19 + table_2, // column 20 + table_3, // column 21 + table_4, // column 22 + lagrange_first, // column 23 + lagrange_last, // column 24 + w_l, // column 25 + w_r, // column 26 + w_o, // column 27 + w_4, // column 28 + sorted_accum, // column 29 + z_perm, // column 30 + z_lookup, // column 31 + table_1_shift, // column 32 + table_2_shift, // column 33 + table_3_shift, // column 34 + table_4_shift, // column 35 + w_l_shift, // column 36 + w_r_shift, // column 37 + w_o_shift, // column 38 + w_4_shift, // column 39 + sorted_accum_shift, // column 40 + z_perm_shift, // column 41 + z_lookup_shift) // column 42 + + RefVector get_wires() { return { w_l, w_r, w_o, w_4 }; }; // Gemini-specific getters. RefVector get_unshifted() { - return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); + return { q_m, q_c, q_l, q_r, q_o, q_4, q_arith, q_sort, + q_elliptic, q_aux, q_lookup, sigma_1, sigma_2, sigma_3, sigma_4, id_1, + id_2, id_3, id_4, table_1, table_2, table_3, table_4, lagrange_first, + lagrange_last, w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup + + }; }; - RefVector get_precomputed() { return PrecomputedEntities::get_all(); } - // get_wires is inherited - RefVector get_witness() { return WitnessEntities::get_all(); } + RefVector get_precomputed() + { + return { q_m, q_c, q_l, q_r, q_o, q_4, q_arith, q_sort, + q_elliptic, q_aux, q_lookup, sigma_1, sigma_2, sigma_3, sigma_4, id_1, + id_2, id_3, id_4, table_1, table_2, table_3, table_4, lagrange_first, + lagrange_last + + }; + } + + RefVector get_witness() { return { w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; RefVector get_to_be_shifted() { - return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, - this->w_o, this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; + return { table_1, table_2, table_3, table_4, w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup }; }; RefVector get_shifted() { - return { this->table_1_shift, this->table_2_shift, this->table_3_shift, this->table_4_shift, - this->w_l_shift, this->w_r_shift, this->w_o_shift, this->w_4_shift, - this->sorted_accum_shift, this->z_perm_shift, this->z_lookup_shift }; + return { table_1_shift, table_2_shift, table_3_shift, table_4_shift, w_l_shift, w_r_shift, + w_o_shift, w_4_shift, sorted_accum_shift, z_perm_shift, z_lookup_shift }; }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp index 02a754981e28..d4591f885f37 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp @@ -52,6 +52,7 @@ template class UltraRecursive_ { using Curve = plonk::stdlib::bn254; using GroupElement = typename Curve::Element; using Commitment = typename Curve::Element; + using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; using NativeVerificationKey = flavor::Ultra::VerificationKey; @@ -215,7 +216,7 @@ template class UltraRecursive_ { // Gemini-specific getters. RefVector get_unshifted() { - return { q_c, q_l, q_r, q_o, q_4, q_m, q_arith, q_sort, + return { q_m, q_c, q_l, q_r, q_o, q_4, q_arith, q_sort, q_elliptic, q_aux, q_lookup, sigma_1, sigma_2, sigma_3, sigma_4, id_1, id_2, id_3, id_4, table_1, table_2, table_3, table_4, lagrange_first, lagrange_last, w_l, w_r, w_o, w_4, sorted_accum, z_perm, z_lookup From 7781b3ae01aa0c3e2f0b0f61de4685b0863789fd Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 15:37:15 +0000 Subject: [PATCH 49/60] fix --- .../src/barretenberg/flavor/flavor_macros.hpp | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp index 300577aeb45f..a3d10d9db275 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp @@ -8,14 +8,34 @@ #include "barretenberg/common/ref_vector.hpp" #include "barretenberg/common/std_array.hpp" +#include "barretenberg/common/std_string.hpp" +#include "barretenberg/common/std_vector.hpp" #include #include #include -template auto _refs_to_pointer_array(Refs&... refs) +namespace barretenberg::detail { +template constexpr std::size_t _va_count(Args&&... /*unused*/) { - return std::array{ &refs... }; + return sizeof...(Args); } +template constexpr std::size_t _sum_base_class_size(const T& arg) +{ + return (static_cast(arg).size() + ...); +} +template auto _concatenate_base_class_get_all(T& arg) +{ + return concatenate(static_cast(arg).get_all()...); +} +template auto _concatenate_base_class_get_all_const(const T& arg) +{ + return concatenate(static_cast(arg).get_all()...); +} +template auto _concatenate_base_class_get_labels(const T& arg) +{ + return concatenate(static_cast(arg).get_labels()...); +} +} // namespace barretenberg::detail #define DEFINE_REF_VIEW(...) \ [[nodiscard]] auto get_all() \ @@ -37,8 +57,7 @@ template auto _refs_to_pointer_array(Refs&... refs) #define DEFINE_FLAVOR_MEMBERS(DataType, ...) \ DataType __VA_ARGS__; \ DEFINE_REF_VIEW(__VA_ARGS__) \ - barretenberg / cpp / src / barretenberg / flavor / \ - flavor_macros.hpp std::vector get_labels() const \ + std::vector get_labels() const \ { \ return std::split_and_trim(#__VA_ARGS__, ','); \ } \ @@ -50,7 +69,7 @@ template auto _refs_to_pointer_array(Refs&... refs) #define DEFINE_COMPOUND_GET_ALL(...) \ [[nodiscard]] auto get_all() \ { \ - return concatenate(__VA_ARGS__); \ + return barretenberg::detail::_concatenate_base_class_get_all(*this); \ } \ [[nodiscard]] auto get_all() const \ { \ From 719c6dea76e72b5530a8b5eeaed1c2e68d11d1cd Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 15:46:54 +0000 Subject: [PATCH 50/60] Copy over helpers --- .../src/barretenberg/common/std_string.cpp | 49 +++++++++++++++++++ .../src/barretenberg/common/std_string.hpp | 14 ++++++ .../src/barretenberg/common/std_vector.hpp | 24 +++++++++ .../cpp/src/barretenberg/flavor/ecc_vm.hpp | 6 +-- .../cpp/src/barretenberg/flavor/flavor.cpp | 2 +- .../flavor/generated/AvmMini_flavor.hpp | 1 + .../barretenberg/flavor/goblin_translator.hpp | 12 ++--- .../src/barretenberg/flavor/goblin_ultra.hpp | 38 ++------------ .../flavor/goblin_ultra_recursive.hpp | 1 + 9 files changed, 100 insertions(+), 47 deletions(-) create mode 100644 barretenberg/cpp/src/barretenberg/common/std_string.cpp create mode 100644 barretenberg/cpp/src/barretenberg/common/std_string.hpp create mode 100644 barretenberg/cpp/src/barretenberg/common/std_vector.hpp diff --git a/barretenberg/cpp/src/barretenberg/common/std_string.cpp b/barretenberg/cpp/src/barretenberg/common/std_string.cpp new file mode 100644 index 000000000000..775c6a8e298d --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/common/std_string.cpp @@ -0,0 +1,49 @@ +#include "std_string.hpp" +#include +#include +#include +#include +#include +#include + +namespace std { +std::vector split(const std::string& str, char delimiter) +{ + std::vector result; + std::istringstream iss(str); + std::string token; + + while (std::getline(iss, token, delimiter)) { + result.push_back(token); + } + + return result; +} + +// trim from start (in place) +void ltrim(std::string& s) +{ + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); +} + +// trim from end (in place) +void rtrim(std::string& s) +{ + s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); +} + +// trim from both ends (in place) +void trim(std::string& s) +{ + rtrim(s); + ltrim(s); +} +std::vector split_and_trim(const std::string& str, char delimiter) +{ + std::vector ret = split(str, delimiter); + for (std::string& part : ret) { + trim(part); + } + return ret; +} +} // namespace std \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/common/std_string.hpp b/barretenberg/cpp/src/barretenberg/common/std_string.hpp new file mode 100644 index 000000000000..a116ea54ce00 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/common/std_string.hpp @@ -0,0 +1,14 @@ +#include + +namespace std { +std::vector split(const std::string& str, char delimiter); +// trim from start (in place) +void ltrim(std::string& s); +// trim from end (in place) +void rtrim(std::string& s); +// trim from both ends (in place) +void trim(std::string& s); + +// Used to extract variables from a macro #__VA_ARGS__ +std::vector split_and_trim(const std::string& str, char delimiter); +} // namespace std \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/common/std_vector.hpp b/barretenberg/cpp/src/barretenberg/common/std_vector.hpp new file mode 100644 index 000000000000..1bdbdd76fd67 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/common/std_vector.hpp @@ -0,0 +1,24 @@ +#pragma once +#include + +/** + * @brief Concatenates multiple std::vector objects into a single std::vector. + * + * @tparam T The type of elements in the std::vector. + * @param vectors The std::vector objects to be concatenated. + * @return std::vector object containing all elements from the input vectors. + */ +template std::vector concatenate(const std::vector& vector, const auto&... vectors) +{ + std::vector concatenated; + // Reserve our final space + concatenated.reserve(vector.size() + (vectors.size() + ...)); + + auto append = [&](const auto& vec) { std::copy(vec.begin(), vec.end(), std::back_inserter(concatenated)); }; + + append(vector); + // Unpack and append each std::vector's elements to concatenated + (append(vectors), ...); + + return concatenated; +} \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index fb245aa9d3ec..433dd1b296f4 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -201,7 +201,7 @@ template class ECCVMBa template class WitnessEntities : public WireEntities, public DerivedWitnessEntities { public: - DEFINE_COMPOUND_GET_ALL(WireEntities::get_all(), DerivedWitnessEntities::get_all()) + DEFINE_COMPOUND_GET_ALL(WireEntities, DerivedWitnessEntities) RefVector get_wires() { return WireEntities::get_all(); }; // The sorted concatenations of table and witness data needed for plookup. RefVector get_sorted_polynomials() { return {}; }; @@ -295,9 +295,7 @@ template class ECCVMBa {} // get_wires is inherited - DEFINE_COMPOUND_GET_ALL(PrecomputedEntities::get_all(), - WitnessEntities::get_all(), - ShiftedEntities::get_all()) + DEFINE_COMPOUND_GET_ALL(PrecomputedEntities, WitnessEntities, ShiftedEntities) // Gemini-specific getters. RefVector get_unshifted() { diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.cpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.cpp index 91a791d8b933..69e8e7069293 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.cpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.cpp @@ -1,3 +1,3 @@ #include "flavor.hpp" -// This file is here to make sure that a flavor object file is created. +// This file is here to make sure that a flavor object file is created. \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 9a887fc673eb..59ccbcf94409 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -29,6 +29,7 @@ class AvmMiniFlavor { using PolynomialHandle = std::span; using GroupElement = G1::element; using Commitment = G1::affine_element; + using CommitmentHandle = G1::affine_element; using CommitmentKey = pcs::CommitmentKey; using VerifierCommitmentKey = pcs::VerifierCommitmentKey; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index ddd87fb83c40..d4bce5f5ea35 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -246,10 +246,10 @@ class GoblinTranslator { public DerivedWitnessEntities, public ConcatenatedRangeConstraints { public: - DEFINE_COMPOUND_GET_ALL(WireNonshiftedEntities::get_all(), - WireToBeShiftedEntities::get_all(), - DerivedWitnessEntities::get_all(), - ConcatenatedRangeConstraints::get_all()) + DEFINE_COMPOUND_GET_ALL(WireNonshiftedEntities, + WireToBeShiftedEntities, + DerivedWitnessEntities, + ConcatenatedRangeConstraints) RefVector get_wires() { @@ -647,9 +647,7 @@ class GoblinTranslator { this->ordered_range_constraints_4 }; } - DEFINE_COMPOUND_GET_ALL(PrecomputedEntities::get_all(), - WitnessEntities::get_all(), - ShiftedEntities::get_all()) + DEFINE_COMPOUND_GET_ALL(PrecomputedEntities, WitnessEntities, ShiftedEntities) /** * @brief Get the polynomials that are concatenated for the permutation relation * diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 0e7016b222f9..6225bbab6776 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -187,7 +187,7 @@ class GoblinUltra { template class WitnessEntities : public WireEntities, public DerivedEntities { public: - DEFINE_COMPOUND_GET_ALL(WireEntities::get_all(), DerivedEntities::get_all()) + DEFINE_COMPOUND_GET_ALL(WireEntities, DerivedEntities) RefVector get_wires() { return WireEntities::get_all(); }; RefVector get_ecc_op_wires() @@ -228,9 +228,7 @@ class GoblinUltra { public WitnessEntities, public ShiftedEntities { public: - DEFINE_COMPOUND_GET_ALL(PrecomputedEntities::get_all(), - WitnessEntities::get_all(), - ShiftedEntities::get_all()) + DEFINE_COMPOUND_GET_ALL(PrecomputedEntities, WitnessEntities, ShiftedEntities) RefVector get_wires() { return { this->w_l, this->w_r, this->w_o, this->w_4 }; }; RefVector get_ecc_op_wires() @@ -249,37 +247,7 @@ class GoblinUltra { return { this->table_1, this->table_2, this->table_3, this->table_4, this->w_l, this->w_r, this->w_o, this->w_4, this->sorted_accum, this->z_perm, this->z_lookup }; }; - RefVector get_precomputed() - { - return { this->q_m, - this->q_c, - this->q_l, - this->q_r, - this->q_o, - this->q_4, - this->q_arith, - this->q_sort, - this->q_elliptic, - this->q_aux, - this->q_lookup, - this->q_busread, - this->sigma_1, - this->sigma_2, - this->sigma_3, - this->sigma_4, - this->id_1, - this->id_2, - this->id_3, - this->id_4, - this->table_1, - this->table_2, - this->table_3, - this->table_4, - this->lagrange_first, - this->lagrange_last, - this->lagrange_ecc_op, - this->databus_id }; - } + RefVector get_precomputed() { return PrecomputedEntities::get_all(); } RefVector get_shifted() { return ShiftedEntities::get_all(); }; }; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp index c82f68c463b6..fb6e0751361a 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp @@ -44,6 +44,7 @@ template class GoblinUltraRecursive_ { using Curve = plonk::stdlib::bn254; using GroupElement = typename Curve::Element; using Commitment = typename Curve::Element; + using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; using NativeVerificationKey = flavor::GoblinUltra::VerificationKey; From 93799111b03c7148e86766ab24bccd7be2abf3eb Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 15:51:17 +0000 Subject: [PATCH 51/60] build fix --- barretenberg/cpp/src/barretenberg/common/std_string.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/barretenberg/cpp/src/barretenberg/common/std_string.hpp b/barretenberg/cpp/src/barretenberg/common/std_string.hpp index a116ea54ce00..c869f94ec7af 100644 --- a/barretenberg/cpp/src/barretenberg/common/std_string.hpp +++ b/barretenberg/cpp/src/barretenberg/common/std_string.hpp @@ -1,4 +1,5 @@ #include +#include namespace std { std::vector split(const std::string& str, char delimiter); From 7967923af93aa2ce0d971974e0278d54b9dcabf9 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 16:14:13 +0000 Subject: [PATCH 52/60] grand product fix --- .../proof_system/library/grand_product_library.test.cpp | 6 ------ .../cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp index c4f48b979d88..da0d6b3a2035 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.test.cpp @@ -95,12 +95,6 @@ template class GrandProductTests : public testing::Test { proof_system::flavor_get_label(*proving_key, key_poly)); prover_poly = key_poly.share(); } - for (auto [prover_poly, key_poly] : - zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(proof_system::flavor_get_label(prover_polynomials, prover_poly) == - (proof_system::flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } // Method 1: Compute z_perm using 'compute_grand_product_polynomial' as the prover would in practice constexpr size_t PERMUTATION_RELATION_INDEX = 0; diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp index 578150c33050..3493608cf754 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/AvmMini_composer.cpp @@ -18,7 +18,7 @@ void AvmMiniComposer::compute_witness(CircuitConstructor& circuit) auto polynomials = circuit.compute_polynomials(); for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) { - // TODO(AD): can this be shared instead? + ASSERT(flavor_get_label(*proving_key, key_poly) == flavor_get_label(polynomials, prover_poly)); key_poly = prover_poly; } From 334405391f02fb118f004c5ddd6f250d3a7d018e Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 16:18:20 +0000 Subject: [PATCH 53/60] grand product fix --- .../src/barretenberg/translator_vm/goblin_translator_prover.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index aae817c10b7b..fcd9fe5a2b01 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -35,6 +35,7 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrget_all())) { ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly)); + std::cout << flavor_get_label(prover_polynomials, prover_poly) << " vs " << flavor_get_label(*key, key_poly); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { From 598dd986c02ed414077712927f33e5e6849bde43 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 19:30:36 +0000 Subject: [PATCH 54/60] unshifted order fix --- .../barretenberg/flavor/goblin_translator.hpp | 777 ++++++++---------- .../goblin_translator_prover.cpp | 3 +- 2 files changed, 348 insertions(+), 432 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index d4bce5f5ea35..1166c3451a8c 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -756,468 +756,383 @@ class GoblinTranslator { // Gemini-specific getters. RefVector get_unshifted() { - return { - this->x_lo_y_hi, - this->x_hi_z_1, - this->y_lo_z_2, - this->p_x_low_limbs, - this->p_x_low_limbs_range_constraint_0, - this->p_x_low_limbs_range_constraint_1, - this->p_x_low_limbs_range_constraint_2, - this->p_x_low_limbs_range_constraint_3, - this->p_x_low_limbs_range_constraint_4, - this->p_x_low_limbs_range_constraint_tail, - this->p_x_high_limbs, - this->p_x_high_limbs_range_constraint_0, - this->p_x_high_limbs_range_constraint_1, - this->p_x_high_limbs_range_constraint_2, - this->p_x_high_limbs_range_constraint_3, - this->p_x_high_limbs_range_constraint_4, - this->p_x_high_limbs_range_constraint_tail, - this->p_y_low_limbs, - this->p_y_low_limbs_range_constraint_0, - this->p_y_low_limbs_range_constraint_1, - this->p_y_low_limbs_range_constraint_2, - this->p_y_low_limbs_range_constraint_3, - this->p_y_low_limbs_range_constraint_4, - this->p_y_low_limbs_range_constraint_tail, - this->p_y_high_limbs, - this->p_y_high_limbs_range_constraint_0, - this->p_y_high_limbs_range_constraint_1, - this->p_y_high_limbs_range_constraint_2, - this->p_y_high_limbs_range_constraint_3, - this->p_y_high_limbs_range_constraint_4, - this->p_y_high_limbs_range_constraint_tail, - this->z_low_limbs, - this->z_low_limbs_range_constraint_0, - this->z_low_limbs_range_constraint_1, - this->z_low_limbs_range_constraint_2, - this->z_low_limbs_range_constraint_3, - this->z_low_limbs_range_constraint_4, - this->z_low_limbs_range_constraint_tail, - this->z_high_limbs, - this->z_high_limbs_range_constraint_0, - this->z_high_limbs_range_constraint_1, - this->z_high_limbs_range_constraint_2, - this->z_high_limbs_range_constraint_3, - this->z_high_limbs_range_constraint_4, - this->z_high_limbs_range_constraint_tail, - this->accumulators_binary_limbs_0, - this->accumulators_binary_limbs_1, - this->accumulators_binary_limbs_2, - this->accumulators_binary_limbs_3, - this->accumulator_low_limbs_range_constraint_0, - this->accumulator_low_limbs_range_constraint_1, - this->accumulator_low_limbs_range_constraint_2, - this->accumulator_low_limbs_range_constraint_3, - this->accumulator_low_limbs_range_constraint_4, - this->accumulator_low_limbs_range_constraint_tail, - this->accumulator_high_limbs_range_constraint_0, - this->accumulator_high_limbs_range_constraint_1, - this->accumulator_high_limbs_range_constraint_2, - this->accumulator_high_limbs_range_constraint_3, - this->accumulator_high_limbs_range_constraint_4, - this->accumulator_high_limbs_range_constraint_tail, - this->quotient_low_binary_limbs, - this->quotient_high_binary_limbs, - this->quotient_low_limbs_range_constraint_0, - this->quotient_low_limbs_range_constraint_1, - this->quotient_low_limbs_range_constraint_2, - this->quotient_low_limbs_range_constraint_3, - this->quotient_low_limbs_range_constraint_4, - this->quotient_low_limbs_range_constraint_tail, - this->quotient_high_limbs_range_constraint_0, - this->quotient_high_limbs_range_constraint_1, - this->quotient_high_limbs_range_constraint_2, - this->quotient_high_limbs_range_constraint_3, - this->quotient_high_limbs_range_constraint_4, - this->quotient_high_limbs_range_constraint_tail, - this->relation_wide_limbs, - this->relation_wide_limbs_range_constraint_0, - this->relation_wide_limbs_range_constraint_1, - this->relation_wide_limbs_range_constraint_2, - this->relation_wide_limbs_range_constraint_3, - this->ordered_range_constraints_0, - this->ordered_range_constraints_1, - this->ordered_range_constraints_2, - this->ordered_range_constraints_3, - this->ordered_range_constraints_4, + return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); + // get_to_be_shifted is inherited + RefVector get_shifted() + { + return { this->x_lo_y_hi_shift, + this->x_hi_z_1_shift, + this->y_lo_z_2_shift, + this->p_x_low_limbs_shift, + this->p_x_low_limbs_range_constraint_0_shift, + this->p_x_low_limbs_range_constraint_1_shift, + this->p_x_low_limbs_range_constraint_2_shift, + this->p_x_low_limbs_range_constraint_3_shift, + this->p_x_low_limbs_range_constraint_4_shift, + this->p_x_low_limbs_range_constraint_tail_shift, + this->p_x_high_limbs_shift, + this->p_x_high_limbs_range_constraint_0_shift, + this->p_x_high_limbs_range_constraint_1_shift, + this->p_x_high_limbs_range_constraint_2_shift, + this->p_x_high_limbs_range_constraint_3_shift, + this->p_x_high_limbs_range_constraint_4_shift, + this->p_x_high_limbs_range_constraint_tail_shift, + this->p_y_low_limbs_shift, + this->p_y_low_limbs_range_constraint_0_shift, + this->p_y_low_limbs_range_constraint_1_shift, + this->p_y_low_limbs_range_constraint_2_shift, + this->p_y_low_limbs_range_constraint_3_shift, + this->p_y_low_limbs_range_constraint_4_shift, + this->p_y_low_limbs_range_constraint_tail_shift, + this->p_y_high_limbs_shift, + this->p_y_high_limbs_range_constraint_0_shift, + this->p_y_high_limbs_range_constraint_1_shift, + this->p_y_high_limbs_range_constraint_2_shift, + this->p_y_high_limbs_range_constraint_3_shift, + this->p_y_high_limbs_range_constraint_4_shift, + this->p_y_high_limbs_range_constraint_tail_shift, + this->z_low_limbs_shift, + this->z_low_limbs_range_constraint_0_shift, + this->z_low_limbs_range_constraint_1_shift, + this->z_low_limbs_range_constraint_2_shift, + this->z_low_limbs_range_constraint_3_shift, + this->z_low_limbs_range_constraint_4_shift, + this->z_low_limbs_range_constraint_tail_shift, + this->z_high_limbs_shift, + this->z_high_limbs_range_constraint_0_shift, + this->z_high_limbs_range_constraint_1_shift, + this->z_high_limbs_range_constraint_2_shift, + this->z_high_limbs_range_constraint_3_shift, + this->z_high_limbs_range_constraint_4_shift, + this->z_high_limbs_range_constraint_tail_shift, + this->accumulators_binary_limbs_0_shift, + this->accumulators_binary_limbs_1_shift, + this->accumulators_binary_limbs_2_shift, + this->accumulators_binary_limbs_3_shift, + this->accumulator_low_limbs_range_constraint_0_shift, + this->accumulator_low_limbs_range_constraint_1_shift, + this->accumulator_low_limbs_range_constraint_2_shift, + this->accumulator_low_limbs_range_constraint_3_shift, + this->accumulator_low_limbs_range_constraint_4_shift, + this->accumulator_low_limbs_range_constraint_tail_shift, + this->accumulator_high_limbs_range_constraint_0_shift, + this->accumulator_high_limbs_range_constraint_1_shift, + this->accumulator_high_limbs_range_constraint_2_shift, + this->accumulator_high_limbs_range_constraint_3_shift, + this->accumulator_high_limbs_range_constraint_4_shift, + this->accumulator_high_limbs_range_constraint_tail_shift, + this->quotient_low_binary_limbs_shift, + this->quotient_high_binary_limbs_shift, + this->quotient_low_limbs_range_constraint_0_shift, + this->quotient_low_limbs_range_constraint_1_shift, + this->quotient_low_limbs_range_constraint_2_shift, + this->quotient_low_limbs_range_constraint_3_shift, + this->quotient_low_limbs_range_constraint_4_shift, + this->quotient_low_limbs_range_constraint_tail_shift, + this->quotient_high_limbs_range_constraint_0_shift, + this->quotient_high_limbs_range_constraint_1_shift, + this->quotient_high_limbs_range_constraint_2_shift, + this->quotient_high_limbs_range_constraint_3_shift, + this->quotient_high_limbs_range_constraint_4_shift, + this->quotient_high_limbs_range_constraint_tail_shift, + this->relation_wide_limbs_shift, + this->relation_wide_limbs_range_constraint_0_shift, + this->relation_wide_limbs_range_constraint_1_shift, + this->relation_wide_limbs_range_constraint_2_shift, + this->relation_wide_limbs_range_constraint_3_shift, + this->ordered_range_constraints_0_shift, + this->ordered_range_constraints_1_shift, + this->ordered_range_constraints_2_shift, + this->ordered_range_constraints_3_shift, + this->ordered_range_constraints_4_shift, - this->z_perm, + this->z_perm_shift }; }; - } - // get_to_be_shifted is inherited - RefVector get_shifted() - { - return { this->x_lo_y_hi_shift, - this->x_hi_z_1_shift, - this->y_lo_z_2_shift, - this->p_x_low_limbs_shift, - this->p_x_low_limbs_range_constraint_0_shift, - this->p_x_low_limbs_range_constraint_1_shift, - this->p_x_low_limbs_range_constraint_2_shift, - this->p_x_low_limbs_range_constraint_3_shift, - this->p_x_low_limbs_range_constraint_4_shift, - this->p_x_low_limbs_range_constraint_tail_shift, - this->p_x_high_limbs_shift, - this->p_x_high_limbs_range_constraint_0_shift, - this->p_x_high_limbs_range_constraint_1_shift, - this->p_x_high_limbs_range_constraint_2_shift, - this->p_x_high_limbs_range_constraint_3_shift, - this->p_x_high_limbs_range_constraint_4_shift, - this->p_x_high_limbs_range_constraint_tail_shift, - this->p_y_low_limbs_shift, - this->p_y_low_limbs_range_constraint_0_shift, - this->p_y_low_limbs_range_constraint_1_shift, - this->p_y_low_limbs_range_constraint_2_shift, - this->p_y_low_limbs_range_constraint_3_shift, - this->p_y_low_limbs_range_constraint_4_shift, - this->p_y_low_limbs_range_constraint_tail_shift, - this->p_y_high_limbs_shift, - this->p_y_high_limbs_range_constraint_0_shift, - this->p_y_high_limbs_range_constraint_1_shift, - this->p_y_high_limbs_range_constraint_2_shift, - this->p_y_high_limbs_range_constraint_3_shift, - this->p_y_high_limbs_range_constraint_4_shift, - this->p_y_high_limbs_range_constraint_tail_shift, - this->z_low_limbs_shift, - this->z_low_limbs_range_constraint_0_shift, - this->z_low_limbs_range_constraint_1_shift, - this->z_low_limbs_range_constraint_2_shift, - this->z_low_limbs_range_constraint_3_shift, - this->z_low_limbs_range_constraint_4_shift, - this->z_low_limbs_range_constraint_tail_shift, - this->z_high_limbs_shift, - this->z_high_limbs_range_constraint_0_shift, - this->z_high_limbs_range_constraint_1_shift, - this->z_high_limbs_range_constraint_2_shift, - this->z_high_limbs_range_constraint_3_shift, - this->z_high_limbs_range_constraint_4_shift, - this->z_high_limbs_range_constraint_tail_shift, - this->accumulators_binary_limbs_0_shift, - this->accumulators_binary_limbs_1_shift, - this->accumulators_binary_limbs_2_shift, - this->accumulators_binary_limbs_3_shift, - this->accumulator_low_limbs_range_constraint_0_shift, - this->accumulator_low_limbs_range_constraint_1_shift, - this->accumulator_low_limbs_range_constraint_2_shift, - this->accumulator_low_limbs_range_constraint_3_shift, - this->accumulator_low_limbs_range_constraint_4_shift, - this->accumulator_low_limbs_range_constraint_tail_shift, - this->accumulator_high_limbs_range_constraint_0_shift, - this->accumulator_high_limbs_range_constraint_1_shift, - this->accumulator_high_limbs_range_constraint_2_shift, - this->accumulator_high_limbs_range_constraint_3_shift, - this->accumulator_high_limbs_range_constraint_4_shift, - this->accumulator_high_limbs_range_constraint_tail_shift, - this->quotient_low_binary_limbs_shift, - this->quotient_high_binary_limbs_shift, - this->quotient_low_limbs_range_constraint_0_shift, - this->quotient_low_limbs_range_constraint_1_shift, - this->quotient_low_limbs_range_constraint_2_shift, - this->quotient_low_limbs_range_constraint_3_shift, - this->quotient_low_limbs_range_constraint_4_shift, - this->quotient_low_limbs_range_constraint_tail_shift, - this->quotient_high_limbs_range_constraint_0_shift, - this->quotient_high_limbs_range_constraint_1_shift, - this->quotient_high_limbs_range_constraint_2_shift, - this->quotient_high_limbs_range_constraint_3_shift, - this->quotient_high_limbs_range_constraint_4_shift, - this->quotient_high_limbs_range_constraint_tail_shift, - this->relation_wide_limbs_shift, - this->relation_wide_limbs_range_constraint_0_shift, - this->relation_wide_limbs_range_constraint_1_shift, - this->relation_wide_limbs_range_constraint_2_shift, - this->relation_wide_limbs_range_constraint_3_shift, - this->ordered_range_constraints_0_shift, - this->ordered_range_constraints_1_shift, - this->ordered_range_constraints_2_shift, - this->ordered_range_constraints_3_shift, - this->ordered_range_constraints_4_shift, - this->z_perm_shift }; - }; + /** + * @brief Polynomials/commitments, that can be constructed only after the r challenge has been received from + * gemini + * + * @return RefVector + */ + RefVector get_special() + { + return get_concatenated_constraints(); + } - /** - * @brief Polynomials/commitments, that can be constructed only after the r challenge has been received from - * gemini - * - * @return RefVector - */ - RefVector get_special() { return get_concatenated_constraints(); } + RefVector get_unshifted_then_shifted_then_special() + { + RefVector result{ this->get_unshifted() }; + RefVector shifted{ get_shifted() }; + RefVector special{ get_special() }; + result.insert(result.end(), shifted.begin(), shifted.end()); + result.insert(result.end(), special.begin(), special.end()); + return result; + } - RefVector get_unshifted_then_shifted_then_special() - { - RefVector result{ this->get_unshifted() }; - RefVector shifted{ get_shifted() }; - RefVector special{ get_special() }; - result.insert(result.end(), shifted.begin(), shifted.end()); - result.insert(result.end(), special.begin(), special.end()); - return result; - } + friend std::ostream& operator<<(std::ostream& os, const AllEntities& a) + { + os << "{ "; + std::ios_base::fmtflags f(os.flags()); + auto entities = a.get_all(); + for (size_t i = 0; i < entities.size() - 1; i++) { + os << "e[" << std::setw(2) << i << "] = " << (entities[i]) << ",\n"; + } + os << "e[" << std::setw(2) << (entities.size() - 1) << "] = " << entities[entities.size() - 1] << " }"; - friend std::ostream& operator<<(std::ostream& os, const AllEntities& a) - { - os << "{ "; - std::ios_base::fmtflags f(os.flags()); - auto entities = a.get_all(); - for (size_t i = 0; i < entities.size() - 1; i++) { - os << "e[" << std::setw(2) << i << "] = " << (entities[i]) << ",\n"; + os.flags(f); + return os; } - os << "e[" << std::setw(2) << (entities.size() - 1) << "] = " << entities[entities.size() - 1] << " }"; - - os.flags(f); - return os; - } - }; + }; - public: - /** - * @brief The proving key is responsible for storing the polynomials used by the prover. - * @note TODO(Cody): Maybe multiple inheritance is the right thing here. In that case, nothing should eve - * inherit from ProvingKey. - */ - class ProvingKey : public ProvingKey_, WitnessEntities> { public: - BF batching_challenge_v = { 0 }; - BF evaluation_input_x = { 0 }; - ProvingKey() = default; + /** + * @brief The proving key is responsible for storing the polynomials used by the prover. + * @note TODO(Cody): Maybe multiple inheritance is the right thing here. In that case, nothing should eve + * inherit from ProvingKey. + */ + class ProvingKey : public ProvingKey_, WitnessEntities> { + public: + BF batching_challenge_v = { 0 }; + BF evaluation_input_x = { 0 }; + ProvingKey() = default; - // Expose constructors on the base class - using Base = ProvingKey_, WitnessEntities>; - using Base::Base; + // Expose constructors on the base class + using Base = ProvingKey_, WitnessEntities>; + using Base::Base; - ProvingKey(const size_t circuit_size) - : ProvingKey_, WitnessEntities>(circuit_size, 0) + ProvingKey(const size_t circuit_size) + : ProvingKey_, WitnessEntities>(circuit_size, 0) - , batching_challenge_v(0) - , evaluation_input_x(0) - {} - }; + , batching_challenge_v(0) + , evaluation_input_x(0) + {} + }; - /** - * @brief The verification key is responsible for storing the the commitments to the precomputed (non-witnessk) - * polynomials used by the verifier. - * - * @note Note the discrepancy with what sort of data is stored here vs in the proving key. We may want to - * resolve that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for - * portability of our circuits. - */ - using VerificationKey = VerificationKey_>; + /** + * @brief The verification key is responsible for storing the the commitments to the precomputed (non-witnessk) + * polynomials used by the verifier. + * + * @note Note the discrepancy with what sort of data is stored here vs in the proving key. We may want to + * resolve that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for + * portability of our circuits. + */ + using VerificationKey = VerificationKey_>; - /** - * @brief A field element for each entity of the flavor. These entities represent the prover polynomials - * evaluated at one point. - */ - class AllValues : public AllEntities { - public: - using Base = AllEntities; - using Base::Base; - }; - /** - * @brief A container for the prover polynomials handles. - */ - class ProverPolynomials : public AllEntities { - public: - // Define all operations as default, except only all move construction/assignment - ProverPolynomials() = default; - ProverPolynomials& operator=(const ProverPolynomials&) = delete; - ProverPolynomials(const ProverPolynomials& o) = delete; - ProverPolynomials(ProverPolynomials&& o) noexcept = default; - ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; - ~ProverPolynomials() = default; - [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } /** - * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which - * represents one row in the execution trace. + * @brief A field element for each entity of the flavor. These entities represent the prover polynomials + * evaluated at one point. */ - [[nodiscard]] AllValues get_row(size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; + class AllValues : public AllEntities { + public: + using Base = AllEntities; + using Base::Base; + }; + /** + * @brief A container for the prover polynomials handles. + */ + class ProverPolynomials : public AllEntities { + public: + // Define all operations as default, except only all move construction/assignment + ProverPolynomials() = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; + [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } + /** + * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which + * represents one row in the execution trace. + */ + [[nodiscard]] AllValues get_row(size_t row_idx) const + { + AllValues result; + for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { + result_field = polynomial[row_idx]; + } + return result; } - return result; - } - }; + }; - /** - * @brief A container for easier mapping of polynomials - */ - using ProverPolynomialIds = AllEntities; + /** + * @brief A container for easier mapping of polynomials + */ + using ProverPolynomialIds = AllEntities; - /** - * @brief A container for polynomials produced after the first round of sumcheck. - * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. - */ - using RowPolynomials = AllEntities; + /** + * @brief A container for polynomials produced after the first round of sumcheck. + * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. + */ + using RowPolynomials = AllEntities; - /** - * @brief A container for storing the partially evaluated multivariates produced by sumcheck. - */ - class PartiallyEvaluatedMultivariates : public AllEntities { + /** + * @brief A container for storing the partially evaluated multivariates produced by sumcheck. + */ + class PartiallyEvaluatedMultivariates : public AllEntities { - public: - PartiallyEvaluatedMultivariates() = default; - PartiallyEvaluatedMultivariates(const size_t circuit_size) - { - // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) - for (auto& poly : this->get_all()) { - poly = Polynomial(circuit_size / 2); + public: + PartiallyEvaluatedMultivariates() = default; + PartiallyEvaluatedMultivariates(const size_t circuit_size) + { + // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) + for (auto& poly : this->get_all()) { + poly = Polynomial(circuit_size / 2); + } } - } - }; + }; - /** - * @brief A container for univariates used during sumcheck. - */ - template using ProverUnivariates = AllEntities>; + /** + * @brief A container for univariates used during sumcheck. + */ + template using ProverUnivariates = AllEntities>; - /** - * @brief A container for univariates produced during the hot loop in sumcheck. - */ - using ExtendedEdges = ProverUnivariates; + /** + * @brief A container for univariates produced during the hot loop in sumcheck. + */ + using ExtendedEdges = ProverUnivariates; - /** - * @brief A container for commitment labels. - * @note It's debatable whether this should inherit from AllEntities. since most entries are not strictly - * needed. It has, however, been useful during debugging to have these labels available. - * - */ - class CommitmentLabels : public AllEntities { - public: - CommitmentLabels() - { - this->op = "OP"; - this->x_lo_y_hi = "X_LO_Y_HI"; - this->x_hi_z_1 = "X_HI_Z_1"; - this->y_lo_z_2 = "Y_LO_Z_2"; - this->p_x_low_limbs = "P_X_LOW_LIMBS"; - this->p_x_low_limbs_range_constraint_0 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->p_x_low_limbs_range_constraint_1 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->p_x_low_limbs_range_constraint_2 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->p_x_low_limbs_range_constraint_3 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->p_x_low_limbs_range_constraint_4 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->p_x_low_limbs_range_constraint_tail = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_x_high_limbs = "P_X_HIGH_LIMBS"; - this->p_x_high_limbs_range_constraint_0 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->p_x_high_limbs_range_constraint_1 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->p_x_high_limbs_range_constraint_2 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->p_x_high_limbs_range_constraint_3 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->p_x_high_limbs_range_constraint_4 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->p_x_high_limbs_range_constraint_tail = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_y_low_limbs = "P_Y_LOW_LIMBS"; - this->p_y_low_limbs_range_constraint_0 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->p_y_low_limbs_range_constraint_1 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->p_y_low_limbs_range_constraint_2 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->p_y_low_limbs_range_constraint_3 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->p_y_low_limbs_range_constraint_4 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->p_y_low_limbs_range_constraint_tail = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_y_high_limbs = "P_Y_HIGH_LIMBS"; - this->p_y_high_limbs_range_constraint_0 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->p_y_high_limbs_range_constraint_1 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->p_y_high_limbs_range_constraint_2 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->p_y_high_limbs_range_constraint_3 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->p_y_high_limbs_range_constraint_4 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->p_y_high_limbs_range_constraint_tail = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->z_low_limbs = "Z_LOw_LIMBS"; - this->z_low_limbs_range_constraint_0 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->z_low_limbs_range_constraint_1 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->z_low_limbs_range_constraint_2 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->z_low_limbs_range_constraint_3 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->z_low_limbs_range_constraint_4 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->z_low_limbs_range_constraint_tail = "Z_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->z_high_limbs = "Z_HIGH_LIMBS"; - this->z_high_limbs_range_constraint_0 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->z_high_limbs_range_constraint_1 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->z_high_limbs_range_constraint_2 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->z_high_limbs_range_constraint_3 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->z_high_limbs_range_constraint_4 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->z_high_limbs_range_constraint_tail = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->accumulators_binary_limbs_0 = "ACCUMULATORS_BINARY_LIMBS_0"; - this->accumulators_binary_limbs_1 = "ACCUMULATORS_BINARY_LIMBS_1"; - this->accumulators_binary_limbs_2 = "ACCUMULATORS_BINARY_LIMBS_2"; - this->accumulators_binary_limbs_3 = "ACCUMULATORS_BINARY_LIMBS_3"; - this->accumulator_low_limbs_range_constraint_0 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->accumulator_low_limbs_range_constraint_1 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->accumulator_low_limbs_range_constraint_2 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->accumulator_low_limbs_range_constraint_3 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->accumulator_low_limbs_range_constraint_4 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->accumulator_low_limbs_range_constraint_tail = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->accumulator_high_limbs_range_constraint_0 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->accumulator_high_limbs_range_constraint_1 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->accumulator_high_limbs_range_constraint_2 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->accumulator_high_limbs_range_constraint_3 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->accumulator_high_limbs_range_constraint_4 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->accumulator_high_limbs_range_constraint_tail = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->quotient_low_binary_limbs = "QUOTIENT_LOW_BINARY_LIMBS"; - this->quotient_high_binary_limbs = "QUOTIENT_HIGH_BINARY_LIMBS"; - this->quotient_low_limbs_range_constraint_0 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->quotient_low_limbs_range_constraint_1 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->quotient_low_limbs_range_constraint_2 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->quotient_low_limbs_range_constraint_3 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->quotient_low_limbs_range_constraint_4 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->quotient_low_limbs_range_constraint_tail = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->quotient_high_limbs_range_constraint_0 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->quotient_high_limbs_range_constraint_1 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->quotient_high_limbs_range_constraint_2 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->quotient_high_limbs_range_constraint_3 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->quotient_high_limbs_range_constraint_4 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->quotient_high_limbs_range_constraint_tail = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->relation_wide_limbs = "RELATION_WIDE_LIMBS"; - this->relation_wide_limbs_range_constraint_0 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_0"; - this->relation_wide_limbs_range_constraint_1 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_1"; - this->relation_wide_limbs_range_constraint_2 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; - this->relation_wide_limbs_range_constraint_3 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; - this->concatenated_range_constraints_0 = "CONCATENATED_RANGE_CONSTRAINTS_0"; - this->concatenated_range_constraints_1 = "CONCATENATED_RANGE_CONSTRAINTS_1"; - this->concatenated_range_constraints_2 = "CONCATENATED_RANGE_CONSTRAINTS_2"; - this->concatenated_range_constraints_3 = "CONCATENATED_RANGE_CONSTRAINTS_3"; - this->z_perm = "Z_PERM"; - // "__" are only used for debugging - this->lagrange_first = "__LAGRANGE_FIRST"; - this->lagrange_last = "__LAGRANGE_LAST"; - this->lagrange_odd_in_minicircuit = "__LAGRANGE_ODD_IN_MINICIRCUIT"; - this->lagrange_even_in_minicircuit = "__LAGRANGE_EVEN_IN_MINICIRCUIT"; - this->lagrange_second = "__LAGRANGE_SECOND"; - this->lagrange_second_to_last_in_minicircuit = "__LAGRANGE_SECOND_TO_LAST_IN_MINICIRCUIT"; - this->ordered_extra_range_constraints_numerator = "__ORDERED_EXTRA_RANGE_CONSTRAINTS_NUMERATOR"; + /** + * @brief A container for commitment labels. + * @note It's debatable whether this should inherit from AllEntities. since most entries are not strictly + * needed. It has, however, been useful during debugging to have these labels available. + * + */ + class CommitmentLabels : public AllEntities { + public: + CommitmentLabels() + { + this->op = "OP"; + this->x_lo_y_hi = "X_LO_Y_HI"; + this->x_hi_z_1 = "X_HI_Z_1"; + this->y_lo_z_2 = "Y_LO_Z_2"; + this->p_x_low_limbs = "P_X_LOW_LIMBS"; + this->p_x_low_limbs_range_constraint_0 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->p_x_low_limbs_range_constraint_1 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->p_x_low_limbs_range_constraint_2 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->p_x_low_limbs_range_constraint_3 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->p_x_low_limbs_range_constraint_4 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->p_x_low_limbs_range_constraint_tail = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_x_high_limbs = "P_X_HIGH_LIMBS"; + this->p_x_high_limbs_range_constraint_0 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->p_x_high_limbs_range_constraint_1 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->p_x_high_limbs_range_constraint_2 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->p_x_high_limbs_range_constraint_3 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->p_x_high_limbs_range_constraint_4 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->p_x_high_limbs_range_constraint_tail = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_y_low_limbs = "P_Y_LOW_LIMBS"; + this->p_y_low_limbs_range_constraint_0 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->p_y_low_limbs_range_constraint_1 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->p_y_low_limbs_range_constraint_2 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->p_y_low_limbs_range_constraint_3 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->p_y_low_limbs_range_constraint_4 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->p_y_low_limbs_range_constraint_tail = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_y_high_limbs = "P_Y_HIGH_LIMBS"; + this->p_y_high_limbs_range_constraint_0 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->p_y_high_limbs_range_constraint_1 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->p_y_high_limbs_range_constraint_2 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->p_y_high_limbs_range_constraint_3 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->p_y_high_limbs_range_constraint_4 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->p_y_high_limbs_range_constraint_tail = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->z_low_limbs = "Z_LOw_LIMBS"; + this->z_low_limbs_range_constraint_0 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->z_low_limbs_range_constraint_1 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->z_low_limbs_range_constraint_2 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->z_low_limbs_range_constraint_3 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->z_low_limbs_range_constraint_4 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->z_low_limbs_range_constraint_tail = "Z_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->z_high_limbs = "Z_HIGH_LIMBS"; + this->z_high_limbs_range_constraint_0 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->z_high_limbs_range_constraint_1 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->z_high_limbs_range_constraint_2 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->z_high_limbs_range_constraint_3 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->z_high_limbs_range_constraint_4 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->z_high_limbs_range_constraint_tail = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->accumulators_binary_limbs_0 = "ACCUMULATORS_BINARY_LIMBS_0"; + this->accumulators_binary_limbs_1 = "ACCUMULATORS_BINARY_LIMBS_1"; + this->accumulators_binary_limbs_2 = "ACCUMULATORS_BINARY_LIMBS_2"; + this->accumulators_binary_limbs_3 = "ACCUMULATORS_BINARY_LIMBS_3"; + this->accumulator_low_limbs_range_constraint_0 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->accumulator_low_limbs_range_constraint_1 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->accumulator_low_limbs_range_constraint_2 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->accumulator_low_limbs_range_constraint_3 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->accumulator_low_limbs_range_constraint_4 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->accumulator_low_limbs_range_constraint_tail = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->accumulator_high_limbs_range_constraint_0 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->accumulator_high_limbs_range_constraint_1 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->accumulator_high_limbs_range_constraint_2 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->accumulator_high_limbs_range_constraint_3 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->accumulator_high_limbs_range_constraint_4 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->accumulator_high_limbs_range_constraint_tail = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->quotient_low_binary_limbs = "QUOTIENT_LOW_BINARY_LIMBS"; + this->quotient_high_binary_limbs = "QUOTIENT_HIGH_BINARY_LIMBS"; + this->quotient_low_limbs_range_constraint_0 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->quotient_low_limbs_range_constraint_1 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->quotient_low_limbs_range_constraint_2 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->quotient_low_limbs_range_constraint_3 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->quotient_low_limbs_range_constraint_4 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->quotient_low_limbs_range_constraint_tail = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->quotient_high_limbs_range_constraint_0 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->quotient_high_limbs_range_constraint_1 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->quotient_high_limbs_range_constraint_2 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->quotient_high_limbs_range_constraint_3 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->quotient_high_limbs_range_constraint_4 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->quotient_high_limbs_range_constraint_tail = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->relation_wide_limbs = "RELATION_WIDE_LIMBS"; + this->relation_wide_limbs_range_constraint_0 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_0"; + this->relation_wide_limbs_range_constraint_1 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_1"; + this->relation_wide_limbs_range_constraint_2 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; + this->relation_wide_limbs_range_constraint_3 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; + this->concatenated_range_constraints_0 = "CONCATENATED_RANGE_CONSTRAINTS_0"; + this->concatenated_range_constraints_1 = "CONCATENATED_RANGE_CONSTRAINTS_1"; + this->concatenated_range_constraints_2 = "CONCATENATED_RANGE_CONSTRAINTS_2"; + this->concatenated_range_constraints_3 = "CONCATENATED_RANGE_CONSTRAINTS_3"; + this->z_perm = "Z_PERM"; + // "__" are only used for debugging + this->lagrange_first = "__LAGRANGE_FIRST"; + this->lagrange_last = "__LAGRANGE_LAST"; + this->lagrange_odd_in_minicircuit = "__LAGRANGE_ODD_IN_MINICIRCUIT"; + this->lagrange_even_in_minicircuit = "__LAGRANGE_EVEN_IN_MINICIRCUIT"; + this->lagrange_second = "__LAGRANGE_SECOND"; + this->lagrange_second_to_last_in_minicircuit = "__LAGRANGE_SECOND_TO_LAST_IN_MINICIRCUIT"; + this->ordered_extra_range_constraints_numerator = "__ORDERED_EXTRA_RANGE_CONSTRAINTS_NUMERATOR"; + }; }; - }; - class VerifierCommitments : public AllEntities { - public: - VerifierCommitments(const std::shared_ptr& verification_key) - { - this->lagrange_first = verification_key->lagrange_first; - this->lagrange_last = verification_key->lagrange_last; - this->lagrange_odd_in_minicircuit = verification_key->lagrange_odd_in_minicircuit; - this->lagrange_even_in_minicircuit = verification_key->lagrange_even_in_minicircuit; - this->lagrange_second = verification_key->lagrange_second; - this->lagrange_second_to_last_in_minicircuit = verification_key->lagrange_second_to_last_in_minicircuit; - this->ordered_extra_range_constraints_numerator = - verification_key->ordered_extra_range_constraints_numerator; - } - }; + class VerifierCommitments : public AllEntities { + public: + VerifierCommitments(const std::shared_ptr& verification_key) + { + this->lagrange_first = verification_key->lagrange_first; + this->lagrange_last = verification_key->lagrange_last; + this->lagrange_odd_in_minicircuit = verification_key->lagrange_odd_in_minicircuit; + this->lagrange_even_in_minicircuit = verification_key->lagrange_even_in_minicircuit; + this->lagrange_second = verification_key->lagrange_second; + this->lagrange_second_to_last_in_minicircuit = verification_key->lagrange_second_to_last_in_minicircuit; + this->ordered_extra_range_constraints_numerator = + verification_key->ordered_extra_range_constraints_numerator; + } + }; - using Transcript = BaseTranscript; -}; + using Transcript = BaseTranscript; + }; } // namespace proof_system::honk::flavor -namespace proof_system { +namespace proof_system +{ -extern template class GoblinTranslatorPermutationRelationImpl; -extern template class GoblinTranslatorGenPermSortRelationImpl; -extern template class GoblinTranslatorOpcodeConstraintRelationImpl; -extern template class GoblinTranslatorAccumulatorTransferRelationImpl; -extern template class GoblinTranslatorDecompositionRelationImpl; -extern template class GoblinTranslatorNonNativeFieldRelationImpl; + extern template class GoblinTranslatorPermutationRelationImpl; + extern template class GoblinTranslatorGenPermSortRelationImpl; + extern template class GoblinTranslatorOpcodeConstraintRelationImpl; + extern template class GoblinTranslatorAccumulatorTransferRelationImpl; + extern template class GoblinTranslatorDecompositionRelationImpl; + extern template class GoblinTranslatorNonNativeFieldRelationImpl; -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorPermutationRelationImpl, honk::flavor::GoblinTranslator); -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorGenPermSortRelationImpl, honk::flavor::GoblinTranslator); -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorOpcodeConstraintRelationImpl, honk::flavor::GoblinTranslator); -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorAccumulatorTransferRelationImpl, honk::flavor::GoblinTranslator); -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorDecompositionRelationImpl, honk::flavor::GoblinTranslator); -DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorNonNativeFieldRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorPermutationRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorGenPermSortRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorOpcodeConstraintRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorAccumulatorTransferRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorDecompositionRelationImpl, honk::flavor::GoblinTranslator); + DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorNonNativeFieldRelationImpl, honk::flavor::GoblinTranslator); } // namespace proof_system diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index fcd9fe5a2b01..3a7a4815923b 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -34,8 +34,9 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrget_all())) { + std::cout << flavor_get_label(prover_polynomials, prover_poly) << " vs " << flavor_get_label(*key, key_poly) + << std::endl; ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly)); - std::cout << flavor_get_label(prover_polynomials, prover_poly) << " vs " << flavor_get_label(*key, key_poly); prover_poly = key_poly.share(); } for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), key->get_to_be_shifted())) { From 0fa607ba9ca6c6e1c651e607425342e9902e8e6d Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 22:00:12 +0000 Subject: [PATCH 55/60] sad not working noises --- .../cpp/src/barretenberg/common/zip_view.hpp | 19 +- .../barretenberg/flavor/goblin_translator.hpp | 691 +++++++++--------- .../proof_system/composer/composer_lib.hpp | 5 +- .../goblin_translator_composer.cpp | 3 +- 4 files changed, 367 insertions(+), 351 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/common/zip_view.hpp b/barretenberg/cpp/src/barretenberg/common/zip_view.hpp index f4683049c35d..964888ac644a 100644 --- a/barretenberg/cpp/src/barretenberg/common/zip_view.hpp +++ b/barretenberg/cpp/src/barretenberg/common/zip_view.hpp @@ -75,6 +75,7 @@ static_assert(__cplusplus >= 201703L, " must be c++17 or greater"); // could be rewritten in c++11, but the features you must use will be buggy // in an older compiler anyways. +#include "barretenberg/common/assert.hpp" #include #include #include @@ -154,13 +155,22 @@ class zip_iterator { } }; +enum class ZipAllowDifferentSizes { FLAG }; template class zip_view { using arg_indexes = std::make_index_sequence; public: zip_view(S... args) : args(std::forward(args)...) - {} + { + // min size matches max size + ASSERT(size() == max_size_impl(arg_indexes{})); + } + zip_view(ZipAllowDifferentSizes /*unused*/, S... args) + : args(std::forward(args)...) + { + // Same in a release build, in a debug build doesn't error with different container sizes + } auto begin() const { return get_begins(arg_indexes{}); } auto end() const { return get_ends(arg_indexes{}); } [[nodiscard]] std::size_t size() const { return size_impl(arg_indexes{}); } @@ -176,6 +186,10 @@ template class zip_view { return zip_iterator(std::make_tuple(std::get(args).end()...), std::make_tuple(std::get(args).end()...)); } template auto size_impl(std::index_sequence) const + { + return std::min({ std::size_t(std::get(args).size())... }); + } + template auto max_size_impl(std::index_sequence) const { return std::max({ std::size_t(std::get(args).size())... }); } @@ -188,3 +202,6 @@ template class zip_view { // deduction guide, template zip_view(S&&...) -> zip_view; + +// deduction guide, +template zip_view(ZipAllowDifferentSizes, S&&...) -> zip_view; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 1166c3451a8c..9cd5c7407d19 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -757,382 +757,379 @@ class GoblinTranslator { RefVector get_unshifted() { return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); - // get_to_be_shifted is inherited - RefVector get_shifted() - { - return { this->x_lo_y_hi_shift, - this->x_hi_z_1_shift, - this->y_lo_z_2_shift, - this->p_x_low_limbs_shift, - this->p_x_low_limbs_range_constraint_0_shift, - this->p_x_low_limbs_range_constraint_1_shift, - this->p_x_low_limbs_range_constraint_2_shift, - this->p_x_low_limbs_range_constraint_3_shift, - this->p_x_low_limbs_range_constraint_4_shift, - this->p_x_low_limbs_range_constraint_tail_shift, - this->p_x_high_limbs_shift, - this->p_x_high_limbs_range_constraint_0_shift, - this->p_x_high_limbs_range_constraint_1_shift, - this->p_x_high_limbs_range_constraint_2_shift, - this->p_x_high_limbs_range_constraint_3_shift, - this->p_x_high_limbs_range_constraint_4_shift, - this->p_x_high_limbs_range_constraint_tail_shift, - this->p_y_low_limbs_shift, - this->p_y_low_limbs_range_constraint_0_shift, - this->p_y_low_limbs_range_constraint_1_shift, - this->p_y_low_limbs_range_constraint_2_shift, - this->p_y_low_limbs_range_constraint_3_shift, - this->p_y_low_limbs_range_constraint_4_shift, - this->p_y_low_limbs_range_constraint_tail_shift, - this->p_y_high_limbs_shift, - this->p_y_high_limbs_range_constraint_0_shift, - this->p_y_high_limbs_range_constraint_1_shift, - this->p_y_high_limbs_range_constraint_2_shift, - this->p_y_high_limbs_range_constraint_3_shift, - this->p_y_high_limbs_range_constraint_4_shift, - this->p_y_high_limbs_range_constraint_tail_shift, - this->z_low_limbs_shift, - this->z_low_limbs_range_constraint_0_shift, - this->z_low_limbs_range_constraint_1_shift, - this->z_low_limbs_range_constraint_2_shift, - this->z_low_limbs_range_constraint_3_shift, - this->z_low_limbs_range_constraint_4_shift, - this->z_low_limbs_range_constraint_tail_shift, - this->z_high_limbs_shift, - this->z_high_limbs_range_constraint_0_shift, - this->z_high_limbs_range_constraint_1_shift, - this->z_high_limbs_range_constraint_2_shift, - this->z_high_limbs_range_constraint_3_shift, - this->z_high_limbs_range_constraint_4_shift, - this->z_high_limbs_range_constraint_tail_shift, - this->accumulators_binary_limbs_0_shift, - this->accumulators_binary_limbs_1_shift, - this->accumulators_binary_limbs_2_shift, - this->accumulators_binary_limbs_3_shift, - this->accumulator_low_limbs_range_constraint_0_shift, - this->accumulator_low_limbs_range_constraint_1_shift, - this->accumulator_low_limbs_range_constraint_2_shift, - this->accumulator_low_limbs_range_constraint_3_shift, - this->accumulator_low_limbs_range_constraint_4_shift, - this->accumulator_low_limbs_range_constraint_tail_shift, - this->accumulator_high_limbs_range_constraint_0_shift, - this->accumulator_high_limbs_range_constraint_1_shift, - this->accumulator_high_limbs_range_constraint_2_shift, - this->accumulator_high_limbs_range_constraint_3_shift, - this->accumulator_high_limbs_range_constraint_4_shift, - this->accumulator_high_limbs_range_constraint_tail_shift, - this->quotient_low_binary_limbs_shift, - this->quotient_high_binary_limbs_shift, - this->quotient_low_limbs_range_constraint_0_shift, - this->quotient_low_limbs_range_constraint_1_shift, - this->quotient_low_limbs_range_constraint_2_shift, - this->quotient_low_limbs_range_constraint_3_shift, - this->quotient_low_limbs_range_constraint_4_shift, - this->quotient_low_limbs_range_constraint_tail_shift, - this->quotient_high_limbs_range_constraint_0_shift, - this->quotient_high_limbs_range_constraint_1_shift, - this->quotient_high_limbs_range_constraint_2_shift, - this->quotient_high_limbs_range_constraint_3_shift, - this->quotient_high_limbs_range_constraint_4_shift, - this->quotient_high_limbs_range_constraint_tail_shift, - this->relation_wide_limbs_shift, - this->relation_wide_limbs_range_constraint_0_shift, - this->relation_wide_limbs_range_constraint_1_shift, - this->relation_wide_limbs_range_constraint_2_shift, - this->relation_wide_limbs_range_constraint_3_shift, - this->ordered_range_constraints_0_shift, - this->ordered_range_constraints_1_shift, - this->ordered_range_constraints_2_shift, - this->ordered_range_constraints_3_shift, - this->ordered_range_constraints_4_shift, - - this->z_perm_shift }; - }; + } + // get_to_be_shifted is inherited + RefVector get_shifted() + { + return { this->x_lo_y_hi_shift, + this->x_hi_z_1_shift, + this->y_lo_z_2_shift, + this->p_x_low_limbs_shift, + this->p_x_low_limbs_range_constraint_0_shift, + this->p_x_low_limbs_range_constraint_1_shift, + this->p_x_low_limbs_range_constraint_2_shift, + this->p_x_low_limbs_range_constraint_3_shift, + this->p_x_low_limbs_range_constraint_4_shift, + this->p_x_low_limbs_range_constraint_tail_shift, + this->p_x_high_limbs_shift, + this->p_x_high_limbs_range_constraint_0_shift, + this->p_x_high_limbs_range_constraint_1_shift, + this->p_x_high_limbs_range_constraint_2_shift, + this->p_x_high_limbs_range_constraint_3_shift, + this->p_x_high_limbs_range_constraint_4_shift, + this->p_x_high_limbs_range_constraint_tail_shift, + this->p_y_low_limbs_shift, + this->p_y_low_limbs_range_constraint_0_shift, + this->p_y_low_limbs_range_constraint_1_shift, + this->p_y_low_limbs_range_constraint_2_shift, + this->p_y_low_limbs_range_constraint_3_shift, + this->p_y_low_limbs_range_constraint_4_shift, + this->p_y_low_limbs_range_constraint_tail_shift, + this->p_y_high_limbs_shift, + this->p_y_high_limbs_range_constraint_0_shift, + this->p_y_high_limbs_range_constraint_1_shift, + this->p_y_high_limbs_range_constraint_2_shift, + this->p_y_high_limbs_range_constraint_3_shift, + this->p_y_high_limbs_range_constraint_4_shift, + this->p_y_high_limbs_range_constraint_tail_shift, + this->z_low_limbs_shift, + this->z_low_limbs_range_constraint_0_shift, + this->z_low_limbs_range_constraint_1_shift, + this->z_low_limbs_range_constraint_2_shift, + this->z_low_limbs_range_constraint_3_shift, + this->z_low_limbs_range_constraint_4_shift, + this->z_low_limbs_range_constraint_tail_shift, + this->z_high_limbs_shift, + this->z_high_limbs_range_constraint_0_shift, + this->z_high_limbs_range_constraint_1_shift, + this->z_high_limbs_range_constraint_2_shift, + this->z_high_limbs_range_constraint_3_shift, + this->z_high_limbs_range_constraint_4_shift, + this->z_high_limbs_range_constraint_tail_shift, + this->accumulators_binary_limbs_0_shift, + this->accumulators_binary_limbs_1_shift, + this->accumulators_binary_limbs_2_shift, + this->accumulators_binary_limbs_3_shift, + this->accumulator_low_limbs_range_constraint_0_shift, + this->accumulator_low_limbs_range_constraint_1_shift, + this->accumulator_low_limbs_range_constraint_2_shift, + this->accumulator_low_limbs_range_constraint_3_shift, + this->accumulator_low_limbs_range_constraint_4_shift, + this->accumulator_low_limbs_range_constraint_tail_shift, + this->accumulator_high_limbs_range_constraint_0_shift, + this->accumulator_high_limbs_range_constraint_1_shift, + this->accumulator_high_limbs_range_constraint_2_shift, + this->accumulator_high_limbs_range_constraint_3_shift, + this->accumulator_high_limbs_range_constraint_4_shift, + this->accumulator_high_limbs_range_constraint_tail_shift, + this->quotient_low_binary_limbs_shift, + this->quotient_high_binary_limbs_shift, + this->quotient_low_limbs_range_constraint_0_shift, + this->quotient_low_limbs_range_constraint_1_shift, + this->quotient_low_limbs_range_constraint_2_shift, + this->quotient_low_limbs_range_constraint_3_shift, + this->quotient_low_limbs_range_constraint_4_shift, + this->quotient_low_limbs_range_constraint_tail_shift, + this->quotient_high_limbs_range_constraint_0_shift, + this->quotient_high_limbs_range_constraint_1_shift, + this->quotient_high_limbs_range_constraint_2_shift, + this->quotient_high_limbs_range_constraint_3_shift, + this->quotient_high_limbs_range_constraint_4_shift, + this->quotient_high_limbs_range_constraint_tail_shift, + this->relation_wide_limbs_shift, + this->relation_wide_limbs_range_constraint_0_shift, + this->relation_wide_limbs_range_constraint_1_shift, + this->relation_wide_limbs_range_constraint_2_shift, + this->relation_wide_limbs_range_constraint_3_shift, + this->ordered_range_constraints_0_shift, + this->ordered_range_constraints_1_shift, + this->ordered_range_constraints_2_shift, + this->ordered_range_constraints_3_shift, + this->ordered_range_constraints_4_shift, - /** - * @brief Polynomials/commitments, that can be constructed only after the r challenge has been received from - * gemini - * - * @return RefVector - */ - RefVector get_special() - { - return get_concatenated_constraints(); - } + this->z_perm_shift }; + }; - RefVector get_unshifted_then_shifted_then_special() - { - RefVector result{ this->get_unshifted() }; - RefVector shifted{ get_shifted() }; - RefVector special{ get_special() }; - result.insert(result.end(), shifted.begin(), shifted.end()); - result.insert(result.end(), special.begin(), special.end()); - return result; - } + /** + * @brief Polynomials/commitments, that can be constructed only after the r challenge has been received from + * gemini + * + * @return RefVector + */ + RefVector get_special() { return get_concatenated_constraints(); } - friend std::ostream& operator<<(std::ostream& os, const AllEntities& a) - { - os << "{ "; - std::ios_base::fmtflags f(os.flags()); - auto entities = a.get_all(); - for (size_t i = 0; i < entities.size() - 1; i++) { - os << "e[" << std::setw(2) << i << "] = " << (entities[i]) << ",\n"; - } - os << "e[" << std::setw(2) << (entities.size() - 1) << "] = " << entities[entities.size() - 1] << " }"; + RefVector get_unshifted_then_shifted_then_special() + { + RefVector result{ this->get_unshifted() }; + RefVector shifted{ get_shifted() }; + RefVector special{ get_special() }; + result.insert(result.end(), shifted.begin(), shifted.end()); + result.insert(result.end(), special.begin(), special.end()); + return result; + } - os.flags(f); - return os; + friend std::ostream& operator<<(std::ostream& os, const AllEntities& a) + { + os << "{ "; + std::ios_base::fmtflags f(os.flags()); + auto entities = a.get_all(); + for (size_t i = 0; i < entities.size() - 1; i++) { + os << "e[" << std::setw(2) << i << "] = " << (entities[i]) << ",\n"; } - }; + os << "e[" << std::setw(2) << (entities.size() - 1) << "] = " << entities[entities.size() - 1] << " }"; + os.flags(f); + return os; + } + }; + + public: + /** + * @brief The proving key is responsible for storing the polynomials used by the prover. + * @note TODO(Cody): Maybe multiple inheritance is the right thing here. In that case, nothing should eve + * inherit from ProvingKey. + */ + class ProvingKey : public ProvingKey_, WitnessEntities> { public: - /** - * @brief The proving key is responsible for storing the polynomials used by the prover. - * @note TODO(Cody): Maybe multiple inheritance is the right thing here. In that case, nothing should eve - * inherit from ProvingKey. - */ - class ProvingKey : public ProvingKey_, WitnessEntities> { - public: - BF batching_challenge_v = { 0 }; - BF evaluation_input_x = { 0 }; - ProvingKey() = default; + BF batching_challenge_v = { 0 }; + BF evaluation_input_x = { 0 }; + ProvingKey() = default; - // Expose constructors on the base class - using Base = ProvingKey_, WitnessEntities>; - using Base::Base; + // Expose constructors on the base class + using Base = ProvingKey_, WitnessEntities>; + using Base::Base; - ProvingKey(const size_t circuit_size) - : ProvingKey_, WitnessEntities>(circuit_size, 0) + ProvingKey(const size_t circuit_size) + : ProvingKey_, WitnessEntities>(circuit_size, 0) - , batching_challenge_v(0) - , evaluation_input_x(0) - {} - }; + , batching_challenge_v(0) + , evaluation_input_x(0) + {} + }; - /** - * @brief The verification key is responsible for storing the the commitments to the precomputed (non-witnessk) - * polynomials used by the verifier. - * - * @note Note the discrepancy with what sort of data is stored here vs in the proving key. We may want to - * resolve that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for - * portability of our circuits. - */ - using VerificationKey = VerificationKey_>; + /** + * @brief The verification key is responsible for storing the the commitments to the precomputed (non-witnessk) + * polynomials used by the verifier. + * + * @note Note the discrepancy with what sort of data is stored here vs in the proving key. We may want to + * resolve that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for + * portability of our circuits. + */ + using VerificationKey = VerificationKey_>; + /** + * @brief A field element for each entity of the flavor. These entities represent the prover polynomials + * evaluated at one point. + */ + class AllValues : public AllEntities { + public: + using Base = AllEntities; + using Base::Base; + }; + /** + * @brief A container for the prover polynomials handles. + */ + class ProverPolynomials : public AllEntities { + public: + // Define all operations as default, except only all move construction/assignment + ProverPolynomials() = default; + ProverPolynomials& operator=(const ProverPolynomials&) = delete; + ProverPolynomials(const ProverPolynomials& o) = delete; + ProverPolynomials(ProverPolynomials&& o) noexcept = default; + ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; + ~ProverPolynomials() = default; + [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } /** - * @brief A field element for each entity of the flavor. These entities represent the prover polynomials - * evaluated at one point. - */ - class AllValues : public AllEntities { - public: - using Base = AllEntities; - using Base::Base; - }; - /** - * @brief A container for the prover polynomials handles. + * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which + * represents one row in the execution trace. */ - class ProverPolynomials : public AllEntities { - public: - // Define all operations as default, except only all move construction/assignment - ProverPolynomials() = default; - ProverPolynomials& operator=(const ProverPolynomials&) = delete; - ProverPolynomials(const ProverPolynomials& o) = delete; - ProverPolynomials(ProverPolynomials&& o) noexcept = default; - ProverPolynomials& operator=(ProverPolynomials&& o) noexcept = default; - ~ProverPolynomials() = default; - [[nodiscard]] size_t get_polynomial_size() const { return this->op.size(); } - /** - * @brief Returns the evaluations of all prover polynomials at one point on the boolean hypercube, which - * represents one row in the execution trace. - */ - [[nodiscard]] AllValues get_row(size_t row_idx) const - { - AllValues result; - for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { - result_field = polynomial[row_idx]; - } - return result; + [[nodiscard]] AllValues get_row(size_t row_idx) const + { + AllValues result; + for (auto [result_field, polynomial] : zip_view(result.get_all(), this->get_all())) { + result_field = polynomial[row_idx]; } - }; + return result; + } + }; - /** - * @brief A container for easier mapping of polynomials - */ - using ProverPolynomialIds = AllEntities; + /** + * @brief A container for easier mapping of polynomials + */ + using ProverPolynomialIds = AllEntities; - /** - * @brief A container for polynomials produced after the first round of sumcheck. - * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. - */ - using RowPolynomials = AllEntities; + /** + * @brief A container for polynomials produced after the first round of sumcheck. + * @todo TODO(#394) Use polynomial classes for guaranteed memory alignment. + */ + using RowPolynomials = AllEntities; - /** - * @brief A container for storing the partially evaluated multivariates produced by sumcheck. - */ - class PartiallyEvaluatedMultivariates : public AllEntities { + /** + * @brief A container for storing the partially evaluated multivariates produced by sumcheck. + */ + class PartiallyEvaluatedMultivariates : public AllEntities { - public: - PartiallyEvaluatedMultivariates() = default; - PartiallyEvaluatedMultivariates(const size_t circuit_size) - { - // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) - for (auto& poly : this->get_all()) { - poly = Polynomial(circuit_size / 2); - } + public: + PartiallyEvaluatedMultivariates() = default; + PartiallyEvaluatedMultivariates(const size_t circuit_size) + { + // Storage is only needed after the first partial evaluation, hence polynomials of size (n / 2) + for (auto& poly : this->get_all()) { + poly = Polynomial(circuit_size / 2); } - }; - - /** - * @brief A container for univariates used during sumcheck. - */ - template using ProverUnivariates = AllEntities>; + } + }; - /** - * @brief A container for univariates produced during the hot loop in sumcheck. - */ - using ExtendedEdges = ProverUnivariates; + /** + * @brief A container for univariates used during sumcheck. + */ + template using ProverUnivariates = AllEntities>; - /** - * @brief A container for commitment labels. - * @note It's debatable whether this should inherit from AllEntities. since most entries are not strictly - * needed. It has, however, been useful during debugging to have these labels available. - * - */ - class CommitmentLabels : public AllEntities { - public: - CommitmentLabels() - { - this->op = "OP"; - this->x_lo_y_hi = "X_LO_Y_HI"; - this->x_hi_z_1 = "X_HI_Z_1"; - this->y_lo_z_2 = "Y_LO_Z_2"; - this->p_x_low_limbs = "P_X_LOW_LIMBS"; - this->p_x_low_limbs_range_constraint_0 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->p_x_low_limbs_range_constraint_1 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->p_x_low_limbs_range_constraint_2 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->p_x_low_limbs_range_constraint_3 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->p_x_low_limbs_range_constraint_4 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->p_x_low_limbs_range_constraint_tail = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_x_high_limbs = "P_X_HIGH_LIMBS"; - this->p_x_high_limbs_range_constraint_0 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->p_x_high_limbs_range_constraint_1 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->p_x_high_limbs_range_constraint_2 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->p_x_high_limbs_range_constraint_3 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->p_x_high_limbs_range_constraint_4 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->p_x_high_limbs_range_constraint_tail = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_y_low_limbs = "P_Y_LOW_LIMBS"; - this->p_y_low_limbs_range_constraint_0 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->p_y_low_limbs_range_constraint_1 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->p_y_low_limbs_range_constraint_2 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->p_y_low_limbs_range_constraint_3 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->p_y_low_limbs_range_constraint_4 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->p_y_low_limbs_range_constraint_tail = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->p_y_high_limbs = "P_Y_HIGH_LIMBS"; - this->p_y_high_limbs_range_constraint_0 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->p_y_high_limbs_range_constraint_1 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->p_y_high_limbs_range_constraint_2 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->p_y_high_limbs_range_constraint_3 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->p_y_high_limbs_range_constraint_4 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->p_y_high_limbs_range_constraint_tail = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->z_low_limbs = "Z_LOw_LIMBS"; - this->z_low_limbs_range_constraint_0 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->z_low_limbs_range_constraint_1 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->z_low_limbs_range_constraint_2 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->z_low_limbs_range_constraint_3 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->z_low_limbs_range_constraint_4 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->z_low_limbs_range_constraint_tail = "Z_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->z_high_limbs = "Z_HIGH_LIMBS"; - this->z_high_limbs_range_constraint_0 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->z_high_limbs_range_constraint_1 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->z_high_limbs_range_constraint_2 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->z_high_limbs_range_constraint_3 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->z_high_limbs_range_constraint_4 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->z_high_limbs_range_constraint_tail = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->accumulators_binary_limbs_0 = "ACCUMULATORS_BINARY_LIMBS_0"; - this->accumulators_binary_limbs_1 = "ACCUMULATORS_BINARY_LIMBS_1"; - this->accumulators_binary_limbs_2 = "ACCUMULATORS_BINARY_LIMBS_2"; - this->accumulators_binary_limbs_3 = "ACCUMULATORS_BINARY_LIMBS_3"; - this->accumulator_low_limbs_range_constraint_0 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->accumulator_low_limbs_range_constraint_1 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->accumulator_low_limbs_range_constraint_2 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->accumulator_low_limbs_range_constraint_3 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->accumulator_low_limbs_range_constraint_4 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->accumulator_low_limbs_range_constraint_tail = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->accumulator_high_limbs_range_constraint_0 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->accumulator_high_limbs_range_constraint_1 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->accumulator_high_limbs_range_constraint_2 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->accumulator_high_limbs_range_constraint_3 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->accumulator_high_limbs_range_constraint_4 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->accumulator_high_limbs_range_constraint_tail = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->quotient_low_binary_limbs = "QUOTIENT_LOW_BINARY_LIMBS"; - this->quotient_high_binary_limbs = "QUOTIENT_HIGH_BINARY_LIMBS"; - this->quotient_low_limbs_range_constraint_0 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_0"; - this->quotient_low_limbs_range_constraint_1 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_1"; - this->quotient_low_limbs_range_constraint_2 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_2"; - this->quotient_low_limbs_range_constraint_3 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_3"; - this->quotient_low_limbs_range_constraint_4 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_4"; - this->quotient_low_limbs_range_constraint_tail = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->quotient_high_limbs_range_constraint_0 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_0"; - this->quotient_high_limbs_range_constraint_1 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_1"; - this->quotient_high_limbs_range_constraint_2 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_2"; - this->quotient_high_limbs_range_constraint_3 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_3"; - this->quotient_high_limbs_range_constraint_4 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_4"; - this->quotient_high_limbs_range_constraint_tail = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; - this->relation_wide_limbs = "RELATION_WIDE_LIMBS"; - this->relation_wide_limbs_range_constraint_0 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_0"; - this->relation_wide_limbs_range_constraint_1 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_1"; - this->relation_wide_limbs_range_constraint_2 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; - this->relation_wide_limbs_range_constraint_3 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; - this->concatenated_range_constraints_0 = "CONCATENATED_RANGE_CONSTRAINTS_0"; - this->concatenated_range_constraints_1 = "CONCATENATED_RANGE_CONSTRAINTS_1"; - this->concatenated_range_constraints_2 = "CONCATENATED_RANGE_CONSTRAINTS_2"; - this->concatenated_range_constraints_3 = "CONCATENATED_RANGE_CONSTRAINTS_3"; - this->z_perm = "Z_PERM"; - // "__" are only used for debugging - this->lagrange_first = "__LAGRANGE_FIRST"; - this->lagrange_last = "__LAGRANGE_LAST"; - this->lagrange_odd_in_minicircuit = "__LAGRANGE_ODD_IN_MINICIRCUIT"; - this->lagrange_even_in_minicircuit = "__LAGRANGE_EVEN_IN_MINICIRCUIT"; - this->lagrange_second = "__LAGRANGE_SECOND"; - this->lagrange_second_to_last_in_minicircuit = "__LAGRANGE_SECOND_TO_LAST_IN_MINICIRCUIT"; - this->ordered_extra_range_constraints_numerator = "__ORDERED_EXTRA_RANGE_CONSTRAINTS_NUMERATOR"; - }; - }; + /** + * @brief A container for univariates produced during the hot loop in sumcheck. + */ + using ExtendedEdges = ProverUnivariates; - class VerifierCommitments : public AllEntities { - public: - VerifierCommitments(const std::shared_ptr& verification_key) - { - this->lagrange_first = verification_key->lagrange_first; - this->lagrange_last = verification_key->lagrange_last; - this->lagrange_odd_in_minicircuit = verification_key->lagrange_odd_in_minicircuit; - this->lagrange_even_in_minicircuit = verification_key->lagrange_even_in_minicircuit; - this->lagrange_second = verification_key->lagrange_second; - this->lagrange_second_to_last_in_minicircuit = verification_key->lagrange_second_to_last_in_minicircuit; - this->ordered_extra_range_constraints_numerator = - verification_key->ordered_extra_range_constraints_numerator; - } + /** + * @brief A container for commitment labels. + * @note It's debatable whether this should inherit from AllEntities. since most entries are not strictly + * needed. It has, however, been useful during debugging to have these labels available. + * + */ + class CommitmentLabels : public AllEntities { + public: + CommitmentLabels() + { + this->op = "OP"; + this->x_lo_y_hi = "X_LO_Y_HI"; + this->x_hi_z_1 = "X_HI_Z_1"; + this->y_lo_z_2 = "Y_LO_Z_2"; + this->p_x_low_limbs = "P_X_LOW_LIMBS"; + this->p_x_low_limbs_range_constraint_0 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->p_x_low_limbs_range_constraint_1 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->p_x_low_limbs_range_constraint_2 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->p_x_low_limbs_range_constraint_3 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->p_x_low_limbs_range_constraint_4 = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->p_x_low_limbs_range_constraint_tail = "P_X_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_x_high_limbs = "P_X_HIGH_LIMBS"; + this->p_x_high_limbs_range_constraint_0 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->p_x_high_limbs_range_constraint_1 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->p_x_high_limbs_range_constraint_2 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->p_x_high_limbs_range_constraint_3 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->p_x_high_limbs_range_constraint_4 = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->p_x_high_limbs_range_constraint_tail = "P_X_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_y_low_limbs = "P_Y_LOW_LIMBS"; + this->p_y_low_limbs_range_constraint_0 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->p_y_low_limbs_range_constraint_1 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->p_y_low_limbs_range_constraint_2 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->p_y_low_limbs_range_constraint_3 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->p_y_low_limbs_range_constraint_4 = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->p_y_low_limbs_range_constraint_tail = "P_Y_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->p_y_high_limbs = "P_Y_HIGH_LIMBS"; + this->p_y_high_limbs_range_constraint_0 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->p_y_high_limbs_range_constraint_1 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->p_y_high_limbs_range_constraint_2 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->p_y_high_limbs_range_constraint_3 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->p_y_high_limbs_range_constraint_4 = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->p_y_high_limbs_range_constraint_tail = "P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->z_low_limbs = "Z_LOw_LIMBS"; + this->z_low_limbs_range_constraint_0 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->z_low_limbs_range_constraint_1 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->z_low_limbs_range_constraint_2 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->z_low_limbs_range_constraint_3 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->z_low_limbs_range_constraint_4 = "Z_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->z_low_limbs_range_constraint_tail = "Z_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->z_high_limbs = "Z_HIGH_LIMBS"; + this->z_high_limbs_range_constraint_0 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->z_high_limbs_range_constraint_1 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->z_high_limbs_range_constraint_2 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->z_high_limbs_range_constraint_3 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->z_high_limbs_range_constraint_4 = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->z_high_limbs_range_constraint_tail = "Z_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->accumulators_binary_limbs_0 = "ACCUMULATORS_BINARY_LIMBS_0"; + this->accumulators_binary_limbs_1 = "ACCUMULATORS_BINARY_LIMBS_1"; + this->accumulators_binary_limbs_2 = "ACCUMULATORS_BINARY_LIMBS_2"; + this->accumulators_binary_limbs_3 = "ACCUMULATORS_BINARY_LIMBS_3"; + this->accumulator_low_limbs_range_constraint_0 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->accumulator_low_limbs_range_constraint_1 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->accumulator_low_limbs_range_constraint_2 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->accumulator_low_limbs_range_constraint_3 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->accumulator_low_limbs_range_constraint_4 = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->accumulator_low_limbs_range_constraint_tail = "ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->accumulator_high_limbs_range_constraint_0 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->accumulator_high_limbs_range_constraint_1 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->accumulator_high_limbs_range_constraint_2 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->accumulator_high_limbs_range_constraint_3 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->accumulator_high_limbs_range_constraint_4 = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->accumulator_high_limbs_range_constraint_tail = "ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->quotient_low_binary_limbs = "QUOTIENT_LOW_BINARY_LIMBS"; + this->quotient_high_binary_limbs = "QUOTIENT_HIGH_BINARY_LIMBS"; + this->quotient_low_limbs_range_constraint_0 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_0"; + this->quotient_low_limbs_range_constraint_1 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_1"; + this->quotient_low_limbs_range_constraint_2 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_2"; + this->quotient_low_limbs_range_constraint_3 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_3"; + this->quotient_low_limbs_range_constraint_4 = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_4"; + this->quotient_low_limbs_range_constraint_tail = "QUOTIENT_LOW_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->quotient_high_limbs_range_constraint_0 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_0"; + this->quotient_high_limbs_range_constraint_1 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_1"; + this->quotient_high_limbs_range_constraint_2 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_2"; + this->quotient_high_limbs_range_constraint_3 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_3"; + this->quotient_high_limbs_range_constraint_4 = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_4"; + this->quotient_high_limbs_range_constraint_tail = "QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL"; + this->relation_wide_limbs = "RELATION_WIDE_LIMBS"; + this->relation_wide_limbs_range_constraint_0 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_0"; + this->relation_wide_limbs_range_constraint_1 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_1"; + this->relation_wide_limbs_range_constraint_2 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; + this->relation_wide_limbs_range_constraint_3 = "RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2"; + this->concatenated_range_constraints_0 = "CONCATENATED_RANGE_CONSTRAINTS_0"; + this->concatenated_range_constraints_1 = "CONCATENATED_RANGE_CONSTRAINTS_1"; + this->concatenated_range_constraints_2 = "CONCATENATED_RANGE_CONSTRAINTS_2"; + this->concatenated_range_constraints_3 = "CONCATENATED_RANGE_CONSTRAINTS_3"; + this->z_perm = "Z_PERM"; + // "__" are only used for debugging + this->lagrange_first = "__LAGRANGE_FIRST"; + this->lagrange_last = "__LAGRANGE_LAST"; + this->lagrange_odd_in_minicircuit = "__LAGRANGE_ODD_IN_MINICIRCUIT"; + this->lagrange_even_in_minicircuit = "__LAGRANGE_EVEN_IN_MINICIRCUIT"; + this->lagrange_second = "__LAGRANGE_SECOND"; + this->lagrange_second_to_last_in_minicircuit = "__LAGRANGE_SECOND_TO_LAST_IN_MINICIRCUIT"; + this->ordered_extra_range_constraints_numerator = "__ORDERED_EXTRA_RANGE_CONSTRAINTS_NUMERATOR"; }; + }; - using Transcript = BaseTranscript; + class VerifierCommitments : public AllEntities { + public: + VerifierCommitments(const std::shared_ptr& verification_key) + { + this->lagrange_first = verification_key->lagrange_first; + this->lagrange_last = verification_key->lagrange_last; + this->lagrange_odd_in_minicircuit = verification_key->lagrange_odd_in_minicircuit; + this->lagrange_even_in_minicircuit = verification_key->lagrange_even_in_minicircuit; + this->lagrange_second = verification_key->lagrange_second; + this->lagrange_second_to_last_in_minicircuit = verification_key->lagrange_second_to_last_in_minicircuit; + this->ordered_extra_range_constraints_numerator = + verification_key->ordered_extra_range_constraints_numerator; + } }; + + using Transcript = BaseTranscript; +}; } // namespace proof_system::honk::flavor -namespace proof_system -{ +namespace proof_system { - extern template class GoblinTranslatorPermutationRelationImpl; - extern template class GoblinTranslatorGenPermSortRelationImpl; - extern template class GoblinTranslatorOpcodeConstraintRelationImpl; - extern template class GoblinTranslatorAccumulatorTransferRelationImpl; - extern template class GoblinTranslatorDecompositionRelationImpl; - extern template class GoblinTranslatorNonNativeFieldRelationImpl; +extern template class GoblinTranslatorPermutationRelationImpl; +extern template class GoblinTranslatorGenPermSortRelationImpl; +extern template class GoblinTranslatorOpcodeConstraintRelationImpl; +extern template class GoblinTranslatorAccumulatorTransferRelationImpl; +extern template class GoblinTranslatorDecompositionRelationImpl; +extern template class GoblinTranslatorNonNativeFieldRelationImpl; - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorPermutationRelationImpl, honk::flavor::GoblinTranslator); - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorGenPermSortRelationImpl, honk::flavor::GoblinTranslator); - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorOpcodeConstraintRelationImpl, honk::flavor::GoblinTranslator); - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorAccumulatorTransferRelationImpl, honk::flavor::GoblinTranslator); - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorDecompositionRelationImpl, honk::flavor::GoblinTranslator); - DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorNonNativeFieldRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorPermutationRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorGenPermSortRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorOpcodeConstraintRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorAccumulatorTransferRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorDecompositionRelationImpl, honk::flavor::GoblinTranslator); +DECLARE_SUMCHECK_RELATION_CLASS(GoblinTranslatorNonNativeFieldRelationImpl, honk::flavor::GoblinTranslator); } // namespace proof_system diff --git a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp index 9882e89c2dad..10b1d751107c 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/composer/composer_lib.hpp @@ -40,8 +40,9 @@ void construct_selector_polynomials(const typename Flavor::CircuitBuilder& circu // TODO(#398): Loose coupling here! Would rather build up pk from arithmetization if constexpr (IsHonkFlavor) { - for (auto [poly, selector_values] : - zip_view(proving_key->get_precomputed_polynomials(), circuit_constructor.selectors.get())) { + for (auto [poly, selector_values] : zip_view(ZipAllowDifferentSizes::FLAG, + proving_key->get_precomputed_polynomials(), + circuit_constructor.selectors.get())) { ASSERT(proving_key->circuit_size >= selector_values.size()); // Copy the selector values for all gates, keeping the rows at which we store public inputs as 0. diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp index f31ea42ddd09..953e2db99f6c 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp @@ -100,7 +100,8 @@ void GoblinTranslatorComposer::compute_witness(CircuitBuilder& circuit_builder) auto wire_polynomials = construct_wire_polynomials_base_goblin_translator(circuit_builder, dyadic_circuit_size); // Most of the witness polynomials are the original wire polynomials - for (auto [key_poly, wire_poly] : zip_view(proving_key->get_all(), wire_polynomials)) { + for (auto [key_poly, wire_poly] : + zip_view(ZipAllowDifferentSizes::FLAG, proving_key->get_all(), wire_polynomials)) { key_poly = wire_poly.share(); } From 92c1804f8951db4eb9ebed7718593df3fb64f92d Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 22:04:11 +0000 Subject: [PATCH 56/60] Revert --- .../goblin_translator_composer.cpp | 87 +++++++++++++++++-- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp index 953e2db99f6c..1e23cf12f4ad 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_composer.cpp @@ -99,11 +99,88 @@ void GoblinTranslatorComposer::compute_witness(CircuitBuilder& circuit_builder) // Construct the conventional wire polynomials auto wire_polynomials = construct_wire_polynomials_base_goblin_translator(circuit_builder, dyadic_circuit_size); - // Most of the witness polynomials are the original wire polynomials - for (auto [key_poly, wire_poly] : - zip_view(ZipAllowDifferentSizes::FLAG, proving_key->get_all(), wire_polynomials)) { - key_poly = wire_poly.share(); - } + // TODO(AD): figure out how to get this in a loop, why does NUM_WIRES=81? @kesha + proving_key->op = wire_polynomials[0]; + proving_key->x_lo_y_hi = wire_polynomials[1]; + proving_key->x_hi_z_1 = wire_polynomials[2]; + proving_key->y_lo_z_2 = wire_polynomials[3]; + proving_key->p_x_low_limbs = wire_polynomials[4]; + proving_key->p_x_low_limbs_range_constraint_0 = wire_polynomials[5]; + proving_key->p_x_low_limbs_range_constraint_1 = wire_polynomials[6]; + proving_key->p_x_low_limbs_range_constraint_2 = wire_polynomials[7]; + proving_key->p_x_low_limbs_range_constraint_3 = wire_polynomials[8]; + proving_key->p_x_low_limbs_range_constraint_4 = wire_polynomials[9]; + proving_key->p_x_low_limbs_range_constraint_tail = wire_polynomials[10]; + proving_key->p_x_high_limbs = wire_polynomials[11]; + proving_key->p_x_high_limbs_range_constraint_0 = wire_polynomials[12]; + proving_key->p_x_high_limbs_range_constraint_1 = wire_polynomials[13]; + proving_key->p_x_high_limbs_range_constraint_2 = wire_polynomials[14]; + proving_key->p_x_high_limbs_range_constraint_3 = wire_polynomials[15]; + proving_key->p_x_high_limbs_range_constraint_4 = wire_polynomials[16]; + proving_key->p_x_high_limbs_range_constraint_tail = wire_polynomials[17]; + proving_key->p_y_low_limbs = wire_polynomials[18]; + proving_key->p_y_low_limbs_range_constraint_0 = wire_polynomials[19]; + proving_key->p_y_low_limbs_range_constraint_1 = wire_polynomials[20]; + proving_key->p_y_low_limbs_range_constraint_2 = wire_polynomials[21]; + proving_key->p_y_low_limbs_range_constraint_3 = wire_polynomials[22]; + proving_key->p_y_low_limbs_range_constraint_4 = wire_polynomials[23]; + proving_key->p_y_low_limbs_range_constraint_tail = wire_polynomials[24]; + proving_key->p_y_high_limbs = wire_polynomials[25]; + proving_key->p_y_high_limbs_range_constraint_0 = wire_polynomials[26]; + proving_key->p_y_high_limbs_range_constraint_1 = wire_polynomials[27]; + proving_key->p_y_high_limbs_range_constraint_2 = wire_polynomials[28]; + proving_key->p_y_high_limbs_range_constraint_3 = wire_polynomials[29]; + proving_key->p_y_high_limbs_range_constraint_4 = wire_polynomials[30]; + proving_key->p_y_high_limbs_range_constraint_tail = wire_polynomials[31]; + proving_key->z_low_limbs = wire_polynomials[32]; + proving_key->z_low_limbs_range_constraint_0 = wire_polynomials[33]; + proving_key->z_low_limbs_range_constraint_1 = wire_polynomials[34]; + proving_key->z_low_limbs_range_constraint_2 = wire_polynomials[35]; + proving_key->z_low_limbs_range_constraint_3 = wire_polynomials[36]; + proving_key->z_low_limbs_range_constraint_4 = wire_polynomials[37]; + proving_key->z_low_limbs_range_constraint_tail = wire_polynomials[38]; + proving_key->z_high_limbs = wire_polynomials[39]; + proving_key->z_high_limbs_range_constraint_0 = wire_polynomials[40]; + proving_key->z_high_limbs_range_constraint_1 = wire_polynomials[41]; + proving_key->z_high_limbs_range_constraint_2 = wire_polynomials[42]; + proving_key->z_high_limbs_range_constraint_3 = wire_polynomials[43]; + proving_key->z_high_limbs_range_constraint_4 = wire_polynomials[44]; + proving_key->z_high_limbs_range_constraint_tail = wire_polynomials[45]; + proving_key->accumulators_binary_limbs_0 = wire_polynomials[46]; + proving_key->accumulators_binary_limbs_1 = wire_polynomials[47]; + proving_key->accumulators_binary_limbs_2 = wire_polynomials[48]; + proving_key->accumulators_binary_limbs_3 = wire_polynomials[49]; + proving_key->accumulator_low_limbs_range_constraint_0 = wire_polynomials[50]; + proving_key->accumulator_low_limbs_range_constraint_1 = wire_polynomials[51]; + proving_key->accumulator_low_limbs_range_constraint_2 = wire_polynomials[52]; + proving_key->accumulator_low_limbs_range_constraint_3 = wire_polynomials[53]; + proving_key->accumulator_low_limbs_range_constraint_4 = wire_polynomials[54]; + proving_key->accumulator_low_limbs_range_constraint_tail = wire_polynomials[55]; + proving_key->accumulator_high_limbs_range_constraint_0 = wire_polynomials[56]; + proving_key->accumulator_high_limbs_range_constraint_1 = wire_polynomials[57]; + proving_key->accumulator_high_limbs_range_constraint_2 = wire_polynomials[58]; + proving_key->accumulator_high_limbs_range_constraint_3 = wire_polynomials[59]; + proving_key->accumulator_high_limbs_range_constraint_4 = wire_polynomials[60]; + proving_key->accumulator_high_limbs_range_constraint_tail = wire_polynomials[61]; + proving_key->quotient_low_binary_limbs = wire_polynomials[62]; + proving_key->quotient_high_binary_limbs = wire_polynomials[63]; + proving_key->quotient_low_limbs_range_constraint_0 = wire_polynomials[64]; + proving_key->quotient_low_limbs_range_constraint_1 = wire_polynomials[65]; + proving_key->quotient_low_limbs_range_constraint_2 = wire_polynomials[66]; + proving_key->quotient_low_limbs_range_constraint_3 = wire_polynomials[67]; + proving_key->quotient_low_limbs_range_constraint_4 = wire_polynomials[68]; + proving_key->quotient_low_limbs_range_constraint_tail = wire_polynomials[69]; + proving_key->quotient_high_limbs_range_constraint_0 = wire_polynomials[70]; + proving_key->quotient_high_limbs_range_constraint_1 = wire_polynomials[71]; + proving_key->quotient_high_limbs_range_constraint_2 = wire_polynomials[72]; + proving_key->quotient_high_limbs_range_constraint_3 = wire_polynomials[73]; + proving_key->quotient_high_limbs_range_constraint_4 = wire_polynomials[74]; + proving_key->quotient_high_limbs_range_constraint_tail = wire_polynomials[75]; + proving_key->relation_wide_limbs = wire_polynomials[76]; + proving_key->relation_wide_limbs_range_constraint_0 = wire_polynomials[77]; + proving_key->relation_wide_limbs_range_constraint_1 = wire_polynomials[78]; + proving_key->relation_wide_limbs_range_constraint_2 = wire_polynomials[79]; + proving_key->relation_wide_limbs_range_constraint_3 = wire_polynomials[80]; // We construct concatenated versions of range constraint polynomials, where several polynomials are concatenated // into one. These polynomials are not commited to. From d65e5b2633618d2d995fc87ab77289e61b49e650 Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 22:24:32 +0000 Subject: [PATCH 57/60] try a kludge --- .../cpp/src/barretenberg/flavor/goblin_translator.hpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 9cd5c7407d19..faf43160ca56 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -756,7 +756,8 @@ class GoblinTranslator { // Gemini-specific getters. RefVector get_unshifted() { - return concatenate(PrecomputedEntities::get_all(), WitnessEntities::get_all()); + return concatenate(PrecomputedEntities::get_all(), + WitnessEntities::get_unshifted_wires()); } // get_to_be_shifted is inherited RefVector get_shifted() @@ -899,6 +900,13 @@ class GoblinTranslator { using Base = ProvingKey_, WitnessEntities>; using Base::Base; + // HACK to get around concatenated constraints being weird + RefVector get_all() + { + return concatenate(PrecomputedEntities::get_all(), + WitnessEntities::get_unshifted_wires()); + } + ProvingKey(const size_t circuit_size) : ProvingKey_, WitnessEntities>(circuit_size, 0) From 5511face7208a4cd3b486acd5d3099c03447e23e Mon Sep 17 00:00:00 2001 From: ludamad Date: Tue, 12 Dec 2023 22:44:16 +0000 Subject: [PATCH 58/60] FIXES!??? --- .../barretenberg/flavor/goblin_translator.hpp | 19 +++++++++++++++++-- .../goblin_translator_prover.cpp | 8 ++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index faf43160ca56..04f0f24456c2 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -342,12 +342,21 @@ class GoblinTranslator { }; // everything but ConcatenatedRangeConstraints + // TODO(https://github.com/AztecProtocol/barretenberg/issues/810) RefVector get_unshifted_wires() { return concatenate(WireNonshiftedEntities::get_all(), WireToBeShiftedEntities::get_all(), DerivedWitnessEntities::get_all()); - }; + } + // everything but ConcatenatedRangeConstraints + // TODO(https://github.com/AztecProtocol/barretenberg/issues/810) + std::vector get_unshifted_wire_labels() + { + return concatenate(WireNonshiftedEntities::get_labels(), + WireToBeShiftedEntities::get_labels(), + DerivedWitnessEntities::get_labels()); + } RefVector get_to_be_shifted() { return concatenate(WireToBeShiftedEntities::get_all(), @@ -900,7 +909,13 @@ class GoblinTranslator { using Base = ProvingKey_, WitnessEntities>; using Base::Base; - // HACK to get around concatenated constraints being weird + // TODO(https://github.com/AztecProtocol/barretenberg/issues/810): get around this by properly having + // concatenated range be a concept outside of witnessentities + std::vector get_labels() + { + return concatenate(PrecomputedEntities::get_labels(), + WitnessEntities::get_unshifted_wire_labels()); + } RefVector get_all() { return concatenate(PrecomputedEntities::get_all(), diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index 3a7a4815923b..b398f982d30a 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -34,8 +34,6 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrget_all())) { - std::cout << flavor_get_label(prover_polynomials, prover_poly) << " vs " << flavor_get_label(*key, key_poly) - << std::endl; ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*key, key_poly)); prover_poly = key_poly.share(); } @@ -43,6 +41,12 @@ GoblinTranslatorProver::GoblinTranslatorProver(const std::shared_ptrconcatenated_range_constraints_0; + prover_polynomials.concatenated_range_constraints_1 = key->concatenated_range_constraints_1; + prover_polynomials.concatenated_range_constraints_2 = key->concatenated_range_constraints_2; + prover_polynomials.concatenated_range_constraints_3 = key->concatenated_range_constraints_3; } /** From 10e294cdb46e8d7b41ad846904c2cb375e9174bb Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 13 Dec 2023 15:07:06 -0500 Subject: [PATCH 59/60] typo --- barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp | 2 +- .../cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp | 2 +- .../cpp/src/barretenberg/flavor/goblin_translator.hpp | 2 +- barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp | 4 ++-- barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp | 2 +- barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp index 433dd1b296f4..2322c43f5a2f 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ecc_vm.hpp @@ -387,7 +387,7 @@ template class ECCVMBa */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp index 59ccbcf94409..899af8d2fbc1 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/generated/AvmMini_flavor.hpp @@ -262,7 +262,7 @@ class AvmMiniFlavor { */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 04f0f24456c2..02ea81495a19 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -954,7 +954,7 @@ class GoblinTranslator { */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 6225bbab6776..0849e8857733 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -328,7 +328,7 @@ class GoblinUltra { */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; @@ -575,4 +575,4 @@ class GoblinUltra { using Transcript = Transcript_; }; -} // namespace proof_system::honk::flavor \ No newline at end of file +} // namespace proof_system::honk::flavor diff --git a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp index 6c72f420ccb8..b781e842d3ec 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/toy_avm.hpp @@ -218,7 +218,7 @@ class ToyAVM { */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 9b0f54db9bc7..5dad1648b597 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -304,7 +304,7 @@ class Ultra { */ class ProverPolynomials : public AllEntities { public: - // Define all operations as default, except only all move construction/assignment + // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; ProverPolynomials(const ProverPolynomials& o) = delete; From 6db2e107850ac19e911e83c2bb42cee93332c17f Mon Sep 17 00:00:00 2001 From: ludamad Date: Thu, 14 Dec 2023 17:29:46 +0000 Subject: [PATCH 60/60] fix and todo --- barretenberg/cpp/src/barretenberg/common/std_string.cpp | 4 ++-- barretenberg/cpp/src/barretenberg/common/std_string.hpp | 4 ++-- barretenberg/cpp/src/barretenberg/common/std_vector.hpp | 1 + barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/common/std_string.cpp b/barretenberg/cpp/src/barretenberg/common/std_string.cpp index 775c6a8e298d..dc876db9ae24 100644 --- a/barretenberg/cpp/src/barretenberg/common/std_string.cpp +++ b/barretenberg/cpp/src/barretenberg/common/std_string.cpp @@ -6,7 +6,7 @@ #include #include -namespace std { +namespace barretenberg::detail { std::vector split(const std::string& str, char delimiter) { std::vector result; @@ -46,4 +46,4 @@ std::vector split_and_trim(const std::string& str, char delimiter) } return ret; } -} // namespace std \ No newline at end of file +} // namespace barretenberg::detail \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/common/std_string.hpp b/barretenberg/cpp/src/barretenberg/common/std_string.hpp index c869f94ec7af..5b5d132c921e 100644 --- a/barretenberg/cpp/src/barretenberg/common/std_string.hpp +++ b/barretenberg/cpp/src/barretenberg/common/std_string.hpp @@ -1,7 +1,7 @@ #include #include -namespace std { +namespace barretenberg::detail { std::vector split(const std::string& str, char delimiter); // trim from start (in place) void ltrim(std::string& s); @@ -12,4 +12,4 @@ void trim(std::string& s); // Used to extract variables from a macro #__VA_ARGS__ std::vector split_and_trim(const std::string& str, char delimiter); -} // namespace std \ No newline at end of file +} // namespace barretenberg::detail \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/common/std_vector.hpp b/barretenberg/cpp/src/barretenberg/common/std_vector.hpp index 1bdbdd76fd67..c3bf373820c4 100644 --- a/barretenberg/cpp/src/barretenberg/common/std_vector.hpp +++ b/barretenberg/cpp/src/barretenberg/common/std_vector.hpp @@ -1,6 +1,7 @@ #pragma once #include +// TODO(https://github.com/AztecProtocol/barretenberg/issues/794) namespace this once convenient /** * @brief Concatenates multiple std::vector objects into a single std::vector. * diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp index a3d10d9db275..de19c2d6bd28 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor_macros.hpp @@ -59,7 +59,7 @@ template auto _concatenate_base_class_get_la DEFINE_REF_VIEW(__VA_ARGS__) \ std::vector get_labels() const \ { \ - return std::split_and_trim(#__VA_ARGS__, ','); \ + return barretenberg::detail::split_and_trim(#__VA_ARGS__, ','); \ } \ constexpr std::size_t size() const \ { \