Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
variable.hpp
Go to the documentation of this file.
1 
10 #ifndef LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_VARIABLE_HPP_
11 #define LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_VARIABLE_HPP_
12 
13 #include <cstddef>
14 #include <iostream>
17 #include <map>
18 #include <set>
19 #include <string>
20 #include <unordered_set>
21 #include <utility>
22 #include <vector>
23 
24 namespace gadgetlib2
25 {
26 
27 class GadgetLibAdapter;
28 
29 // Forward declarations
30 class Protoboard;
31 class FElemInterface;
32 class FElem;
33 class FConst;
34 class Variable;
35 class VariableArray;
36 
37 typedef enum { R1P, AGNOSTIC } FieldType;
38 
39 typedef ::std::shared_ptr<Variable> VariablePtr;
40 typedef ::std::shared_ptr<VariableArray> VariableArrayPtr;
41 typedef ::std::unique_ptr<FElemInterface> FElemInterfacePtr;
42 typedef ::std::shared_ptr<Protoboard> ProtoboardPtr;
43 typedef unsigned long VarIndex_t;
44 
45 // Naming Conventions:
46 // R1P == Rank 1 Prime characteristic
47 
54 {
55 public:
56  virtual FElemInterface &operator=(const long n) = 0;
60  virtual FElemInterface &operator=(const FConst &src) = 0;
61  virtual ::std::string asString() const = 0;
62  virtual FieldType fieldType() const = 0;
63  virtual FElemInterface &operator+=(const FElemInterface &other) = 0;
64  virtual FElemInterface &operator-=(const FElemInterface &other) = 0;
65  virtual FElemInterface &operator*=(const FElemInterface &other) = 0;
66  virtual bool operator==(const FElemInterface &other) const = 0;
67  virtual bool operator==(const FConst &other) const = 0;
71  virtual bool operator==(const long n) const = 0;
73  virtual FElemInterfacePtr clone() const = 0;
74  virtual FElemInterfacePtr inverse() const = 0;
75  virtual long asLong() const = 0;
76  virtual int getBit(unsigned int i) const = 0;
77  virtual FElemInterface &power(long exponent) = 0;
78  virtual ~FElemInterface(){};
79 }; // class FElemInterface
80 
81 inline bool operator==(const long first, const FElemInterface &second)
82 {
83  return second == first;
84 }
85 inline bool operator!=(const long first, const FElemInterface &second)
86 {
87  return !(first == second);
88 }
89 inline bool operator!=(const FElemInterface &first, const long second)
90 {
91  return !(first == second);
92 }
93 inline bool operator!=(
94  const FElemInterface &first, const FElemInterface &second)
95 {
96  return !(first == second);
97 }
98 
101 class FElem
102 {
103 private:
104  FElemInterfacePtr elem_;
105 
106 public:
107  explicit FElem(const FElemInterface &elem);
112  void promoteToFieldType(FieldType type);
113  FElem();
114  FElem(const long n);
115  FElem(const int i);
116  FElem(const size_t n);
117  FElem(const Fp &elem);
118  FElem(const FElem &src);
119 
120  FElem &operator=(const FElem &other);
121  FElem &operator=(FElem &&other);
122  FElem &operator=(const long i)
123  {
124  *elem_ = i;
125  return *this;
126  }
127  ::std::string asString() const { return elem_->asString(); }
128  FieldType fieldType() const { return elem_->fieldType(); }
129  bool operator==(const FElem &other) const { return *elem_ == *other.elem_; }
130  FElem &operator*=(const FElem &other);
131  FElem &operator+=(const FElem &other);
132  FElem &operator-=(const FElem &other);
133  FElem operator-() const
134  {
135  FElem retval(0);
136  retval -= FElem(*elem_);
137  return retval;
138  }
140  long asLong() const { return elem_->asLong(); }
141  int getBit(unsigned int i, const FieldType &fieldType);
142  friend FElem power(const FElem &base, long exponent);
143 
144  inline friend ::std::ostream &operator<<(
145  ::std::ostream &os, const FElem &elem)
146  {
147  return os << elem.elem_->asString();
148  }
149 
150  friend class GadgetLibAdapter;
151 }; // class FElem
152 
153 inline bool operator!=(const FElem &first, const FElem &second)
154 {
155  return !(first == second);
156 }
157 
161 inline bool operator==(const FElem &first, const long second)
162 {
163  return first == FElem(second);
164 }
165 inline bool operator==(const long first, const FElem &second)
166 {
167  return second == first;
168 }
169 inline bool operator!=(const FElem &first, const long second)
170 {
171  return !(first == second);
172 }
173 inline bool operator!=(const long first, const FElem &second)
174 {
175  return !(first == second);
176 }
177 
189 class FConst : public FElemInterface
190 {
191 private:
192  long contents_;
193  explicit FConst(const long n) : contents_(n) {}
194 
195 public:
196  FConst(const FConst &src) : contents_(src.contents_) {}
197  virtual FConst &operator=(const long n)
198  {
199  contents_ = n;
200  return *this;
201  }
202  virtual FConst &operator=(const FConst &src)
203  {
204  contents_ = src.contents_;
205  return *this;
206  }
207  virtual ::std::string asString() const
208  {
209  return GADGETLIB2_FMT("%ld", contents_);
210  }
211  virtual FieldType fieldType() const { return AGNOSTIC; }
212  virtual FConst &operator+=(const FElemInterface &other);
213  virtual FConst &operator-=(const FElemInterface &other);
214  virtual FConst &operator*=(const FElemInterface &other);
215  virtual bool operator==(const FElemInterface &other) const
216  {
217  return other == *this;
218  }
219  virtual bool operator==(const FConst &other) const
220  {
221  return contents_ == other.contents_;
222  }
223  virtual bool operator==(const long n) const { return contents_ == n; }
225  virtual FElemInterfacePtr clone() const
226  {
227  return FElemInterfacePtr(new FConst(*this));
228  }
231  virtual FElemInterfacePtr inverse() const;
232  long asLong() const { return contents_; }
233  int getBit(unsigned int i) const
234  {
235  libff::UNUSED(i);
236  GADGETLIB_FATAL("Cannot get bit from FConst.");
237  }
238  virtual FElemInterface &power(long exponent);
239 
240  friend class FElem; // allow constructor call
241 }; // class FConst
242 
245 class R1P_Elem : public FElemInterface
246 {
247 private:
248  Fp elem_;
249 
250 public:
251  explicit R1P_Elem(const Fp &elem) : elem_(elem) {}
252  virtual R1P_Elem &operator=(const FConst &src)
253  {
254  elem_ = src.asLong();
255  return *this;
256  }
257  virtual R1P_Elem &operator=(const long n)
258  {
259  elem_ = Fp(n);
260  return *this;
261  }
262  virtual ::std::string asString() const
263  {
264  return GADGETLIB2_FMT("%u", elem_.as_ulong());
265  }
266  virtual FieldType fieldType() const { return R1P; }
267  virtual R1P_Elem &operator+=(const FElemInterface &other);
268  virtual R1P_Elem &operator-=(const FElemInterface &other);
269  virtual R1P_Elem &operator*=(const FElemInterface &other);
270  virtual bool operator==(const FElemInterface &other) const;
271  virtual bool operator==(const FConst &other) const
272  {
273  return elem_ == Fp(other.asLong());
274  }
275  virtual bool operator==(const long n) const { return elem_ == Fp(n); }
277  virtual FElemInterfacePtr clone() const
278  {
279  return FElemInterfacePtr(new R1P_Elem(*this));
280  }
283  virtual FElemInterfacePtr inverse() const;
284  long asLong() const;
285  int getBit(unsigned int i) const { return elem_.as_bigint().test_bit(i); }
286  virtual FElemInterface &power(long exponent)
287  {
288  elem_ ^= exponent;
289  return *this;
290  }
291 
292  friend class FElem; // allow constructor call
293  friend class GadgetLibAdapter;
294 };
295 
306 class Variable
307 {
308 private:
309  VarIndex_t index_;
310  static VarIndex_t nextFreeIndex_;
312 #ifdef DEBUG
314  ::std::string name_;
315 #endif
316 
320 public:
321  explicit Variable(const ::std::string &name = "");
322  virtual ~Variable();
323 
324  ::std::string name() const;
325 
330  bool operator()(const Variable &first, const Variable &second) const
331  {
332  return first.index_ < second.index_;
333  }
334  };
335 
336  typedef ::std::map<Variable, FElem, Variable::VariableStrictOrder>
338  FElem eval(const VariableAssignment &assignment) const;
339 
341  typedef ::std::set<Variable, VariableStrictOrder> set;
342  typedef ::std::multiset<Variable, VariableStrictOrder> multiset;
343 
344  friend class GadgetLibAdapter;
345 }; // class Variable
346 
347 typedef ::std::map<Variable, FElem, Variable::VariableStrictOrder>
349 
350 typedef ::std::vector<Variable> VariableArrayContents;
351 
354 {
355 private:
356 #ifdef DEBUG
357  ::std::string name_;
358 #endif
359 public:
360  explicit VariableArray(const ::std::string &name = "");
361  explicit VariableArray(const int size, const ::std::string &name = "");
362  explicit VariableArray(const size_t size, const ::std::string &name = "");
363  explicit VariableArray(const size_t size, const Variable &contents)
364  : VariableArrayContents(size, contents)
365  {
366  }
367 
368  using VariableArrayContents::operator[];
369  using VariableArrayContents::at;
370  using VariableArrayContents::push_back;
371  using VariableArrayContents::size;
372 
373  ::std::string name() const;
374 }; // class VariableArray
375 
380 
386 
390 {
391 public:
393  UnpackedWord(const size_t numBits, const ::std::string &name)
394  : VariableArray(numBits, name)
395  {
396  }
397 }; // class UnpackedWord
398 
399 typedef ::std::vector<UnpackedWord> UnpackedWordArray;
400 
405 {
406 private:
407  size_t numBits_;
408  FieldType fieldType_;
409  size_t getMultipackedSize() const;
410 
411 public:
412  MultiPackedWord(const FieldType &fieldType = AGNOSTIC);
414  const size_t numBits,
415  const FieldType &fieldType,
416  const ::std::string &name);
417  void resize(const size_t numBits);
418  ::std::string name() const { return VariableArray::name(); }
419 }; // class MultiPackedWord
420 
421 typedef ::std::vector<MultiPackedWord> MultiPackedWordArray;
422 
424 class DualWord
425 {
426 private:
427  MultiPackedWord multipacked_;
428  UnpackedWord unpacked_;
429 
430 public:
431  DualWord(const FieldType &fieldType) : multipacked_(fieldType), unpacked_()
432  {
433  }
434  DualWord(
435  const size_t numBits,
436  const FieldType &fieldType,
437  const ::std::string &name);
439  MultiPackedWord multipacked() const { return multipacked_; }
440  UnpackedWord unpacked() const { return unpacked_; }
441  FlagVariable bit(size_t i) const
442  {
443  return unpacked_[i];
444  } // syntactic sugar, same as unpacked()[i]
445  size_t numBits() const { return unpacked_.size(); }
446  void resize(size_t newSize);
447 }; // class DualWord
448 
450 {
451 private:
452  // kept as 2 separate arrays because the more common usecase will be to
453  // request one of these, and not dereference a specific DualWord
454  MultiPackedWordArray multipackedContents_;
455  UnpackedWordArray unpackedContents_;
456  size_t numElements_;
457 
458 public:
459  DualWordArray(const FieldType &fieldType);
461  const MultiPackedWordArray &multipackedContents, // TODO delete, for dev
462  const UnpackedWordArray &unpackedContents);
464  UnpackedWordArray unpacked() const;
465  // For cases in which we can assume each unpacked value fits < in 1 packed
466  // Variable
467  PackedWordArray packed() const;
468  void push_back(const DualWord &dualWord);
469  DualWord at(size_t i) const;
470  size_t size() const;
471 }; // class DualWordArray
472 
475 {
476 private:
477  Variable variable_;
478  FElem coeff_;
479 
480 public:
481  LinearTerm(const Variable &v) : variable_(v), coeff_(1) {}
482  LinearTerm(const Variable &v, const FElem &coeff)
483  : variable_(v), coeff_(coeff)
484  {
485  }
486  LinearTerm(const Variable &v, long n) : variable_(v), coeff_(n) {}
487  LinearTerm operator-() const { return LinearTerm(variable_, -coeff_); }
488  LinearTerm &operator*=(const FElem &other)
489  {
490  coeff_ *= other;
491  return *this;
492  }
493  FieldType fieldtype() const { return coeff_.fieldType(); }
494  ::std::string asString() const;
495  FElem eval(const VariableAssignment &assignment) const;
496  Variable variable() const { return variable_; }
497 
498  friend class Monomial;
499  friend class GadgetLibAdapter;
500 }; // class LinearTerm
501 
504 {
505 protected:
506  ::std::vector<LinearTerm> linearTerms_;
508  typedef ::std::vector<LinearTerm>::size_type size_type;
509 
510 public:
513  {
514  }
516  : linearTerms_(1, linTerm), constant_(0)
517  {
518  }
520  LinearCombination(const FElem &elem) : linearTerms_(), constant_(elem) {}
521 
524  LinearCombination &operator*=(const FElem &other);
525  FElem eval(const VariableAssignment &assignment) const;
526  ::std::string asString() const;
527  const Variable::set getUsedVariables() const;
528 
529  friend class Polynomial;
530  friend class GadgetLibAdapter;
531 }; // class LinearCombination
532 
534 {
535  return LinearCombination(0) -= lc;
536 }
537 
538 LinearCombination sum(const VariableArray &inputs);
539 // TODO : change this to member function
540 LinearCombination negate(const LinearCombination &lc);
541 
543 class Monomial
544 {
545 private:
546  FElem coeff_;
547  // currently just a vector of variables. This can surely be optimized e.g.
548  // hold a variable-degree pair but is not needed for concrete efficiency as
549  // we will only be invoking degree 2 constraints in the near future.
550  Variable::multiset variables_;
551 
552 public:
553  Monomial(const Variable &var) : coeff_(1), variables_()
554  {
555  variables_.insert(var);
556  }
557  Monomial(const Variable &var, const FElem &coeff)
558  : coeff_(coeff), variables_()
559  {
560  variables_.insert(var);
561  }
562  Monomial(const FElem &val) : coeff_(val), variables_() {}
563  Monomial(const LinearTerm &linearTerm);
564 
565  FElem eval(const VariableAssignment &assignment) const;
566  const Variable::set getUsedVariables() const;
567  const FElem getCoefficient() const;
568  ::std::string asString() const;
569  Monomial operator-() const;
570  Monomial &operator*=(const Monomial &other);
571 }; // class Monomial
572 
575 {
576 private:
577  ::std::vector<Monomial> monomials_;
578  FElem constant_;
579 
580 public:
581  Polynomial() : monomials_(), constant_(0) {}
582  Polynomial(const Monomial &monomial) : monomials_(1, monomial), constant_(0)
583  {
584  }
585  Polynomial(const Variable &var) : monomials_(1, Monomial(var)), constant_(0)
586  {
587  }
588  Polynomial(const FElem &val) : monomials_(), constant_(val) {}
589  Polynomial(const LinearCombination &linearCombination);
590  Polynomial(const LinearTerm &linearTerm)
591  : monomials_(1, Monomial(linearTerm)), constant_(0)
592  {
593  }
594  Polynomial(int i) : monomials_(), constant_(i) {}
595 
596  FElem eval(const VariableAssignment &assignment) const;
597  const Variable::set getUsedVariables() const;
598  const std::vector<Monomial> &getMonomials() const;
599  const FElem getConstant() const;
600  ::std::string asString() const;
601  Polynomial &operator+=(const Polynomial &other);
602  Polynomial &operator*=(const Polynomial &other);
603  Polynomial &operator-=(const Polynomial &other);
605  {
606  return *this += Polynomial(Monomial(other));
607  }
608 }; // class Polynomial
609 
610 inline Polynomial operator-(const Polynomial &src)
611 {
612  return Polynomial(FElem(0)) -= src;
613 }
614 
615 } // namespace gadgetlib2
616 
618 
619 #endif // LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_VARIABLE_HPP_
gadgetlib2::Polynomial::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:712
gadgetlib2::DualWord
Holds both representations of a word, both multipacked and unpacked.
Definition: variable.hpp:424
gadgetlib2::FElemInterface::inverse
virtual FElemInterfacePtr inverse() const =0
gadgetlib2::Polynomial::Polynomial
Polynomial()
Definition: variable.hpp:581
gadgetlib2::FConst::operator-=
virtual FConst & operator-=(const FElemInterface &other)
Definition: variable.cpp:164
gadgetlib2::LinearCombination::operator+=
LinearCombination & operator+=(const LinearCombination &other)
Definition: variable.cpp:544
gadgetlib2::LinearCombination::asString
::std::string asString() const
Definition: variable.cpp:581
gadgetlib2::LinearTerm::operator*=
LinearTerm & operator*=(const FElem &other)
Definition: variable.hpp:488
gadgetlib2::GadgetLibAdapter
Definition: adapters.hpp:37
gadgetlib2::Monomial::getUsedVariables
const Variable::set getUsedVariables() const
Definition: variable.cpp:650
gadgetlib2::FElemInterface::getBit
virtual int getBit(unsigned int i) const =0
gadgetlib2::LinearCombination::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:572
gadgetlib2::FConst::operator=
virtual FConst & operator=(const FConst &src)
Definition: variable.hpp:202
gadgetlib2::FElemInterface::power
virtual FElemInterface & power(long exponent)=0
gadgetlib2::VariableArrayContents
::std::vector< Variable > VariableArrayContents
Definition: variable.hpp:350
gadgetlib2::MultiPackedWord::MultiPackedWord
MultiPackedWord(const FieldType &fieldType=AGNOSTIC)
Definition: variable.cpp:383
gadgetlib2::FConst::asString
virtual ::std::string asString() const
Definition: variable.hpp:207
gadgetlib2::FConst::operator+=
virtual FConst & operator+=(const FElemInterface &other)
Definition: variable.cpp:158
gadgetlib2::R1P_Elem::asLong
long asLong() const
Definition: variable.cpp:253
gadgetlib2::Polynomial::getConstant
const FElem getConstant() const
Definition: variable.cpp:733
gadgetlib2::LinearTerm::LinearTerm
LinearTerm(const Variable &v)
Definition: variable.hpp:481
gadgetlib2::FElemInterface::asString
virtual ::std::string asString() const =0
gadgetlib2::LinearCombination::LinearCombination
LinearCombination(const Variable &var)
Definition: variable.hpp:512
gadgetlib2::LinearTerm::operator-
LinearTerm operator-() const
Definition: variable.hpp:487
gadgetlib2::Polynomial::operator+=
Polynomial & operator+=(const LinearTerm &other)
Definition: variable.hpp:604
gadgetlib2::GADGETLIB2_FMT
::std::string GADGETLIB2_FMT(const char *format,...)
Definition: infrastructure.cpp:49
gadgetlib2::FConst::operator==
virtual bool operator==(const long n) const
Definition: variable.hpp:223
gadgetlib2::Polynomial::Polynomial
Polynomial(int i)
Definition: variable.hpp:594
gadgetlib2::FElem::operator-=
FElem & operator-=(const FElem &other)
Definition: variable.cpp:115
gadgetlib2::FConst::power
virtual FElemInterface & power(long exponent)
Definition: variable.cpp:181
gadgetlib2::LinearCombination::operator-=
LinearCombination & operator-=(const LinearCombination &other)
Definition: variable.cpp:554
gadgetlib2::FElem::promoteToFieldType
void promoteToFieldType(FieldType type)
Definition: variable.cpp:86
gadgetlib2::DualWordArray::packed
PackedWordArray packed() const
Definition: variable.cpp:462
gadgetlib2::Variable::Variable
Variable(const ::std::string &name="")
allocates the variable
Definition: variable.cpp:283
gadgetlib2::VarIndex_t
unsigned long VarIndex_t
Definition: variable.hpp:43
gadgetlib2::VariableArray::VariableArray
VariableArray(const size_t size, const Variable &contents)
Definition: variable.hpp:363
gadgetlib2::R1P_Elem::operator=
virtual R1P_Elem & operator=(const long n)
Definition: variable.hpp:257
gadgetlib2::Variable::name
::std::string name() const
Definition: variable.cpp:297
gadgetlib2::LinearTerm
LinearTerm.
Definition: variable.hpp:474
infrastructure.hpp
gadgetlib2::FElem::operator<<
friend ::std::ostream & operator<<(::std::ostream &os, const FElem &elem)
Definition: variable.hpp:144
gadgetlib2::Polynomial::Polynomial
Polynomial(const LinearTerm &linearTerm)
Definition: variable.hpp:590
gadgetlib2::LinearTerm::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:526
gadgetlib2::MultiPackedWordArray
::std::vector< MultiPackedWord > MultiPackedWordArray
Definition: variable.hpp:421
gadgetlib2::FlagVariable
Variable FlagVariable
Definition: variable.hpp:378
gadgetlib2::Polynomial
Polynomial.
Definition: variable.hpp:574
gadgetlib2::FConst::fieldType
virtual FieldType fieldType() const
Definition: variable.hpp:211
gadgetlib2::DualWord::DualWord
DualWord(const FieldType &fieldType)
Definition: variable.hpp:431
gadgetlib2::FElem::FElem
FElem()
Definition: variable.cpp:44
gadgetlib2::Polynomial::operator-=
Polynomial & operator-=(const Polynomial &other)
Definition: variable.cpp:780
gadgetlib2::Monomial::operator*=
Monomial & operator*=(const Monomial &other)
Definition: variable.cpp:685
gadgetlib2::negate
LinearCombination negate(const LinearCombination &lc)
Definition: variable.cpp:625
gadgetlib2::FElemInterface::operator=
virtual FElemInterface & operator=(const long n)=0
gadgetlib2::FieldType
FieldType
Definition: variable.hpp:37
gadgetlib2::FConst::asLong
long asLong() const
Definition: variable.hpp:232
gadgetlib2::operator-
LinearCombination operator-(const LinearCombination &lc)
Definition: variable.hpp:533
gadgetlib2::UnpackedWord::UnpackedWord
UnpackedWord(const size_t numBits, const ::std::string &name)
Definition: variable.hpp:393
gadgetlib2::LinearCombination::size_type
::std::vector< LinearTerm >::size_type size_type
Definition: variable.hpp:508
gadgetlib2::LinearCombination::LinearCombination
LinearCombination(long i)
Definition: variable.hpp:519
gadgetlib2::FElemInterface::operator+=
virtual FElemInterface & operator+=(const FElemInterface &other)=0
gadgetlib2::DualWordArray::multipacked
MultiPackedWordArray multipacked() const
Definition: variable.cpp:457
gadgetlib2::FElemInterface
Definition: variable.hpp:53
gadgetlib2::AGNOSTIC
@ AGNOSTIC
Definition: variable.hpp:37
gadgetlib2::VariableAssignment
::std::map< Variable, FElem, Variable::VariableStrictOrder > VariableAssignment
Definition: variable.hpp:348
gadgetlib2::R1P_Elem::operator-=
virtual R1P_Elem & operator-=(const FElemInterface &other)
Definition: variable.cpp:211
gadgetlib2::Monomial::Monomial
Monomial(const Variable &var)
Definition: variable.hpp:553
gadgetlib2::FConst::operator=
virtual FConst & operator=(const long n)
Definition: variable.hpp:197
gadgetlib2::VariableArray
VariableArray.
Definition: variable.hpp:353
gadgetlib2::VariableArrayPtr
::std::shared_ptr< VariableArray > VariableArrayPtr
Definition: variable.hpp:40
gadgetlib2::Polynomial::operator+=
Polynomial & operator+=(const Polynomial &other)
Definition: variable.cpp:755
gadgetlib2::FConst::inverse
virtual FElemInterfacePtr inverse() const
Definition: variable.cpp:176
gadgetlib2::MultiPackedWord
Definition: variable.hpp:404
gadgetlib2::FElem::asLong
long asLong() const
Definition: variable.hpp:140
gadgetlib2::LinearCombination::operator*=
LinearCombination & operator*=(const FElem &other)
Definition: variable.cpp:563
gadgetlib2::FElemInterface::asLong
virtual long asLong() const =0
gadgetlib2::LinearCombination::constant_
FElem constant_
Definition: variable.hpp:507
gadgetlib2::Variable::VariableAssignment
::std::map< Variable, FElem, Variable::VariableStrictOrder > VariableAssignment
Definition: variable.hpp:337
gadgetlib2::LinearCombination::LinearCombination
LinearCombination(const FElem &elem)
Definition: variable.hpp:520
gadgetlib2::R1P_Elem::operator==
virtual bool operator==(const FElemInterface &other) const
Definition: variable.cpp:235
gadgetlib2::DualWordArray::at
DualWord at(size_t i) const
Definition: variable.cpp:484
gadgetlib2::FElem::power
friend FElem power(const FElem &base, long exponent)
Definition: variable.cpp:139
gadgetlib2::Monomial::getCoefficient
const FElem getCoefficient() const
Definition: variable.cpp:655
gadgetlib2::FElemInterface::operator-=
virtual FElemInterface & operator-=(const FElemInterface &other)=0
GADGETLIB_FATAL
#define GADGETLIB_FATAL(msg)
Definition: infrastructure.hpp:85
gadgetlib2::Monomial::operator-
Monomial operator-() const
Definition: variable.cpp:678
gadgetlib2::PackedWordArray
VariableArray PackedWordArray
Definition: variable.hpp:385
gadgetlib2::UnpackedWordArray
::std::vector< UnpackedWord > UnpackedWordArray
Definition: variable.hpp:399
gadgetlib2::UnpackedWord::UnpackedWord
UnpackedWord()
Definition: variable.hpp:392
gadgetlib2::Monomial::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:641
gadgetlib2::LinearCombination::LinearCombination
LinearCombination(const LinearTerm &linTerm)
Definition: variable.hpp:515
gadgetlib2::MultiPackedWord::resize
void resize(const size_t numBits)
Definition: variable.cpp:397
gadgetlib2::DualWord::resize
void resize(size_t newSize)
Definition: variable.cpp:429
gadgetlib2::LinearTerm::LinearTerm
LinearTerm(const Variable &v, const FElem &coeff)
Definition: variable.hpp:482
gadgetlib2::FElemInterface::clone
virtual FElemInterfacePtr clone() const =0
gadgetlib2::FElemInterface::~FElemInterface
virtual ~FElemInterface()
Definition: variable.hpp:78
gadgetlib2::Variable::set
::std::set< Variable, VariableStrictOrder > set
A set of Variables should be declared as follows: Variable::set s1;.
Definition: variable.hpp:341
gadgetlib2::Monomial::Monomial
Monomial(const Variable &var, const FElem &coeff)
Definition: variable.hpp:557
gadgetlib2::PackedWord
Variable PackedWord
Definition: variable.hpp:384
gadgetlib2::FElem::operator==
bool operator==(const FElem &other) const
Definition: variable.hpp:129
gadgetlib2::Polynomial::getUsedVariables
const Variable::set getUsedVariables() const
Definition: variable.cpp:721
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetlib2::Polynomial::Polynomial
Polynomial(const Monomial &monomial)
Definition: variable.hpp:582
gadgetlib2::R1P_Elem::power
virtual FElemInterface & power(long exponent)
Definition: variable.hpp:286
gadgetlib2::Polynomial::Polynomial
Polynomial(const FElem &val)
Definition: variable.hpp:588
gadgetlib2::FElem::operator=
FElem & operator=(const long i)
Definition: variable.hpp:122
gadgetlib2::UnpackedWord
Definition: variable.hpp:389
gadgetlib2::LinearTerm::LinearTerm
LinearTerm(const Variable &v, long n)
Definition: variable.hpp:486
gadgetlib2::Variable::VariableStrictOrder
Definition: variable.hpp:329
gadgetlib2::DualWordArray::DualWordArray
DualWordArray(const FieldType &fieldType)
Definition: variable.cpp:435
gadgetlib2::R1P_Elem::operator==
virtual bool operator==(const FConst &other) const
Definition: variable.hpp:271
gadgetlib2::operator!=
bool operator!=(const long first, const FElemInterface &second)
Definition: variable.hpp:85
gadgetlib2::FElemInterface::fieldType
virtual FieldType fieldType() const =0
gadgetlib2::R1P_Elem::fieldType
virtual FieldType fieldType() const
Definition: variable.hpp:266
gadgetlib2::FConst::FConst
FConst(const FConst &src)
Definition: variable.hpp:196
gadgetlib2::DualWord::numBits
size_t numBits() const
Definition: variable.hpp:445
gadgetlib2::R1P_Elem::getBit
int getBit(unsigned int i) const
Definition: variable.hpp:285
gadgetlib2::R1P_Elem::operator==
virtual bool operator==(const long n) const
Definition: variable.hpp:275
gadgetlib2::Variable::~Variable
virtual ~Variable()
Definition: variable.cpp:295
gadgetlib2::FConst::operator==
virtual bool operator==(const FConst &other) const
Definition: variable.hpp:219
gadgetlib2::FElemInterfacePtr
::std::unique_ptr< FElemInterface > FElemInterfacePtr
Definition: variable.hpp:41
pp.hpp
gadgetlib2::FElem::fieldType
FieldType fieldType() const
Definition: variable.hpp:128
gadgetlib2::FConst::operator==
virtual bool operator==(const FElemInterface &other) const
Definition: variable.hpp:215
gadgetlib2::FElem::operator+=
FElem & operator+=(const FElem &other)
Definition: variable.cpp:108
gadgetlib2::LinearTerm::variable
Variable variable() const
Definition: variable.hpp:496
gadgetlib2::R1P_Elem::inverse
virtual FElemInterfacePtr inverse() const
Definition: variable.cpp:248
gadgetlib2::FConst
Definition: variable.hpp:189
gadgetlib2::Monomial::Monomial
Monomial(const FElem &val)
Definition: variable.hpp:562
gadgetlib2::VariableArray::name
::std::string name() const
Definition: variable.cpp:353
gadgetlib2::FElem::operator-
FElem operator-() const
Definition: variable.hpp:133
gadgetlib2::R1P_Elem::operator=
virtual R1P_Elem & operator=(const FConst &src)
Definition: variable.hpp:252
gadgetlib2::FElemInterface::operator==
virtual bool operator==(const FElemInterface &other) const =0
gadgetlib2::DualWord::multipacked
MultiPackedWord multipacked() const
Definition: variable.hpp:439
gadgetlib2::Variable
A formal variable, field agnostic.
Definition: variable.hpp:306
gadgetlib2::DualWordArray
Definition: variable.hpp:449
gadgetlib2::FElemInterface::operator*=
virtual FElemInterface & operator*=(const FElemInterface &other)=0
gadgetlib2::FElem::inverse
FElem inverse(const FieldType &fieldType)
Definition: variable.cpp:122
gadgetlib2::MultiPackedWord::name
::std::string name() const
Definition: variable.hpp:418
gadgetlib2::DualWord::unpacked
UnpackedWord unpacked() const
Definition: variable.hpp:440
gadgetlib2::Monomial
Monomial.
Definition: variable.hpp:543
gadgetlib2::R1P_Elem::operator*=
virtual R1P_Elem & operator*=(const FElemInterface &other)
Definition: variable.cpp:223
gadgetlib2::Variable::multiset
::std::multiset< Variable, VariableStrictOrder > multiset
Definition: variable.hpp:342
gadgetlib2::Polynomial::Polynomial
Polynomial(const Variable &var)
Definition: variable.hpp:585
gadgetlib2::FConst::getBit
int getBit(unsigned int i) const
Definition: variable.hpp:233
gadgetlib2::FConst::clone
virtual FElemInterfacePtr clone() const
Definition: variable.hpp:225
gadgetlib2::sum
LinearCombination sum(const VariableArray &inputs)
Definition: variable.cpp:616
gadgetlib2::LinearTerm::asString
::std::string asString() const
Definition: variable.cpp:512
gadgetlib2::operator==
bool operator==(const GLA::linear_combination_t &lhs, const GLA::linear_term_t &rhs)
Definition: adapters.cpp:105
gadgetlib2::LinearCombination::linearTerms_
::std::vector< LinearTerm > linearTerms_
Definition: variable.hpp:506
gadgetlib2::R1P_Elem::R1P_Elem
R1P_Elem(const Fp &elem)
Definition: variable.hpp:251
gadgetlib2::R1P_Elem::operator+=
virtual R1P_Elem & operator+=(const FElemInterface &other)
Definition: variable.cpp:199
gadgetlib2::LinearCombination
LinearCombination.
Definition: variable.hpp:503
gadgetlib2::R1P_Elem::clone
virtual FElemInterfacePtr clone() const
Definition: variable.hpp:277
gadgetlib2::Polynomial::getMonomials
const std::vector< Monomial > & getMonomials() const
Definition: variable.cpp:731
gadgetlib2::DualWord::bit
FlagVariable bit(size_t i) const
Definition: variable.hpp:441
gadgetlib2::LinearCombination::getUsedVariables
const Variable::set getUsedVariables() const
Definition: variable.cpp:603
gadgetlib2::VariableArray::VariableArray
VariableArray(const ::std::string &name="")
gadgetlib2::FElem::getBit
int getBit(unsigned int i, const FieldType &fieldType)
Definition: variable.cpp:128
gadgetlib2::ProtoboardPtr
::std::shared_ptr< Protoboard > ProtoboardPtr
Definition: variable.hpp:42
gadgetlib2::VariablePtr
::std::shared_ptr< Variable > VariablePtr
Definition: variable.hpp:39
gadgetlib2::FElem::operator*=
FElem & operator*=(const FElem &other)
Definition: variable.cpp:101
gadgetlib2::DualWordArray::size
size_t size() const
Definition: variable.cpp:493
gadgetlib2::Monomial::asString
::std::string asString() const
Definition: variable.cpp:657
variable_operators.hpp
gadgetlib2::Variable::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:306
gadgetlib2::FElem::asString
::std::string asString() const
Definition: variable.hpp:127
gadgetlib2::Variable::VariableStrictOrder::operator()
bool operator()(const Variable &first, const Variable &second) const
Definition: variable.hpp:330
gadgetlib2
Definition: adapters.cpp:15
gadgetlib2::LinearCombination::LinearCombination
LinearCombination()
Definition: variable.hpp:511
gadgetlib2::FElem::operator=
FElem & operator=(const FElem &other)
Definition: variable.cpp:51
gadgetlib2::DualWordArray::push_back
void push_back(const DualWord &dualWord)
Definition: variable.cpp:477
gadgetlib2::R1P_Elem::asString
virtual ::std::string asString() const
Definition: variable.hpp:262
gadgetlib2::FConst::operator*=
virtual FConst & operator*=(const FElemInterface &other)
Definition: variable.cpp:170
gadgetlib2::FlagVariableArray
VariableArray FlagVariableArray
Definition: variable.hpp:379
gadgetlib2::R1P
@ R1P
Definition: variable.hpp:37
gadgetlib2::DualWordArray::unpacked
UnpackedWordArray unpacked() const
Definition: variable.cpp:461
gadgetlib2::Polynomial::asString
::std::string asString() const
Definition: variable.cpp:735
gadgetlib2::Polynomial::operator*=
Polynomial & operator*=(const Polynomial &other)
Definition: variable.cpp:763
gadgetlib2::LinearTerm::fieldtype
FieldType fieldtype() const
Definition: variable.hpp:493
gadgetlib2::Fp
libff::Fr< libff::default_ec_pp > Fp
Definition: pp.hpp:29
gadgetlib2::R1P_Elem
Definition: variable.hpp:245