36template <
typename Flavor>
46template <
typename T>
inline constexpr size_t lane_count = 1;
47template <IsVectorField T>
inline constexpr size_t lane_count<T> = T::SIZE;
78 typename Flavor::template ProverUnivariates<2>,
171 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
174 size_t max_end_index = 0;
175 if constexpr (
requires { multivariates.get_witness(); }) {
176 for (
auto& witness_poly : multivariates.get_witness()) {
177 max_end_index =
std::max(max_end_index, witness_poly.end_index());
183 size_t effective = max_end_index + (max_end_index % 2);
218 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
220 const ProverPolynomialsOrPartiallyEvaluatedMultivariates& multivariates,
221 const size_t edge_idx)
223 for (
auto [extended_edge, multivariate] :
zip_view(extended_edges.get_all(), multivariates.get_all())) {
229 if (multivariate.end_index() <= edge_idx) {
231 extended_edge = zero_univariate;
234 .
template extend_to<MAX_PARTIAL_RELATION_LENGTH>();
256 using EntityId =
typename Flavor::template ProverUnivariates<2>::EntityId;
274 const size_t index =
static_cast<size_t>(id);
281 { Element::from_lanes([&](
size_t lane) {
return multivariate[
current_edge + (2 * lane)]; }),
282 Element::from_lanes([&](
size_t lane) {
return multivariate[
current_edge + (2 * lane) + 1]; }) });
306 template <
typename Element = FF,
typename Multivariates>
310 "SIMD (VectorField) sumcheck is only supported for short-monomial flavors");
321 template <
typename Edges,
typename Multivariates>
322 static void load_edge(Edges& edges,
const Multivariates& multivariates,
const size_t edge_idx)
325 edges.set_current_edge(edge_idx);
336 template <
typename Element>
342 return gate_separators.template gather<Element>(edge_idx);
347 template <
typename Element>
using RelationTupleFor =
typename Flavor::template Relations_<Element>;
352 template <
typename Element>
353 using AccumulatorsFor =
decltype(create_sumcheck_tuple_of_tuples_of_univariates<RelationTupleFor<Element>>());
359 template <
typename Element>
363 constexpr_for<0, NUM_RELATIONS, 1>([&]<
size_t relation_idx>() {
367 [&]<
size_t subrelation_idx>() {
370 for (
size_t k = 0; k <
std::decay_t<
decltype(source_univariate)>::LENGTH; ++k) {
372 destination_univariate.evaluations[k] += source_univariate.evaluations[k].horizontal_sum();
392 template <
typename Element =
void,
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
405#ifdef BB_FORCE_SCALAR_LANE
406 using AutoResolved =
FF;
410 !USES_ROW_MANIFEST<ProverPolynomialsOrPartiallyEvaluatedMultivariates>,
416 "SIMD element requested for a flavor that does not support the row-parallel path");
419 accumulate_edge_chunks<ResolvedElement>(chunks, polynomials, relation_parameters, gate_separators);
429 static size_t chunk_count(
const size_t span,
const size_t rows_per_chunk)
431 return span / rows_per_chunk + (span % rows_per_chunk > 0 ? 1 : 0);
477 BB_ASSERT(rows_per_chunk >= 2 && rows_per_chunk % 2 == 0,
"rows_per_chunk must be at least 2 and even");
479 size_t num_chunks = 0;
481 BB_ASSERT(range.begin % 2 == 0,
"edge range begin must be even");
482 BB_ASSERT(range.end % 2 == 0,
"edge range end must be even");
483 BB_ASSERT(range.begin <= range.end,
"edge range begin must not exceed end");
484 num_chunks +=
chunk_count(range.end - range.begin, rows_per_chunk);
487 chunks.reserve(num_chunks);
489 for (
size_t chunk_begin = range.begin; chunk_begin < range.end; chunk_begin += rows_per_chunk) {
491 EdgeRange{ .
begin = chunk_begin, .end = std::min(chunk_begin + rows_per_chunk, range.end) });
501 if (
id >=
chunks.size()) {
511 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
514 if constexpr (USES_ROW_MANIFEST<ProverPolynomialsOrPartiallyEvaluatedMultivariates>) {
534 template <
typename GroupFn,
typename PairFn>
536 const size_t begin,
const size_t end,
const size_t group_stride, GroupFn on_full_group, PairFn on_leftover_pair)
538 size_t edge_idx = begin;
539 for (; edge_idx + group_stride <= end; edge_idx += group_stride) {
540 on_full_group(edge_idx);
542 for (; edge_idx < end; edge_idx += 2) {
543 on_leftover_pair(edge_idx);
552 template <
typename Accumulators,
typename Edges,
typename Multivariates,
typename Element>
554 Edges& edge_container,
555 const Multivariates& polynomials,
558 const size_t edge_idx)
561 accumulate_relation_univariates<RelationTupleFor<Element>>(
562 accumulator, edge_container, params, element_scaling<Element>(gate_separators, edge_idx));
570 template <
typename Element,
typename EdgeChunks,
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
572 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
576 constexpr size_t EDGE_STRIDE = 2 * lane_count<Element>;
577 const size_t num_slots = chunks.num_slots();
578 const auto element_parameters = relation_parameters.template convert_to<Element>();
584 auto edges = make_extended_edges<Element>(polynomials);
586 auto& wide_accumulator = slot_wide_accumulators[slot_id];
587 auto&
result = slot_results[slot_id];
588 while (
auto chunk = chunks.pop()) {
596 [&](
const size_t edge_idx) {
598 wide_accumulator, edges, polynomials, element_parameters, gate_separators, edge_idx);
600 [&](
const size_t edge_idx) {
602 result, tail_edges, polynomials, relation_parameters, gate_separators, edge_idx);
605 reduce_accumulator<Element>(
result, wide_accumulator);
608 for (
auto&
result : slot_results) {
617 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
620 requires(
const ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials) {
626 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
632 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
634 HAS_STATIC_ROW_SKIP_MANIFEST<ProverPolynomialsOrPartiallyEvaluatedMultivariates> ||
635 CAN_SKIP_ROWS<ProverPolynomialsOrPartiallyEvaluatedMultivariates>;
644 if (!ranges.empty()) {
645 auto& previous = ranges.back();
646 const size_t previous_end = previous.end;
647 if (start <= previous_end) {
648 previous.end =
std::max(previous_end, end);
657 if (ranges.empty()) {
661 return lhs.begin < rhs.begin;
664 size_t write_idx = 0;
665 for (
size_t read_idx = 1; read_idx < ranges.size(); ++read_idx) {
666 auto& previous = ranges[write_idx];
667 const auto& current = ranges[read_idx];
668 const size_t previous_end = previous.end;
669 if (current.begin <= previous_end) {
670 previous.end =
std::max(previous_end, current.end);
673 ranges[write_idx] = current;
676 ranges.resize(write_idx + 1);
679 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
681 const size_t effective_round_size)
const
685 if (effective_round_size <= scan_start) {
689 if constexpr (HAS_STATIC_ROW_SKIP_MANIFEST<ProverPolynomialsOrPartiallyEvaluatedMultivariates>) {
691 if (row_skip_active_prefix_end == 0) {
696 const size_t active_prefix_end =
697 std::min(
round_up_to_even(row_skip_active_prefix_end), effective_round_size);
702 if (effective_round_size >= scan_start + 2) {
721 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
728 if constexpr (HAS_STATIC_ROW_SKIP_MANIFEST<ProverPolynomialsOrPartiallyEvaluatedMultivariates>) {
732 }
else if constexpr (CAN_SKIP_ROWS<ProverPolynomialsOrPartiallyEvaluatedMultivariates>) {
740 for (
const auto& scan_range : scan_ranges) {
741 const size_t num_edge_pairs = (scan_range.end - scan_range.begin) / 2;
745 auto range = chunk.
range(num_edge_pairs);
750 size_t current_block_start = 0;
751 size_t current_block_size = 0;
753 for (
size_t pair_idx : range) {
754 size_t edge_idx = scan_range.begin + pair_idx * 2;
755 if (!Flavor::skip_entire_row(polynomials, edge_idx)) {
756 if (current_block_size == 0) {
757 current_block_start = edge_idx;
759 current_block_size += 2;
761 if (current_block_size > 0) {
762 thread_ranges.push_back(
764 .end = current_block_start + current_block_size });
765 current_block_size = 0;
769 if (current_block_size > 0) {
771 .end = current_block_start + current_block_size });
774 ranges.insert(ranges.end(), thread_ranges.begin(), thread_ranges.end());
779 for (
const auto& thread_ranges : all_thread_ranges) {
780 result.insert(
result.end(), thread_ranges.begin(), thread_ranges.end());
810 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
812 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
823 load_edge(extended_edges, polynomials, edge_idx);
825 univariate_accumulator, extended_edges, relation_parameters, gate_separators[edge_idx]);
828 return batch_over_relations<SumcheckRoundUnivariate>(
829 univariate_accumulator, alphas, gate_separators, &row_disabling_polynomial);
835 template <
typename ProverPolynomialsOrPartiallyEvaluatedMultivariates>
837 ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials,
846 "compute_virtual_contribution must only run in virtual rounds (after all regular rounds)");
855 const size_t virtual_contribution_edge_idx = 0;
859 load_edge(extended_edges, polynomials, virtual_contribution_edge_idx);
862 const FF gate_separator_tail{ 1 };
864 univariate_accumulator, extended_edges, relation_parameters, gate_separator_tail);
866 return batch_over_relations<SumcheckRoundUnivariate>(
867 univariate_accumulator, alphas, gate_separator, row_disabling_polynomial);
886 template <
typename ExtendedUnivariate,
typename ContainerOverSubrelations>
894 auto result = ExtendedUnivariate(0);
895 extend_and_batch_univariates<ExtendedUnivariate>(
923 template <
typename ExtendedUnivariate,
typename TupleOfTuplesOfUnivariates>
925 ExtendedUnivariate&
result,
931 ExtendedUnivariate extended_random_polynomial =
932 random_polynomial.template extend_to<ExtendedUnivariate::LENGTH>();
941 if (row_disabling_polynomial !=
nullptr) {
943 {
FF::one() - row_disabling_polynomial->eval_at_0,
FF::one() - row_disabling_polynomial->eval_at_1 });
947 const ExtendedUnivariate main_factor = main_linear.template extend_to<ExtendedUnivariate::LENGTH>();
948 const ExtendedUnivariate offset_factor = offset_linear.template extend_to<ExtendedUnivariate::LENGTH>();
952 auto batch_one_relation = [&]<
size_t relation_idx>() -> ExtendedUnivariate {
956 ExtendedUnivariate per_relation(0);
958 [&]<
size_t subrelation_idx>() {
960 auto extended = element.template extend_to<ExtendedUnivariate::LENGTH>();
962 constexpr bool is_subrelation_linearly_independent =
963 bb::subrelation_is_linearly_independent<Relation, subrelation_idx>();
968 if constexpr (!is_subrelation_linearly_independent) {
969 per_relation += extended;
979 return per_relation * offset_factor;
981 return per_relation * main_factor;
994 constexpr_for<0, num_relations_in_tuple, 1>([&]<
size_t relation_idx>() {
995 if (relation_idx ==
slot) {
996 per_relation_results[relation_idx] = batch_one_relation.template operator()<relation_idx>();
1000 for (
const auto& per_relation : per_relation_results) {
1004 constexpr_for<0, num_relations_in_tuple, 1>(
1005 [&]<
size_t relation_idx>() {
result += batch_one_relation.template operator()<relation_idx>(); });
1024 "compute_libra_univariate: round_idx out of range");
1031 libra_round_univariate.
value_at(idx) =
1035 return libra_round_univariate;
1037 return libra_round_univariate.template extend_to<SumcheckRoundUnivariate::LENGTH>();
1043 const auto& extended_edges,
1045 const FF& scaling_factor)
1078 template <
typename RelationTuple = Relations,
typename Accumulators,
typename Edges,
typename Element>
1080 const Edges& extended_edges,
1082 const Element& scaling_factor)
1087 constexpr_for<0, NUM_RELATIONS, 1>([&]<
size_t relation_idx>() {
1094 relation_parameters,
1098 if (!Relation::skip(extended_edges)) {
1101 relation_parameters,
1168 eval.set_origin_tag(bound_tag);
1173 bool sumcheck_round_failed(
false);
1175 sumcheck_round_failed = (
target_total_sum.get_value() != total_sum.get_value());
1204 Utils::template accumulate_relation_evaluations_without_skipping<>(purported_evaluations,
1206 relation_parameters,
1208 FF main_factor{ 1 };
1209 FF offset_factor{ 0 };
1210 if constexpr (UseRowDisablingPolynomial<Flavor> &&
Flavor::HasZK) {
1212 multivariate_challenge.size());
1213 offset_factor =
FF{ 1 } - main_factor;
1225 std::vector<FF>& multivariate_challenge,
1230 std::string round_univariate_label =
"Sumcheck:univariate_" +
std::to_string(round_idx);
1231 auto round_univariate =
1232 transcript->template receive_from_prover<bb::Univariate<FF, BATCHED_RELATION_PARTIAL_LENGTH>>(
1233 round_univariate_label);
1234 FF round_challenge = transcript->template get_challenge<FF>(
"Sumcheck:u_" +
std::to_string(round_idx));
1235 multivariate_challenge.emplace_back(round_challenge);
1250 bool verified =
false;
1252 verified = (full_honk_purported_value.get_value() ==
target_total_sum.get_value());
1316 Utils::template accumulate_relation_evaluations_without_skipping<>(purported_evaluations,
1318 relation_parameters,
1320 FF main_factor{ 1 };
1321 FF offset_factor{ 0 };
1322 if constexpr (UseRowDisablingPolynomial<Flavor> &&
Flavor::HasZK) {
1324 multivariate_challenge.size());
1325 offset_factor =
FF{ 1 } - main_factor;
1335 std::vector<FF>& multivariate_challenge,
1339 const std::string round_univariate_comm_label =
"Sumcheck:univariate_comm_" +
std::to_string(round_idx);
1340 const std::string univariate_eval_label_0 =
"Sumcheck:univariate_" +
std::to_string(round_idx) +
"_eval_0";
1341 const std::string univariate_eval_label_1 =
"Sumcheck:univariate_" +
std::to_string(round_idx) +
"_eval_1";
1344 round_univariate_commitments.push_back(
1345 transcript->template receive_from_prover<Commitment>(round_univariate_comm_label));
1347 round_univariate_evaluations.push_back(
1348 { transcript->template receive_from_prover<FF>(univariate_eval_label_0),
1349 transcript->template receive_from_prover<FF>(univariate_eval_label_1),
1352 const FF round_challenge = transcript->template get_challenge<FF>(
"Sumcheck:u_" +
std::to_string(round_idx));
1353 multivariate_challenge.emplace_back(round_challenge);
1368 FF first_sumcheck_round_evaluations_sum =
1369 round_univariate_evaluations[0][0] + round_univariate_evaluations[0][1];
1371 bool verified =
false;
1374 first_sumcheck_round_evaluations_sum.self_reduce();
1376 full_honk_purported_value.self_reduce();
1378 verified = (first_sumcheck_round_evaluations_sum.get_value() ==
target_total_sum.get_value());
1386 for (
size_t round_idx = 1; round_idx < round_univariate_evaluations.size(); round_idx++) {
1387 round_univariate_evaluations[round_idx - 1][2] =
1388 round_univariate_evaluations[round_idx][0] + round_univariate_evaluations[round_idx][1];
1392 round_univariate_evaluations[round_univariate_evaluations.size() - 1][2] = full_honk_purported_value;
#define BB_ASSERT(expression,...)
#define BB_BENCH_NAME(name)
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...
static constexpr bool HasZK
typename Curve::ScalarField FF
static constexpr size_t NUM_SUBRELATIONS
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t MAX_PARTIAL_RELATION_LENGTH
typename G1::affine_element Commitment
static size_t row_skip_active_prefix_end(const ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials)
static constexpr bool USE_SHORT_MONOMIALS
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
static constexpr size_t NUM_RELATIONS
BaseTranscript< Codec, HashFunction > Transcript
Relations_< FF > Relations
static constexpr size_t TRACE_OFFSET
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 FF scale_and_batch_elements(auto &tuple, const SubrelationSeparators &subrelation_separators, const FF &main_factor=FF{ 1 }, const FF &offset_factor=FF{ 0 })
Scale per-subrelation evaluations by α powers and row-disabling factors, then sum.
Lazy edge container for USE_SHORT_MONOMIALS flavors, generic over the lane element type.
void set_current_edge(const size_t edge_idx)
std::conditional_t< cache_on_heap, std::vector< bb::Univariate< Element, 2 > >, std::array< bb::Univariate< Element, 2 >, Flavor::NUM_ALL_ENTITIES > > Cache
std::bitset< Flavor::NUM_ALL_ENTITIES > materialized
static constexpr bool cache_on_heap
LazyExtendedEdges(const Multivariates &multivariates)
const Multivariates & multivariates
typename Flavor::template ProverUnivariates< 2 >::EntityId EntityId
const bb::Univariate< Element, 2 > & operator[](const EntityId id) const
Imlementation of the Sumcheck prover round.
static size_t chunk_count(const size_t span, const size_t rows_per_chunk)
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 ROWS_PER_CHUNK
static constexpr size_t MAX_PARTIAL_RELATION_LENGTH
The total algebraic degree of the Sumcheck relation as a polynomial in Prover Polynomials .
static constexpr bool USES_ROW_MANIFEST
decltype(create_sumcheck_tuple_of_tuples_of_univariates< RelationTupleFor< Element > >()) AccumulatorsFor
static constexpr bool HAS_STATIC_ROW_SKIP_MANIFEST
std::vector< EdgeRange > compute_edge_ranges(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials)
Compute the edge ranges the main sumcheck loop must visit.
std::vector< EdgeRange > compute_row_skip_edge_ranges(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const size_t effective_round_size) const
static void merge_edge_ranges(std::vector< EdgeRange > &ranges)
static Element element_scaling(const bb::GateSeparatorPolynomial< FF > &gate_separators, const size_t edge_idx)
static constexpr bool CAN_SKIP_ROWS
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 round univariate at .
size_t compute_effective_round_size(const ProverPolynomialsOrPartiallyEvaluatedMultivariates &multivariates) const
Compute the effective round size by finding the maximum end_index() across witness polynomials.
void accumulate_relation_univariates(Accumulators &univariate_accumulators, const Edges &extended_edges, const bb::RelationParameters< Element > &relation_parameters, const Element &scaling_factor)
In Round , for a given point , calculate the contribution of each sub-relation to .
SumcheckRoundUnivariate compute_virtual_contribution(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const GateSeparatorPolynomial< FF > &gate_separator, const SubrelationSeparators &alphas, const RowDisablingPolynomial< FF > *row_disabling_polynomial=nullptr)
Virtual (zero-extension) round univariate contribution.
static auto make_extended_edges(const Multivariates &multivariates)
void advance_round()
Advance to the next regular sumcheck round: halve the active hypercube size and increment the round i...
SumcheckProverRound(size_t initial_round_size)
static 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 ...
static void reduce_accumulator(SumcheckTupleOfTuplesOfUnivariates &destination, const AccumulatorsFor< Element > &source)
auto make_edge_chunks(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials)
static void for_each_edge_group(const size_t begin, const size_t end, const size_t group_stride, GroupFn on_full_group, PairFn on_leftover_pair)
SumcheckTupleOfTuplesOfUnivariates univariate_accumulators
static void load_edge(Edges &edges, const Multivariates &multivariates, const size_t edge_idx)
typename Flavor::template Relations_< Element > RelationTupleFor
std::array< FF, Flavor::NUM_SUBRELATIONS - 1 > SubrelationSeparators
void accumulate_edge(Accumulators &accumulator, Edges &edge_container, const Multivariates &polynomials, const bb::RelationParameters< Element > ¶ms, const bb::GateSeparatorPolynomial< FF > &gate_separators, const size_t edge_idx)
static SumcheckRoundUnivariate compute_libra_univariate(const ZKData &zk_sumcheck_data, size_t round_idx)
Compute Libra round univariate expressed given by the formula.
bool is_virtual_round() const
A virtual (zero-extension) round is any round at or beyond the multivariate_d regular rounds....
size_t excluded_head_size
static constexpr size_t NUM_RELATIONS
Number of batched sub-relations in specified by Flavor.
static size_t round_up_to_even(const size_t value)
static constexpr bool USE_LAZY_EDGES
typename Flavor::Relations Relations
size_t round_size
In regular round i = 0,...,multivariate_d-1, equals 2^{multivariate_d - i}; halved once per regular r...
void accumulate_relation_univariates_public(SumcheckTupleOfTuplesOfUnivariates &univariate_accumulators, const auto &extended_edges, const bb::RelationParameters< FF > &relation_parameters, const FF &scaling_factor)
void accumulate_edge_chunks(EdgeChunks &chunks, ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators)
static void extend_and_batch_univariates(const TupleOfTuplesOfUnivariates &tuple, ExtendedUnivariate &result, const bb::GateSeparatorPolynomial< FF > &gate_separators, const RowDisablingPolynomial< FF > *row_disabling_polynomial=nullptr)
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, const RowDisablingPolynomial< FF > *row_disabling_polynomial=nullptr)
Given a tuple of tuples of extended per-relation contributions, and a challenge ,...
static constexpr bool USE_LAZY_SHORT_EDGES
SumcheckRoundUnivariate compute_offset_area_contribution(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas, const RowDisablingPolynomial< FF > row_disabling_polynomial)
Contribution to the round univariate from the offset-area head rows (rows 0 .. TRACE_OFFSET - 1),...
static void append_edge_range(std::vector< EdgeRange > &ranges, const size_t start, const size_t end)
TupleOfArraysOfValues relation_evaluations
std::vector< std::array< FF, 3 > > round_univariate_evaluations
typename Flavor::Commitment Commitment
typename std::vector< FF > ClaimedLibraEvaluations
std::vector< Commitment > round_univariate_commitments
void process_round(const std::shared_ptr< Transcript > &transcript, std::vector< FF > &multivariate_challenge, bb::GateSeparatorPolynomial< FF > &gate_separators, size_t round_idx)
Process a single sumcheck round for Grumpkin: receive commitment and evaluations, defer per-round ver...
typename Flavor::Relations Relations
decltype(create_tuple_of_arrays_of_values< typename Flavor::Relations >()) TupleOfArraysOfValues
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, std::span< const FF > multivariate_challenge={})
Evaluate the full Honk relation at the sumcheck challenge u (Grumpkin variant).
bool perform_final_verification(const FF &full_honk_purported_value)
Perform final verification for Grumpkin: check first round sum, populate Shplemini data,...
std::array< FF, Flavor::NUM_SUBRELATIONS - 1 > SubrelationSeparators
std::vector< std::array< FF, 3 > > get_round_univariate_evaluations()
Get round univariate evaluations for Shplemini.
std::vector< Commitment > get_round_univariate_commitments()
Get round univariate commitments for Shplemini.
typename Flavor::Transcript Transcript
SumcheckVerifierRound(FF target_total_sum=0)
typename Flavor::AllValues ClaimedEvaluations
Implementation of the Sumcheck Verifier Round.
typename Flavor::Commitment Commitment
typename Flavor::Relations Relations
typename std::vector< FF > ClaimedLibraEvaluations
std::vector< std::array< FF, 3 > > get_round_univariate_evaluations()
Get round univariate evaluations (only used for Grumpkin flavors).
void check_sum(bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &univariate)
Check that the round target sum is correct.
static constexpr size_t NUM_RELATIONS
void process_round(const std::shared_ptr< Transcript > &transcript, std::vector< FF > &multivariate_challenge, bb::GateSeparatorPolynomial< FF > &gate_separators, size_t round_idx)
Process a single sumcheck round: receive univariate from transcript, verify sum, generate challenge.
decltype(create_tuple_of_arrays_of_values< typename Flavor::Relations >()) TupleOfArraysOfValues
std::array< FF, Flavor::NUM_SUBRELATIONS - 1 > SubrelationSeparators
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, std::span< const FF > multivariate_challenge={})
Evaluate the full Honk relation at the sumcheck challenge u.
typename Flavor::AllValues ClaimedEvaluations
TupleOfArraysOfValues relation_evaluations
std::vector< Commitment > get_round_univariate_commitments()
Get round univariate commitments (only used for Grumpkin flavors).
bool perform_final_verification(const FF &full_honk_purported_value)
Perform final verification: check that the computed target sum matches the full relation evaluation....
typename Flavor::Transcript Transcript
void compute_next_target_sum(bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &univariate, FF &round_challenge)
Compute the next target sum.
SumcheckVerifierRound(FF target_total_sum=0)
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
std::array< Fr, LENGTH > evaluations
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...
A relation is "offset-only" if its contribution enters the round univariate scaled by L(x) = L_0 + L_...
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 shared across Honk flavors.
constexpr T get_msb(const T in)
constexpr size_t FF_COPY_COST
Entry point for Barretenberg command-line interface.
constexpr size_t lane_count< T >
constexpr void constexpr_for(F &&f)
Implements a loop using a compile-time iterator. Requires c++20. Implementation (and description) fro...
void parallel_for_heuristic(size_t num_points, const std::function< void(size_t, size_t, size_t)> &func, size_t heuristic_cost)
Split a loop into several loops running in parallel based on operations in 1 iteration.
constexpr size_t lane_count
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
bb::VectorAffineElementPushSpan< BaseParams > lhs
bb::VectorAffineElementPushSpan< BaseParams > rhs
FF current_element() const
Computes the component at index current_element_idx in betas.
void partially_evaluate(FF challenge)
Partially evaluate the -polynomial at the new challenge and update .
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.
static FF evaluate_at_challenge(std::span< const FF > multivariate_challenge, const size_t log_circuit_size)
Compute the evaluation of at the sumcheck challenge.
const size_t rows_per_chunk
const size_t total_chunks
std::atomic< size_t > next_chunk
ContiguousEdgeChunks(const size_t begin, const size_t end, const size_t rows_per_chunk)
std::optional< EdgeRange > pop()
std::optional< EdgeRange > pop()
std::vector< EdgeRange > chunks
std::atomic< size_t > next_chunk
ListedEdgeChunks(const std::vector< EdgeRange > &ranges, const size_t rows_per_chunk)
auto range(size_t size, size_t offset=0) const
This structure is created to contain various polynomials and constants required by ZK Sumcheck.
std::vector< Polynomial< FF > > libra_univariates
static constexpr field one()
static constexpr field zero()