Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
constraint.cpp
Go to the documentation of this file.
1 
10 #include <algorithm>
11 #include <cassert>
12 #include <iostream>
15 #include <memory>
16 #include <set>
17 
18 using ::std::cerr;
19 using ::std::cout;
20 using ::std::endl;
21 using ::std::set;
22 using ::std::shared_ptr;
23 using ::std::string;
24 using ::std::vector;
25 
26 namespace gadgetlib2
27 {
28 
29 /*************************************************************************************************/
30 /*************************************************************************************************/
31 /******************* ******************/
32 /******************* class Constraint ******************/
33 /******************* ******************/
34 /*************************************************************************************************/
35 /*************************************************************************************************/
36 
37 #ifdef DEBUG
38 Constraint::Constraint(const string &name) : name_(name) {}
39 #else
40 Constraint::Constraint(const string &name) { libff::UNUSED(name); }
41 #endif
42 
43 string Constraint::name() const
44 {
45 #ifdef DEBUG
46  return name_;
47 #else
48  return "";
49 #endif
50 }
51 
52 /***********************************/
53 /*** END OF CLASS DEFINITION ***/
54 /***********************************/
55 
56 /*************************************************************************************************/
57 /*************************************************************************************************/
58 /******************* ******************/
59 /******************* class Rank1Constraint ******************/
60 /******************* ******************/
61 /*************************************************************************************************/
62 /*************************************************************************************************/
63 
65  const LinearCombination &a,
66  const LinearCombination &b,
67  const LinearCombination &c,
68  const string &name)
69  : Constraint(name), a_(a), b_(b), c_(c)
70 {
71 }
72 
73 LinearCombination Rank1Constraint::a() const { return a_; }
74 LinearCombination Rank1Constraint::b() const { return b_; }
75 LinearCombination Rank1Constraint::c() const { return c_; }
76 
78  const VariableAssignment &assignment, const PrintOptions &printOnFail) const
79 {
80  const FElem ares = a_.eval(assignment);
81  const FElem bres = b_.eval(assignment);
82  const FElem cres = c_.eval(assignment);
83  if (ares * bres != cres) {
84 #ifdef DEBUG
85  if (printOnFail == PrintOptions::DBG_PRINT_IF_NOT_SATISFIED) {
86  cerr << GADGETLIB2_FMT(
87  "Constraint named \"%s\" not satisfied. Constraint is:",
88  name().c_str())
89  << endl;
90  cerr << annotation() << endl;
91  cerr << "Variable assignments are:" << endl;
92  const Variable::set varSet = getUsedVariables();
93  for (const Variable &var : varSet) {
94  cerr << var.name() << ": " << assignment.at(var).asString()
95  << endl;
96  }
97  cerr << "a: " << ares.asString() << endl;
98  cerr << "b: " << bres.asString() << endl;
99  cerr << "a*b: " << (ares * bres).asString() << endl;
100  cerr << "c: " << cres.asString() << endl;
101  }
102 #else
103  libff::UNUSED(printOnFail);
104 #endif
105  return false;
106  }
107  return true;
108 }
109 
111 {
112 #ifndef DEBUG
113  return "";
114 #endif
115  return string("( ") + a_.asString() + " ) * ( " + b_.asString() +
116  " ) = " + c_.asString();
117 }
118 
120 {
121  Variable::set retSet;
122  const Variable::set aSet = a_.getUsedVariables();
123  retSet.insert(aSet.begin(), aSet.end());
124  const Variable::set bSet = b_.getUsedVariables();
125  retSet.insert(bSet.begin(), bSet.end());
126  const Variable::set cSet = c_.getUsedVariables();
127  retSet.insert(cSet.begin(), cSet.end());
128  return retSet;
129 }
130 
131 /***********************************/
132 /*** END OF CLASS DEFINITION ***/
133 /***********************************/
134 
135 /*************************************************************************************************/
136 /*************************************************************************************************/
137 /******************* ******************/
138 /******************* class PolynomialConstraint
139  * ******************/
140 /******************* ******************/
141 /*************************************************************************************************/
142 /*************************************************************************************************/
143 
145  const Polynomial &a, const Polynomial &b, const string &name)
146  : Constraint(name), a_(a), b_(b)
147 {
148 }
149 
151  const VariableAssignment &assignment, const PrintOptions &printOnFail) const
152 {
153  const FElem aEval = a_.eval(assignment);
154  const FElem bEval = b_.eval(assignment);
155  if (aEval != bEval) {
156 #ifdef DEBUG
157  if (printOnFail == PrintOptions::DBG_PRINT_IF_NOT_SATISFIED) {
158  cerr << GADGETLIB2_FMT(
159  "Constraint named \"%s\" not satisfied. Constraint is:",
160  name().c_str())
161  << endl;
162  cerr << annotation() << endl;
163  cerr << "Expecting: " << aEval << " == " << bEval << endl;
164  cerr << "Variable assignments are:" << endl;
165  const Variable::set varSet = getUsedVariables();
166  for (const Variable &var : varSet) {
167  cerr << var.name() << ": " << assignment.at(var).asString()
168  << endl;
169  }
170  }
171 #else
172  libff::UNUSED(printOnFail);
173 #endif
174 
175  return false;
176  }
177  return true;
178 }
179 
181 {
182 #ifndef DEBUG
183  return "";
184 #endif
185  return a_.asString() + " == " + b_.asString();
186 }
187 
189 {
190  Variable::set retSet;
191  const Variable::set aSet = a_.getUsedVariables();
192  retSet.insert(aSet.begin(), aSet.end());
193  const Variable::set bSet = b_.getUsedVariables();
194  retSet.insert(bSet.begin(), bSet.end());
195  return retSet;
196 }
197 
198 /***********************************/
199 /*** END OF CLASS DEFINITION ***/
200 /***********************************/
201 
203 {
204  constraintsPtrs_.emplace_back(
205  ::std::shared_ptr<Constraint>(new Rank1Constraint(c)));
206 }
207 
209 {
210  constraintsPtrs_.emplace_back(
211  ::std::shared_ptr<Constraint>(new PolynomialConstraint(c)));
212 }
213 
215  const VariableAssignment &assignment, const PrintOptions &printOnFail) const
216 {
217  for (size_t i = 0; i < constraintsPtrs_.size(); ++i) {
218  if (!constraintsPtrs_[i]->isSatisfied(assignment, printOnFail)) {
219  return false;
220  }
221  }
222  return true;
223 }
224 
226 {
227  string retVal("\n");
228  for (auto i = constraintsPtrs_.begin(); i != constraintsPtrs_.end(); ++i) {
229  retVal += (*i)->annotation() + '\n';
230  }
231  return retVal;
232 }
233 
235 {
236  Variable::set retSet;
237  for (auto &pConstraint : constraintsPtrs_) {
238  const Variable::set curSet = pConstraint->getUsedVariables();
239  retSet.insert(curSet.begin(), curSet.end());
240  }
241  return retSet;
242 }
243 
244 } // namespace gadgetlib2
gadgetlib2::Polynomial::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:712
gadgetlib2::Constraint::name
::std::string name() const
Definition: constraint.cpp:43
gadgetlib2::Constraint::Constraint
Constraint(const ::std::string &name)
Definition: constraint.cpp:40
gadgetlib2::LinearCombination::asString
::std::string asString() const
Definition: variable.cpp:581
gadgetlib2::PolynomialConstraint::annotation
::std::string annotation() const
Definition: constraint.cpp:180
gadgetlib2::LinearCombination::eval
FElem eval(const VariableAssignment &assignment) const
Definition: variable.cpp:572
gadgetlib2::ConstraintSystem::addConstraint
void addConstraint(const Rank1Constraint &c)
Definition: constraint.cpp:202
gadgetlib2::Rank1Constraint::c
LinearCombination c() const
Definition: constraint.cpp:75
gadgetlib2::GADGETLIB2_FMT
::std::string GADGETLIB2_FMT(const char *format,...)
Definition: infrastructure.cpp:49
gadgetlib2::PrintOptions
PrintOptions
Definition: constraint.hpp:25
gadgetlib2::ConstraintSystem::constraintsPtrs_
::std::vector< ConstraintPtr > constraintsPtrs_
Definition: constraint.hpp:157
gadgetlib2::Polynomial
Polynomial.
Definition: variable.hpp:574
gadgetlib2::PrintOptions::DBG_PRINT_IF_NOT_SATISFIED
@ DBG_PRINT_IF_NOT_SATISFIED
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::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::Polynomial::getUsedVariables
const Variable::set getUsedVariables() const
Definition: variable.cpp:721
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetlib2::Rank1Constraint::Rank1Constraint
Rank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: constraint.cpp:64
gadgetlib2::PolynomialConstraint::isSatisfied
bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT) const
Definition: constraint.cpp:150
variable.hpp
constraint.hpp
gadgetlib2::PolynomialConstraint::getUsedVariables
virtual const Variable::set getUsedVariables() const
Definition: constraint.cpp:188
gadgetlib2::Variable
A formal variable, field agnostic.
Definition: variable.hpp:306
gadgetlib2::Rank1Constraint
Definition: constraint.hpp:83
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::LinearCombination::getUsedVariables
const Variable::set getUsedVariables() const
Definition: variable.cpp:603
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::FElem::asString
::std::string asString() const
Definition: variable.hpp:127
gadgetlib2::PolynomialConstraint::PolynomialConstraint
PolynomialConstraint(const Polynomial &a, const Polynomial &b, const ::std::string &name)
Definition: constraint.cpp:144
gadgetlib2
Definition: adapters.cpp:15
gadgetlib2::Polynomial::asString
::std::string asString() const
Definition: variable.cpp:735
gadgetlib2::Constraint
Definition: constraint.hpp:42