Skip to content

Commit

Permalink
move selectors to the end of the table #20
Browse files Browse the repository at this point in the history
  • Loading branch information
SK0M0R0H committed Mar 10, 2022
1 parent d98821a commit c7c6687
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 120 deletions.
24 changes: 12 additions & 12 deletions include/nil/crypto3/zk/snark/relations/plonk/constraint.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@ namespace nil {
math::non_linear_combination<VariableType>(terms) {
}

template<std::size_t WitnessColumns, std::size_t SelectorColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns>
template<std::size_t WitnessColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns, std::size_t SelectorColumns>
typename VariableType::assignment_type
evaluate(std::size_t row_index,
const plonk_assignment_table<FieldType, WitnessColumns,
SelectorColumns, PublicInputColumns, ConstantColumns> &assignments) const {
PublicInputColumns, ConstantColumns, SelectorColumns> &assignments) const {
typename VariableType::assignment_type acc = VariableType::assignment_type::zero();
for (const math::non_linear_term<VariableType> &nlt : this->terms) {
typename VariableType::assignment_type term_value = nlt.coeff;
Expand All @@ -84,15 +84,15 @@ namespace nil {
case VariableType::column_type::witness:
assignment = assignments.witness(var.index)[row_index + var.rotation];
break;
case VariableType::column_type::selector:
assignment = assignments.selector(var.index)[row_index + var.rotation];
break;
case VariableType::column_type::public_input:
assignment = assignments.public_input(var.index)[row_index + var.rotation];
break;
case VariableType::column_type::constant:
assignment = assignments.constant(var.index)[row_index + var.rotation];
break;
case VariableType::column_type::selector:
assignment = assignments.selector(var.index)[row_index + var.rotation];
break;
}

term_value = term_value * assignment;
Expand All @@ -102,11 +102,11 @@ namespace nil {
return acc;
}

template<std::size_t WitnessColumns, std::size_t SelectorColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns>
template<std::size_t WitnessColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns, std::size_t SelectorColumns>
math::polynomial<typename VariableType::assignment_type>
evaluate(const plonk_polynomial_table<FieldType, WitnessColumns,
SelectorColumns, PublicInputColumns, ConstantColumns> &assignments) const {
PublicInputColumns, ConstantColumns, SelectorColumns> &assignments) const {
math::polynomial<typename VariableType::assignment_type> acc = {0};
for (const math::non_linear_term<VariableType> &nlt : this->terms) {
math::polynomial<typename VariableType::assignment_type> term_value = {nlt.coeff};
Expand All @@ -118,15 +118,15 @@ namespace nil {
case VariableType::column_type::witness:
assignment = assignments.witness(var.index);
break;
case VariableType::column_type::selector:
assignment = assignments.selector(var.index);
break;
case VariableType::column_type::public_input:
assignment = assignments.public_input(var.index);
break;
case VariableType::column_type::constant:
assignment = assignments.constant(var.index);
break;
case VariableType::column_type::selector:
assignment = assignments.selector(var.index);
break;
}

term_value = term_value * assignment;
Expand Down
102 changes: 52 additions & 50 deletions include/nil/crypto3/zk/snark/relations/plonk/table.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,38 +74,26 @@ namespace nil {
}
};

template<typename FieldType, std::size_t SelectorColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns, typename ColumnType>
template<typename FieldType, std::size_t PublicInputColumns, std::size_t ConstantColumns,
std::size_t SelectorColumns, typename ColumnType>
struct plonk_public_table {

protected:

std::array<ColumnType, SelectorColumns> selector_columns;
std::array<ColumnType, PublicInputColumns> public_input_columns;
std::array<ColumnType, ConstantColumns> constant_columns;
std::array<ColumnType, SelectorColumns> selector_columns;

public:
plonk_public_table(std::array<ColumnType, SelectorColumns> selector_columns = {},
std::array<ColumnType, PublicInputColumns>
plonk_public_table(std::array<ColumnType, PublicInputColumns>
public_input_columns = {},
std::array<ColumnType, ConstantColumns>
constant_columns = {}) :
selector_columns(selector_columns),
constant_columns = {},
std::array<ColumnType, SelectorColumns>
selector_columns = {}) :
public_input_columns(public_input_columns),
constant_columns() {
}

ColumnType selector(std::size_t index) const {
assert(index < SelectorColumns);
return selector_columns[index];
}

std::array<ColumnType, SelectorColumns> selectors() const {
return selector_columns;
}

std::size_t selectors_size() {
return selector_columns.size();
constant_columns(constant_columns),
selector_columns(selector_columns) {
}

ColumnType public_input(std::size_t index) const {
Expand Down Expand Up @@ -134,31 +122,45 @@ namespace nil {
return constant_columns.size();
}

ColumnType selector(std::size_t index) const {
assert(index < SelectorColumns);
return selector_columns[index];
}

std::array<ColumnType, SelectorColumns> selectors() const {
return selector_columns;
}

std::size_t selectors_size() {
return selector_columns.size();
}

ColumnType operator[](std::size_t index) const {
if (index < SelectorColumns)
return selector_columns[index];
index -= SelectorColumns;
if (index < PublicInputColumns)
return public_input_columns[index];
index -= PublicInputColumns;
if (index < ConstantColumns)
return constant_columns[index];
index -= ConstantColumns;
if (index < SelectorColumns) {
return selector_columns[index];
}
index -= SelectorColumns;
}

constexpr std::size_t size() const {
return SelectorColumns + PublicInputColumns + ConstantColumns;
return PublicInputColumns + ConstantColumns + SelectorColumns;
}
};

template<typename FieldType, std::size_t WitnessColumns,
std::size_t SelectorColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns, typename ColumnType>
std::size_t PublicInputColumns, std::size_t ConstantColumns,
std::size_t SelectorColumns, typename ColumnType>
struct plonk_table {

using private_table_type = plonk_private_table<FieldType, WitnessColumns, ColumnType>;
using public_table_type = plonk_public_table<FieldType, SelectorColumns,
PublicInputColumns, ConstantColumns, ColumnType>;
using public_table_type = plonk_public_table<FieldType,
PublicInputColumns, ConstantColumns, SelectorColumns, ColumnType>;

protected:

Expand All @@ -175,10 +177,6 @@ namespace nil {
return _private_table.witness(index);
}

ColumnType selector(std::size_t index) const {
return _public_table.selector(index);
}

ColumnType public_input(std::size_t index) const {
return _public_table.public_input(index);
}
Expand All @@ -187,6 +185,10 @@ namespace nil {
return _public_table.constant(index);
}

ColumnType selector(std::size_t index) const {
return _public_table.selector(index);
}

ColumnType operator[](std::size_t index) const {
if (index < _private_table.size())
return _private_table[index];
Expand All @@ -208,45 +210,45 @@ namespace nil {
}

plonk_table_description<FieldType> table_description() {
return plonk_table_description<FieldType> {_private_table.size(),
_public_table.selectors_size(),
return plonk_table_description<FieldType> {_private_table.size(),
_public_table.public_input_size(),
_public_table.constant_size()};
_public_table.constant_size(),
_public_table.selectors_size()};
}
};

template<typename FieldType, std::size_t WitnessColumns>
using plonk_private_assignment_table =
plonk_private_table<FieldType, WitnessColumns, plonk_column<FieldType>>;

template<typename FieldType, std::size_t SelectorColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns>
template<typename FieldType, std::size_t PublicInputColumns,
std::size_t ConstantColumns, std::size_t SelectorColumns>
using plonk_public_assignment_table =
plonk_public_table<FieldType, SelectorColumns, PublicInputColumns, ConstantColumns,
plonk_public_table<FieldType, PublicInputColumns, ConstantColumns, SelectorColumns,
plonk_column<FieldType>>;

template<typename FieldType, std::size_t WitnessColumns, std::size_t SelectorColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns>
template<typename FieldType, std::size_t WitnessColumns,
std::size_t PublicInputColumns, std::size_t ConstantColumns, std::size_t SelectorColumns>
using plonk_assignment_table = plonk_table<FieldType, WitnessColumns,
SelectorColumns, PublicInputColumns, ConstantColumns,
PublicInputColumns, ConstantColumns, SelectorColumns,
plonk_column<FieldType>>;

template<typename FieldType, std::size_t WitnessColumns>
using plonk_private_polynomial_table =
plonk_private_table<FieldType, WitnessColumns, math::polynomial<typename FieldType::value_type>>;

template<typename FieldType, std::size_t SelectorColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns>
template<typename FieldType, std::size_t PublicInputColumns,
std::size_t ConstantColumns, std::size_t SelectorColumns>
using plonk_public_polynomial_table =
plonk_public_table<FieldType, SelectorColumns, PublicInputColumns,
ConstantColumns, math::polynomial<typename FieldType::value_type>>;
plonk_public_table<FieldType, PublicInputColumns, ConstantColumns,
SelectorColumns, math::polynomial<typename FieldType::value_type>>;

template<typename FieldType, std::size_t WitnessColumns,
std::size_t SelectorColumns, std::size_t PublicInputColumns,
std::size_t ConstantColumns>
std::size_t PublicInputColumns, std::size_t ConstantColumns,
std::size_t SelectorColumns>
using plonk_polynomial_table =
plonk_table<FieldType, WitnessColumns, SelectorColumns, PublicInputColumns,
ConstantColumns, math::polynomial<typename FieldType::value_type>>;
plonk_table<FieldType, WitnessColumns, PublicInputColumns,
ConstantColumns, SelectorColumns, math::polynomial<typename FieldType::value_type>>;

} // namespace snark
} // namespace zk
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,27 @@ namespace nil {
template<typename FieldType>
struct plonk_table_description {
std::size_t witness_columns;
std::size_t selector_columns;
std::size_t public_input_columns;
std::size_t constant_columns;
std::size_t selector_columns;

std::size_t global_index(const plonk_variable<FieldType> &a) const {
switch (a.type)
{
case plonk_variable<FieldType>::column_type::witness:
return a.index;
case plonk_variable<FieldType>::column_type::selector:
return witness_columns + a.index;
case plonk_variable<FieldType>::column_type::public_input:
return witness_columns + selector_columns + a.index;
return witness_columns + a.index;
case plonk_variable<FieldType>::column_type::constant:
return witness_columns + selector_columns + public_input_columns + a.index;
return witness_columns + public_input_columns + a.index;
case plonk_variable<FieldType>::column_type::selector:
return witness_columns + public_input_columns + constant_columns + a.index;
}
}

std::size_t table_width() const {
return witness_columns + selector_columns
+ public_input_columns + constant_columns;
return witness_columns + public_input_columns
+ constant_columns + selector_columns;
}
};
} // namespace snark
Expand Down
2 changes: 1 addition & 1 deletion include/nil/crypto3/zk/snark/relations/plonk/variable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ namespace nil {
*/
enum rotation_type { pre_previous = -2, previous, current, next, after_next };
int rotation;
enum column_type { witness, selector, public_input, constant } type;
enum column_type { witness, public_input, constant, selector } type;
std::size_t index;
bool relative;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ namespace nil {
constexpr static const std::size_t witness_columns = RedshiftParams::witness_columns;
constexpr static const std::size_t public_input_columns =
RedshiftParams::public_input_columns;
constexpr static const std::size_t selector_columns = RedshiftParams::selector_columns;
constexpr static const std::size_t constant_columns = RedshiftParams::constant_columns;
constexpr static const std::size_t constant_columns = RedshiftParams::constant_columns;
constexpr static const std::size_t selector_columns = RedshiftParams::selector_columns;

/******************************** Params ********************************/

Expand All @@ -65,7 +65,7 @@ namespace nil {
typedef RedshiftParams redshift_params_type;

typedef plonk_assignment_table<FieldType, witness_columns,
selector_columns, public_input_columns, constant_columns> variable_assignment_type;
public_input_columns, constant_columns, selector_columns> variable_assignment_type;

typedef detail::plonk_evaluation_map<plonk_variable<FieldType>> evaluation_map;

Expand All @@ -89,8 +89,8 @@ namespace nil {

std::shared_ptr<math::evaluation_domain<FieldType>> basic_domain;

plonk_public_polynomial_table<FieldType, selector_columns,
public_input_columns, constant_columns> public_polynomial_table;
plonk_public_polynomial_table<FieldType, public_input_columns,
constant_columns, selector_columns> public_polynomial_table;

// S_sigma
std::vector<math::polynomial<typename FieldType::value_type>> permutation_polynomials;
Expand Down
Loading

0 comments on commit c7c6687

Please sign in to comment.