Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
pb_variable.hpp
Go to the documentation of this file.
1 
8 #ifndef PB_VARIABLE_HPP_
9 #define PB_VARIABLE_HPP_
10 
11 #include <cstddef>
12 #include <libff/common/utils.hpp>
14 #include <string>
15 #include <vector>
16 
17 namespace libsnark
18 {
19 
20 typedef size_t lc_index_t;
21 
22 template<typename FieldT> class protoboard;
23 
24 template<typename FieldT> class pb_variable : public variable<FieldT>
25 {
26 public:
27  pb_variable(const var_index_t index = 0) : variable<FieldT>(index){};
28 
29  void allocate(protoboard<FieldT> &pb, const std::string &annotation);
30 };
31 
39 template<typename FieldT>
40 pb_variable<FieldT> pb_variable_allocate(
41  protoboard<FieldT> &pb, const std::string &annotation);
42 
43 template<typename FieldT>
44 class pb_variable_array : private std::vector<pb_variable<FieldT>>
45 {
46  typedef std::vector<pb_variable<FieldT>> contents;
47 
48 public:
49  using typename contents::const_iterator;
50  using typename contents::const_reverse_iterator;
51  using typename contents::iterator;
52  using typename contents::reverse_iterator;
53 
54  using contents::begin;
55  using contents::emplace_back;
56  using contents::empty;
57  using contents::end;
58  using contents::insert;
59  using contents::rbegin;
60  using contents::rend;
61  using contents::reserve;
62  using contents::size;
63  using contents::operator[];
64  using contents::resize;
65 
66  pb_variable_array() : contents(){};
67  pb_variable_array(size_t count, const pb_variable<FieldT> &value)
68  : contents(count, value){};
70  typename contents::const_iterator first,
71  typename contents::const_iterator last)
72  : contents(first, last){};
74  typename contents::const_reverse_iterator first,
75  typename contents::const_reverse_iterator last)
76  : contents(first, last){};
77  void allocate(
79  const size_t n,
80  const std::string &annotation_prefix);
81 
83  protoboard<FieldT> &pb, const std::vector<FieldT> &vals) const;
84  void fill_with_bits(
85  protoboard<FieldT> &pb, const libff::bit_vector &bits) const;
87  protoboard<FieldT> &pb, const unsigned long i) const;
89  protoboard<FieldT> &pb, const FieldT &r) const;
90 
91  std::vector<FieldT> get_vals(const protoboard<FieldT> &pb) const;
92  libff::bit_vector get_bits(const protoboard<FieldT> &pb) const;
93 
94  FieldT get_field_element_from_bits(const protoboard<FieldT> &pb) const;
95 };
96 
97 /* index 0 corresponds to the constant term (used in legacy code) */
98 #define ONE pb_variable<FieldT>(0)
99 
100 template<typename FieldT>
102 {
103 public:
106 
109 
111  void evaluate(protoboard<FieldT> &pb) const;
112 
113  bool is_constant() const;
114  FieldT constant_term() const;
115 };
116 
117 template<typename FieldT>
119  : private std::vector<pb_linear_combination<FieldT>>
120 {
121  typedef std::vector<pb_linear_combination<FieldT>> contents;
122 
123 public:
124  using typename contents::const_iterator;
125  using typename contents::const_reverse_iterator;
126  using typename contents::iterator;
127  using typename contents::reverse_iterator;
128 
129  using contents::begin;
130  using contents::emplace_back;
131  using contents::empty;
132  using contents::end;
133  using contents::insert;
134  using contents::rbegin;
135  using contents::rend;
136  using contents::reserve;
137  using contents::size;
138  using contents::operator[];
139  using contents::resize;
140 
141  pb_linear_combination_array() : contents(){};
143  {
144  for (auto &v : arr)
145  this->emplace_back(pb_linear_combination<FieldT>(v));
146  };
147  pb_linear_combination_array(size_t count) : contents(count){};
149  size_t count, const pb_linear_combination<FieldT> &value)
150  : contents(count, value){};
152  typename contents::const_iterator first,
153  typename contents::const_iterator last)
154  : contents(first, last){};
156  typename contents::const_reverse_iterator first,
157  typename contents::const_reverse_iterator last)
158  : contents(first, last){};
159 
160  void evaluate(protoboard<FieldT> &pb) const;
161 
163  protoboard<FieldT> &pb, const std::vector<FieldT> &vals) const;
164  void fill_with_bits(
165  protoboard<FieldT> &pb, const libff::bit_vector &bits) const;
167  protoboard<FieldT> &pb, const unsigned long i) const;
169  protoboard<FieldT> &pb, const FieldT &r) const;
170 
171  std::vector<FieldT> get_vals(const protoboard<FieldT> &pb) const;
172  libff::bit_vector get_bits(const protoboard<FieldT> &pb) const;
173 
174  FieldT get_field_element_from_bits(const protoboard<FieldT> &pb) const;
175 };
176 
177 template<typename FieldT>
178 linear_combination<FieldT> pb_sum(const pb_linear_combination_array<FieldT> &v);
179 
180 template<typename FieldT>
181 linear_combination<FieldT> pb_packing_sum(
182  const pb_linear_combination_array<FieldT> &v);
183 
184 template<typename FieldT>
185 linear_combination<FieldT> pb_coeff_sum(
186  const pb_linear_combination_array<FieldT> &v,
187  const std::vector<FieldT> &coeffs);
188 
189 } // namespace libsnark
191 
192 #endif // PB_VARIABLE_HPP_
libsnark::pb_variable_array::allocate
void allocate(protoboard< FieldT > &pb, const size_t n, const std::string &annotation_prefix)
libsnark::linear_combination
Definition: variable.hpp:40
libsnark::pb_linear_combination::constant_term
FieldT constant_term() const
pb_variable.tcc
libsnark::pb_linear_combination_array::get_field_element_from_bits
FieldT get_field_element_from_bits(const protoboard< FieldT > &pb) const
libsnark::pb_variable_array::pb_variable_array
pb_variable_array(typename contents::const_iterator first, typename contents::const_iterator last)
Definition: pb_variable.hpp:69
libsnark::pb_variable_array::fill_with_field_elements
void fill_with_field_elements(protoboard< FieldT > &pb, const std::vector< FieldT > &vals) const
libsnark::pb_linear_combination_array::get_bits
libff::bit_vector get_bits(const protoboard< FieldT > &pb) const
libsnark
Definition: accumulation_vector.hpp:18
libsnark::variable::index
var_index_t index
Definition: variable.hpp:50
libsnark::pb_variable::allocate
void allocate(protoboard< FieldT > &pb, const std::string &annotation)
libsnark::variable
Definition: variable.hpp:47
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array(const pb_variable_array< FieldT > &arr)
Definition: pb_variable.hpp:142
libsnark::lc_index_t
size_t lc_index_t
Definition: pb_variable.hpp:20
libsnark::var_index_t
size_t var_index_t
Definition: variable.hpp:29
libsnark::pb_variable_array::get_field_element_from_bits
FieldT get_field_element_from_bits(const protoboard< FieldT > &pb) const
libsnark::pb_linear_combination_array::fill_with_bits_of_ulong
void fill_with_bits_of_ulong(protoboard< FieldT > &pb, const unsigned long i) const
variable.hpp
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array(size_t count)
Definition: pb_variable.hpp:147
libsnark::pb_linear_combination::is_constant
bool is_constant() const
libsnark::pb_variable_array::fill_with_bits_of_field_element
void fill_with_bits_of_field_element(protoboard< FieldT > &pb, const FieldT &r) const
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array()
Definition: pb_variable.hpp:141
libsnark::pb_variable_array::pb_variable_array
pb_variable_array()
Definition: pb_variable.hpp:66
libsnark::pb_sum
linear_combination< FieldT > pb_sum(const pb_linear_combination_array< FieldT > &v)
libsnark::pb_variable_array::get_vals
std::vector< FieldT > get_vals(const protoboard< FieldT > &pb) const
libsnark::pb_linear_combination::index
lc_index_t index
Definition: pb_variable.hpp:105
libsnark::pb_variable::pb_variable
pb_variable(const var_index_t index=0)
Definition: pb_variable.hpp:27
libsnark::pb_linear_combination_array
Definition: pb_variable.hpp:118
libsnark::pb_linear_combination
Definition: pb_variable.hpp:101
libsnark::pb_coeff_sum
linear_combination< FieldT > pb_coeff_sum(const pb_linear_combination_array< FieldT > &v, const std::vector< FieldT > &coeffs)
libsnark::pb_variable_array::fill_with_bits
void fill_with_bits(protoboard< FieldT > &pb, const libff::bit_vector &bits) const
libsnark::pb_packing_sum
linear_combination< FieldT > pb_packing_sum(const pb_linear_combination_array< FieldT > &v)
libsnark::pb_variable_array::fill_with_bits_of_ulong
void fill_with_bits_of_ulong(protoboard< FieldT > &pb, const unsigned long i) const
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array(typename contents::const_iterator first, typename contents::const_iterator last)
Definition: pb_variable.hpp:151
libsnark::pb_variable_allocate
pb_variable< FieldT > pb_variable_allocate(protoboard< FieldT > &pb, const std::string &annotation)
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::pb_linear_combination_array::fill_with_bits
void fill_with_bits(protoboard< FieldT > &pb, const libff::bit_vector &bits) const
libsnark::pb_linear_combination_array::get_vals
std::vector< FieldT > get_vals(const protoboard< FieldT > &pb) const
libsnark::pb_variable_array
Definition: pb_variable.hpp:44
libsnark::pb_variable_array::pb_variable_array
pb_variable_array(size_t count, const pb_variable< FieldT > &value)
Definition: pb_variable.hpp:67
libsnark::pb_linear_combination_array::evaluate
void evaluate(protoboard< FieldT > &pb) const
libsnark::pb_linear_combination::is_variable
bool is_variable
Definition: pb_variable.hpp:104
libsnark::pb_linear_combination::pb_linear_combination
pb_linear_combination()
libsnark::pb_linear_combination::assign
void assign(protoboard< FieldT > &pb, const linear_combination< FieldT > &lc)
libsnark::pb_variable_array::pb_variable_array
pb_variable_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last)
Definition: pb_variable.hpp:73
libsnark::pb_variable_array::get_bits
libff::bit_vector get_bits(const protoboard< FieldT > &pb) const
libsnark::pb_linear_combination_array::fill_with_field_elements
void fill_with_field_elements(protoboard< FieldT > &pb, const std::vector< FieldT > &vals) const
libsnark::pb_linear_combination_array::fill_with_bits_of_field_element
void fill_with_bits_of_field_element(protoboard< FieldT > &pb, const FieldT &r) const
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last)
Definition: pb_variable.hpp:155
libsnark::pb_linear_combination::evaluate
void evaluate(protoboard< FieldT > &pb) const
libsnark::pb_linear_combination_array::pb_linear_combination_array
pb_linear_combination_array(size_t count, const pb_linear_combination< FieldT > &value)
Definition: pb_variable.hpp:148
libsnark::protoboard
Definition: pb_variable.hpp:22