83 template <
typename T,
size_t N>
88 for (
size_t i = 0; i < N; ++i) {
89 out[(bus * N) + i] = pattern[i];
100 template <
typename AllEntities>
inline static bool skip([[maybe_unused]]
const AllEntities& in)
103 if (!in.q_busread.is_zero()) {
106 bool all_counts_zero =
true;
107 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>(
109 return all_counts_zero;
113 template <
size_t bus_
idx,
typename AllEntities>
struct BusData;
116 template <
typename AllEntities>
struct BusData<0, AllEntities> {
117 static auto&
values(
const AllEntities& in) {
return in.kernel_calldata; }
118 static auto&
selector(
const AllEntities& in) {
return in.q_l; }
119 static auto&
inverses(AllEntities& in) {
return in.kernel_calldata_inverses; }
120 static auto&
inverses(
const AllEntities& in) {
return in.kernel_calldata_inverses; }
121 static auto&
read_counts(
const AllEntities& in) {
return in.kernel_calldata_read_counts; }
125 template <
typename AllEntities>
struct BusData<1, AllEntities> {
126 static auto&
values(
const AllEntities& in) {
return in.first_app_calldata; }
127 static auto&
selector(
const AllEntities& in) {
return in.q_r; }
128 static auto&
inverses(AllEntities& in) {
return in.first_app_calldata_inverses; }
129 static auto&
inverses(
const AllEntities& in) {
return in.first_app_calldata_inverses; }
130 static auto&
read_counts(
const AllEntities& in) {
return in.first_app_calldata_read_counts; }
134 template <
typename AllEntities>
struct BusData<2, AllEntities> {
135 static auto&
values(
const AllEntities& in) {
return in.second_app_calldata; }
136 static auto&
selector(
const AllEntities& in) {
return in.q_o; }
137 static auto&
inverses(AllEntities& in) {
return in.second_app_calldata_inverses; }
138 static auto&
inverses(
const AllEntities& in) {
return in.second_app_calldata_inverses; }
139 static auto&
read_counts(
const AllEntities& in) {
return in.second_app_calldata_read_counts; }
143 template <
typename AllEntities>
struct BusData<3, AllEntities> {
144 static auto&
values(
const AllEntities& in) {
return in.third_app_calldata; }
145 static auto&
selector(
const AllEntities& in) {
return in.q_4; }
146 static auto&
inverses(AllEntities& in) {
return in.third_app_calldata_inverses; }
147 static auto&
inverses(
const AllEntities& in) {
return in.third_app_calldata_inverses; }
148 static auto&
read_counts(
const AllEntities& in) {
return in.third_app_calldata_read_counts; }
152 template <
typename AllEntities>
struct BusData<4, AllEntities> {
153 static auto&
values(
const AllEntities& in) {
return in.return_data; }
154 static auto&
selector(
const AllEntities& in) {
return in.q_m; }
155 static auto&
inverses(AllEntities& in) {
return in.return_data_inverses; }
156 static auto&
inverses(
const AllEntities& in) {
return in.return_data_inverses; }
157 static auto&
read_counts(
const AllEntities& in) {
return in.return_data_read_counts; }
167 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities>
170 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
172 auto q_busread = CoefficientAccumulator(in.q_busread);
176 return Accumulator(q_busread * column_selector);
183 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities,
typename Parameters>
186 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
187 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
189 const auto&
id = CoefficientAccumulator(in.databus_id);
191 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
192 const auto& beta = ParameterCoefficientAccumulator(params.beta);
196 return Accumulator(
id * beta +
value + gamma);
204 template <
typename Accumulator,
typename AllEntities,
typename Parameters>
207 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
208 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
211 const auto& w_1 = CoefficientAccumulator(in.w_l);
212 const auto& w_2 = CoefficientAccumulator(in.w_r);
213 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
214 const auto& beta = ParameterCoefficientAccumulator(params.beta);
217 return Accumulator((w_2 * beta) + w_1 + gamma);
231 template <
size_t bus_
idx,
typename Polynomials>
233 auto& relation_parameters,
234 const size_t circuit_size,
235 const size_t start_index = 0)
242 const size_t num_rows = circuit_size - start_index;
243 size_t min_iterations_per_thread = 1 << 6;
248 for (
size_t j : chunk.
range(num_rows)) {
249 size_t i = j + start_index;
251 const bool is_read = polynomials.q_busread[i] == 1 && column_selector[i] == 1;
252 const bool nonzero_read_count = read_counts[i] > 0;
254 if (is_read || nonzero_read_count) {
256 auto row = polynomials.get_row(i);
257 auto value = compute_lookup_term<FF>(row, relation_parameters) *
258 compute_table_term<FF, bus_idx>(row, relation_parameters);
259 inverse_polynomial.at(i) =
value;
276 template <
typename FF,
278 typename ContainerOverSubrelations,
279 typename AllEntities,
282 const AllEntities& in,
283 const Parameters& params,
284 const FF& scaling_factor)
292 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
297 const Accumulator inverses(inverses_m);
298 const Accumulator read_counts(read_counts_m);
299 const auto lookup_term = compute_lookup_term<Accumulator>(in, params);
300 const auto table_term = compute_table_term<Accumulator, bus_idx>(in, params);
301 const auto read_selector = get_read_selector<Accumulator, bus_idx>(in);
304 const auto common = lookup_term * table_term * inverses -
FF(1);
314 Accumulator tmp = read_selector * table_term;
315 tmp -= read_counts * lookup_term;
327 template <
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
328 static void accumulate(ContainerOverSubrelations& accumulator,
329 const AllEntities& in,
330 const Parameters& params,
331 const FF& scaling_factor)
334 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
335 accumulate_subrelation_contributions<FF, bus_idx>(accumulator, in, params, scaling_factor);
#define BB_BENCH_NAME(name)
#define BB_BENCH_TRACY_NAME(name)
Log-derivative lookup argument relation for establishing DataBus reads.
static constexpr size_t INVERSE_WRITE_SUBREL_LENGTH
static constexpr std::array< T, N *NUM_BUS_COLUMNS > repeat_per_bus(const std::array< T, N > &pattern)
static constexpr size_t NUM_SUB_RELATION_PER_IDX
static bool skip(const AllEntities &in)
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, const size_t start_index=0)
Construct the polynomial whose components are the inverse of the product of the read and write terms...
static constexpr size_t INVERSE_READ_SUBREL_LENGTH
static constexpr size_t LOOKUP_SUBREL_LENGTH
static constexpr std::array< bool, NUM_SUB_RELATION_PER_IDX *NUM_BUS_COLUMNS > SUBRELATION_LINEARLY_INDEPENDENT
static constexpr std::array< bool, NUM_SUB_RELATION_PER_IDX > PER_BUS_LIN_INDEPENDENT
static Accumulator compute_lookup_term(const AllEntities &in, const Parameters ¶ms)
Compute read term denominator in log derivative lookup argument.
static Accumulator get_read_selector(const AllEntities &in)
Compute scalar for read term in log derivative lookup argument.
static Accumulator compute_table_term(const AllEntities &in, const Parameters ¶ms)
Compute write term denominator in log derivative lookup argument.
static constexpr std::array< size_t, NUM_SUB_RELATION_PER_IDX > PER_BUS_SUBREL_LENGTHS
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.
constexpr size_t NUM_BUS_COLUMNS
The DataBus; facilitates storage of public circuit input/output.
size_t calculate_num_threads(size_t num_iterations, size_t min_iterations_per_thread)
calculates number of threads to create based on minimum iterations per thread
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
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_counts(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 auto & values(const AllEntities &in)
static auto & selector(const AllEntities &in)
static auto & inverses(const AllEntities &in)
static auto & read_counts(const AllEntities &in)
static auto & inverses(AllEntities &in)
static auto & read_counts(const AllEntities &in)
static auto & inverses(AllEntities &in)
static auto & selector(const AllEntities &in)
static auto & inverses(const AllEntities &in)
static auto & values(const AllEntities &in)
auto range(size_t size, size_t offset=0) const
static void batch_invert(C &coeffs) noexcept
Batch invert a collection of field elements using Montgomery's trick.