106 template <
typename AllEntities>
inline static bool skip([[maybe_unused]]
const AllEntities& in)
109 return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() &&
110 in.secondary_calldata_read_counts.is_zero() && in.return_data_read_counts.is_zero();
114 template <
size_t bus_
idx,
typename AllEntities>
struct BusData;
117 template <
typename AllEntities>
struct BusData<0, AllEntities> {
118 static auto&
values(
const AllEntities& in) {
return in.calldata; }
119 static auto&
selector(
const AllEntities& in) {
return in.q_l; }
120 static auto&
inverses(AllEntities& in) {
return in.calldata_inverses; }
121 static auto&
inverses(
const AllEntities& in) {
return in.calldata_inverses; }
122 static auto&
read_counts(
const AllEntities& in) {
return in.calldata_read_counts; }
123 static auto&
read_tags(
const AllEntities& in) {
return in.calldata_read_tags; }
127 template <
typename AllEntities>
struct BusData<1, AllEntities> {
128 static auto&
values(
const AllEntities& in) {
return in.secondary_calldata; }
129 static auto&
selector(
const AllEntities& in) {
return in.q_r; }
130 static auto&
inverses(AllEntities& in) {
return in.secondary_calldata_inverses; }
131 static auto&
inverses(
const AllEntities& in) {
return in.secondary_calldata_inverses; }
132 static auto&
read_counts(
const AllEntities& in) {
return in.secondary_calldata_read_counts; }
133 static auto&
read_tags(
const AllEntities& in) {
return in.secondary_calldata_read_tags; }
137 template <
typename AllEntities>
struct BusData<2, AllEntities> {
138 static auto&
values(
const AllEntities& in) {
return in.return_data; }
139 static auto&
selector(
const AllEntities& in) {
return in.q_o; }
140 static auto&
inverses(AllEntities& in) {
return in.return_data_inverses; }
141 static auto&
inverses(
const AllEntities& in) {
return in.return_data_inverses; }
142 static auto&
read_counts(
const AllEntities& in) {
return in.return_data_read_counts; }
143 static auto&
read_tags(
const AllEntities& in) {
return in.return_data_read_tags; }
156 auto read_selector = get_read_selector<FF, bus_idx>(row);
158 return (read_selector == 1 || read_tag == 1);
168 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities>
171 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
173 const auto is_read_gate = get_read_selector<Accumulator, bus_idx>(in);
174 const auto read_tag_m =
176 const Accumulator read_tag(read_tag_m);
178 return is_read_gate + read_tag - (is_read_gate * read_tag);
186 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities>
189 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
191 auto q_busread = CoefficientAccumulator(in.q_busread);
195 return Accumulator(q_busread * column_selector);
202 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities,
typename Parameters>
205 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
206 using ParameterCoefficientAccumulator =
209 const auto&
id = CoefficientAccumulator(in.databus_id);
211 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
212 const auto& beta = ParameterCoefficientAccumulator(params.beta);
216 return Accumulator(
id * beta +
value + gamma);
224 template <
typename Accumulator,
typename AllEntities,
typename Parameters>
227 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
228 using View =
typename Accumulator::View;
230 using ParameterCoefficientAccumulator =
typename ParameterView::CoefficientAccumulator;
233 const auto& w_1 = CoefficientAccumulator(in.w_l);
234 const auto& w_2 = CoefficientAccumulator(in.w_r);
235 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
236 const auto& beta = ParameterCoefficientAccumulator(params.beta);
239 return Accumulator((w_2 * beta) + w_1 + gamma);
250 template <
size_t bus_
idx,
typename Polynomials>
252 auto& relation_parameters,
253 const size_t circuit_size)
258 size_t min_iterations_per_thread = 1 << 6;
260 size_t iterations_per_thread = circuit_size / num_threads;
263 size_t start = thread_idx * iterations_per_thread;
264 size_t end = (thread_idx + 1) * iterations_per_thread;
265 bool is_read =
false;
266 bool nonzero_read_count =
false;
267 for (
size_t i = start; i < end; ++i) {
269 auto q_busread = polynomials.q_busread[i];
270 if constexpr (bus_idx == 0) {
271 is_read = q_busread == 1 && polynomials.q_l[i] == 1;
272 nonzero_read_count = polynomials.calldata_read_counts[i] > 0;
274 if constexpr (bus_idx == 1) {
275 is_read = q_busread == 1 && polynomials.q_r[i] == 1;
276 nonzero_read_count = polynomials.secondary_calldata_read_counts[i] > 0;
278 if constexpr (bus_idx == 2) {
279 is_read = q_busread == 1 && polynomials.q_o[i] == 1;
280 nonzero_read_count = polynomials.return_data_read_counts[i] > 0;
283 if (is_read || nonzero_read_count) {
285 auto row = polynomials.get_row(i);
286 auto value = compute_read_term<FF>(row, relation_parameters) *
287 compute_write_term<FF, bus_idx>(row, relation_parameters);
288 inverse_polynomial.at(i) =
value;
308 template <
typename FF,
310 typename ContainerOverSubrelations,
311 typename AllEntities,
314 const AllEntities& in,
315 const Parameters& params,
316 const FF& scaling_factor)
319 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
322 Accumulator inverses(inverses_m);
324 const auto read_term = compute_read_term<Accumulator>(in, params);
325 const auto write_term = compute_write_term<Accumulator, bus_idx>(in, params);
326 const auto inverse_exists = compute_inverse_exists<Accumulator, bus_idx>(in);
327 const auto read_selector = get_read_selector<Accumulator, bus_idx>(in);
338 std::get<subrel_idx_1>(accumulator) += (read_term * write_term * inverses - inverse_exists) * scaling_factor;
344 Accumulator tmp = read_selector * write_term;
346 tmp -= Accumulator(read_counts_m) * read_term;
352 const auto read_tag = ShortAccumulator(read_tag_m);
367 template <
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
368 static void accumulate(ContainerOverSubrelations& accumulator,
369 const AllEntities& in,
370 const Parameters& params,
371 const FF& scaling_factor)
374 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
375 accumulate_subrelation_contributions<FF, bus_idx>(accumulator, in, params, scaling_factor);
Log-derivative lookup argument relation for establishing DataBus reads.
static constexpr bool READ_TAG_BOOLEAN_CHECK_LIN_INDEPENDENT
static bool operation_exists_at_row(const AllValues &row)
Determine whether the inverse I needs to be computed at a given row for a given bus column.
static Accumulator compute_read_term(const AllEntities &in, const Parameters ¶ms)
Compute read term denominator in log derivative lookup argument.
static constexpr size_t NUM_SUB_RELATION_PER_IDX
static bool skip(const AllEntities &in)
static constexpr std::array< size_t, NUM_SUB_RELATION_PER_IDX *NUM_BUS_COLUMNS > TOTAL_LENGTH_ADJUSTMENTS
static constexpr bool LOOKUP_SUBREL_LIN_INDEPENDENT
static constexpr size_t LOOKUP_SUBREL_LENGTH_ADJUSTMENT
static void accumulate_subrelation_contributions(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Accumulate the subrelation contributions for reads from a single databus column.
static constexpr std::array< size_t, NUM_SUB_RELATION_PER_IDX *NUM_BUS_COLUMNS > SUBRELATION_PARTIAL_LENGTHS
static void compute_logderivative_inverse(Polynomials &polynomials, auto &relation_parameters, const size_t circuit_size)
Construct the polynomial I whose components are the inverse of the product of the read and write term...
static constexpr size_t NUM_BUS_COLUMNS
static constexpr size_t LOOKUP_SUBREL_LENGTH
static Accumulator compute_write_term(const AllEntities &in, const Parameters ¶ms)
Compute write term denominator in log derivative lookup argument.
static Accumulator compute_inverse_exists(const AllEntities &in)
Compute the Accumulator whose values indicate whether the inverse is computed or not.
static constexpr std::array< bool, NUM_SUB_RELATION_PER_IDX *NUM_BUS_COLUMNS > SUBRELATION_LINEARLY_INDEPENDENT
static constexpr bool INVERSE_SUBREL_LIN_INDEPENDENT
static constexpr size_t READ_TAG_BOOLEAN_CHECK_SUBREL_LENGTH
static constexpr size_t INVERSE_SUBREL_LENGTH
static constexpr size_t READ_TAG_BOOLEAN_CHECK_SUBREL_LENGTH_ADJUSTMENT
static constexpr size_t INVERSE_SUBREL_LENGTH_ADJUSTMENT
static Accumulator get_read_selector(const AllEntities &in)
Compute scalar for read term in log derivative lookup argument.
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Accumulate the log derivative databus lookup argument subrelation contributions for each databus colu...
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
Entry point for Barretenberg command-line interface.
std::conditional_t< IsField< typename Params::DataType >, typename Params::DataType, View > GetParameterView
A type to optionally extract a view of a relation parameter in a relation.
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)
static auto & read_tags(const AllEntities &in)
static auto & inverses(const AllEntities &in)
static auto & read_counts(const AllEntities &in)
static auto & values(const AllEntities &in)
static auto & inverses(AllEntities &in)
static auto & selector(const AllEntities &in)
static auto & inverses(const AllEntities &in)
static auto & inverses(AllEntities &in)
static auto & values(const AllEntities &in)
static auto & read_counts(const AllEntities &in)
static auto & selector(const AllEntities &in)
static auto & read_tags(const AllEntities &in)
static auto & read_counts(const AllEntities &in)
static auto & read_tags(const AllEntities &in)
static auto & inverses(AllEntities &in)
static auto & inverses(const AllEntities &in)
static auto & values(const AllEntities &in)
static auto & selector(const AllEntities &in)
static void batch_invert(std::span< field > coeffs) noexcept