Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
protoboard.hpp
Go to the documentation of this file.
1 
11 #ifndef LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_PROTOBOARD_HPP_
12 #define LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_PROTOBOARD_HPP_
13 
17 #include <string>
18 
19 #define ASSERT_CONSTRAINTS_SATISFIED(pb) \
20  ASSERT_TRUE(pb->isSatisfied(PrintOptions::DBG_PRINT_IF_NOT_SATISFIED))
21 
22 #define ASSERT_CONSTRAINTS_NOT_SATISFIED(pb) \
23  ASSERT_FALSE(pb->isSatisfied(PrintOptions::NO_DBG_PRINT))
24 
25 namespace gadgetlib2
26 {
27 
28 class ProtoboardParams; // Forward declaration
29 typedef ::std::shared_ptr<const ProtoboardParams> ParamsCPtr;
30 
31 /*************************************************************************************************/
32 /*************************************************************************************************/
33 /******************* ******************/
34 /******************* class Protoboard ******************/
35 /******************* ******************/
36 /*************************************************************************************************/
37 /*************************************************************************************************/
39 {
40 protected:
43  size_t numInputs_;
45  pParams_; // TODO try to refactor this out and use inheritance for
46  // different types of protoboards, for instance
47  // TinyRAMProtoboard : public Protoboard This may not be
48  // trivial because of Gadget multiple inheritance scheme
49 
50  Protoboard(const FieldType &fieldType, ParamsCPtr pParams);
51 
52 public:
55  const FieldType &fieldType, ParamsCPtr pParams = NULL)
56  {
57  return ProtoboardPtr(new Protoboard(fieldType, pParams));
58  }
59  size_t numVars() const
60  {
61  return assignment_.size();
62  } // TODO change to take num from constraintSys_
63  // size_t numVars() const {return
64  // constraintSystem_.getUsedVariables().size();} // TODO change to take num
65  // from constraintSys_
66 
67  size_t numInputs() const
68  {
69  return numInputs_;
70  } // TODO Madars How do we book keep this?
71  ParamsCPtr params() const { return pParams_; }
72  FElem &val(const Variable &var);
73  FElem val(const LinearCombination &lc) const;
75  const VariableArray &varArray, const size_t srcValue);
76  void setDualWordValue(const DualWord &dualWord, const size_t srcValue);
78  const MultiPackedWord &multipackedWord, const size_t srcValue);
79 
80  // The following 3 methods are purposely not overloaded to the same name in
81  // order to reduce programmer error. We want the programmer to explicitly
82  // code what type of constraint she wants.
83  void addRank1Constraint(
84  const LinearCombination &a,
85  const LinearCombination &b,
86  const LinearCombination &c,
87  const ::std::string &name);
89  const Polynomial &a, const Polynomial &b, const ::std::string &name);
91  void addUnaryConstraint(
92  const LinearCombination &a, const ::std::string &name);
93  bool isSatisfied(
94  const PrintOptions &printOnFail = PrintOptions::NO_DBG_PRINT);
95  bool flagIsSet(const FlagVariable &flag) const { return val(flag) == 1; }
96  void setFlag(const FlagVariable &flag, bool newFlagState = true);
97  void clearFlag(const FlagVariable &flag) { val(flag) = 0; }
98  void flipFlag(const FlagVariable &flag) { val(flag) = 1 - val(flag); }
99  void enforceBooleanity(const Variable &var);
100  ::std::string annotation() const;
104  const DualWord &dualWord,
105  const size_t expectedValue,
106  const PrintOptions &printOption = PrintOptions::NO_DBG_PRINT) const;
108  const MultiPackedWord &multipackedWord,
109  const size_t expectedValue,
110  const PrintOptions &printOption = PrintOptions::NO_DBG_PRINT) const;
112  const UnpackedWord &unpackedWord,
113  const size_t expectedValue,
114  const PrintOptions &printOption = PrintOptions::NO_DBG_PRINT) const;
115 };
116 /***********************************/
117 /*** END OF CLASS DEFINITION ***/
118 /***********************************/
119 
120 /*************************************************************************************************/
121 /*************************************************************************************************/
122 /******************* ******************/
123 /******************* class ProtoboardParams
124  * ******************/
125 /******************* ******************/
126 /*************************************************************************************************/
127 /*************************************************************************************************/
128 /*
129  An abstract class to hold any additional information needed by a specific
130  Protoboard. For example a Protoboard specific to TinyRAM will have a class
131  ArchParams which will inherit from this class.
132 */
134 {
135 public:
136  virtual ~ProtoboardParams() = 0;
137 };
138 
139 } // namespace gadgetlib2
140 
141 #endif // LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_PROTOBOARD_HPP_
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::Protoboard::numInputs
size_t numInputs() const
Definition: protoboard.hpp:67
gadgetlib2::Protoboard::flipFlag
void flipFlag(const FlagVariable &flag)
Definition: protoboard.hpp:98
gadgetlib2::Protoboard::setValuesAsBitArray
void setValuesAsBitArray(const VariableArray &varArray, const size_t srcValue)
Definition: protoboard.cpp:50
gadgetlib2::PrintOptions::NO_DBG_PRINT
@ NO_DBG_PRINT
gadgetlib2::Protoboard::enforceBooleanity
void enforceBooleanity(const Variable &var)
Definition: protoboard.cpp:126
gadgetlib2::Protoboard::numInputs_
size_t numInputs_
Definition: protoboard.hpp:43
gadgetlib2::Protoboard::pParams_
ParamsCPtr pParams_
Definition: protoboard.hpp:45
gadgetlib2::Protoboard::annotation
::std::string annotation() const
Definition: protoboard.cpp:135
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::clearFlag
void clearFlag(const FlagVariable &flag)
Definition: protoboard.hpp:97
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::constraintSystem
ConstraintSystem constraintSystem() const
Definition: protoboard.hpp:101
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::VariableAssignment
::std::map< Variable, FElem, Variable::VariableStrictOrder > VariableAssignment
Definition: variable.hpp:348
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::MultiPackedWord
Definition: variable.hpp:404
gadgetlib2::Protoboard::params
ParamsCPtr params() const
Definition: protoboard.hpp:71
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetlib2::Protoboard::constraintSystem_
ConstraintSystem constraintSystem_
Definition: protoboard.hpp:42
gadgetlib2::UnpackedWord
Definition: variable.hpp:389
variable.hpp
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
Definition: protoboard.hpp:38
gadgetlib2::Protoboard::addUnaryConstraint
void addUnaryConstraint(const LinearCombination &a, const ::std::string &name)
adds a constraint of the form (a == 0)
Definition: protoboard.cpp:110
pp.hpp
constraint.hpp
gadgetlib2::ProtoboardParams
Definition: protoboard.hpp:133
gadgetlib2::Protoboard::create
static ProtoboardPtr create(const FieldType &fieldType, ParamsCPtr pParams=NULL)
Definition: protoboard.hpp:54
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::Protoboard::addRank1Constraint
void addRank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: protoboard.cpp:95
gadgetlib2::Variable
A formal variable, field agnostic.
Definition: variable.hpp:306
gadgetlib2::Protoboard::flagIsSet
bool flagIsSet(const FlagVariable &flag) const
Definition: protoboard.hpp:95
gadgetlib2::Protoboard::assignment
VariableAssignment assignment() const
Definition: protoboard.hpp:102
gadgetlib2::ConstraintSystem
Definition: constraint.hpp:153
gadgetlib2::Protoboard::numVars
size_t numVars() const
Definition: protoboard.hpp:59
gadgetlib2::LinearCombination
LinearCombination.
Definition: variable.hpp:503
gadgetlib2::ProtoboardPtr
::std::shared_ptr< Protoboard > ProtoboardPtr
Definition: variable.hpp:42
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::ParamsCPtr
::std::shared_ptr< const ProtoboardParams > ParamsCPtr
Definition: protoboard.hpp:28