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.calldata; }
118 static auto&
selector(
const AllEntities& in) {
return in.q_l; }
119 static auto&
inverses(AllEntities& in) {
return in.calldata_inverses; }
120 static auto&
inverses(
const AllEntities& in) {
return in.calldata_inverses; }
121 static auto&
read_counts(
const AllEntities& in) {
return in.calldata_read_counts; }
125 template <
typename AllEntities>
struct BusData<1, AllEntities> {
126 static auto&
values(
const AllEntities& in) {
return in.secondary_calldata; }
127 static auto&
selector(
const AllEntities& in) {
return in.q_r; }
128 static auto&
inverses(AllEntities& in) {
return in.secondary_calldata_inverses; }
129 static auto&
inverses(
const AllEntities& in) {
return in.secondary_calldata_inverses; }
130 static auto&
read_counts(
const AllEntities& in) {
return in.secondary_calldata_read_counts; }
134 template <
typename AllEntities>
struct BusData<2, AllEntities> {
135 static auto&
values(
const AllEntities& in) {
return in.return_data; }
136 static auto&
selector(
const AllEntities& in) {
return in.q_o; }
137 static auto&
inverses(AllEntities& in) {
return in.return_data_inverses; }
138 static auto&
inverses(
const AllEntities& in) {
return in.return_data_inverses; }
139 static auto&
read_counts(
const AllEntities& in) {
return in.return_data_read_counts; }
149 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities>
152 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
154 auto q_busread = CoefficientAccumulator(in.q_busread);
158 return Accumulator(q_busread * column_selector);
165 template <
typename Accumulator,
size_t bus_
idx,
typename AllEntities,
typename Parameters>
168 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
169 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
171 const auto&
id = CoefficientAccumulator(in.databus_id);
173 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
174 const auto& beta = ParameterCoefficientAccumulator(params.beta);
178 return Accumulator(
id * beta +
value + gamma);
186 template <
typename Accumulator,
typename AllEntities,
typename Parameters>
189 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
190 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
193 const auto& w_1 = CoefficientAccumulator(in.w_l);
194 const auto& w_2 = CoefficientAccumulator(in.w_r);
195 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
196 const auto& beta = ParameterCoefficientAccumulator(params.beta);
199 return Accumulator((w_2 * beta) + w_1 + gamma);
213 template <
size_t bus_
idx,
typename Polynomials>
215 auto& relation_parameters,
216 const size_t circuit_size,
217 const size_t start_index = 0)
224 const size_t num_rows = circuit_size - start_index;
225 size_t min_iterations_per_thread = 1 << 6;
230 for (
size_t j : chunk.
range(num_rows)) {
231 size_t i = j + start_index;
233 const bool is_read = polynomials.q_busread[i] == 1 && column_selector[i] == 1;
234 const bool nonzero_read_count = read_counts[i] > 0;
236 if (is_read || nonzero_read_count) {
238 auto row = polynomials.get_row(i);
239 auto value = compute_lookup_term<FF>(row, relation_parameters) *
240 compute_table_term<FF, bus_idx>(row, relation_parameters);
241 inverse_polynomial.at(i) =
value;
258 template <
typename FF,
260 typename ContainerOverSubrelations,
261 typename AllEntities,
264 const AllEntities& in,
265 const Parameters& params,
266 const FF& scaling_factor)
274 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
279 const Accumulator inverses(inverses_m);
280 const Accumulator read_counts(read_counts_m);
281 const auto lookup_term = compute_lookup_term<Accumulator>(in, params);
282 const auto table_term = compute_table_term<Accumulator, bus_idx>(in, params);
283 const auto read_selector = get_read_selector<Accumulator, bus_idx>(in);
286 const auto common = lookup_term * table_term * inverses -
FF(1);
296 Accumulator tmp = read_selector * table_term;
297 tmp -= read_counts * lookup_term;
309 template <
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
310 static void accumulate(ContainerOverSubrelations& accumulator,
311 const AllEntities& in,
312 const Parameters& params,
313 const FF& scaling_factor)
316 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
317 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)
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.