Skip to content

Commit 05b865f

Browse files
author
akokoshn
committed
Enable lookup
1 parent 460d5ab commit 05b865f

File tree

4 files changed

+61
-25
lines changed

4 files changed

+61
-25
lines changed

bin/assigner/src/main.cpp

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,15 @@ void print_circuit(const circuit_proxy<ArithmetizationType> &circuit_proxy,
8989
using variable_type = crypto3::zk::snark::plonk_variable<typename AssignmentTableType::field_type::value_type>;
9090

9191
const auto gates = circuit_proxy.gates();
92-
const std::set<std::uint32_t>& used_gates_idx = circuit_proxy.get_used_gates();
92+
const auto used_gates_idx = circuit_proxy.get_used_gates();
9393
typename ConstraintSystemType::gates_container_type used_gates;
9494
for (const auto &it : used_gates_idx) {
9595
used_gates.push_back(gates[it]);
9696
}
9797

9898
const auto copy_constraints = circuit_proxy.copy_constraints();
9999
typename ConstraintSystemType::copy_constraints_container_type used_copy_constraints;
100-
const std::set<std::uint32_t>& used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints();
100+
const auto used_copy_constraints_idx = circuit_proxy.get_used_copy_constraints();
101101
for (const auto &it : used_copy_constraints_idx) {
102102
used_copy_constraints.push_back(copy_constraints[it]);
103103
}
@@ -127,14 +127,14 @@ void print_circuit(const circuit_proxy<ArithmetizationType> &circuit_proxy,
127127

128128
const auto lookup_gates = circuit_proxy.lookup_gates();
129129
typename ConstraintSystemType::lookup_gates_container_type used_lookup_gates;
130-
const std::set<std::uint32_t>& used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates();
130+
const auto used_lookup_gates_idx = circuit_proxy.get_used_lookup_gates();
131131
for (const auto &it : used_lookup_gates_idx) {
132132
used_lookup_gates.push_back(lookup_gates[it]);
133133
}
134134

135135
const auto lookup_tables = circuit_proxy.lookup_tables();
136136
typename ConstraintSystemType::lookup_tables_type used_lookup_tables;
137-
const std::set<std::uint32_t>& used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables();
137+
const auto used_lookup_tables_idx = circuit_proxy.get_used_lookup_tables();
138138
for (const auto &it : used_lookup_tables_idx) {
139139
used_lookup_tables.push_back(lookup_tables[it]);
140140
}
@@ -170,8 +170,8 @@ enum class print_column_kind {
170170

171171
template<typename ValueType, typename ArithmetizationType>
172172
void fill_vector_value(std::vector<ValueType> &table_values, const assignment_proxy<ArithmetizationType> &table_proxy,
173-
print_column_kind column_kind, std::uint32_t num_cols, std::uint32_t num_rows, std::uint32_t padding) {
174-
for(std::size_t i = 0; i < num_cols; i++) {
173+
print_column_kind column_kind, std::uint32_t start_col, std::uint32_t end_col, std::uint32_t num_rows, std::uint32_t padding) {
174+
for(std::size_t i = start_col; i < end_col; i++) {
175175
for(std::size_t j = 0; j < num_rows; j++){
176176
ValueType val;
177177
switch (column_kind) {
@@ -227,7 +227,9 @@ void fill_vector_value(std::vector<ValueType> &table_values, const assignment_pr
227227
}
228228

229229
template<typename Endianness, typename ArithmetizationType>
230-
void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_proxy, print_table_kind print_kind, std::ostream &out = std::cout) {
230+
void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_proxy,
231+
print_table_kind print_kind,
232+
std::ostream &out = std::cout) {
231233
using AssignmentTableType = assignment_proxy<ArithmetizationType>;
232234
std::uint32_t usable_rows_amount;
233235
std::uint32_t total_columns;
@@ -236,20 +238,31 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
236238
std::uint32_t witness_size = table_proxy.witnesses_amount();
237239
std::uint32_t constant_size = table_proxy.constants_amount();
238240
std::uint32_t selector_size = table_proxy.selectors_amount();
241+
const auto lookup_constant_cols = table_proxy.get_lookup_constant_cols();
242+
const auto lookup_selector_cols = table_proxy.get_lookup_selector_cols();
239243
if (print_kind == print_table_kind::PRIVATE) {
240-
total_columns = witness_size + constant_size + selector_size;
244+
total_columns = witness_size + (constant_size - table_proxy.get_lookup_constant_amount())
245+
+ (selector_size - table_proxy.get_lookup_selector_amount());
241246
usable_rows_amount = table_proxy.get_used_rows().size();
242247
} else if (print_kind == print_table_kind::SHARED) {
243-
total_columns = shared_size + public_input_size;
248+
total_columns = shared_size + public_input_size + table_proxy.get_lookup_constant_amount() + table_proxy.get_lookup_selector_amount();
244249
std::uint32_t max_shared_size = 0;
245250
std::uint32_t max_public_inputs_size = 0;
251+
std::uint32_t max_constant_size = 0;
252+
std::uint32_t max_selector_size = 0;
246253
for (std::uint32_t i = 0; i < shared_size; i++) {
247254
max_shared_size = std::max(max_shared_size, table_proxy.shared_column_size(i));
248255
}
249256
for (std::uint32_t i = 0; i < public_input_size; i++) {
250257
max_public_inputs_size = std::max(max_public_inputs_size, table_proxy.public_input_column_size(i));
251258
}
252-
usable_rows_amount = std::max(max_shared_size, max_public_inputs_size);
259+
for (const auto &i : lookup_constant_cols) {
260+
max_constant_size = std::max(max_constant_size, table_proxy.constant_column_size(i));
261+
}
262+
for (const auto &i : lookup_selector_cols) {
263+
max_selector_size = std::max(max_selector_size, table_proxy.selector_column_size(i));
264+
}
265+
usable_rows_amount = std::max({max_shared_size, max_public_inputs_size, max_constant_size, max_selector_size});
253266
} else { // FULL
254267
total_columns = AssignmentTableType::arithmetization_params::total_columns;
255268
std::uint32_t max_witness_size = 0;
@@ -298,18 +311,22 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
298311
std::vector<typename AssignmentTableType::field_type::value_type> table_values;
299312
if (print_kind == print_table_kind::FULL) {
300313
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
301-
(table_values, table_proxy, print_column_kind::WITNESS, witness_size, usable_rows_amount, padding);
314+
(table_values, table_proxy, print_column_kind::WITNESS, 0, witness_size, usable_rows_amount, padding);
302315
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
303-
(table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size, usable_rows_amount, padding);
316+
(table_values, table_proxy, print_column_kind::PUBLIC_INPUT, 0, public_input_size, usable_rows_amount, padding);
304317
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
305-
(table_values, table_proxy, print_column_kind::CONSTANT, constant_size, usable_rows_amount, padding);
318+
(table_values, table_proxy, print_column_kind::CONSTANT, 0, constant_size, usable_rows_amount, padding);
306319
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
307-
(table_values, table_proxy, print_column_kind::SELECTOR, selector_size, usable_rows_amount, padding);
320+
(table_values, table_proxy, print_column_kind::SELECTOR, 0, selector_size, usable_rows_amount, padding);
308321
} else if (print_kind == print_table_kind::SHARED) {
309322
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
310-
(table_values, table_proxy, print_column_kind::PUBLIC_INPUT, public_input_size, usable_rows_amount, padding);
323+
(table_values, table_proxy, print_column_kind::SHARED, 0, shared_size, usable_rows_amount, padding);
311324
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
312-
(table_values, table_proxy, print_column_kind::SHARED, shared_size, usable_rows_amount, padding);
325+
(table_values, table_proxy, print_column_kind::PUBLIC_INPUT, 0, public_input_size, usable_rows_amount, padding);
326+
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
327+
(table_values, table_proxy, print_column_kind::CONSTANT, table_proxy.get_lookup_constant_amount(), constant_size, usable_rows_amount, padding);
328+
fill_vector_value<typename AssignmentTableType::field_type::value_type, ArithmetizationType>
329+
(table_values, table_proxy, print_column_kind::SELECTOR, table_proxy.get_lookup_selector_amount(), selector_size, usable_rows_amount, padding);
313330
} else {
314331
const auto rows = table_proxy.get_used_rows();
315332
for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::witness_columns; i++ ){
@@ -324,7 +341,7 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
324341
table_values.push_back(0);
325342
}
326343
}
327-
for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::constant_columns; i++ ){
344+
for( std::size_t i = 0; i < (constant_size - table_proxy.get_lookup_constant_amount()); i++ ){
328345
for(const auto& j : rows){
329346
if (j < table_proxy.constant_column_size(i)) {
330347
table_values.push_back(table_proxy.constant(i, j));
@@ -336,7 +353,7 @@ void print_assignment_table(const assignment_proxy<ArithmetizationType> &table_p
336353
table_values.push_back(0);
337354
}
338355
}
339-
for( std::size_t i = 0; i < AssignmentTableType::arithmetization_params::selector_columns; i++ ){
356+
for( std::size_t i = 0; i < (selector_size - table_proxy.get_lookup_selector_amount()); i++ ){
340357
for(const auto& j : rows){
341358
if (j < table_proxy.selector_column_size(i)) {
342359
table_values.push_back(table_proxy.selector(i, j));
@@ -374,10 +391,13 @@ int curve_dependent_main(std::string bytecode_file_name,
374391
const std::string &policy,
375392
std::uint32_t max_num_provers) {
376393
using BlueprintFieldType = typename CurveType::base_field_type;
394+
constexpr std::size_t ComponentConstantColumns = 5;
395+
constexpr std::size_t LookupConstantColumns = 100;
396+
377397
constexpr std::size_t WitnessColumns = 15;
378398
constexpr std::size_t PublicInputColumns = 1;
379-
constexpr std::size_t ConstantColumns = 5;
380-
constexpr std::size_t SelectorColumns = 35;
399+
constexpr std::size_t ConstantColumns = ComponentConstantColumns + LookupConstantColumns;
400+
constexpr std::size_t SelectorColumns = 50;
381401

382402
using ArithmetizationParams =
383403
zk::snark::plonk_arithmetization_params<WitnessColumns, PublicInputColumns, ConstantColumns, SelectorColumns>;
@@ -431,6 +451,23 @@ int curve_dependent_main(std::string bytecode_file_name,
431451

432452
ASSERT_MSG(!parser_instance.assignments.empty() && !parser_instance.circuits.empty(), "Not found any proxy for prover" );
433453

454+
// pack lookup tables
455+
if (parser_instance.circuits[0].get_reserved_tables().size() > 0) {
456+
std::vector <std::size_t> lookup_columns_indices;
457+
for (std::size_t i = ComponentConstantColumns;
458+
i < ConstantColumns; i++)
459+
lookup_columns_indices.push_back(i);
460+
auto usable_rows_amount = zk::snark::pack_lookup_tables_horizontal(
461+
parser_instance.circuits[0].get_reserved_indices(),
462+
parser_instance.circuits[0].get_reserved_tables(),
463+
parser_instance.circuits[0].get(),
464+
parser_instance.assignments[0].get(),
465+
lookup_columns_indices,
466+
parser_instance.assignments[0].allocated_rows(),
467+
500000
468+
);
469+
}
470+
434471
// print shared table
435472
std::ofstream shared_otable;
436473
const auto print_kind = parser_instance.assignments.size() > 1 ? print_table_kind::SHARED : print_table_kind::FULL;
@@ -468,10 +505,9 @@ int curve_dependent_main(std::string bytecode_file_name,
468505
otable.close();
469506
}
470507
}
471-
472508
auto assignment_it = parser_instance.assignments.begin();
473509
for (auto& it : parser_instance.circuits) {
474-
std::ofstream ocircuit;
510+
std::ofstream ocircuit;
475511
std::string file_name = parser_instance.circuits.size() > 1 ?
476512
circuit_file_name + std::to_string(it.get_id()) : circuit_file_name;
477513
ocircuit.open(file_name);

libs/blueprint

Submodule blueprint updated 44 files

libs/crypto3

0 commit comments

Comments
 (0)