51 copy_cycles.resize(
builder.get_num_variables());
54 auto selectors = polynomials.get_selectors();
58 auto blocks_array =
builder.blocks.get();
59 const size_t num_blocks = blocks_array.
size();
66 auto& block = blocks_array[block_idx];
67 const uint32_t
offset = block.trace_offset();
68 const uint32_t block_size =
static_cast<uint32_t
>(block.size());
69 auto& local_nodes = per_block_nodes[block_idx];
70 local_nodes.reserve(
static_cast<size_t>(block_size) * NUM_WIRES);
73 for (uint32_t block_row_idx = 0; block_row_idx < block_size; ++block_row_idx) {
74 for (uint32_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) {
75 uint32_t var_idx = block.wires[wire_idx][block_row_idx];
77 uint32_t real_var_idx =
builder.real_variable_index.at(var_idx);
78 uint32_t trace_row_idx = block_row_idx +
offset;
80 wires[wire_idx].at(trace_row_idx) =
builder.get_variable(var_idx);
81 local_nodes.emplace_back(real_var_idx,
cycle_node{ wire_idx, trace_row_idx });
90 for (
const auto& block_nodes : per_block_nodes) {
91 for (
const auto& [real_var_idx, node] : block_nodes) {
92 copy_cycles.at(real_var_idx).emplace_back(node);
101 for (
size_t block_idx = 0; block_idx < num_blocks; ++block_idx) {
102 const size_t num_selectors = blocks_array[block_idx].get_selectors().size();
103 for (
size_t selector_idx = 0; selector_idx < num_selectors; ++selector_idx) {
104 selector_tasks.emplace_back(block_idx, selector_idx);
107 parallel_for(selector_tasks.size(), [&](
size_t task_idx) {
108 const auto [block_idx, selector_idx] = selector_tasks[task_idx];
109 auto& block = blocks_array[block_idx];
110 const size_t offset = block.trace_offset();
111 const size_t block_size = block.size();
112 RefVector<Selector<FF>> block_selectors = block.get_selectors();
113 auto& selector = block_selectors[selector_idx];
114 for (size_t row_idx = 0; row_idx < block_size; ++row_idx) {
115 selectors[selector_idx].set_if_valid_index(row_idx + offset, selector[row_idx]);
127 auto& ecc_op_selector = polynomials.lagrange_ecc_op;
132 const auto& ecc_op_block =
builder.blocks.ecc_op;
133 const size_t wire_start = ecc_op_block.trace_offset();
134 BB_ASSERT_GTE(wire_start, NUM_ZERO_ROWS,
"ecc_op block must start beyond the zero row");
135 const size_t op_wire_start = wire_start - NUM_ZERO_ROWS;
136 for (
auto [ecc_op_wire, wire] :
zip_view(polynomials.get_ecc_op_wires(), polynomials.get_wires())) {
137 for (
size_t i = 0; i < ecc_op_block.size(); ++i) {
138 ecc_op_wire.at(op_wire_start + i) = wire[wire_start + i];
139 ecc_op_selector.at(op_wire_start + i) = 1;
static void populate(Builder &builder, ProverPolynomials &)
Given a circuit, populate a proving key with wire polys, selector polys, and sigma/id polys.