Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ecc_lookup_short_relation_impl.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
11#include <type_traits>
12
13namespace bb {
14
15// Open-coded logderivative accumulation: the shared helper in logderivative_library.hpp constructs
16// `UnivariateView<FF, RELATION_LENGTH>` directly over `in.lookup_inverses`, which buffer-overreads when entities
17// are length-2 short edges. Inline the logic here so the only direct entity access uses ECCVMShortMonomialView.
18template <typename FF>
19template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
20void ECCVMLookupShortRelationImpl<FF>::accumulate(ContainerOverSubrelations& accumulator,
21 const AllEntities& in,
22 const Parameters& params,
23 const FF& scaling_factor)
24{
25 constexpr size_t NUM_LOOKUP_TERMS = Base::NUM_LOOKUP_TERMS;
26 constexpr size_t NUM_TABLE_TERMS = Base::NUM_TABLE_TERMS;
27 constexpr size_t NUM_TOTAL_TERMS = NUM_LOOKUP_TERMS + NUM_TABLE_TERMS;
28
29 using Accumulator = typename std::tuple_element_t<0, ContainerOverSubrelations>;
31 using ShortTerm = std::
33
34 const auto lookup_inverses_short = ShortView(Base::get_inverse_polynomial(in));
35 const auto lookup_inverses = Accumulator(lookup_inverses_short);
36
39 std::array<Accumulator, NUM_TOTAL_TERMS> denominator_accumulator;
40
41 bb::constexpr_for<0, NUM_LOOKUP_TERMS, 1>([&]<size_t i>() {
42 lookup_terms_short[i] =
43 ECCVMLookupShortRelationImpl<FF>::template compute_lookup_term_short<Accumulator, i>(in, params);
44 lookup_terms[i] = Accumulator(lookup_terms_short[i]);
45 });
46 bb::constexpr_for<0, NUM_TABLE_TERMS, 1>([&]<size_t i>() {
47 lookup_terms_short[i + NUM_LOOKUP_TERMS] =
48 ECCVMLookupShortRelationImpl<FF>::template compute_table_term_short<Accumulator, i>(in, params);
49 lookup_terms[i + NUM_LOOKUP_TERMS] = Accumulator(lookup_terms_short[i + NUM_LOOKUP_TERMS]);
50 });
51
52 static_assert(NUM_TOTAL_TERMS == 6);
53 denominator_accumulator[0] = lookup_terms[0];
54 denominator_accumulator[1] = Accumulator(lookup_terms_short[0] * lookup_terms_short[1]);
55 denominator_accumulator[2] = denominator_accumulator[1] * lookup_terms[2];
56 denominator_accumulator[3] =
57 denominator_accumulator[1] * Accumulator(lookup_terms_short[2] * lookup_terms_short[3]);
58 denominator_accumulator[4] = denominator_accumulator[3] * lookup_terms[4];
59 denominator_accumulator[5] =
60 denominator_accumulator[3] * Accumulator(lookup_terms_short[4] * lookup_terms_short[5]);
61
62 auto inverse_accumulator = lookup_inverses;
63 const auto inverse_exists_short =
64 ECCVMLookupShortRelationImpl<FF>::template compute_inverse_exists_short<Accumulator>(in);
65
66 std::get<0>(accumulator) +=
67 denominator_accumulator[NUM_TOTAL_TERMS - 1] * Accumulator(lookup_inverses_short * scaling_factor) -
68 Accumulator(inverse_exists_short * scaling_factor);
69
70 for (size_t i = NUM_TOTAL_TERMS - 1; i > 0; --i) {
71 denominator_accumulator[i] = denominator_accumulator[i - 1] * inverse_accumulator;
72 inverse_accumulator = inverse_accumulator * lookup_terms[i];
73 }
74 denominator_accumulator[0] = inverse_accumulator;
75
76 bb::constexpr_for<0, NUM_LOOKUP_TERMS, 1>([&]<size_t i>() {
77 const auto lookup_predicate =
78 ECCVMLookupShortRelationImpl<FF>::template get_lookup_term_predicate_short<Accumulator, i>(in);
79 std::get<1>(accumulator) += Accumulator(lookup_predicate) * denominator_accumulator[i];
80 });
81
82 bb::constexpr_for<0, NUM_TABLE_TERMS, 1>([&]<size_t i>() {
83 const auto table_predicate =
84 ECCVMLookupShortRelationImpl<FF>::template get_table_term_predicate_short<Accumulator, i>(in);
85 const auto read_count = ECCVMLookupShortRelationImpl<FF>::template lookup_read_counts_short<Accumulator, i>(in);
86 auto to_subtract = Accumulator(table_predicate * read_count) * denominator_accumulator[i + NUM_LOOKUP_TERMS];
87 std::get<1>(accumulator) -= to_subtract;
88 });
89}
90
91} // namespace bb
Short-monomial variant of ECCVMLookupRelationImpl.
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
A view of a univariate, also used to truncate univariates.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
typename Accumulator::CoefficientAccumulator ECCVMShortMonomialView
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13