22template <
typename Flavor>
55 typename Flavor::template ProverUnivariates<2>,
123 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
125 const ProverPolynomialsOrPartiallyEvaluatedMultivariates& multivariates,
126 const size_t edge_idx)
128 for (
auto [extended_edge, multivariate] :
zip_view(extended_edges.get_all(), multivariates.get_all())) {
131 extended_edge = edge;
133 if (multivariate.end_index() < edge_idx) {
135 extended_edge = zero_univariate;
137 extended_edge = edge.template extend_to<MAX_PARTIAL_RELATION_LENGTH>();
146 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
181 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
183 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
194 size_t min_iterations_per_thread = 1 << 6;
237 size_t num_of_chunks = 1;
238 size_t chunk_thread_portion_size =
round_size / num_threads;
243 static_assert(Flavor::MAX_CHUNK_THREAD_PORTION_SIZE >= 2);
244 static_assert((Flavor::MAX_CHUNK_THREAD_PORTION_SIZE & (Flavor::MAX_CHUNK_THREAD_PORTION_SIZE - 1)) == 0);
249 chunk_thread_portion_size = std::min(
round_size / num_threads, Flavor::MAX_CHUNK_THREAD_PORTION_SIZE);
250 num_of_chunks =
round_size / (chunk_thread_portion_size * num_threads);
260 size_t chunk_size =
round_size / num_of_chunks;
269 for (
size_t chunk_idx = 0; chunk_idx < num_of_chunks; chunk_idx++) {
270 size_t start = chunk_idx * chunk_size + thread_idx * chunk_thread_portion_size;
271 size_t end = chunk_idx * chunk_size + (thread_idx + 1) * chunk_thread_portion_size;
272 for (
size_t edge_idx = start; edge_idx < end; edge_idx += 2) {
282 gate_separators[(edge_idx >> 1) * gate_separators.
periodicity]);
288 for (
auto& accumulators : thread_univariate_accumulators) {
316 for (
size_t i = 0; i <
blocks->size(); ++i) {
318 if (count + (block.
size / 2) > starting_index) {
323 count += (block.
size / 2);
354 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
356 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials)
358 const size_t min_iterations_per_thread = 1 << 10;
360 const size_t iterations_per_thread =
round_size / num_threads;
365 if constexpr (can_skip_rows) {
368 size_t current_block_size = 0;
369 size_t start = thread_idx * iterations_per_thread;
370 size_t end = (thread_idx + 1) * iterations_per_thread;
372 for (
size_t edge_idx = start; edge_idx < end; edge_idx += 2) {
374 current_block_size += 2;
376 if (current_block_size > 0) {
378 .
starting_edge_idx = edge_idx - current_block_size, .size = current_block_size });
379 current_block_size = 0;
383 if (current_block_size > 0) {
385 .size = current_block_size });
387 all_thread_blocks[thread_idx] = thread_blocks;
390 for (
const auto& thread_blocks : all_thread_blocks) {
391 for (
const auto block : thread_blocks) {
392 result.push_back(block);
405 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
407 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
416 size_t num_valid_rows = 0;
418 num_valid_rows += block.size;
420 size_t num_valid_iterations = num_valid_rows / 2;
426 size_t min_iterations_per_thread = 1 << 6;
428 size_t iterations_per_thread = num_valid_iterations / num_threads;
429 size_t iterations_for_last_thread = num_valid_iterations - (iterations_per_thread * (num_threads - 1));
435 const size_t start = thread_idx * iterations_per_thread;
436 const size_t end = (thread_idx == num_threads - 1) ? start + iterations_for_last_thread
437 : (thread_idx + 1) * iterations_per_thread;
442 for (
size_t i = start; i < end; ++i) {
453 gate_separators[(edge_idx >> 1) * gate_separators.
periodicity]);
458 for (
auto& accumulators : thread_univariate_accumulators) {
463 const auto round_univariate =
466 return round_univariate;
468 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
470 const size_t round_idx,
471 const ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
475 const ZKData& zk_sumcheck_data,
481 hiding_univariate -= compute_disabled_contribution(
482 polynomials, relation_parameters, gate_separators, alpha, round_idx, row_disabling_polynomial);
484 return hiding_univariate;
493 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
495 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
499 const size_t round_idx,
512 for (
size_t edge_idx = start_edge_idx; edge_idx <
round_size; edge_idx += 2) {
517 gate_separators[(edge_idx >> 1) * gate_separators.periodicity]);
519 result = batch_over_relations<SumcheckRoundUnivariate>(univariate_accumulator, alphas, gate_separators);
523 row_disabling_factor.template extend_to<SumcheckRoundUnivariate::LENGTH>();
524 result *= row_disabling_factor_extended;
529 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
531 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
533 const GateSeparatorPolynomial<FF>& gate_separator,
544 const size_t virtual_contribution_edge_idx = 0;
547 extend_edges(extended_edges, polynomials, virtual_contribution_edge_idx);
549 const FF gate_separator_tail{ 1 };
551 univariate_accumulator, extended_edges, relation_parameters, gate_separator_tail);
553 return batch_over_relations<SumcheckRoundUnivariate>(univariate_accumulator, alphas, gate_separator);
571 template <
typename ExtendedUnivariate,
typename ContainerOverSubrelations>
578 auto result = ExtendedUnivariate(0);
599 template <
typename ExtendedUnivariate,
typename TupleOfTuplesOfUnivariates>
601 ExtendedUnivariate& result,
604 ExtendedUnivariate extended_random_polynomial;
607 extended_random_polynomial = random_polynomial.template extend_to<ExtendedUnivariate::LENGTH>();
609 auto extend_and_sum = [&]<
size_t relation_idx,
size_t subrelation_idx,
typename Element>(
Element& element) {
610 auto extended = element.template extend_to<ExtendedUnivariate::LENGTH>();
613 const bool is_subrelation_linearly_independent =
614 bb::subrelation_is_linearly_independent<Relation, subrelation_idx>();
619 if (!is_subrelation_linearly_independent) {
651 libra_round_univariate.
value_at(idx) =
655 return libra_round_univariate;
657 return libra_round_univariate.template extend_to<SumcheckRoundUnivariate::LENGTH>();
690 const auto& extended_edges,
692 const FF& scaling_factor)
694 constexpr_for<0, NUM_RELATIONS, 1>([&]<
size_t relation_idx>() {
705 if (!Relation::skip(extended_edges)) {
774 bool sumcheck_round_failed(
false);
777 if (indicator.get_value() ==
FF{ 1 }.get_value()) {
778 sumcheck_round_failed = (
target_total_sum.get_value() != total_sum.get_value());
787 return !sumcheck_round_failed;
818 Utils::template accumulate_relation_evaluations_without_skipping<>(purported_evaluations,
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)
Version of compute_univariate that allows for row-skipping, as a prover-side optimization.
SumcheckProverRound(size_t initial_round_size)
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.
SumcheckRoundUnivariate compute_univariate_with_chunking(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 ....
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
#define PROFILE_THIS_NAME(name)
Implementation of the methods for the -polynomials used in Protogalaxy and -polynomials used in Sumch...
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