48 std::shared_ptr<bool[]>
78 for (
size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) {
86 for (uint8_t col_idx = 0; col_idx < NUM_WIRES; ++col_idx) {
87 for (
size_t i : chunk.
range(circuit_size)) {
88 auto row_idx =
static_cast<uint32_t
>(i);
89 auto idx =
static_cast<ptrdiff_t
>(row_idx);
91 sigmas[col_idx].row_idx[idx] = row_idx;
92 sigmas[col_idx].col_idx[idx] = col_idx;
93 sigmas[col_idx].is_public_input[idx] =
false;
94 sigmas[col_idx].is_tag[idx] =
false;
96 ids[col_idx].row_idx[idx] = row_idx;
97 ids[col_idx].col_idx[idx] = col_idx;
98 ids[col_idx].is_public_input[idx] =
false;
99 ids[col_idx].is_tag[idx] =
false;
123template <
typename Flavor>
126 const size_t dyadic_size,
135 std::span<const uint32_t> real_variable_tags = circuit_constructor.real_variable_tags;
141 wire_copy_cycles.size(),
142 [&](
size_t cycle_idx) {
143 const CyclicPermutation& cycle = wire_copy_cycles[cycle_idx];
144 const auto cycle_size = cycle.size();
145 if (cycle_size == 0) {
150 const cycle_node& last_node = cycle[cycle_size - 1];
152 const auto first_row =
static_cast<ptrdiff_t
>(first_node.gate_idx);
153 const auto first_col = first_node.
wire_idx;
154 const auto last_row =
static_cast<ptrdiff_t
>(last_node.
gate_idx);
155 const auto last_col = last_node.
wire_idx;
158 mapping.
ids[first_col].is_tag[first_row] =
true;
159 mapping.
ids[first_col].row_idx[first_row] = real_variable_tags[cycle_idx];
162 mapping.
sigmas[last_col].is_tag[last_row] =
true;
163 mapping.
sigmas[last_col].row_idx[last_row] = circuit_constructor.tau().at(real_variable_tags[cycle_idx]);
166 for (
size_t node_idx = 0; node_idx + 1 < cycle_size; ++node_idx) {
167 const cycle_node& current_node = cycle[node_idx];
168 const cycle_node& next_node = cycle[node_idx + 1];
170 const auto current_row =
static_cast<ptrdiff_t
>(current_node.
gate_idx);
171 const auto current_col = current_node.
wire_idx;
173 mapping.
sigmas[current_col].row_idx[current_row] = next_node.
gate_idx;
174 mapping.
sigmas[current_col].col_idx[current_row] =
static_cast<uint8_t
>(next_node.
wire_idx);
183 const auto num_public_inputs =
static_cast<uint32_t
>(circuit_constructor.num_public_inputs());
185 auto pub_inputs_offset = circuit_constructor.blocks.pub_inputs.trace_offset();
186 for (
size_t i = 0; i < num_public_inputs; ++i) {
187 uint32_t idx =
static_cast<uint32_t
>(i + pub_inputs_offset);
188 mapping.sigmas[0].row_idx[
static_cast<ptrdiff_t
>(idx)] = idx;
189 mapping.sigmas[0].col_idx[
static_cast<ptrdiff_t
>(idx)] = 0;
190 mapping.sigmas[0].is_public_input[
static_cast<ptrdiff_t
>(idx)] =
true;
191 BB_ASSERT(!mapping.sigmas[0].is_tag[
static_cast<ptrdiff_t
>(idx)],
"MAPPING IS BOTH A TAG AND A PUBLIC INPUT");
205template <
typename Flavor>
206void compute_honk_style_permutation_lagrange_polynomials_from_mapping(
207 const RefSpan<typename Flavor::Polynomial>& permutation_polynomials,
212 size_t domain_size = permutation_polynomials[0].size();
217 BB_ASSERT_LT(permutation_polynomials[0].size(), SEPARATOR);
222 for (
auto& current_permutation_poly : permutation_polynomials) {
224 BB_BENCH_TRACY_NAME(
"Permutation::compute_polys");
225 const size_t start = thread_data.start[j];
226 const size_t end = thread_data.end[j];
227 for (size_t i = start; i < end; ++i) {
228 const size_t poly_idx = i + current_permutation_poly.start_index();
229 const auto idx = static_cast<ptrdiff_t>(poly_idx);
230 const auto& current_row_idx = permutation_mappings[wire_idx].row_idx[idx];
231 const auto& current_col_idx = permutation_mappings[wire_idx].col_idx[idx];
232 const auto& current_is_tag = permutation_mappings[wire_idx].is_tag[idx];
233 const auto& current_is_public_input =
234 permutation_mappings[wire_idx].is_public_input[idx];
236 if (current_is_public_input) {
250 current_permutation_poly.at(poly_idx) = -FF(current_row_idx + 1 + SEPARATOR * current_col_idx);
251 } else if (current_is_tag) {
256 current_permutation_poly.at(poly_idx) = SEPARATOR * Flavor::NUM_WIRES + current_row_idx;
260 current_permutation_poly.at(poly_idx) = FF(current_row_idx + SEPARATOR * current_col_idx);
273template <
typename Flavor>
279 auto mapping = compute_permutation_mapping<Flavor>(circuit, polynomial_size, copy_cycles);
283 BB_BENCH_NAME(
"compute_honk_style_permutation_lagrange_polynomials_from_mapping");
284 compute_honk_style_permutation_lagrange_polynomials_from_mapping<Flavor>(polynomials.get_sigmas(),
288 BB_BENCH_NAME(
"compute_honk_style_permutation_lagrange_polynomials_from_mapping");
289 compute_honk_style_permutation_lagrange_polynomials_from_mapping<Flavor>(polynomials.get_ids(), mapping.ids);
#define BB_ASSERT(expression,...)
#define BB_ASSERT_LT(left, right,...)
#define BB_BENCH_NAME(name)
#define BB_BENCH_TRACY_NAME(name)
A container for the prover polynomials.
size_t get_polynomial_size() const
typename Curve::ScalarField FF
Base class templates shared across Honk flavors.
constexpr size_t FF_COPY_COST
Entry point for Barretenberg command-line interface.
MultithreadData calculate_thread_data(size_t num_iterations, size_t min_iterations_per_thread)
Calculates number of threads and index bounds for each thread.
std::shared_ptr< Fr[]> _allocate_aligned_memory(size_t n_elements)
void parallel_for_heuristic(size_t num_points, const std::function< void(size_t, size_t, size_t)> &func, size_t heuristic_cost)
Split a loop into several loops running in parallel based on operations in 1 iteration.
void compute_permutation_argument_polynomials(const typename Flavor::CircuitBuilder &circuit, typename Flavor::ProverPolynomials &polynomials, const std::vector< CyclicPermutation > ©_cycles)
Compute Honk-style permutation sigma/id polynomials and add to prover_instance, where the copy_cycles...
constexpr uint32_t PERMUTATION_ARGUMENT_VALUE_SEPARATOR
std::vector< cycle_node > CyclicPermutation
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Stores permutation mapping data for a single wire column.
std::shared_ptr< bool[]> is_public_input
std::shared_ptr< uint32_t[]> row_idx
std::shared_ptr< bool[]> is_tag
std::shared_ptr< uint8_t[]> col_idx
PermutationMapping(size_t circuit_size)
Construct a permutation mapping default initialized so every element is in a cycle by itself.
std::array< Mapping, NUM_WIRES > ids
std::array< Mapping, NUM_WIRES > sigmas
auto range(size_t size, size_t offset=0) const
cycle_node represents the idx of a value of the circuit. It will belong to a CyclicPermutation,...