2#include "barretenberg/common/constexpr_utils.hpp"
3#include "barretenberg/common/thread.hpp"
4#include "barretenberg/common/zip_view.hpp"
5#include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp"
6#include "barretenberg/polynomials/polynomial.hpp"
7#include "barretenberg/relations/relation_parameters.hpp"
10namespace proof_system::honk::grand_product_library {
50template <
typename Flavor,
typename GrandProdRelation>
51void compute_grand_product(
const size_t circuit_size,
55 using FF =
typename Flavor::FF;
57 using Accumulator = std::tuple_element_t<0, typename GrandProdRelation::SumcheckArrayOfValuesOverSubrelations>;
61 Polynomial numerator{ circuit_size };
62 Polynomial denominator{ circuit_size };
66 const size_t num_threads = circuit_size >= get_num_cpus_pow2() ? get_num_cpus_pow2() : 1;
67 const size_t block_size = circuit_size / num_threads;
68 auto full_polynomials_view = full_polynomials.get_all();
69 parallel_for(num_threads, [&](
size_t thread_idx) {
70 const size_t start = thread_idx * block_size;
71 const size_t end = (thread_idx + 1) * block_size;
72 for (
size_t i = start; i < end; ++i) {
74 for (
auto [eval, full_poly] :
zip_view(evaluations.get_all(), full_polynomials_view)) {
75 eval = full_poly.size() > i ? full_poly[i] : 0;
77 numerator[i] = GrandProdRelation::template compute_grand_product_numerator<Accumulator>(
78 evaluations, relation_parameters);
79 denominator[i] = GrandProdRelation::template compute_grand_product_denominator<Accumulator>(
80 evaluations, relation_parameters);
96 std::vector<FF> partial_numerators(num_threads);
97 std::vector<FF> partial_denominators(num_threads);
99 parallel_for(num_threads, [&](
size_t thread_idx) {
100 const size_t start = thread_idx * block_size;
101 const size_t end = (thread_idx + 1) * block_size;
102 for (
size_t i = start; i < end - 1; ++i) {
103 numerator[i + 1] *= numerator[i];
104 denominator[i + 1] *= denominator[i];
106 partial_numerators[thread_idx] = numerator[end - 1];
107 partial_denominators[thread_idx] = denominator[end - 1];
110 parallel_for(num_threads, [&](
size_t thread_idx) {
111 const size_t start = thread_idx * block_size;
112 const size_t end = (thread_idx + 1) * block_size;
113 if (thread_idx > 0) {
114 FF numerator_scaling = 1;
115 FF denominator_scaling = 1;
117 for (
size_t j = 0; j < thread_idx; ++j) {
118 numerator_scaling *= partial_numerators[j];
119 denominator_scaling *= partial_denominators[j];
121 for (
size_t i = start; i < end; ++i) {
122 numerator[i] *= numerator_scaling;
123 denominator[i] *= denominator_scaling;
128 FF::batch_invert(std::span{ &denominator[start], block_size });
132 auto& grand_product_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials);
133 grand_product_polynomial[0] = 0;
134 parallel_for(num_threads, [&](
size_t thread_idx) {
135 const size_t start = thread_idx * block_size;
136 const size_t end = (thread_idx == num_threads - 1) ? circuit_size - 1 : (thread_idx + 1) * block_size;
137 for (
size_t i = start; i < end; ++i) {
138 grand_product_polynomial[i + 1] = numerator[i] * denominator[i];
143template <
typename Flavor>
144void compute_grand_products(std::shared_ptr<typename Flavor::ProvingKey>& key,
148 using GrandProductRelations =
typename Flavor::GrandProductRelations;
149 using FF =
typename Flavor::FF;
151 constexpr size_t NUM_RELATIONS = std::tuple_size<GrandProductRelations>{};
152 barretenberg::constexpr_for<0, NUM_RELATIONS, 1>([&]<
size_t i>() {
153 using GrandProdRelation =
typename std::tuple_element<i, GrandProductRelations>::type;
159 GrandProdRelation::get_grand_product_polynomial(full_polynomials);
160 auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(*key);
161 full_polynomial = key_polynomial.
share();
163 compute_grand_product<Flavor, GrandProdRelation>(key->circuit_size, full_polynomials, relation_parameters);
165 GrandProdRelation::get_shifted_grand_product_polynomial(full_polynomials);
166 full_polynomial_shift = key_polynomial.
shifted();
Definition: polynomial.hpp:12
Polynomial shifted() const
Returns an std::span of the left-shift of self.
Definition: polynomial.cpp:323
Polynomial share() const
Definition: polynomial.cpp:141
Definition: AvmMini_flavor.hpp:254
A container for the prover polynomials handles.
Definition: AvmMini_flavor.hpp:263
Definition: zip_view.hpp:159
Container for parameters used by the grand product (permutation, lookup) Honk relations.
Definition: relation_parameters.hpp:12