39template <
typename FF_, auto ValueId, auto ReadCountsId, auto InversesId, auto IndicatorId, auto SelectorId>
75 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
77 auto column_selector = CoefficientAccumulator(in[SelectorId]);
82 template <
typename Accumulator,
typename AllEntities,
typename Parameters>
85 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
86 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
89 const auto&
value = CoefficientAccumulator(in[ValueId]);
90 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
91 const auto& beta = ParameterCoefficientAccumulator(params.beta);
97 template <
typename Accumulator,
typename AllEntities,
typename Parameters>
100 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
101 using ParameterCoefficientAccumulator =
typename Parameters::DataType::CoefficientAccumulator;
105 const auto& gamma = ParameterCoefficientAccumulator(params.gamma);
106 const auto& beta = ParameterCoefficientAccumulator(params.beta);
117 template <
typename Polynomials>
119 auto& relation_parameters,
120 const size_t circuit_size,
121 const size_t start_index = 0)
124 auto& inverse_polynomial = polynomials[InversesId];
125 const auto& column_selector = polynomials[SelectorId];
126 const auto& read_counts = polynomials[ReadCountsId];
128 const size_t num_rows = circuit_size - start_index;
129 size_t min_iterations_per_thread = 1 << 6;
134 for (
size_t j : chunk.
range(num_rows)) {
135 size_t i = j + start_index;
136 const bool is_read = polynomials.q_busread()[i] == 1 && column_selector[i] == 1;
137 const bool nonzero_read_count = read_counts[i] > 0;
138 if (is_read || nonzero_read_count) {
140 auto row = polynomials.get_row(i);
141 auto value = compute_lookup_term<FF>(row, relation_parameters) *
142 compute_table_term<FF>(row, relation_parameters);
143 inverse_polynomial.at(i) =
value;
158 template <
typename ContainerOverSubrelations,
typename AllEntities,
typename Parameters>
159 static void accumulate(ContainerOverSubrelations& accumulator,
161 const Parameters& params,
162 const FF& scaling_factor)
165 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
167 const auto inverses_m = CoefficientAccumulator(in[InversesId]);
168 const auto read_counts_m = CoefficientAccumulator(in[ReadCountsId]);
172 const auto lookup_term = compute_lookup_term<Accumulator>(in, params);
173 const auto table_term = compute_table_term<Accumulator>(in, params);
174 const auto read_selector = get_read_selector<Accumulator>(in);
177 const auto common = lookup_term * table_term * inverses -
FF(1);
180 std::get<0>(accumulator) += (common * read_selector) * scaling_factor;
182 std::get<1>(accumulator) += (common * read_counts) * scaling_factor;
185 tmp -= read_counts * lookup_term;
191 const auto indicator_m = CoefficientAccumulator(in[IndicatorId]);
192 const ShortAccumulator indicator_short(indicator_m);
193 const ShortAccumulator read_counts_short(read_counts_m);
194 std::get<3>(accumulator) += (read_counts_short - indicator_short * read_counts_short) * scaling_factor;
198template <
typename FF, auto V, auto RC, auto IV, auto IND, auto
SEL>
#define BB_BENCH_NAME(name)
#define BB_BENCH_TRACY_NAME(name)
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
Log-derivative lookup argument for a single DataBus column.
static Accumulator compute_table_term(const AllEntities &in, const Parameters ¶ms)
Write term denominator: value + databus_id·β + γ.
static bool skip(const AllEntities &in)
static constexpr size_t INVERSE_READ_SUBREL_LENGTH
static Accumulator get_read_selector(const AllEntities &in)
Compute scalar for read term in log derivative lookup argument.
static constexpr std::array< size_t, 4 > SUBRELATION_PARTIAL_LENGTHS
static constexpr size_t INVERSE_WRITE_SUBREL_LENGTH
static constexpr size_t LOOKUP_SUBREL_LENGTH
static constexpr bool IS_SINGLE_BUS_LOOKUP
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Accumulate this column's four subrelation contributions. (1a) (I*L*T - 1) * is_read = 0 (1b) (I*L*T -...
static Accumulator compute_lookup_term(const AllEntities &in, const Parameters ¶ms)
Read term denominator: w_l + w_r·β + γ. Bus-independent.
static void compute_logderivative_inverse(Polynomials &polynomials, auto &relation_parameters, const size_t circuit_size, const size_t start_index=0)
Compute the column's inverse polynomial at active rows.
static constexpr size_t READ_COUNT_LOCALITY_SUBREL_LENGTH
static constexpr std::array< bool, 4 > SUBRELATION_LINEARLY_INDEPENDENT
static constexpr bool HAS_LOGDERIVATIVE_INVERSE_COMPUTATION
Entry point for Barretenberg command-line interface.
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
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.