Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
variable.hpp
Go to the documentation of this file.
1 
15 #ifndef VARIABLE_HPP_
16 #define VARIABLE_HPP_
17 
18 #include <cstddef>
19 #include <map>
20 #include <string>
21 #include <vector>
22 
23 namespace libsnark
24 {
25 
29 typedef size_t var_index_t;
30 typedef long integer_coeff_t;
31 
35 template<typename FieldT> class linear_term;
36 
40 template<typename FieldT> class linear_combination;
41 
42 /********************************* Variable **********************************/
43 
47 template<typename FieldT> class variable
48 {
49 public:
51 
53 
54  linear_term<FieldT> operator*(const integer_coeff_t int_coeff) const;
55  linear_term<FieldT> operator*(const FieldT &field_coeff) const;
56 
58  const linear_combination<FieldT> &other) const;
60  const linear_combination<FieldT> &other) const;
61 
63 
64  bool operator==(const variable<FieldT> &other) const;
65 };
66 
67 template<typename FieldT>
68 linear_term<FieldT> operator*(
69  const integer_coeff_t int_coeff, const variable<FieldT> &var);
70 
71 template<typename FieldT>
72 linear_term<FieldT> operator*(
73  const FieldT &field_coeff, const variable<FieldT> &var);
74 
75 template<typename FieldT>
76 linear_combination<FieldT> operator+(
77  const integer_coeff_t int_coeff, const variable<FieldT> &var);
78 
79 template<typename FieldT>
80 linear_combination<FieldT> operator+(
81  const FieldT &field_coeff, const variable<FieldT> &var);
82 
83 template<typename FieldT>
84 linear_combination<FieldT> operator-(
85  const integer_coeff_t int_coeff, const variable<FieldT> &var);
86 
87 template<typename FieldT>
88 linear_combination<FieldT> operator-(
89  const FieldT &field_coeff, const variable<FieldT> &var);
90 
91 /****************************** Linear term **********************************/
92 
96 template<typename FieldT> class linear_term
97 {
98 public:
100  FieldT coeff;
101 
103  linear_term(const variable<FieldT> &var);
104  linear_term(const variable<FieldT> &var, const integer_coeff_t int_coeff);
105  linear_term(const variable<FieldT> &var, const FieldT &field_coeff);
106 
107  linear_term<FieldT> operator*(const integer_coeff_t int_coeff) const;
108  linear_term<FieldT> operator*(const FieldT &field_coeff) const;
109 
111  const linear_combination<FieldT> &other) const;
113  const linear_combination<FieldT> &other) const;
114 
116 
117  bool operator==(const linear_term<FieldT> &other) const;
118 };
119 
120 template<typename FieldT>
121 linear_term<FieldT> operator*(
122  const integer_coeff_t int_coeff, const linear_term<FieldT> &lt);
123 
124 template<typename FieldT>
125 linear_term<FieldT> operator*(
126  const FieldT &field_coeff, const linear_term<FieldT> &lt);
127 
128 template<typename FieldT>
129 linear_combination<FieldT> operator+(
130  const integer_coeff_t int_coeff, const linear_term<FieldT> &lt);
131 
132 template<typename FieldT>
133 linear_combination<FieldT> operator+(
134  const FieldT &field_coeff, const linear_term<FieldT> &lt);
135 
136 template<typename FieldT>
137 linear_combination<FieldT> operator-(
138  const integer_coeff_t int_coeff, const linear_term<FieldT> &lt);
139 
140 template<typename FieldT>
141 linear_combination<FieldT> operator-(
142  const FieldT &field_coeff, const linear_term<FieldT> &lt);
143 
144 /***************************** Linear combination ****************************/
145 
146 template<typename FieldT> class linear_combination;
147 
148 template<typename FieldT>
149 std::ostream &operator<<(
150  std::ostream &out, const linear_combination<FieldT> &lc);
151 
152 template<typename FieldT>
153 std::istream &operator>>(std::istream &in, linear_combination<FieldT> &lc);
154 
159 template<typename FieldT> class linear_combination
160 {
161 public:
162  std::vector<linear_term<FieldT>> terms;
163 
165  linear_combination(const integer_coeff_t int_coeff);
166  linear_combination(const FieldT &field_coeff);
169  linear_combination(const std::vector<linear_term<FieldT>> &all_terms);
170 
171  /* for supporting range-based for loops over linear_combination */
172  typename std::vector<linear_term<FieldT>>::const_iterator begin() const;
173  typename std::vector<linear_term<FieldT>>::const_iterator end() const;
174 
175  void add_term(const variable<FieldT> &var);
176  void add_term(const variable<FieldT> &var, const integer_coeff_t int_coeff);
177  void add_term(const variable<FieldT> &var, const FieldT &field_coeff);
178 
179  void add_term(const linear_term<FieldT> &lt);
180 
181  FieldT evaluate(const std::vector<FieldT> &assignment) const;
182 
184  linear_combination<FieldT> operator*(const FieldT &field_coeff) const;
185 
187  const linear_combination<FieldT> &other) const;
188 
190  const linear_combination<FieldT> &other) const;
192 
193  bool operator==(const linear_combination<FieldT> &other) const;
194 
195  bool is_valid(const size_t num_variables) const;
196 
197  void print(
198  const std::map<size_t, std::string> &variable_annotations =
199  std::map<size_t, std::string>()) const;
201  const std::vector<FieldT> &full_assignment,
202  const std::map<size_t, std::string> &variable_annotations =
203  std::map<size_t, std::string>()) const;
204 
205  friend std::ostream &operator<<<FieldT>(
206  std::ostream &out, const linear_combination<FieldT> &lc);
207  friend std::istream &operator>>
208  <FieldT>(std::istream &in, linear_combination<FieldT> &lc);
209 };
210 
211 template<typename FieldT>
212 linear_combination<FieldT> operator*(
213  const integer_coeff_t int_coeff, const linear_combination<FieldT> &lc);
214 
215 template<typename FieldT>
216 linear_combination<FieldT> operator*(
217  const FieldT &field_coeff, const linear_combination<FieldT> &lc);
218 
219 template<typename FieldT>
220 linear_combination<FieldT> operator+(
221  const integer_coeff_t int_coeff, const linear_combination<FieldT> &lc);
222 
223 template<typename FieldT>
224 linear_combination<FieldT> operator+(
225  const FieldT &field_coeff, const linear_combination<FieldT> &lc);
226 
227 template<typename FieldT>
228 linear_combination<FieldT> operator-(
229  const integer_coeff_t int_coeff, const linear_combination<FieldT> &lc);
230 
231 template<typename FieldT>
232 linear_combination<FieldT> operator-(
233  const FieldT &field_coeff, const linear_combination<FieldT> &lc);
234 
235 } // namespace libsnark
236 
238 
239 #endif // VARIABLE_HPP_
libsnark::linear_combination::begin
std::vector< linear_term< FieldT > >::const_iterator begin() const
libsnark::linear_term
Definition: variable.hpp:35
libsnark::linear_combination::add_term
void add_term(const variable< FieldT > &var)
libsnark::linear_combination::is_valid
bool is_valid(const size_t num_variables) const
libsnark::linear_combination
Definition: variable.hpp:40
libsnark::variable::operator==
bool operator==(const variable< FieldT > &other) const
libsnark
Definition: accumulation_vector.hpp:18
libsnark::operator<<
std::ostream & operator<<(std::ostream &out, const accumulation_vector< T > &v)
libsnark::variable::index
var_index_t index
Definition: variable.hpp:50
libsnark::linear_term::operator*
linear_term< FieldT > operator*(const integer_coeff_t int_coeff) const
libsnark::linear_term::operator==
bool operator==(const linear_term< FieldT > &other) const
libsnark::linear_term::index
var_index_t index
Definition: variable.hpp:99
libsnark::variable
Definition: variable.hpp:47
libsnark::linear_combination::print
void print(const std::map< size_t, std::string > &variable_annotations=std::map< size_t, std::string >()) const
libsnark::var_index_t
size_t var_index_t
Definition: variable.hpp:29
libsnark::linear_term::operator+
linear_combination< FieldT > operator+(const linear_combination< FieldT > &other) const
libsnark::linear_term::coeff
FieldT coeff
Definition: variable.hpp:100
libsnark::linear_combination::operator*
linear_combination< FieldT > operator*(const integer_coeff_t int_coeff) const
libsnark::linear_combination::operator==
bool operator==(const linear_combination< FieldT > &other) const
libsnark::operator*
knowledge_commitment< T1, T2 > operator*(const libff::bigint< m > &lhs, const knowledge_commitment< T1, T2 > &rhs)
variable.tcc
libsnark::variable::operator*
linear_term< FieldT > operator*(const integer_coeff_t int_coeff) const
libsnark::variable::operator-
linear_term< FieldT > operator-() const
libsnark::operator>>
std::istream & operator>>(std::istream &in, accumulation_vector< T > &v)
libsnark::integer_coeff_t
long integer_coeff_t
Definition: variable.hpp:30
libsnark::operator-
linear_combination< FieldT > operator-(const integer_coeff_t int_coeff, const variable< FieldT > &var)
libsnark::linear_combination::print_with_assignment
void print_with_assignment(const std::vector< FieldT > &full_assignment, const std::map< size_t, std::string > &variable_annotations=std::map< size_t, std::string >()) const
libsnark::linear_combination::linear_combination
linear_combination()
Definition: variable.hpp:164
libsnark::variable::operator+
linear_combination< FieldT > operator+(const linear_combination< FieldT > &other) const
libsnark::variable::variable
variable(const var_index_t index=0)
Definition: variable.hpp:52
libsnark::linear_combination::evaluate
FieldT evaluate(const std::vector< FieldT > &assignment) const
libsnark::operator+
linear_combination< FieldT > operator+(const integer_coeff_t int_coeff, const variable< FieldT > &var)
libsnark::linear_term::operator-
linear_term< FieldT > operator-() const
libsnark::linear_term::linear_term
linear_term()
Definition: variable.hpp:102
libsnark::linear_combination::end
std::vector< linear_term< FieldT > >::const_iterator end() const
libsnark::linear_combination::operator+
linear_combination< FieldT > operator+(const linear_combination< FieldT > &other) const
libsnark::linear_combination::terms
std::vector< linear_term< FieldT > > terms
Definition: variable.hpp:162
libsnark::linear_combination::operator-
linear_combination< FieldT > operator-() const