Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
gadget.hpp
Go to the documentation of this file.
1 
36 #ifndef LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGET_HPP_
37 #define LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGET_HPP_
38 
42 #include <vector>
43 
44 namespace gadgetlib2
45 {
46 
47 /*************************************************************************************************/
48 /*************************************************************************************************/
49 /******************* ******************/
50 /******************* class Gadget ******************/
51 /******************* ******************/
52 /*************************************************************************************************/
53 /*************************************************************************************************/
54 
81 class Gadget
82 {
83 private:
84  DISALLOW_COPY_AND_ASSIGN(Gadget);
85 
86 protected:
88 
89 public:
91  virtual void init() = 0;
92  /* generate constraints must have this interface, however generateWitness
93  for some gadgets (like CTime) will take auxiliary information (like
94  memory contents). We do not want to force the interface for
95  generateWitness but do want to make sure it is never invoked from base
96  class.
97  */
98  virtual void generateConstraints() = 0;
99  virtual void generateWitness(); // Not abstract as this method may have
100  // different signatures.
101  void addUnaryConstraint(
102  const LinearCombination &a, const ::std::string &name);
103  void addRank1Constraint(
104  const LinearCombination &a,
105  const LinearCombination &b,
106  const LinearCombination &c,
107  const ::std::string &name);
108  void enforceBooleanity(const Variable &var) { pb_->enforceBooleanity(var); }
109  FElem &val(const Variable &var) { return pb_->val(var); }
110  FElem val(const LinearCombination &lc) { return pb_->val(lc); }
111  FieldType fieldType() const { return pb_->fieldType_; }
112  bool flagIsSet(const FlagVariable &flag) const
113  {
114  return pb_->flagIsSet(flag);
115  }
116 };
117 
118 typedef ::std::shared_ptr<Gadget>
119  GadgetPtr; // Not a unique_ptr because sometimes we need to cast
120  // these pointers for specific gadget operations.
121 /***********************************/
122 /*** END OF CLASS DEFINITION ***/
123 /***********************************/
124 
125 /*************************************************************************************************/
126 /*************************************************************************************************/
127 /******************* ******************/
128 /******************* Gadget Interfaces ******************/
129 /******************* ******************/
130 /*************************************************************************************************/
131 /*************************************************************************************************/
132 
133 /*
134  We use multiple inheritance in order to use much needed syntactic sugar. We
135  want val() to be able to return different types depending on the field so we
136  need to differentiate the interfaces between R1P and other fields. We also
137  want the interfaces of specific logical gadgets (for instance AND_Gadget
138  which has n inputs and 1 output) in order to construct higher level gadgets
139  without specific knowledge of the underlying field. Both interfaces (for
140  instance R1P_gadget and AND_Gadget) inherit from Gadget using virtual
141  inheritance (this means only one instance of Gadget will be created. For a
142  more thorough discussion on virtual inheritance see
143  http://www.phpcompiler.org/articles/virtualinheritance.html
144  */
145 
146 class R1P_Gadget : virtual public Gadget
147 {
148 public:
150  virtual ~R1P_Gadget() = 0;
151 
152  virtual void addRank1Constraint(
153  const LinearCombination &a,
154  const LinearCombination &b,
155  const LinearCombination &c,
156  const ::std::string &name);
157 
158 private:
159  virtual void init() = 0; // private in order to force programmer to invoke
160  // from a Gadget* only
161  DISALLOW_COPY_AND_ASSIGN(R1P_Gadget);
162 }; // class R1P_Gadget
163 
164 /*************************************************************************************************/
165 /*************************************************************************************************/
166 /******************* ******************/
167 /******************* AND_Gadget classes ******************/
168 /******************* ******************/
169 /*************************************************************************************************/
170 /*************************************************************************************************/
171 
172 CREATE_GADGET_BASE_CLASS(AND_GadgetBase);
173 
175 class BinaryAND_Gadget : public AND_GadgetBase
176 {
177 private:
179  ProtoboardPtr pb,
180  const LinearCombination &input1,
181  const LinearCombination &input2,
182  const Variable &result);
183  void init();
184  void generateConstraints();
185  void generateWitness();
186 
187 public:
188  friend class AND_Gadget;
189 
190 private:
191  // external variables
192  const LinearCombination input1_;
193  const LinearCombination input2_;
194  const Variable result_;
195 
197 }; // class BinaryAND_Gadget
198 
200  : public AND_GadgetBase
201  , public R1P_Gadget
202 {
203 private:
205  ProtoboardPtr pb, const VariableArray &input, const Variable &result);
206  virtual void init();
207 
208 public:
209  void generateConstraints();
210  void generateWitness();
211  friend class AND_Gadget;
212 
213 private:
214  // external variables
215  const VariableArray input_;
216  const Variable result_;
217  // internal variables
218  LinearCombination sum_;
219  Variable sumInverse_;
220 
222 };
223 
225 {
226 public:
227  static GadgetPtr create(
228  ProtoboardPtr pb, const VariableArray &input, const Variable &result);
229  static GadgetPtr create(
230  ProtoboardPtr pb,
231  const LinearCombination &input1,
232  const LinearCombination &input2,
233  const Variable &result);
234 
235 private:
236  DISALLOW_CONSTRUCTION(AND_Gadget);
237  DISALLOW_COPY_AND_ASSIGN(AND_Gadget);
238 }; // class GadgetType
239 
240 /*********************************/
241 /*** END OF Gadget ***/
242 /*********************************/
243 
244 /*************************************************************************************************/
245 /*************************************************************************************************/
246 /******************* ******************/
247 /******************* OR_Gadget classes ******************/
248 /******************* ******************/
249 /*************************************************************************************************/
250 /*************************************************************************************************/
251 
252 CREATE_GADGET_BASE_CLASS(OR_GadgetBase);
253 
255 class BinaryOR_Gadget : public OR_GadgetBase
256 {
257 private:
259  ProtoboardPtr pb,
260  const LinearCombination &input1,
261  const LinearCombination &input2,
262  const Variable &result);
263  void init();
264  void generateConstraints();
265  void generateWitness();
266 
267 public:
268  friend class OR_Gadget;
269 
270 private:
271  // external variables
272  const LinearCombination input1_;
273  const LinearCombination input2_;
274  const Variable result_;
275 
277 }; // class BinaryOR_Gadget
278 
280  : public OR_GadgetBase
281  , public R1P_Gadget
282 {
283 private:
284  LinearCombination sum_;
285  Variable sumInverse_;
287  ProtoboardPtr pb, const VariableArray &input, const Variable &result);
288  virtual void init();
289 
290 public:
293  void generateConstraints();
294  void generateWitness();
295  friend class OR_Gadget;
296 
297 private:
299 };
300 
302 {
303 public:
304  static GadgetPtr create(
305  ProtoboardPtr pb, const VariableArray &input, const Variable &result);
306  static GadgetPtr create(
307  ProtoboardPtr pb,
308  const LinearCombination &input1,
309  const LinearCombination &input2,
310  const Variable &result);
311 
312 private:
313  DISALLOW_CONSTRUCTION(OR_Gadget);
314  DISALLOW_COPY_AND_ASSIGN(OR_Gadget);
315 }; // class GadgetType
316 
317 /*********************************/
318 /*** END OF Gadget ***/
319 /*********************************/
320 
321 /*************************************************************************************************/
322 /*************************************************************************************************/
323 /******************* ******************/
324 /******************* InnerProduct_Gadget classes
325  * ******************/
326 /******************* ******************/
327 /*************************************************************************************************/
328 /*************************************************************************************************/
329 
330 CREATE_GADGET_BASE_CLASS(InnerProduct_GadgetBase);
331 
333  : public InnerProduct_GadgetBase
334  , public R1P_Gadget
335 {
336 private:
337  VariableArray partialSums_;
339  ProtoboardPtr pb,
340  const VariableArray &A,
341  const VariableArray &B,
342  const Variable &result);
343  virtual void init();
344 
345 public:
348  void generateConstraints();
349  void generateWitness();
350  friend class InnerProduct_Gadget;
351 
352 private:
354 };
355 
357  InnerProduct_Gadget, VariableArray, A, VariableArray, B, Variable, result);
358 
359 /*********************************/
360 /*** END OF Gadget ***/
361 /*********************************/
362 
363 /*************************************************************************************************/
364 /*************************************************************************************************/
365 /******************* ******************/
366 /******************* LooseMUX_Gadget classes ******************/
367 /******************* ******************/
368 /*************************************************************************************************/
369 /*************************************************************************************************/
370 
371 /*
372  Loose Multiplexer (MUX):
373  Multiplexes one Variable
374  index not in bounds -> success_flag = 0
375  index in bounds && success_flag = 1 -> result is correct
376  index is in bounds, we can also set success_flag to 0 -> result will be
377  forced to 0
378 */
379 
380 class LooseMUX_GadgetBase : virtual public Gadget
381 {
382 protected:
384 
385 public:
386  virtual ~LooseMUX_GadgetBase() = 0;
387  virtual VariableArray indicatorVariables() const = 0;
388 
389 private:
390  virtual void init() = 0;
391  DISALLOW_COPY_AND_ASSIGN(LooseMUX_GadgetBase);
392 }; // class LooseMUX_GadgetBase
393 
395  : public LooseMUX_GadgetBase
396  , public R1P_Gadget
397 {
398 private:
399  VariableArray indicators_;
400  ::std::vector<GadgetPtr> computeResult_; // Inner product gadgets
402  ProtoboardPtr pb,
403  const MultiPackedWordArray &inputs,
404  const Variable &index,
405  const VariableArray &output,
406  const Variable &successFlag);
407  virtual void init();
408 
409 public:
414  void generateConstraints();
415  void generateWitness();
416  virtual VariableArray indicatorVariables() const;
417  friend class LooseMUX_Gadget;
418 
419 private:
421 };
422 
424 {
425 public:
426  static GadgetPtr create(
427  ProtoboardPtr pb,
428  const MultiPackedWordArray &inputs,
429  const Variable &index,
430  const VariableArray &output,
431  const Variable &successFlag);
432  static GadgetPtr create(
433  ProtoboardPtr pb,
434  const VariableArray &inputs,
435  const Variable &index,
436  const Variable &output,
437  const Variable &successFlag);
438 
439 private:
440  DISALLOW_CONSTRUCTION(LooseMUX_Gadget);
441  DISALLOW_COPY_AND_ASSIGN(LooseMUX_Gadget);
442 }; // class GadgetType
443 
444 /*********************************/
445 /*** END OF Gadget ***/
446 /*********************************/
447 
448 /*************************************************************************************************/
449 /*************************************************************************************************/
450 /******************* ******************/
451 /******************* CompressionPacking_Gadget classes
452  * ******************/
453 /******************* ******************/
454 /*************************************************************************************************/
455 /*************************************************************************************************/
456 // TODO change class name to bitpacking
457 enum class PackingMode : bool { PACK, UNPACK };
458 
459 CREATE_GADGET_BASE_CLASS(CompressionPacking_GadgetBase);
460 
462  : public CompressionPacking_GadgetBase
463  , public R1P_Gadget
464 {
465 private:
466  PackingMode packingMode_;
468  ProtoboardPtr pb,
469  const VariableArray &unpacked,
470  const VariableArray &packed,
471  PackingMode packingMode);
472  virtual void init();
473 
474 public:
477  void generateConstraints();
478  void generateWitness();
480 
481 private:
483 };
484 
486  CompressionPacking_Gadget,
488  unpacked,
490  packed,
491  PackingMode,
492  packingMode);
493 
494 /*********************************/
495 /*** END OF Gadget ***/
496 /*********************************/
497 
498 /*************************************************************************************************/
499 /*************************************************************************************************/
500 /******************* ******************/
501 /******************* IntegerPacking_Gadget classes
502  * ******************/
503 /******************* ******************/
504 /*************************************************************************************************/
505 /*************************************************************************************************/
506 
507 CREATE_GADGET_BASE_CLASS(IntegerPacking_GadgetBase);
508 
509 // In R1P compression and arithmetic packing are implemented the same, hence
510 // this gadget simply instantiates an R1P_CompressionPacking_Gadget
512  : public IntegerPacking_GadgetBase
513  , public R1P_Gadget
514 {
515 private:
516  PackingMode packingMode_;
517  GadgetPtr compressionPackingGadget_;
519  ProtoboardPtr pb,
520  const VariableArray &unpacked,
521  const VariableArray &packed,
522  PackingMode packingMode);
523  virtual void init();
524 
525 public:
528  void generateConstraints();
529  void generateWitness();
530  friend class IntegerPacking_Gadget;
531 
532 private:
534 };
535 
537  IntegerPacking_Gadget,
539  unpacked,
541  packed,
542  PackingMode,
543  packingMode);
544 
545 /*********************************/
546 /*** END OF Gadget ***/
547 /*********************************/
548 
549 /*************************************************************************************************/
550 /*************************************************************************************************/
551 /******************* ******************/
552 /******************* EqualsConst_Gadget classes
553  * ******************/
554 /******************* ******************/
555 /*************************************************************************************************/
556 /*************************************************************************************************/
557 
558 /*
559  Gadgets recieve a constant field element n, and an input.
560  input == n ==> result = 1
561  input != n ==> result = 0
562 */
563 
564 // TODO change to take LinearCombination as input and change AND/OR to use this
565 CREATE_GADGET_BASE_CLASS(EqualsConst_GadgetBase);
566 
568  : public EqualsConst_GadgetBase
569  , public R1P_Gadget
570 {
571 private:
572  const FElem n_;
573  Variable aux_;
575  ProtoboardPtr pb,
576  const FElem &n,
577  const LinearCombination &input,
578  const Variable &result);
579  virtual void init();
580 
581 public:
584  void generateConstraints();
585  void generateWitness();
586  friend class EqualsConst_Gadget;
587 
588 private:
590 };
591 
593  EqualsConst_Gadget, FElem, n, LinearCombination, input, Variable, result);
594 
595 /*********************************/
596 /*** END OF Gadget ***/
597 /*********************************/
598 
599 /*************************************************************************************************/
600 /*************************************************************************************************/
601 /******************* ******************/
602 /******************* DualWord_Gadget ******************/
603 /******************* ******************/
604 /*************************************************************************************************/
605 /*************************************************************************************************/
606 // TODO add test
607 
608 class DualWord_Gadget : public Gadget
609 {
610 
611 private:
612  const DualWord var_;
613  const PackingMode packingMode_;
614 
615  GadgetPtr packingGadget_;
616 
618  ProtoboardPtr pb, const DualWord &var, PackingMode packingMode);
619  virtual void init();
620  DISALLOW_COPY_AND_ASSIGN(DualWord_Gadget);
621 
622 public:
623  static GadgetPtr create(
624  ProtoboardPtr pb, const DualWord &var, PackingMode packingMode);
625  void generateConstraints();
626  void generateWitness();
627 };
628 
629 /*********************************/
630 /*** END OF Gadget ***/
631 /*********************************/
632 
633 /*************************************************************************************************/
634 /*************************************************************************************************/
635 /******************* ******************/
636 /******************* DualWordArray_Gadget ******************/
637 /******************* ******************/
638 /*************************************************************************************************/
639 /*************************************************************************************************/
640 // TODO add test
641 
643 {
644 
645 private:
646  const DualWordArray vars_;
647  const PackingMode packingMode_;
648 
649  ::std::vector<GadgetPtr> packingGadgets_;
650 
652  ProtoboardPtr pb, const DualWordArray &vars, PackingMode packingMode);
653  virtual void init();
654  DISALLOW_COPY_AND_ASSIGN(DualWordArray_Gadget);
655 
656 public:
657  static GadgetPtr create(
658  ProtoboardPtr pb, const DualWordArray &vars, PackingMode packingMode);
659  void generateConstraints();
660  void generateWitness();
661 };
662 
663 /*********************************/
664 /*** END OF Gadget ***/
665 /*********************************/
666 
667 /*************************************************************************************************/
668 /*************************************************************************************************/
669 /******************* ******************/
670 /******************* Toggle_Gadget ******************/
671 /******************* ******************/
672 /*************************************************************************************************/
673 /*************************************************************************************************/
674 
675 // TODO add test
676 
681 
682 class Toggle_Gadget : public Gadget
683 {
684 private:
685  FlagVariable toggle_;
686  LinearCombination zeroValue_;
687  LinearCombination oneValue_;
688  Variable result_;
689 
691  ProtoboardPtr pb,
692  const FlagVariable &toggle,
693  const LinearCombination &zeroValue,
694  const LinearCombination &oneValue,
695  const Variable &result);
696 
697  virtual void init() {}
698  DISALLOW_COPY_AND_ASSIGN(Toggle_Gadget);
699 
700 public:
701  static GadgetPtr create(
702  ProtoboardPtr pb,
703  const FlagVariable &toggle,
704  const LinearCombination &zeroValue,
705  const LinearCombination &oneValue,
706  const Variable &result);
707 
708  void generateConstraints();
709  void generateWitness();
710 };
711 
712 /*********************************/
713 /*** END OF Gadget ***/
714 /*********************************/
715 
716 /*************************************************************************************************/
717 /*************************************************************************************************/
718 /******************* ******************/
719 /******************* ConditionalFlag_Gadget
720  * ******************/
721 /******************* ******************/
722 /*************************************************************************************************/
723 /*************************************************************************************************/
724 
729 
731 {
732 private:
733  FlagVariable flag_;
734  LinearCombination condition_;
735  Variable auxConditionInverse_;
736 
738  ProtoboardPtr pb,
739  const LinearCombination &condition,
740  const FlagVariable &flag);
741 
742  virtual void init() {}
743  DISALLOW_COPY_AND_ASSIGN(ConditionalFlag_Gadget);
744 
745 public:
746  static GadgetPtr create(
747  ProtoboardPtr pb,
748  const LinearCombination &condition,
749  const FlagVariable &flag);
750 
751  void generateConstraints();
752  void generateWitness();
753 };
754 
755 /*********************************/
756 /*** END OF Gadget ***/
757 /*********************************/
758 
759 /*************************************************************************************************/
760 /*************************************************************************************************/
761 /******************* ******************/
762 /******************* LogicImplication_Gadget
763  * ******************/
764 /******************* ******************/
765 /*************************************************************************************************/
766 /*************************************************************************************************/
767 
771 
773 {
774 private:
775  FlagVariable flag_;
776  LinearCombination condition_;
777 
779  ProtoboardPtr pb,
780  const LinearCombination &condition,
781  const FlagVariable &flag);
782 
783  virtual void init() {}
784  DISALLOW_COPY_AND_ASSIGN(LogicImplication_Gadget);
785 
786 public:
787  static GadgetPtr create(
788  ProtoboardPtr pb,
789  const LinearCombination &condition,
790  const FlagVariable &flag);
791 
792  void generateConstraints();
793  void generateWitness();
794 };
795 
796 /*********************************/
797 /*** END OF Gadget ***/
798 /*********************************/
799 
800 /*************************************************************************************************/
801 /*************************************************************************************************/
802 /******************* ******************/
803 /******************* Compare_Gadget ******************/
804 /******************* ******************/
805 /*************************************************************************************************/
806 /*************************************************************************************************/
807 
808 // TODO create unit test
809 CREATE_GADGET_BASE_CLASS(Comparison_GadgetBase);
810 
812  : public Comparison_GadgetBase
813  , public R1P_Gadget
814 {
815 private:
816  const size_t wordBitSize_;
817  const PackedWord lhs_;
818  const PackedWord rhs_;
819  const FlagVariable less_;
820  const FlagVariable lessOrEqual_;
821  const PackedWord alpha_p_;
822  UnpackedWord alpha_u_;
823  const FlagVariable notAllZeroes_;
824  GadgetPtr allZeroesTest_;
825  GadgetPtr alphaDualVariablePacker_;
826 
828  ProtoboardPtr pb,
829  const size_t &wordBitSize,
830  const PackedWord &lhs,
831  const PackedWord &rhs,
832  const FlagVariable &less,
833  const FlagVariable &lessOrEqual);
834  virtual void init();
835 
836 public:
837  static GadgetPtr create(
838  ProtoboardPtr pb,
839  const size_t &wordBitSize,
840  const PackedWord &lhs,
841  const PackedWord &rhs,
842  const FlagVariable &less,
843  const FlagVariable &lessOrEqual);
844 
845  void generateConstraints();
846  void generateWitness();
847  friend class Comparison_Gadget;
848 
849 private:
851 };
852 
854  Comparison_Gadget, // TODO uncomment this
855  size_t,
856  wordBitSize,
857  PackedWord,
858  lhs,
859  PackedWord,
860  rhs,
861  FlagVariable,
862  less,
863  FlagVariable,
864  lessOrEqual);
865 
866 /*********************************/
867 /*** END OF Gadget ***/
868 /*********************************/
869 
870 } // namespace gadgetlib2
871 
872 #endif // LIBSNARK_GADGETLIB2_INCLUDE_GADGETLIB2_GADGET_HPP_
gadgetlib2::DualWord
Holds both representations of a word, both multipacked and unpacked.
Definition: variable.hpp:424
gadgetlib2::R1P_EqualsConst_Gadget::EqualsConst_Gadget
friend class EqualsConst_Gadget
Definition: gadget.hpp:586
gadgetlib2::R1P_Gadget
Definition: gadget.hpp:146
gadgetlib2::LooseMUX_GadgetBase
Definition: gadget.hpp:380
gadgetlib2::R1P_IntegerPacking_Gadget::unpacked_
const VariableArray unpacked_
Definition: gadget.hpp:526
gadgetlib2::Gadget::flagIsSet
bool flagIsSet(const FlagVariable &flag) const
Definition: gadget.hpp:112
gadgetlib2::OR_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const VariableArray &input, const Variable &result)
Definition: gadget.cpp:323
gadgetlib2::Gadget::val
FElem val(const LinearCombination &lc)
Definition: gadget.hpp:110
gadgetlib2::R1P_OR_Gadget::input_
const VariableArray input_
Definition: gadget.hpp:291
gadgetlib2::Toggle_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:963
gadgetlib2::R1P_Comparison_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const size_t &wordBitSize, const PackedWord &lhs, const PackedWord &rhs, const FlagVariable &less, const FlagVariable &lessOrEqual)
gadgetlib2::BinaryAND_Gadget
Specific case for and AND with two inputs. Field agnostic.
Definition: gadget.hpp:175
gadgetlib2::R1P_EqualsConst_Gadget
Definition: gadget.hpp:567
gadgetlib2::R1P_AND_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:163
gadgetlib2::R1P_InnerProduct_Gadget::InnerProduct_Gadget
friend class InnerProduct_Gadget
Definition: gadget.hpp:350
gadgetlib2::Gadget::generateWitness
virtual void generateWitness()
Definition: gadget.cpp:46
gadgetlib2::R1P_AND_Gadget
Definition: gadget.hpp:199
gadgetlib2::R1P_CompressionPacking_Gadget::packed_
const VariableArray packed_
Definition: gadget.hpp:476
gadgetlib2::LooseMUX_GadgetBase::~LooseMUX_GadgetBase
virtual ~LooseMUX_GadgetBase()=0
Definition: gadget.cpp:455
gadgetlib2::CREATE_GADGET_FACTORY_CLASS_5
CREATE_GADGET_FACTORY_CLASS_5(Comparison_Gadget, size_t, wordBitSize, PackedWord, lhs, PackedWord, rhs, FlagVariable, less, FlagVariable, lessOrEqual)
gadgetlib2::DualWord_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:850
gadgetlib2::R1P_IntegerPacking_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:761
gadgetlib2::DualWordArray_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:900
gadgetlib2::LooseMUX_GadgetBase::LooseMUX_GadgetBase
LooseMUX_GadgetBase(ProtoboardPtr pb)
Definition: gadget.hpp:383
gadgetlib2::PackingMode::UNPACK
@ UNPACK
gadgetlib2::DualWordArray_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:893
gadgetlib2::R1P_OR_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:308
gadgetlib2::R1P_EqualsConst_Gadget::result_
const Variable result_
Definition: gadget.hpp:583
gadgetlib2::LogicImplication_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:1085
gadgetlib2::R1P_IntegerPacking_Gadget::IntegerPacking_Gadget
friend class IntegerPacking_Gadget
Definition: gadget.hpp:530
gadgetlib2::MultiPackedWordArray
::std::vector< MultiPackedWord > MultiPackedWordArray
Definition: variable.hpp:421
gadgetlib2::R1P_CompressionPacking_Gadget::unpacked_
const VariableArray unpacked_
Definition: gadget.hpp:475
gadgetlib2::R1P_LooseMUX_Gadget::successFlag_
const Variable successFlag_
Definition: gadget.hpp:413
gadgetlib2::R1P_OR_Gadget
Definition: gadget.hpp:279
gadgetlib2::R1P_CompressionPacking_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:654
gadgetlib2::Toggle_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:954
gadgetlib2::R1P_CompressionPacking_Gadget::CompressionPacking_Gadget
friend class CompressionPacking_Gadget
Definition: gadget.hpp:479
gadgetlib2::R1P_Gadget::addRank1Constraint
virtual void addRank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: gadget.cpp:72
gadgetlib2::ConditionalFlag_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const LinearCombination &condition, const FlagVariable &flag)
Definition: gadget.cpp:1008
gadgetlib2::R1P_Comparison_Gadget
Definition: gadget.hpp:811
gadgetlib2::R1P_CompressionPacking_Gadget
Definition: gadget.hpp:461
gadgetlib2::FieldType
FieldType
Definition: variable.hpp:37
gadgetlib2::Gadget::addRank1Constraint
void addRank1Constraint(const LinearCombination &a, const LinearCombination &b, const LinearCombination &c, const ::std::string &name)
Definition: gadget.cpp:58
gadgetlib2::BinaryOR_Gadget
Specific case for and OR with two inputs. Field agnostic.
Definition: gadget.hpp:255
gadgetlib2::LooseMUX_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const MultiPackedWordArray &inputs, const Variable &index, const VariableArray &output, const Variable &successFlag)
Definition: gadget.cpp:556
gadgetlib2::LogicImplication_Gadget
Definition: gadget.hpp:772
gadgetlib2::R1P_LooseMUX_Gadget::indicatorVariables
virtual VariableArray indicatorVariables() const
Definition: gadget.cpp:551
gadgetlib2::VariableArray
VariableArray.
Definition: variable.hpp:353
gadgetlib2::Gadget::val
FElem & val(const Variable &var)
Definition: gadget.hpp:109
gadgetlib2::R1P_LooseMUX_Gadget
Definition: gadget.hpp:394
gadgetlib2::Gadget
Definition: gadget.hpp:81
gadgetlib2::R1P_LooseMUX_Gadget::index_
const Variable index_
Definition: gadget.hpp:411
gadgetlib2::LooseMUX_Gadget
Definition: gadget.hpp:423
gadgetlib2::DualWordArray_Gadget
Definition: gadget.hpp:642
gadgetlib2::R1P_Comparison_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:1157
gadgetlib2::R1P_OR_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:297
gadgetlib2::R1P_CompressionPacking_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:670
gadgetlib2::R1P_LooseMUX_Gadget::inputs_
MultiPackedWordArray inputs_
Definition: gadget.hpp:410
gadgetlib2::LooseMUX_GadgetBase::indicatorVariables
virtual VariableArray indicatorVariables() const =0
gadgetlib2::ConditionalFlag_Gadget
Definition: gadget.hpp:730
gadgetlib2::FElem
Definition: variable.hpp:101
gadgetMacros.hpp
gadgetlib2::Toggle_Gadget
Definition: gadget.hpp:682
gadgetlib2::Toggle_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const FlagVariable &toggle, const LinearCombination &zeroValue, const LinearCombination &oneValue, const Variable &result)
Definition: gadget.cpp:941
gadgetlib2::Gadget::Gadget
Gadget(ProtoboardPtr pb)
Definition: gadget.cpp:39
gadgetlib2::UnpackedWord
Definition: variable.hpp:389
gadgetlib2::R1P_AND_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:174
gadgetlib2::DualWord_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const DualWord &var, PackingMode packingMode)
Definition: gadget.cpp:842
gadgetlib2::GadgetPtr
::std::shared_ptr< Gadget > GadgetPtr
Definition: gadget.hpp:119
gadgetlib2::R1P_InnerProduct_Gadget::A_
const VariableArray A_
Definition: gadget.hpp:346
variable.hpp
DISALLOW_COPY_AND_ASSIGN
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition: infrastructure.hpp:40
gadgetlib2::DualWord_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:855
gadgetlib2::DualWordArray_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const DualWordArray &vars, PackingMode packingMode)
Definition: gadget.cpp:885
gadgetlib2::CREATE_GADGET_FACTORY_CLASS_3
CREATE_GADGET_FACTORY_CLASS_3(InnerProduct_Gadget, VariableArray, A, VariableArray, B, Variable, result)
gadgetlib2::PackingMode
PackingMode
Definition: gadget.hpp:457
gadgetlib2::LogicImplication_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:1079
gadgetlib2::R1P_EqualsConst_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:813
gadgetlib2::CREATE_GADGET_BASE_CLASS
CREATE_GADGET_BASE_CLASS(AND_GadgetBase)
gadgetlib2::R1P_Comparison_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:1174
gadgetlib2::Gadget::generateConstraints
virtual void generateConstraints()=0
gadgetlib2::Gadget::enforceBooleanity
void enforceBooleanity(const Variable &var)
Definition: gadget.hpp:108
gadgetlib2::ConditionalFlag_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:1018
gadgetlib2::R1P_OR_Gadget::result_
const Variable result_
Definition: gadget.hpp:292
gadgetlib2::R1P_Gadget::R1P_Gadget
R1P_Gadget(ProtoboardPtr pb)
Definition: gadget.hpp:149
gadgetlib2::R1P_InnerProduct_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:428
gadgetlib2::ConditionalFlag_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:1029
gadgetlib2::R1P_IntegerPacking_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:756
gadgetlib2::PackingMode::PACK
@ PACK
gadgetlib2::R1P_IntegerPacking_Gadget
Definition: gadget.hpp:511
gadgetlib2::Gadget::addUnaryConstraint
void addUnaryConstraint(const LinearCombination &a, const ::std::string &name)
Definition: gadget.cpp:52
gadgetlib2::R1P_EqualsConst_Gadget::input_
const LinearCombination input_
Definition: gadget.hpp:582
gadgetlib2::R1P_InnerProduct_Gadget::result_
const Variable result_
Definition: gadget.hpp:347
gadgetlib2::R1P_InnerProduct_Gadget
Definition: gadget.hpp:332
gadgetlib2::R1P_Comparison_Gadget::Comparison_Gadget
friend class Comparison_Gadget
Definition: gadget.hpp:847
gadgetlib2::R1P_LooseMUX_Gadget::output_
const VariableArray output_
Definition: gadget.hpp:412
gadgetlib2::R1P_InnerProduct_Gadget::B_
const VariableArray B_
Definition: gadget.hpp:346
gadgetlib2::Variable
A formal variable, field agnostic.
Definition: variable.hpp:306
gadgetlib2::DualWordArray
Definition: variable.hpp:449
gadgetlib2::LogicImplication_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const LinearCombination &condition, const FlagVariable &flag)
Definition: gadget.cpp:1069
gadgetlib2::DualWord_Gadget
Definition: gadget.hpp:608
gadgetlib2::R1P_LooseMUX_Gadget::generateWitness
void generateWitness()
Definition: gadget.cpp:531
gadgetlib2::Gadget::pb_
ProtoboardPtr pb_
Definition: gadget.hpp:87
gadgetlib2::LinearCombination
LinearCombination.
Definition: variable.hpp:503
gadgetlib2::Gadget::init
virtual void init()=0
protoboard.hpp
gadgetlib2::ProtoboardPtr
::std::shared_ptr< Protoboard > ProtoboardPtr
Definition: variable.hpp:42
gadgetlib2::OR_Gadget
Definition: gadget.hpp:301
gadgetlib2::R1P_EqualsConst_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:806
gadgetlib2::R1P_LooseMUX_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:513
gadgetlib2::Gadget::fieldType
FieldType fieldType() const
Definition: gadget.hpp:111
gadgetlib2::AND_Gadget::create
static GadgetPtr create(ProtoboardPtr pb, const VariableArray &input, const Variable &result)
Definition: gadget.cpp:190
gadgetlib2::R1P_InnerProduct_Gadget::generateConstraints
void generateConstraints()
Definition: gadget.cpp:399
gadgetlib2::AND_Gadget
Definition: gadget.hpp:224
gadgetlib2
Definition: adapters.cpp:15
gadgetlib2::R1P_Gadget::~R1P_Gadget
virtual ~R1P_Gadget()=0
Definition: gadget.cpp:70
gadgetlib2::R1P_IntegerPacking_Gadget::packed_
const VariableArray packed_
Definition: gadget.hpp:527