5#include "barretenberg/common/constexpr_utils.hpp"
6#include "barretenberg/polynomials/polynomial.hpp"
7#include "barretenberg/polynomials/univariate.hpp"
8#include "barretenberg/relations/relation_types.hpp"
10namespace proof_system::honk::sumcheck {
15 static constexpr size_t READ_TERMS = 4;
16 static constexpr size_t WRITE_TERMS = 2;
18 static constexpr size_t LENGTH = READ_TERMS + WRITE_TERMS + 3;
20 static constexpr std::array<size_t, 2> SUBRELATION_PARTIAL_LENGTHS{
25 static constexpr std::array<bool, 2> SUBRELATION_LINEARLY_INDEPENDENT = {
true,
false };
27 template <
typename AllValues>
static bool operation_exists_at_row(
const AllValues& row)
30 return (row.msm_add == 1) || (row.msm_skew == 1) || (row.precompute_select == 1);
42 template <
typename Accumulator,
typename AllEntities>
43 static Accumulator compute_inverse_exists(
const AllEntities& in)
45 using View =
typename Accumulator::View;
47 const auto row_has_write = View(in.precompute_select);
48 const auto row_has_read = View(in.msm_add) + View(in.msm_skew);
49 return row_has_write + row_has_read - (row_has_write * row_has_read);
52 template <
typename Accumulator,
size_t index,
typename AllEntities>
53 static Accumulator lookup_read_counts(
const AllEntities& in)
55 using View =
typename Accumulator::View;
57 if constexpr (index == 0) {
58 return Accumulator(View(in.lookup_read_counts_0));
60 if constexpr (index == 1) {
61 return Accumulator(View(in.lookup_read_counts_1));
63 return Accumulator(1);
66 template <
typename Accumulator,
size_t read_index,
typename AllEntities>
67 static Accumulator compute_read_term_predicate(
const AllEntities& in)
70 using View =
typename Accumulator::View;
72 if constexpr (read_index == 0) {
73 return Accumulator(View(in.msm_add1));
75 if constexpr (read_index == 1) {
76 return Accumulator(View(in.msm_add2));
78 if constexpr (read_index == 2) {
79 return Accumulator(View(in.msm_add3));
81 if constexpr (read_index == 3) {
82 return Accumulator(View(in.msm_add4));
84 return Accumulator(1);
87 template <
typename Accumulator,
size_t write_index,
typename AllEntities>
88 static Accumulator compute_write_term_predicate(
const AllEntities& in)
90 using View =
typename Accumulator::View;
92 if constexpr (write_index == 0) {
93 return Accumulator(View(in.precompute_select));
95 if constexpr (write_index == 1) {
97 return Accumulator(View(in.precompute_select));
99 return Accumulator(1);
102 template <
typename Accumulator,
size_t write_index,
typename AllEntities,
typename Parameters>
103 static Accumulator compute_write_term(
const AllEntities& in,
const Parameters& params)
105 using View =
typename Accumulator::View;
107 static_assert(write_index < WRITE_TERMS);
126 const auto& precompute_pc = View(in.precompute_pc);
127 const auto& tx = View(in.precompute_tx);
128 const auto& ty = View(in.precompute_ty);
129 const auto& precompute_round = View(in.precompute_round);
130 const auto& gamma = params.gamma;
131 const auto& beta = params.beta;
132 const auto& beta_sqr = params.beta_sqr;
133 const auto& beta_cube = params.beta_cube;
159 const auto negative_term = precompute_pc + gamma + precompute_round * beta + tx * beta_sqr - ty * beta_cube;
160 const auto positive_slice_value = -(precompute_round) + 15;
161 const auto positive_term = precompute_pc + gamma + positive_slice_value * beta + tx * beta_sqr + ty * beta_cube;
164 if constexpr (write_index == 0) {
165 return positive_term;
167 if constexpr (write_index == 1) {
168 return negative_term;
170 return Accumulator(1);
173 template <
typename Accumulator,
size_t read_index,
typename AllEntities,
typename Parameters>
174 static Accumulator compute_read_term(
const AllEntities& in,
const Parameters& params)
176 using View =
typename Accumulator::View;
180 static_assert(read_index < READ_TERMS);
181 const auto& gamma = params.gamma;
182 const auto& beta = params.beta;
183 const auto& beta_sqr = params.beta_sqr;
184 const auto& beta_cube = params.beta_cube;
185 const auto& msm_pc = View(in.msm_pc);
186 const auto& msm_count = View(in.msm_count);
187 const auto& msm_slice1 = View(in.msm_slice1);
188 const auto& msm_slice2 = View(in.msm_slice2);
189 const auto& msm_slice3 = View(in.msm_slice3);
190 const auto& msm_slice4 = View(in.msm_slice4);
191 const auto& msm_x1 = View(in.msm_x1);
192 const auto& msm_x2 = View(in.msm_x2);
193 const auto& msm_x3 = View(in.msm_x3);
194 const auto& msm_x4 = View(in.msm_x4);
195 const auto& msm_y1 = View(in.msm_y1);
196 const auto& msm_y2 = View(in.msm_y2);
197 const auto& msm_y3 = View(in.msm_y3);
198 const auto& msm_y4 = View(in.msm_y4);
206 const auto current_pc = msm_pc - msm_count;
208 const auto read_term1 = (current_pc) + gamma + msm_slice1 * beta + msm_x1 * beta_sqr + msm_y1 * beta_cube;
209 const auto read_term2 = (current_pc - 1) + gamma + msm_slice2 * beta + msm_x2 * beta_sqr + msm_y2 * beta_cube;
210 const auto read_term3 = (current_pc - 2) + gamma + msm_slice3 * beta + msm_x3 * beta_sqr + msm_y3 * beta_cube;
211 const auto read_term4 = (current_pc - 3) + gamma + msm_slice4 * beta + msm_x4 * beta_sqr + msm_y4 * beta_cube;
213 if constexpr (read_index == 0) {
216 if constexpr (read_index == 1) {
219 if constexpr (read_index == 2) {
222 if constexpr (read_index == 3) {
225 return Accumulator(1);
241 template <
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
242 static void accumulate(ContainerOverSubrelations& accumulator,
243 const AllEntities& in,
244 const Parameters& params,
245 const FF& scaling_factor);
248template <
typename FF>
using ECCVMLookupRelation = Relation<ECCVMLookupRelationImpl<FF>>;
Definition: ecc_lookup_relation.hpp:12
static auto & get_inverse_polynomial(AllEntities &in)
Get the inverse lookup polynomial.
Definition: ecc_lookup_relation.hpp:40
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Expression for ECCVM lookup tables.
Definition: ecc_lookup_relation.cpp:23