4namespace proof_system::honk::logderivative_library {
25template <
typename Flavor,
typename Relation,
typename Polynomials>
26void compute_logderivative_inverse(Polynomials& polynomials,
auto& relation_parameters,
const size_t circuit_size)
28 using FF =
typename Flavor::FF;
29 using Accumulator =
typename Relation::ValueAccumulator0;
30 constexpr size_t READ_TERMS = Relation::READ_TERMS;
31 constexpr size_t WRITE_TERMS = Relation::WRITE_TERMS;
33 auto lookup_relation = Relation();
34 auto& inverse_polynomial = lookup_relation.template get_inverse_polynomial(polynomials);
35 for (
size_t i = 0; i < circuit_size; ++i) {
36 auto row = polynomials.get_row(i);
37 bool has_inverse = lookup_relation.operation_exists_at_row(row);
42 barretenberg::constexpr_for<0, READ_TERMS, 1>([&]<
size_t read_index> {
43 auto denominator_term =
44 lookup_relation.template compute_read_term<Accumulator, read_index>(row, relation_parameters);
45 denominator *= denominator_term;
47 barretenberg::constexpr_for<0, WRITE_TERMS, 1>([&]<
size_t write_index> {
48 auto denominator_term =
49 lookup_relation.template compute_write_term<Accumulator, write_index>(row, relation_parameters);
50 denominator *= denominator_term;
52 inverse_polynomial[i] = denominator;
56 FF::batch_invert(inverse_polynomial);
86template <
typename FF,
typename Relation,
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
87void accumulate_logderivative_lookup_subrelation_contributions(ContainerOverSubrelations& accumulator,
88 const AllEntities& in,
89 const Parameters& params,
90 const FF& scaling_factor)
92 constexpr size_t READ_TERMS = Relation::READ_TERMS;
93 constexpr size_t WRITE_TERMS = Relation::WRITE_TERMS;
95 auto lookup_relation = Relation();
97 using Accumulator =
typename std::tuple_element_t<0, ContainerOverSubrelations>;
98 using View =
typename Accumulator::View;
100 auto lookup_inverses = View(lookup_relation.template get_inverse_polynomial(in));
102 constexpr size_t NUM_TOTAL_TERMS = READ_TERMS + WRITE_TERMS;
103 std::array<Accumulator, NUM_TOTAL_TERMS> lookup_terms;
104 std::array<Accumulator, NUM_TOTAL_TERMS> denominator_accumulator;
112 barretenberg::constexpr_for<0, READ_TERMS, 1>(
113 [&]<
size_t i>() { lookup_terms[i] = lookup_relation.template compute_read_term<Accumulator, i>(in, params); });
114 barretenberg::constexpr_for<0, WRITE_TERMS, 1>([&]<
size_t i>() {
115 lookup_terms[i + READ_TERMS] = lookup_relation.template compute_write_term<Accumulator, i>(in, params);
118 barretenberg::constexpr_for<0, NUM_TOTAL_TERMS, 1>(
119 [&]<
size_t i>() { denominator_accumulator[i] = lookup_terms[i]; });
122 [&]<
size_t i>() { denominator_accumulator[i + 1] *= denominator_accumulator[i]; });
124 auto inverse_accumulator = Accumulator(lookup_inverses);
126 const auto inverse_exists = lookup_relation.template compute_inverse_exists<Accumulator>(in);
129 std::get<0>(accumulator) +=
130 (denominator_accumulator[NUM_TOTAL_TERMS - 1] * lookup_inverses - inverse_exists) * scaling_factor;
133 for (
size_t i = 0; i < NUM_TOTAL_TERMS - 1; ++i) {
134 denominator_accumulator[NUM_TOTAL_TERMS - 1 - i] =
135 denominator_accumulator[NUM_TOTAL_TERMS - 2 - i] * inverse_accumulator;
136 inverse_accumulator = inverse_accumulator * lookup_terms[NUM_TOTAL_TERMS - 1 - i];
138 denominator_accumulator[0] = inverse_accumulator;
142 barretenberg::constexpr_for<0, READ_TERMS, 1>([&]<
size_t i>() {
143 std::get<1>(accumulator) +=
144 lookup_relation.template compute_read_term_predicate<Accumulator, i>(in) * denominator_accumulator[i];
149 barretenberg::constexpr_for<0, WRITE_TERMS, 1>([&]<
size_t i>() {
150 const auto p = lookup_relation.template compute_write_term_predicate<Accumulator, i>(in);
151 const auto lookup_read_count = lookup_relation.template lookup_read_counts<Accumulator, i>(in);
152 std::get<1>(accumulator) -= p * (denominator_accumulator[i + READ_TERMS] * lookup_read_count);
185template <
typename FF,
typename Relation,
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
186void accumulate_logderivative_permutation_subrelation_contributions(ContainerOverSubrelations& accumulator,
187 const AllEntities& in,
188 const Parameters& params,
189 const FF& scaling_factor)
191 constexpr size_t READ_TERMS = Relation::READ_TERMS;
192 constexpr size_t WRITE_TERMS = Relation::WRITE_TERMS;
195 static_assert(READ_TERMS == 1);
196 static_assert(WRITE_TERMS == 1);
198 auto permutation_relation = Relation();
200 using Accumulator =
typename std::tuple_element_t<0, ContainerOverSubrelations>;
201 using View =
typename Accumulator::View;
203 auto permutation_inverses = View(permutation_relation.template get_inverse_polynomial(in));
205 constexpr size_t NUM_TOTAL_TERMS = 2;
206 std::array<Accumulator, NUM_TOTAL_TERMS> permutation_terms;
207 std::array<Accumulator, NUM_TOTAL_TERMS> denominator_accumulator;
215 permutation_terms[0] = permutation_relation.template compute_read_term<Accumulator, 0>(in, params);
216 permutation_terms[1] = permutation_relation.template compute_write_term<Accumulator, 0>(in, params);
218 barretenberg::constexpr_for<0, NUM_TOTAL_TERMS, 1>(
219 [&]<
size_t i>() { denominator_accumulator[i] = permutation_terms[i]; });
222 [&]<
size_t i>() { denominator_accumulator[i + 1] *= denominator_accumulator[i]; });
224 auto inverse_accumulator = Accumulator(permutation_inverses);
226 const auto inverse_exists = permutation_relation.template compute_inverse_exists<Accumulator>(in);
229 std::get<0>(accumulator) +=
230 (denominator_accumulator[NUM_TOTAL_TERMS - 1] * permutation_inverses - inverse_exists) * scaling_factor;
233 for (
size_t i = 0; i < NUM_TOTAL_TERMS - 1; ++i) {
234 denominator_accumulator[NUM_TOTAL_TERMS - 1 - i] =
235 denominator_accumulator[NUM_TOTAL_TERMS - 2 - i] * inverse_accumulator;
236 inverse_accumulator = inverse_accumulator * permutation_terms[NUM_TOTAL_TERMS - 1 - i];
238 denominator_accumulator[0] = inverse_accumulator;
242 std::get<1>(accumulator) +=
243 permutation_relation.template compute_read_term_predicate<Accumulator, 0>(in) * denominator_accumulator[0];
247 std::get<1>(accumulator) -=
248 permutation_relation.template compute_write_term_predicate<Accumulator, 0>(in) * denominator_accumulator[1];
constexpr void constexpr_for(F &&f)
Implements a loop using a compile-time iterator. Requires c++20. Implementation (and description) fro...
Definition: constexpr_utils.hpp:65