Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
constraint.hpp
Go to the documentation of this file.
1 
15 #ifndef LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_CONSTRAINT_HPP_
16 #define LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_CONSTRAINT_HPP_
17 
19 #include <string>
20 #include <vector>
21 
22 namespace gadgetlib2
23 {
24 
25 enum class PrintOptions {
30 };
31 
32 /*************************************************************************************************/
33 /*************************************************************************************************/
34 /******************* ******************/
35 /******************* class Constraint ******************/
36 /******************* ******************/
37 /*************************************************************************************************/
38 /*************************************************************************************************/
39 
43 {
44 public:
45  explicit Constraint(
46  const ::std::string &name); // casting disallowed by 'explicit'
47  ::std::string name() const;
48 
55  virtual bool isSatisfied(
56  const VariableAssignment &assignment,
57  const PrintOptions &printOnFail) const = 0;
59  virtual ::std::string annotation() const = 0;
60  virtual const Variable::set getUsedVariables() const = 0;
61  virtual Polynomial asPolynomial() const = 0;
62 
63 protected:
64 #ifdef DEBUG
65  ::std::string name_;
66 #endif
67 
68 }; // class Constraint
69 
70 /***********************************/
71 /*** END OF CLASS DEFINITION ***/
72 /***********************************/
73 
74 /*************************************************************************************************/
75 /*************************************************************************************************/
76 /******************* ******************/
77 /******************* class Rank1Constraint ******************/
78 /******************* ******************/
79 /*************************************************************************************************/
80 /*************************************************************************************************/
84 {
85 private:
86  LinearCombination a_, b_, c_; // <a,x> * <b,x> = <c,x>
87 public:
89  const LinearCombination &a,
90  const LinearCombination &b,
91  const LinearCombination &c,
92  const ::std::string &name);
93 
94  LinearCombination a() const;
95  LinearCombination b() const;
96  LinearCombination c() const;
97 
98  virtual bool isSatisfied(
99  const VariableAssignment &assignment,
100  const PrintOptions &printOnFail = PrintOptions::NO_DBG_PRINT) const;
101  virtual ::std::string annotation() const;
102  virtual const Variable::set getUsedVariables()
103  const;
105  virtual Polynomial asPolynomial() const { return a_ * b_ - c_; }
106 }; // class Rank1Constraint
107 
108 /***********************************/
109 /*** END OF CLASS DEFINITION ***/
110 /***********************************/
111 
112 /*************************************************************************************************/
113 /*************************************************************************************************/
114 /******************* ******************/
115 /******************* class PolynomialConstraint
116  * ******************/
117 /******************* ******************/
118 /*************************************************************************************************/
119 /*************************************************************************************************/
120 
122 {
123 private:
124  Polynomial a_, b_;
125 
126 public:
128  const Polynomial &a, const Polynomial &b, const ::std::string &name);
129 
130  bool isSatisfied(
131  const VariableAssignment &assignment,
132  const PrintOptions &printOnFail = PrintOptions::NO_DBG_PRINT) const;
133  ::std::string annotation() const;
134  virtual const Variable::set getUsedVariables()
135  const;
137  virtual Polynomial asPolynomial() const { return a_ - b_; }
138 }; // class PolynomialConstraint
139 
140 /***********************************/
141 /*** END OF CLASS DEFINITION ***/
142 /***********************************/
143 
144 /*************************************************************************************************/
145 /*************************************************************************************************/
146 /******************* ******************/
147 /******************* class ConstraintSystem
148  * ******************/
149 /******************* ******************/
150 /*************************************************************************************************/
151 /*************************************************************************************************/
152 
154 {
155 protected:
156  typedef ::std::shared_ptr<Constraint> ConstraintPtr;
157  ::std::vector<ConstraintPtr> constraintsPtrs_;
158 
159 public:
161 
170  bool isSatisfied(
171  const VariableAssignment &assignment,
172  const PrintOptions &printOnFail = PrintOptions::NO_DBG_PRINT) const;
173  void addConstraint(const Rank1Constraint &c);
174  void addConstraint(const PolynomialConstraint &c);
175  ::std::string annotation() const;
177 
178  typedef ::std::set<::std::unique_ptr<Polynomial>> PolyPtrSet;
181  {
182  PolyPtrSet retset;
183  for (const auto &pConstraint : constraintsPtrs_) {
184  retset.insert(::std::unique_ptr<Polynomial>(
185  new Polynomial(pConstraint->asPolynomial())));
186  }
187  return retset;
188  }
189  size_t getNumberOfConstraints() { return constraintsPtrs_.size(); }
190  ConstraintPtr getConstraint(size_t idx) { return constraintsPtrs_[idx]; }
191  friend class GadgetLibAdapter;
192 }; // class ConstraintSystem
193 
194 /***********************************/
195 /*** END OF CLASS DEFINITION ***/
196 /***********************************/
197 
198 } // namespace gadgetlib2
199 
200 #endif // LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_CONSTRAINT_HPP_
gadgetlib2::Constraint::name
::std::string name() const
Definition: constraint.cpp:43
gadgetlib2::Constraint::Constraint
Constraint(const ::std::string &name)
Definition: constraint.cpp:40
gadgetlib2::GadgetLibAdapter
Definition: adapters.hpp:37
gadgetlib2::PolynomialConstraint::annotation
::std::string annotation() const
Definition: constraint.cpp:180
gadgetlib2::ConstraintSystem::addConstraint
void addConstraint(const Rank1Constraint &c)
Definition: constraint.cpp:202
gadgetlib2::Constraint::isSatisfied
virtual bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail) const =0
gadgetlib2::PolynomialConstraint::asPolynomial
virtual Polynomial asPolynomial() const
Definition: constraint.hpp:137
gadgetlib2::PrintOptions::NO_DBG_PRINT
@ NO_DBG_PRINT
gadgetlib2::Rank1Constraint::c
LinearCombination c() const
Definition: constraint.cpp:75
gadgetlib2::PrintOptions::DBG_PRINT_IF_TRUE
@ DBG_PRINT_IF_TRUE
gadgetlib2::PrintOptions
PrintOptions
Definition: constraint.hpp:25
gadgetlib2::ConstraintSystem::constraintsPtrs_
::std::vector< ConstraintPtr > constraintsPtrs_
Definition: constraint.hpp:157
gadgetlib2::Constraint::getUsedVariables
virtual const Variable::set getUsedVariables() const =0
gadgetlib2::Polynomial
Polynomial.
Definition: variable.hpp:574
gadgetlib2::PrintOptions::DBG_PRINT_IF_NOT_SATISFIED
@ DBG_PRINT_IF_NOT_SATISFIED
gadgetlib2::ConstraintSystem::ConstraintPtr
::std::shared_ptr< Constraint > ConstraintPtr
Definition: constraint.hpp:156
gadgetlib2::ConstraintSystem::PolyPtrSet
::std::set<::std::unique_ptr< Polynomial > > PolyPtrSet
Definition: constraint.hpp:178
gadgetlib2::ConstraintSystem::getUsedVariables
Variable::set getUsedVariables() const
Definition: constraint.cpp:234
gadgetlib2::VariableAssignment
::std::map< Variable, FElem, Variable::VariableStrictOrder > VariableAssignment
Definition: variable.hpp:348
gadgetlib2::PolynomialConstraint
Definition: constraint.hpp:121
gadgetlib2::Rank1Constraint::isSatisfied
virtual bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT) const
Definition: constraint.cpp:77
gadgetlib2::ConstraintSystem::annotation
::std::string annotation() const
Definition: constraint.cpp:225
gadgetlib2::ConstraintSystem::getConstraintPolynomials
PolyPtrSet getConstraintPolynomials() const
Required for interfacing with BREX. Should be optimized in the future.
Definition: constraint.hpp:180
gadgetlib2::Rank1Constraint::annotation
virtual ::std::string annotation() const
Definition: constraint.cpp:110
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::Rank1Constraint::asPolynomial
virtual Polynomial asPolynomial() const
Definition: constraint.hpp:105
gadgetlib2::Rank1Constraint::Rank1Constraint
Rank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: constraint.cpp:64
gadgetlib2::ConstraintSystem::getConstraint
ConstraintPtr getConstraint(size_t idx)
Definition: constraint.hpp:190
gadgetlib2::PolynomialConstraint::isSatisfied
bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT) const
Definition: constraint.cpp:150
variable.hpp
gadgetlib2::Constraint::asPolynomial
virtual Polynomial asPolynomial() const =0
gadgetlib2::ConstraintSystem::getNumberOfConstraints
size_t getNumberOfConstraints()
Definition: constraint.hpp:189
gadgetlib2::PolynomialConstraint::getUsedVariables
virtual const Variable::set getUsedVariables() const
Definition: constraint.cpp:188
gadgetlib2::Constraint::annotation
virtual ::std::string annotation() const =0
gadgetlib2::ConstraintSystem
Definition: constraint.hpp:153
gadgetlib2::Rank1Constraint
Definition: constraint.hpp:83
gadgetlib2::PrintOptions::DBG_PRINT_IF_FALSE
@ DBG_PRINT_IF_FALSE
gadgetlib2::Rank1Constraint::b
LinearCombination b() const
Definition: constraint.cpp:74
gadgetlib2::Rank1Constraint::getUsedVariables
virtual const Variable::set getUsedVariables() const
Definition: constraint.cpp:119
gadgetlib2::LinearCombination
LinearCombination.
Definition: variable.hpp:503
gadgetlib2::ConstraintSystem::ConstraintSystem
ConstraintSystem()
Definition: constraint.hpp:160
gadgetlib2::Rank1Constraint::a
LinearCombination a() const
Definition: constraint.cpp:73
gadgetlib2::ConstraintSystem::isSatisfied
bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT) const
Definition: constraint.cpp:214
gadgetlib2::PolynomialConstraint::PolynomialConstraint
PolynomialConstraint(const Polynomial &a, const Polynomial &b, const ::std::string &name)
Definition: constraint.cpp:144
gadgetlib2
Definition: adapters.cpp:15
gadgetlib2::Constraint
Definition: constraint.hpp:42