21template <
typename Flavor>
54 typename Flavor::template ProverUnivariates<2>,
122 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
124 const ProverPolynomialsOrPartiallyEvaluatedMultivariates& multivariates,
125 const size_t edge_idx)
127 for (
auto [extended_edge, multivariate] :
zip_view(extended_edges.get_all(), multivariates.get_all())) {
131 if (multivariate.end_index() < edge_idx) {
133 extended_edge = zero_univariate;
136 .
template extend_to<MAX_PARTIAL_RELATION_LENGTH>();
146 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
167 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
179 size_t min_iterations_per_thread = 1 << 6;
218 size_t num_of_chunks = 1;
219 size_t chunk_thread_portion_size =
round_size / num_threads;
222 static_assert(Flavor::MAX_CHUNK_THREAD_PORTION_SIZE >= 2);
223 static_assert((Flavor::MAX_CHUNK_THREAD_PORTION_SIZE & (Flavor::MAX_CHUNK_THREAD_PORTION_SIZE - 1)) == 0);
228 chunk_thread_portion_size = std::min(
round_size / num_threads, Flavor::MAX_CHUNK_THREAD_PORTION_SIZE);
229 num_of_chunks =
round_size / (chunk_thread_portion_size * num_threads);
238 size_t chunk_size =
round_size / num_of_chunks;
248 for (
size_t chunk_idx = 0; chunk_idx < num_of_chunks; chunk_idx++) {
249 size_t start = (chunk_idx * chunk_size) + (thread_idx * chunk_thread_portion_size);
250 size_t end = (chunk_idx * chunk_size) + ((thread_idx + 1) * chunk_thread_portion_size);
251 for (
size_t edge_idx = start; edge_idx < end; edge_idx += 2) {
252 lazy_extended_edges.set_current_edge(edge_idx);
261 gate_separators[(edge_idx >> 1) * gate_separators.
periodicity]);
267 for (
auto& accumulators : thread_univariate_accumulators) {
295 for (
size_t i = 0; i <
blocks->size(); ++i) {
297 if (count + (block.
size / 2) > starting_index) {
302 count += (block.
size / 2);
333 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
335 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials)
337 const size_t min_iterations_per_thread = 1 << 10;
339 const size_t iterations_per_thread =
round_size / num_threads;
344 if constexpr (can_skip_rows) {
347 size_t current_block_size = 0;
348 size_t start = thread_idx * iterations_per_thread;
349 size_t end = (thread_idx + 1) * iterations_per_thread;
351 for (
size_t edge_idx = start; edge_idx < end; edge_idx += 2) {
353 current_block_size += 2;
355 if (current_block_size > 0) {
357 .
starting_edge_idx = edge_idx - current_block_size, .size = current_block_size });
358 current_block_size = 0;
362 if (current_block_size > 0) {
364 .size = current_block_size });
366 all_thread_blocks[thread_idx] = thread_blocks;
369 for (
const auto& thread_blocks : all_thread_blocks) {
370 for (
const auto block : thread_blocks) {
371 result.push_back(block);
401 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
403 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
412 size_t num_valid_rows = 0;
414 num_valid_rows += block.size;
416 size_t num_valid_iterations = num_valid_rows / 2;
422 size_t min_iterations_per_thread = 1 << 6;
424 size_t iterations_per_thread = num_valid_iterations / num_threads;
425 size_t iterations_for_last_thread = num_valid_iterations - (iterations_per_thread * (num_threads - 1));
431 const size_t start = thread_idx * iterations_per_thread;
432 const size_t end = (thread_idx == num_threads - 1) ? start + iterations_for_last_thread
433 : (thread_idx + 1) * iterations_per_thread;
438 for (
size_t i = start; i < end; ++i) {
449 gate_separators[(edge_idx >> 1) * gate_separators.
periodicity]);
454 for (
auto& accumulators : thread_univariate_accumulators) {
459 const auto round_univariate =
463 return round_univariate;
465 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
467 const size_t round_idx,
468 const ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
472 const ZKData& zk_sumcheck_data,
478 hiding_univariate -= compute_disabled_contribution(
479 polynomials, relation_parameters, gate_separators, alpha, round_idx, row_disabling_polynomial);
481 return hiding_univariate;
490 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
492 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
496 const size_t round_idx,
509 for (
size_t edge_idx = start_edge_idx; edge_idx <
round_size; edge_idx += 2) {
514 gate_separators[(edge_idx >> 1) * gate_separators.periodicity]);
516 result = batch_over_relations<SumcheckRoundUnivariate>(univariate_accumulator, alphas, gate_separators);
520 row_disabling_factor.template extend_to<SumcheckRoundUnivariate::LENGTH>();
521 result *= row_disabling_factor_extended;
526 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
528 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
530 const GateSeparatorPolynomial<FF>& gate_separator,
540 const size_t virtual_contribution_edge_idx = 0;
544 auto extended_edges = [&]() {
545 if constexpr (isAvmFlavor<Flavor>) {
547 lazy_extended_edges.set_current_edge(virtual_contribution_edge_idx);
548 return lazy_extended_edges;
551 extend_edges(extended_edges, polynomials, virtual_contribution_edge_idx);
552 return extended_edges;
557 const FF gate_separator_tail{ 1 };
559 univariate_accumulator, extended_edges, relation_parameters, gate_separator_tail);
561 return batch_over_relations<SumcheckRoundUnivariate>(univariate_accumulator, alphas, gate_separator);
579 template <
typename ExtendedUnivariate,
typename ContainerOverSubrelations>
586 auto result = ExtendedUnivariate(0);
607 template <
typename ExtendedUnivariate,
typename TupleOfTuplesOfUnivariates>
609 ExtendedUnivariate& result,
612 ExtendedUnivariate extended_random_polynomial;
615 extended_random_polynomial = random_polynomial.template extend_to<ExtendedUnivariate::LENGTH>();
617 auto extend_and_sum = [&]<
size_t relation_idx,
size_t subrelation_idx,
typename Element>(
Element& element) {
618 auto extended = element.template extend_to<ExtendedUnivariate::LENGTH>();
621 const bool is_subrelation_linearly_independent =
622 bb::subrelation_is_linearly_independent<Relation, subrelation_idx>();
627 if (!is_subrelation_linearly_independent) {
659 libra_round_univariate.
value_at(idx) =
663 return libra_round_univariate;
665 return libra_round_univariate.template extend_to<SumcheckRoundUnivariate::LENGTH>();
698 const auto& extended_edges,
700 const FF& scaling_factor)
702 constexpr_for<0, NUM_RELATIONS, 1>([&]<
size_t relation_idx>() {
713 if (!Relation::skip(extended_edges)) {
782 bool sumcheck_round_failed(
false);
785 if (indicator.get_value() ==
FF{ 1 }.get_value()) {
786 sumcheck_round_failed = (
target_total_sum.get_value() != total_sum.get_value());
795 return !sumcheck_round_failed;
826 Utils::template accumulate_relation_evaluations_without_skipping<>(purported_evaluations,
#define BB_BENCH_NAME(name)
static bool skip_entire_row(const ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const EdgeType edge_idx)
When evaluating the sumcheck protocol - can we skip evaluation of all relations for a given row?...
A base class labelling all entities (for instance, all of the polynomials used by the prover during s...
A field element for each entity of the flavor. These entities represent the prover polynomials evalua...
std::array< FF, NUM_SUBRELATIONS - 1 > SubrelationSeparators
static constexpr size_t NUM_RELATIONS
static constexpr bool HasZK
static constexpr size_t MAX_PARTIAL_RELATION_LENGTH
Relations_< FF > Relations
static constexpr bool USE_SHORT_MONOMIALS
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
static void scale_univariates(auto &tuple, const SubrelationSeparators &subrelation_separators)
Scale Univariates, each representing a subrelation, by different challenges.
static void zero_elements(auto &tuple)
Set each element in a tuple of arrays to zero.
static void zero_univariates(auto &tuple)
Set all coefficients of Univariates to zero.
static constexpr void add_nested_tuples(Tuple &tuple_1, const Tuple &tuple_2)
Componentwise addition of nested tuples (tuples of tuples)
static void apply_to_tuple_of_tuples(auto &tuple, Operation &&operation)
General purpose method for applying an operation to a tuple of tuples of Univariates.
static FF scale_and_batch_elements(auto &tuple, const SubrelationSeparators &subrelation_separators)
Scale elements, representing evaluations of subrelations, by separate challenges then sum them.
Imlementation of the Sumcheck prover round.
decltype(create_sumcheck_tuple_of_tuples_of_univariates< Relations >()) SumcheckTupleOfTuplesOfUnivariates
static constexpr size_t LIBRA_UNIVARIATES_LENGTH
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
The total algebraic degree of the Sumcheck relation as a polynomial in Prover Polynomials incremen...
std::conditional_t< Flavor::USE_SHORT_MONOMIALS, typename Flavor::template ProverUnivariates< 2 >, typename Flavor::ExtendedEdges > ExtendedEdges
static constexpr size_t MAX_PARTIAL_RELATION_LENGTH
The total algebraic degree of the Sumcheck relation as a polynomial in Prover Polynomials .
static void extend_and_batch_univariates(const TupleOfTuplesOfUnivariates &tuple, ExtendedUnivariate &result, const bb::GateSeparatorPolynomial< FF > &gate_separators)
Extend Univariates then sum them multiplying by the current -contributions.
static ExtendedUnivariate batch_over_relations(ContainerOverSubrelations &univariate_accumulators, const SubrelationSeparators &challenge, const bb::GateSeparatorPolynomial< FF > &gate_separators)
Given a tuple of tuples of extended per-relation contributions, and a challenge ,...
typename Flavor::SubrelationSeparators SubrelationSeparators
SumcheckRoundUnivariate compute_univariate_with_row_skipping(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators alphas)
Return the evaluations of the univariate round polynomials at . Most likely, is around ....
SumcheckProverRound(size_t initial_round_size)
SumcheckRoundUnivariate compute_univariate_avm(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas)
A version of compute_univariate that is better optimized for the AVM.
SumcheckTupleOfTuplesOfUnivariates univariate_accumulators
bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > SumcheckRoundUnivariate
SumcheckRoundUnivariate compute_univariate(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas)
Return the evaluations of the univariate round polynomials. Toggles between chunked computation (desi...
void extend_edges(ExtendedEdges &extended_edges, const ProverPolynomialsOrPartiallyEvaluatedMultivariates &multivariates, const size_t edge_idx)
To compute the round univariate in Round , the prover first computes the values of Honk polynomials ...
void accumulate_relation_univariates(SumcheckTupleOfTuplesOfUnivariates &univariate_accumulators, const auto &extended_edges, const bb::RelationParameters< FF > &relation_parameters, const FF &scaling_factor)
In Round , for a given point , calculate the contribution of each sub-relation to .
static SumcheckRoundUnivariate compute_libra_univariate(const ZKData &zk_sumcheck_data, size_t round_idx)
Compute Libra round univariate expressed given by the formula.
static constexpr size_t NUM_RELATIONS
Number of batched sub-relations in specified by Flavor.
std::vector< BlockOfContiguousRows > compute_contiguous_round_size(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials)
Compute the number of unskippable rows we must iterate over.
SumcheckRoundUnivariate compute_hiding_univariate(const size_t round_idx, const ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alpha, const ZKData &zk_sumcheck_data, const RowDisablingPolynomial< FF > row_disabling_polynomial)
For ZK Flavors: A method disabling the last 4 rows of the ProverPolynomials.
typename Flavor::Relations Relations
size_t round_size
In Round , equals .
Implementation of the Sumcheck Verifier Round.
typename Flavor::AllValues ClaimedEvaluations
TupleOfArraysOfValues relation_evaluations
decltype(create_tuple_of_arrays_of_values< typename Flavor::Relations >()) TupleOfArraysOfValues
typename Flavor::SubrelationSeparators SubrelationSeparators
SumcheckVerifierRound(FF target_total_sum=0)
static constexpr size_t NUM_RELATIONS
Number of batched sub-relations in specified by Flavor.
FF compute_full_relation_purported_value(const ClaimedEvaluations &purported_evaluations, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas)
Given the evaluations of the ProverPolynomials at the challenge point stored in purported_evaluatio...
void compute_next_target_sum(bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &univariate, FF &round_challenge, const FF &indicator)
After checking that the univariate is good for this round, compute the next target sum given by the e...
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
The partial algebraic degree of the relation , i.e. MAX_PARTIAL_RELATION_LENGTH + 1.
typename std::vector< FF > ClaimedLibraEvaluations
typename Flavor::Relations Relations
bool check_sum(bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &univariate, const FF &indicator)
Check that the round target sum is correct.
Fr evaluate(const Fr &u) const
Evaluate a univariate at a point u not known at compile time and assumed not to be in the domain (els...
Check if the flavor has a static skip method to determine if accumulation of all relations can be ski...
The templates defined herein facilitate sharing the relation arithmetic between the prover and the ve...
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
Entry point for Barretenberg command-line interface.
size_t calculate_num_threads(size_t num_iterations, size_t min_iterations_per_thread)
calculates number of threads to create based on minimum iterations per thread
size_t calculate_num_threads_pow2(size_t num_iterations, size_t min_iterations_per_thread)
calculates number of threads to create based on minimum iterations per thread, guaranteed power of 2
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Implementation of the methods for the -polynomials used in in Sumcheck.
size_t periodicity
In Round of Sumcheck, the periodicity equals to and represents the fixed interval at which elements...
FF current_element() const
Computes the component at index current_element_idx in betas.
FF partial_evaluation_result
The value obtained by partially evaluating one variable in the power polynomial at each round....
Container for parameters used by the grand product (permutation, lookup) Honk relations.
Polynomial for Sumcheck with disabled Rows.
Helper struct that describes a block of non-zero unskippable rows.
Helper struct that will, given a vector of BlockOfContiguousRows, return the edge indices that corres...
RowIterator(const std::vector< BlockOfContiguousRows > &_blocks, size_t starting_index=0)
size_t current_block_index
size_t current_block_count
const std::vector< BlockOfContiguousRows > * blocks
This structure is created to contain various polynomials and constants required by ZK Sumcheck.
std::vector< Polynomial< FF > > libra_univariates