Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
protoboard.cpp
Go to the documentation of this file.
1 
11 #include <cstdio>
13 
14 using ::std::cout;
15 using ::std::endl;
16 using ::std::string;
17 
18 namespace gadgetlib2
19 {
20 
21 /*************************************************************************************************/
22 /*************************************************************************************************/
23 /******************* ******************/
24 /******************* class Protoboard ******************/
25 /******************* ******************/
26 /*************************************************************************************************/
27 /*************************************************************************************************/
28 
29 Protoboard::Protoboard(const FieldType &fieldType, ParamsCPtr pParams)
30  : numInputs_(0), pParams_(pParams), fieldType_(fieldType)
31 {
32 }
33 
35 {
36  FElem &retval = assignment_[var];
38  retval.fieldType() == fieldType_ || retval.fieldType() == AGNOSTIC,
40  "Assigned field element of incorrect field type in Variable \"%s\"",
41  var.name().c_str()));
42  return retval;
43 }
44 
46 {
47  return lc.eval(assignment_);
48 }
49 
51  const VariableArray &varArray, const size_t srcValue)
52 {
54  varArray.size() >= Log2ceil(srcValue),
56  "Variable array of size %u too small to hold value %u. Array must "
57  "be of size "
58  "at least %u",
59  varArray.size(),
60  srcValue,
61  Log2ceil(srcValue)));
62  size_t i = 0;
63  for (i = 0; i < Log2ceil(srcValue); ++i) {
64  val(varArray[i]) = srcValue & (1u << i) ? 1 : 0;
65  }
66  for (; i < varArray.size(); ++i) {
67  val(varArray[i]) = 0;
68  }
69 }
70 
72  const DualWord &dualWord, const size_t srcValue)
73 {
74  setMultipackedWordValue(dualWord.multipacked(), srcValue);
75  setValuesAsBitArray(dualWord.unpacked(), srcValue);
76 }
77 
79  const MultiPackedWord &multipackedWord, const size_t srcValue)
80 {
81  if (fieldType_ == R1P) {
83  multipackedWord.size() == 1,
84  "Multipacked word size mismatch in R1P");
85  val(multipackedWord[0]) = srcValue;
86  } else {
88  "Unknown protoboard type in Protoboard::setMultipackedWordValue");
89  }
90 }
91 
92 // The following 3 methods are purposely not overloaded to the same name in
93 // order to reduce programmer error. We want the programmer to explicitly code
94 // what type of constraint she wants.
96  const LinearCombination &a,
97  const LinearCombination &b,
98  const LinearCombination &c,
99  const ::std::string &name)
100 {
102 }
103 
105  const Polynomial &a, const Polynomial &b, const ::std::string &name)
106 {
108 }
109 
111  const LinearCombination &a, const ::std::string &name)
112 {
113  addRank1Constraint(a, 1, 0, name);
114 }
115 
116 bool Protoboard::isSatisfied(const PrintOptions &printOnFail)
117 {
118  return constraintSystem_.isSatisfied(assignment_, printOnFail);
119 }
120 
121 void Protoboard::setFlag(const FlagVariable &flag, bool newFlagState)
122 {
123  val(flag) = newFlagState ? 1 : 0;
124 }
125 
127 {
129  var,
130  var - 1,
131  0,
132  GADGETLIB2_FMT("enforceBooleanity(%s)", var.name().c_str()));
133 }
134 
136 {
137 #ifdef DEBUG
138  string retVal = constraintSystem_.annotation();
139  retVal += "Variable Assignments:\n";
140  for (const auto &assignmentPair : assignment_) {
141  const string varName = assignmentPair.first.name();
142  const string varAssignedValue = assignmentPair.second.asString();
143  retVal += varName + ": " + varAssignedValue + "\n";
144  }
145  return retVal;
146 #else
147  return "";
148 #endif
149 }
150 
152  const bool multipackedEqualsValue, const bool unpackedEqualsValue)
153 {
154  return multipackedEqualsValue != unpackedEqualsValue;
155 }
156 
158  const bool multipackedEqualsValue, const bool unpackedEqualsValue)
159 {
160  if (multipackedEqualsValue == true && unpackedEqualsValue == false) {
161  cout << "NOTE: multipacked value equals expected value but unpacked "
162  "value does not!"
163  << endl;
164  } else {
166  multipackedEqualsValue == false && unpackedEqualsValue == true,
167  "printInformativeNoticeMessage(...) has been called incorrectly");
168  cout << "NOTE: unpacked value equals expected value but multipacked "
169  "value does not!"
170  << endl;
171  }
172 }
173 
175  const DualWord &dualWord,
176  const size_t expectedValue,
177  const PrintOptions &printOption) const
178 {
179  bool multipackedEqualsValue = multipackedWordAssignmentEqualsValue(
180  dualWord.multipacked(), expectedValue, printOption);
181  bool unpackedEqualsValue = unpackedWordAssignmentEqualsValue(
182  dualWord.unpacked(), expectedValue, printOption);
184  multipackedEqualsValue, unpackedEqualsValue)) {
186  multipackedEqualsValue, unpackedEqualsValue);
187  }
188  return multipackedEqualsValue && unpackedEqualsValue;
189 }
190 
192  const bool boolValue, const PrintOptions &printOption)
193 {
194  return (
195  (boolValue == true && printOption == PrintOptions::DBG_PRINT_IF_TRUE) ||
196  (boolValue == false &&
197  printOption == PrintOptions::DBG_PRINT_IF_FALSE));
198 }
199 
201  const MultiPackedWord &multipackedWord,
202  const size_t expectedValue,
203  const PrintOptions &printOption) const
204 {
205  bool retval = true;
206  if (fieldType_ == R1P) {
208  multipackedWord.size() == 1, "R1P multipacked size mismatch");
209  if (val(multipackedWord[0]) == expectedValue) {
210  retval = true;
211  } else {
212  retval = false;
213  }
214  if (expectedToPrintValues(retval, printOption)) {
215  cout << "Expected value for multipacked word \""
216  << multipackedWord.name() << "\" is: " << expectedValue
217  << endl;
218  cout << "Actual value is: " << val(multipackedWord[0]) << endl;
219  }
220  } else {
222  "Unknown field type in "
223  "Protoboard::multipackedWordAssignmentEqualsValue(...)");
224  }
225  return retval;
226 }
227 
229  const UnpackedWord &unpackedWord,
230  const size_t expectedValue,
231  const PrintOptions &printOption) const
232 {
233  bool retval = true;
234  size_t expectedValueCopy = expectedValue;
235  for (size_t i = 0; i < unpackedWord.size(); ++i) {
236  if (val(unpackedWord[i]) != (expectedValueCopy & 1u)) {
237  retval = false;
238  break;
239  }
240  expectedValueCopy >>= 1;
241  }
242  if (expectedValueCopy != 0) {
243  retval = false;
244  }
245  if (expectedToPrintValues(retval, printOption)) {
246  cout << "Expected value for unpacked word \"" << unpackedWord.name()
247  << "\" is: " << expectedValue << endl;
248  cout << "Actual values are: " << endl;
249  for (size_t i = 0; i < unpackedWord.size(); ++i) {
250  cout << "bit " << i << ": " << val(unpackedWord[i]) << endl;
251  }
252  }
253  return retval;
254 }
255 
256 /***********************************/
257 /*** END OF CLASS DEFINITION ***/
258 /***********************************/
259 
261 
262 } // namespace gadgetlib2
gadgetlib2::DualWord
Holds both representations of a word, both multipacked and unpacked.
Definition: variable.hpp:424
gadgetlib2::Protoboard::setFlag
void setFlag(const FlagVariable &flag, bool newFlagState=true)
Definition: protoboard.cpp:121
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::Protoboard::setValuesAsBitArray
void setValuesAsBitArray(const VariableArray &varArray, const size_t srcValue)
Definition: protoboard.cpp:50
gadgetlib2::expectedToPrintValues
bool expectedToPrintValues(const bool boolValue, const PrintOptions &printOption)
Definition: protoboard.cpp:191
gadgetlib2::Protoboard::enforceBooleanity
void enforceBooleanity(const Variable &var)
Definition: protoboard.cpp:126
gadgetlib2::GADGETLIB2_FMT
::std::string GADGETLIB2_FMT(const char *format,...)
Definition: infrastructure.cpp:49
gadgetlib2::PrintOptions::DBG_PRINT_IF_TRUE
@ DBG_PRINT_IF_TRUE
gadgetlib2::Protoboard::annotation
::std::string annotation() const
Definition: protoboard.cpp:135
gadgetlib2::Variable::name
::std::string name() const
Definition: variable.cpp:297
gadgetlib2::PrintOptions
PrintOptions
Definition: constraint.hpp:25
gadgetlib2::Protoboard::fieldType_
const FieldType fieldType_
Definition: protoboard.hpp:53
gadgetlib2::Polynomial
Polynomial.
Definition: variable.hpp:574
gadgetlib2::Protoboard::assignment_
VariableAssignment assignment_
Definition: protoboard.hpp:41
gadgetlib2::Protoboard::setMultipackedWordValue
void setMultipackedWordValue(const MultiPackedWord &multipackedWord, const size_t srcValue)
Definition: protoboard.cpp:78
gadgetlib2::Protoboard::addGeneralConstraint
void addGeneralConstraint(const Polynomial &a, const Polynomial &b, const ::std::string &name)
Definition: protoboard.cpp:104
gadgetlib2::FieldType
FieldType
Definition: variable.hpp:37
gadgetlib2::Protoboard::val
FElem & val(const Variable &var)
Definition: protoboard.cpp:34
gadgetlib2::AGNOSTIC
@ AGNOSTIC
Definition: variable.hpp:37
gadgetlib2::printInformativeNoticeMessage
void printInformativeNoticeMessage(const bool multipackedEqualsValue, const bool unpackedEqualsValue)
Definition: protoboard.cpp:157
gadgetlib2::Protoboard::isSatisfied
bool isSatisfied(const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT)
Definition: protoboard.cpp:116
gadgetlib2::Protoboard::setDualWordValue
void setDualWordValue(const DualWord &dualWord, const size_t srcValue)
Definition: protoboard.cpp:71
gadgetlib2::VariableArray
VariableArray.
Definition: variable.hpp:353
gadgetlib2::PolynomialConstraint
Definition: constraint.hpp:121
gadgetlib2::MultiPackedWord
Definition: variable.hpp:404
gadgetlib2::Log2ceil
unsigned int Log2ceil(uint64_t i)
Definition: infrastructure.cpp:120
gadgetlib2::multipackedAndUnpackedValuesDisagree
bool multipackedAndUnpackedValuesDisagree(const bool multipackedEqualsValue, const bool unpackedEqualsValue)
Definition: protoboard.cpp:151
gadgetlib2::ConstraintSystem::annotation
::std::string annotation() const
Definition: constraint.cpp:225
GADGETLIB_FATAL
#define GADGETLIB_FATAL(msg)
Definition: infrastructure.hpp:85
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetlib2::Protoboard::constraintSystem_
ConstraintSystem constraintSystem_
Definition: protoboard.hpp:42
gadgetlib2::UnpackedWord
Definition: variable.hpp:389
gadgetlib2::ProtoboardParams::~ProtoboardParams
virtual ~ProtoboardParams()=0
Definition: protoboard.cpp:260
gadgetlib2::Protoboard::multipackedWordAssignmentEqualsValue
bool multipackedWordAssignmentEqualsValue(const MultiPackedWord &multipackedWord, const size_t expectedValue, const PrintOptions &printOption=PrintOptions::NO_DBG_PRINT) const
Definition: protoboard.cpp:200
gadgetlib2::Protoboard::addUnaryConstraint
void addUnaryConstraint(const LinearCombination &a, const ::std::string &name)
adds a constraint of the form (a == 0)
Definition: protoboard.cpp:110
gadgetlib2::FElem::fieldType
FieldType fieldType() const
Definition: variable.hpp:128
gadgetlib2::Protoboard::dualWordAssignmentEqualsValue
bool dualWordAssignmentEqualsValue(const DualWord &dualWord, const size_t expectedValue, const PrintOptions &printOption=PrintOptions::NO_DBG_PRINT) const
Definition: protoboard.cpp:174
gadgetlib2::VariableArray::name
::std::string name() const
Definition: variable.cpp:353
gadgetlib2::Protoboard::addRank1Constraint
void addRank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: protoboard.cpp:95
gadgetlib2::DualWord::multipacked
MultiPackedWord multipacked() const
Definition: variable.hpp:439
gadgetlib2::Variable
A formal variable, field agnostic.
Definition: variable.hpp:306
GADGETLIB_ASSERT
#define GADGETLIB_ASSERT(predicate, msg)
Definition: infrastructure.hpp:94
gadgetlib2::MultiPackedWord::name
::std::string name() const
Definition: variable.hpp:418
gadgetlib2::DualWord::unpacked
UnpackedWord unpacked() const
Definition: variable.hpp:440
gadgetlib2::Rank1Constraint
Definition: constraint.hpp:83
gadgetlib2::PrintOptions::DBG_PRINT_IF_FALSE
@ DBG_PRINT_IF_FALSE
gadgetlib2::LinearCombination
LinearCombination.
Definition: variable.hpp:503
protoboard.hpp
gadgetlib2::ConstraintSystem::isSatisfied
bool isSatisfied(const VariableAssignment &assignment, const PrintOptions &printOnFail=PrintOptions::NO_DBG_PRINT) const
Definition: constraint.cpp:214
gadgetlib2::Protoboard::Protoboard
Protoboard(const FieldType &fieldType, ParamsCPtr pParams)
Definition: protoboard.cpp:29
gadgetlib2::Protoboard::unpackedWordAssignmentEqualsValue
bool unpackedWordAssignmentEqualsValue(const UnpackedWord &unpackedWord, const size_t expectedValue, const PrintOptions &printOption=PrintOptions::NO_DBG_PRINT) const
Definition: protoboard.cpp:228
gadgetlib2
Definition: adapters.cpp:15
gadgetlib2::R1P
@ R1P
Definition: variable.hpp:37
gadgetlib2::ParamsCPtr
::std::shared_ptr< const ProtoboardParams > ParamsCPtr
Definition: protoboard.hpp:28