Skip to content

Commit

Permalink
Keep lookup constant/selector columns
Browse files Browse the repository at this point in the history
  • Loading branch information
akokoshn committed Nov 21, 2023
1 parent 85edb97 commit 38b4c23
Show file tree
Hide file tree
Showing 4 changed files with 199 additions and 118 deletions.
29 changes: 29 additions & 0 deletions include/nil/blueprint/blueprint/plonk/assignment.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

#include <algorithm>
#include <limits>
#include <unordered_set>

#include <nil/crypto3/zk/snark/arithmetization/plonk/table_description.hpp>
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp>
Expand Down Expand Up @@ -69,6 +70,8 @@ namespace nil {
std::uint32_t assignment_allocated_rows = 0;
std::vector<value_type> assignment_private_storage;
shared_container_type shared_storage; // results of the previously prover
std::unordered_set<std::uint32_t> lookup_constant_cols;
std::unordered_set<std::uint32_t> lookup_selector_cols;
public:
static constexpr const std::size_t private_storage_index = std::numeric_limits<std::size_t>::max();

Expand Down Expand Up @@ -131,6 +134,19 @@ namespace nil {
}
}

void fill_selector(std::uint32_t index, const column_type& column) override {
lookup_selector_cols.insert(index);
zk_type::fill_selector(index, column);
}

virtual const std::unordered_set<std::uint32_t>& get_lookup_selector_cols() const {
return lookup_selector_cols;
}

virtual std::uint32_t get_lookup_selector_amount() const {
return lookup_selector_cols.size();
}

virtual value_type &shared(std::uint32_t shared_index, std::uint32_t row_index) {
if (shared_storage[shared_index].size() <= row_index) {
shared_storage[shared_index].resize(row_index + 1);
Expand Down Expand Up @@ -225,6 +241,19 @@ namespace nil {
return zk_type::constant(constant_index)[row_index];
}

void fill_constant(std::uint32_t index, const column_type& column) override {
lookup_constant_cols.insert(index);
zk_type::fill_constant(index, column);
}

virtual const std::unordered_set<std::uint32_t>& get_lookup_constant_cols() const {
return lookup_constant_cols;
}

virtual std::uint32_t get_lookup_constant_amount() const {
return lookup_constant_cols.size();
}

virtual std::uint32_t constant_column_size(std::uint32_t col_idx) const {
return this->_public_table.constant_column_size(col_idx);
}
Expand Down
112 changes: 87 additions & 25 deletions include/nil/blueprint/blueprint/plonk/assignment_proxy.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ namespace nil {
std::shared_ptr<assignment<ArithmetizationType>> assignment_ptr;
std::uint32_t id;
bool check;
std::set<std::uint32_t> used_rows;
std::unordered_set<std::uint32_t> used_rows;
public:
assignment_proxy(std::shared_ptr<assignment<ArithmetizationType>> assignment,
std::uint32_t _id) :
Expand All @@ -66,6 +66,10 @@ namespace nil {
return *assignment_ptr;
}

assignment<ArithmetizationType>& get() {
return *assignment_ptr;
}

std::uint32_t get_id() const {
return id;
}
Expand All @@ -74,7 +78,7 @@ namespace nil {
check = flag;
}

const std::set<std::uint32_t>& get_used_rows() const {
const std::unordered_set<std::uint32_t>& get_used_rows() const {
return used_rows;
}

Expand All @@ -92,9 +96,13 @@ namespace nil {
}

value_type selector(std::size_t selector_index, std::uint32_t row_index) const override {
if (check && used_rows.find(row_index) == used_rows.end()) {
std::cout << id << ": Not found selector " << selector_index << " on row " << row_index << std::endl;
BLUEPRINT_ASSERT(false);
if (check) {
const auto lookup_selector_cols = assignment_ptr->get_lookup_selector_cols();
if (lookup_selector_cols.find(selector_index) == lookup_selector_cols.end() &&
used_rows.find(row_index) == used_rows.end()) {
std::cout << id << ": Not found selector " << selector_index << " on row " << row_index << std::endl;
BLUEPRINT_ASSERT(false);
}
}
return std::const_pointer_cast<const assignment<ArithmetizationType>>(assignment_ptr)->selector(selector_index, row_index);
}
Expand Down Expand Up @@ -126,12 +134,17 @@ namespace nil {
}

void fill_selector(std::uint32_t index, const column_type& column) override {
for (std::uint32_t i = 0; i < column.size(); i++) {
used_rows.insert(i);
}
assignment_ptr->fill_selector(index, column);
}

const std::unordered_set<std::uint32_t>& get_lookup_selector_cols() const override {
return assignment_ptr->get_lookup_selector_cols();
}

std::uint32_t get_lookup_selector_amount() const override {
return assignment_ptr->get_lookup_selector_amount();
}

value_type &shared(std::uint32_t shared_index, std::uint32_t row_index) override {
return assignment_ptr->shared(shared_index, row_index);
}
Expand Down Expand Up @@ -198,20 +211,17 @@ namespace nil {
}

value_type constant(std::uint32_t constant_index, std::uint32_t row_index) const override {
if (check && used_rows.find(row_index) == used_rows.end()) {
std::cout << id << ": Not found constant " << constant_index << " on row " << row_index << std::endl;
BLUEPRINT_ASSERT(false);
if (check) {
const auto lookup_constant_cols = assignment_ptr->get_lookup_constant_cols();
if (lookup_constant_cols.find(constant_index) == lookup_constant_cols.end() &&
used_rows.find(row_index) == used_rows.end()) {
std::cout << id << ": Not found constant " << constant_index << " on row " << row_index << std::endl;
BLUEPRINT_ASSERT(false);
}
}
return std::const_pointer_cast<const assignment<ArithmetizationType>>(assignment_ptr)->constant(constant_index, row_index);
}

void fill_constant(std::uint32_t index, const column_type& column) override {
for (std::uint32_t i = 0; i < column.size(); i++) {
used_rows.insert(i);
}
assignment_ptr->fill_constant(index, column);
}

std::uint32_t constants_amount() const override {
return assignment_ptr->constants_amount();
}
Expand All @@ -220,6 +230,18 @@ namespace nil {
return assignment_ptr->constant_column_size(index);
}

void fill_constant(std::uint32_t index, const column_type& column) override {
assignment_ptr->fill_constant(index, column);
}

const std::unordered_set<std::uint32_t>& get_lookup_constant_cols() const override {
return assignment_ptr->get_lookup_constant_cols();
}

std::uint32_t get_lookup_constant_amount() const override {
return assignment_ptr->get_lookup_constant_amount();
}

value_type private_storage(std::uint32_t storage_index) const override {
return assignment_ptr->private_storage(storage_index);
}
Expand Down Expand Up @@ -286,17 +308,29 @@ namespace nil {
<< "max_size: " << max_size << " "
<< "internal used rows size: " << used_rows.size() << "\n";

std::cout << "internal used rows: ";
os << "internal used rows: ";
for (const auto& it : used_rows) {
std::cout << it << " ";
os << it << " ";
}
os << "\n";

os << "lookup constants: ";
for (const auto &it : assignment_ptr->get_lookup_constant_cols()) {
os << it << " ";
}
os << "\n";

os << "lookup selectors: ";
for (const auto &it : assignment_ptr->get_lookup_selector_cols()) {
os << it << " ";
}
std::cout << "\n";
os << "\n";

os << std::dec;
os << std::hex << std::setfill('0');
std::uint32_t width = wide_export ? (BlueprintFieldType::modulus_bits + 4 - 1) / 4 : 0;

for (std::uint32_t i = 0; i < max_size; i++) {
/*for (std::uint32_t i = 0; i < max_size; i++) {
os << i << ": ";
const auto is_used_row = used_rows.find(i) != used_rows.end();
for (std::uint32_t j = 0; j < witnesses_size; j++) {
Expand Down Expand Up @@ -329,7 +363,7 @@ namespace nil {
assignment_ptr->selector(j, i) : 0).data << " ";
}
os << "\n";
}
}*/
os.flush();
os.flags(os_flags);
}
Expand Down Expand Up @@ -370,14 +404,18 @@ namespace nil {

using variable_type = crypto3::zk::snark::plonk_variable<typename BlueprintFieldType::value_type>;
const auto private_rows = assignments.get_used_rows();
const auto lookup_selector_cols = assignments.get_lookup_selector_cols();

const std::vector<crypto3::zk::snark::plonk_gate<BlueprintFieldType,
crypto3::zk::snark::plonk_constraint<BlueprintFieldType>>> &gates = bp.gates();
const std::set<std::uint32_t>& used_gates = bp.get_used_gates();
const auto& used_gates = bp.get_used_gates();

const std::vector<crypto3::zk::snark::plonk_copy_constraint<BlueprintFieldType>> &copy_constraints =
bp.copy_constraints();
const std::set<std::uint32_t>& used_copy_constraints = bp.get_used_copy_constraints();
const auto& used_copy_constraints = bp.get_used_copy_constraints();

const auto lookup_gates = bp.lookup_gates();
const auto used_lookup_gates = bp.get_used_lookup_gates();

std::uint32_t row_index = 0;
auto check_var = [&assignments, &row_index](const variable_type& var) {
Expand Down Expand Up @@ -434,6 +472,30 @@ namespace nil {
check_var(copy_constraints[i].second);
}

for (const auto& i : used_lookup_gates) {
if (i >= lookup_gates.size()) {
std::cout << "No lookup gate " << i << "\n";
return false;
}
row_index = 0;
crypto3::math::expression_for_each_variable_visitor<variable_type> visitor(check_var);

crypto3::zk::snark::plonk_column <BlueprintFieldType> selector =
assignments.selector(lookup_gates[i].tag_index);

for (std::size_t selector_row = 0;
selector_row < selector.size(); selector_row++) {
if (!selector[selector_row].is_zero()) {
row_index = selector_row;
for (const auto &lookup_constraint: lookup_gates[i].constraints) {
for (const auto &constraint : lookup_constraint.lookup_input) {
visitor.visit(constraint);
}
}
}
}
}

return true;
}

Expand Down
Loading

0 comments on commit 38b4c23

Please sign in to comment.