27#include <initializer_list>
95 for (
size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) {
101 size_t iterations_per_thread = circuit_size / num_threads;
104 uint32_t start =
static_cast<uint32_t
>(thread_idx * iterations_per_thread);
105 uint32_t end =
static_cast<uint32_t
>((thread_idx + 1) * iterations_per_thread);
108 for (uint8_t col_idx = 0; col_idx < NUM_WIRES; ++col_idx) {
109 for (uint32_t row_idx = start; row_idx < end; ++row_idx) {
110 auto idx =
static_cast<ptrdiff_t
>(row_idx);
111 sigmas[col_idx].row_idx[idx] = row_idx;
112 sigmas[col_idx].col_idx[idx] = col_idx;
113 sigmas[col_idx].is_public_input[idx] =
false;
114 sigmas[col_idx].is_tag[idx] =
false;
115 if constexpr (generalized) {
116 ids[col_idx].row_idx[idx] = row_idx;
117 ids[col_idx].col_idx[idx] = col_idx;
118 ids[col_idx].is_public_input[idx] =
false;
119 ids[col_idx].is_tag[idx] =
false;
142template <
typename Flavor,
bool generalized>
145 const size_t dyadic_size,
153 std::span<const uint32_t> real_variable_tags = circuit_constructor.
real_variable_tags;
156 for (
size_t cycle_idx = 0; cycle_idx < wire_copy_cycles.size(); ++cycle_idx) {
158 for (
size_t node_idx = 0; node_idx < cycle.size(); ++node_idx) {
160 const cycle_node& current_node = cycle[node_idx];
161 const auto current_row =
static_cast<ptrdiff_t
>(current_node.
gate_idx);
162 const auto current_column = current_node.
wire_idx;
165 size_t next_node_idx = (node_idx == cycle.size() - 1 ? 0 : node_idx + 1);
166 const cycle_node& next_node = cycle[next_node_idx];
167 const auto next_row = next_node.
gate_idx;
168 const auto next_column =
static_cast<uint8_t
>(next_node.
wire_idx);
171 mapping.
sigmas[current_column].row_idx[current_row] = next_row;
172 mapping.
sigmas[current_column].col_idx[current_row] = next_column;
174 if constexpr (generalized) {
175 const bool first_node = (node_idx == 0);
176 const bool last_node = (next_node_idx == 0);
179 mapping.
ids[current_column].is_tag[current_row] =
true;
180 mapping.
ids[current_column].row_idx[current_row] = real_variable_tags[cycle_idx];
183 mapping.
sigmas[current_column].is_tag[current_row] =
true;
186 mapping.
sigmas[current_column].row_idx[current_row] =
187 circuit_constructor.
tau.at(real_variable_tags[cycle_idx]);
195 const auto num_public_inputs =
static_cast<uint32_t
>(circuit_constructor.
num_public_inputs());
197 size_t pub_inputs_offset = 0;
201 for (
size_t i = 0; i < num_public_inputs; ++i) {
202 uint32_t idx =
static_cast<uint32_t
>(i + pub_inputs_offset);
203 mapping.
sigmas[0].row_idx[
static_cast<ptrdiff_t
>(idx)] = idx;
204 mapping.
sigmas[0].col_idx[
static_cast<ptrdiff_t
>(idx)] = 0;
205 mapping.
sigmas[0].is_public_input[
static_cast<ptrdiff_t
>(idx)] =
true;
206 if (mapping.
sigmas[0].is_tag[
static_cast<ptrdiff_t
>(idx)]) {
223template <
typename Flavor>
224void compute_honk_style_permutation_lagrange_polynomials_from_mapping(
231 size_t domain_size = active_region_data.
size();
236 BB_ASSERT_LT(permutation_polynomials[0].size(), SEPARATOR);
241 for (
auto& current_permutation_poly : permutation_polynomials) {
243 const size_t start = thread_data.start[j];
244 const size_t end = thread_data.end[j];
245 for (size_t i = start; i < end; ++i) {
246 const size_t poly_idx = active_region_data.get_idx(i);
247 const auto idx = static_cast<ptrdiff_t>(poly_idx);
248 const auto& current_row_idx = permutation_mappings[wire_idx].row_idx[idx];
249 const auto& current_col_idx = permutation_mappings[wire_idx].col_idx[idx];
250 const auto& current_is_tag = permutation_mappings[wire_idx].is_tag[idx];
251 const auto& current_is_public_input = permutation_mappings[wire_idx].is_public_input[idx];
252 if (current_is_public_input) {
262 current_permutation_poly.at(poly_idx) = -FF(current_row_idx + 1 + SEPARATOR * current_col_idx);
263 } else if (current_is_tag) {
265 current_permutation_poly.at(poly_idx) = SEPARATOR * Flavor::NUM_WIRES + current_row_idx;
269 current_permutation_poly.at(poly_idx) = FF(current_row_idx + SEPARATOR * current_col_idx);
286template <
typename Flavor>
294 auto mapping = compute_permutation_mapping<Flavor, generalized>(circuit, polynomial_size, copy_cycles);
299 PROFILE_THIS_NAME(
"compute_honk_style_permutation_lagrange_polynomials_from_mapping");
301 compute_honk_style_permutation_lagrange_polynomials_from_mapping<Flavor>(
302 polynomials.
get_sigmas(), mapping.sigmas, active_region_data);
306 PROFILE_THIS_NAME(
"compute_honk_style_permutation_lagrange_polynomials_from_mapping");
308 compute_honk_style_permutation_lagrange_polynomials_from_mapping<Flavor>(
309 polynomials.
get_ids(), mapping.ids, active_region_data);
#define BB_ASSERT_LT(left, right,...)
size_t num_public_inputs() const
std::vector< uint32_t > real_variable_tags
std::map< uint32_t, uint32_t > tau
uint32_t trace_offset() const
A container for the prover polynomials handles.
size_t get_polynomial_size() const
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
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.
void compute_permutation_argument_polynomials(const typename Flavor::CircuitBuilder &circuit, typename Flavor::ProverPolynomials &polynomials, const std::vector< CyclicPermutation > ©_cycles, ActiveRegionData &active_region_data)
Compute Honk style generalized permutation sigmas and ids and add to proving_key.
std::shared_ptr< Fr[]> _allocate_aligned_memory(size_t n_elements)
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
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
#define PROFILE_THIS_NAME(name)
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
MegaTracePublicInputBlock pub_inputs
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
cycle_node represents the idx of a value of the circuit. It will belong to a CyclicPermutation,...
Permutations subgroup element structure is used to hold data necessary to construct permutation polyn...