forked from ttyhgo/VCNN
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpb_variable.hpp
More file actions
146 lines (114 loc) · 5.47 KB
/
pb_variable.hpp
File metadata and controls
146 lines (114 loc) · 5.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/** @file
*****************************************************************************
* @author This file is part of libsnark, developed by SCIPR Lab
* and contributors (see AUTHORS).
* @copyright MIT license (see LICENSE file)
*****************************************************************************/
#ifndef PB_VARIABLE_HPP_
#define PB_VARIABLE_HPP_
#include <cstddef>
#include <string>
#include <vector>
#include <libff/common/utils.hpp>
#include <libsnark/relations/variable.hpp>
namespace libsnark {
typedef size_t lc_index_t;
template<typename FieldT>
class protoboard;
template<typename FieldT>
class pb_variable : public variable<FieldT> {
public:
pb_variable(const var_index_t index = 0) : variable<FieldT>(index) {};
void allocate(protoboard<FieldT> &pb, const std::string &annotation="");
};
template<typename FieldT>
class pb_variable_array : private std::vector<pb_variable<FieldT> >
{
typedef std::vector<pb_variable<FieldT> > contents;
public:
using typename contents::iterator;
using typename contents::const_iterator;
using typename contents::reverse_iterator;
using typename contents::const_reverse_iterator;
using contents::begin;
using contents::end;
using contents::rbegin;
using contents::rend;
using contents::emplace_back;
using contents::insert;
using contents::reserve;
using contents::size;
using contents::empty;
using contents::operator[];
using contents::resize;
pb_variable_array() : contents() {};
pb_variable_array(size_t count, const pb_variable<FieldT> &value) : contents(count, value) {};
pb_variable_array(typename contents::const_iterator first, typename contents::const_iterator last) : contents(first, last) {};
pb_variable_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last) : contents(first, last) {};
void allocate(protoboard<FieldT> &pb, const size_t n, const std::string &annotation_prefix="");
void fill_with_field_elements(protoboard<FieldT> &pb, const std::vector<FieldT>& vals) const;
void fill_with_bits(protoboard<FieldT> &pb, const libff::bit_vector& bits) const;
void fill_with_bits_of_ulong(protoboard<FieldT> &pb, const unsigned long i) const;
void fill_with_bits_of_field_element(protoboard<FieldT> &pb, const FieldT &r) const;
std::vector<FieldT> get_vals(const protoboard<FieldT> &pb) const;
libff::bit_vector get_bits(const protoboard<FieldT> &pb) const;
FieldT get_field_element_from_bits(const protoboard<FieldT> &pb) const;
};
/* index 0 corresponds to the constant term (used in legacy code) */
#define ONE pb_variable<FieldT>(0)
template<typename FieldT>
class pb_linear_combination : public linear_combination<FieldT> {
public:
bool is_variable;
lc_index_t index;
pb_linear_combination();
pb_linear_combination(const pb_variable<FieldT> &var);
void assign(protoboard<FieldT> &pb, const linear_combination<FieldT> &lc);
void evaluate(protoboard<FieldT> &pb) const;
bool is_constant() const;
FieldT constant_term() const;
};
template<typename FieldT>
class pb_linear_combination_array : private std::vector<pb_linear_combination<FieldT> >
{
typedef std::vector<pb_linear_combination<FieldT> > contents;
public:
using typename contents::iterator;
using typename contents::const_iterator;
using typename contents::reverse_iterator;
using typename contents::const_reverse_iterator;
using contents::begin;
using contents::end;
using contents::rbegin;
using contents::rend;
using contents::emplace_back;
using contents::insert;
using contents::reserve;
using contents::size;
using contents::empty;
using contents::operator[];
using contents::resize;
pb_linear_combination_array() : contents() {};
pb_linear_combination_array(const pb_variable_array<FieldT> &arr) { for (auto &v : arr) this->emplace_back(pb_linear_combination<FieldT>(v)); };
pb_linear_combination_array(size_t count) : contents(count) {};
pb_linear_combination_array(size_t count, const pb_linear_combination<FieldT> &value) : contents(count, value) {};
pb_linear_combination_array(typename contents::const_iterator first, typename contents::const_iterator last) : contents(first, last) {};
pb_linear_combination_array(typename contents::const_reverse_iterator first, typename contents::const_reverse_iterator last) : contents(first, last) {};
void evaluate(protoboard<FieldT> &pb) const;
void fill_with_field_elements(protoboard<FieldT> &pb, const std::vector<FieldT>& vals) const;
void fill_with_bits(protoboard<FieldT> &pb, const libff::bit_vector& bits) const;
void fill_with_bits_of_ulong(protoboard<FieldT> &pb, const unsigned long i) const;
void fill_with_bits_of_field_element(protoboard<FieldT> &pb, const FieldT &r) const;
std::vector<FieldT> get_vals(const protoboard<FieldT> &pb) const;
libff::bit_vector get_bits(const protoboard<FieldT> &pb) const;
FieldT get_field_element_from_bits(const protoboard<FieldT> &pb) const;
};
template<typename FieldT>
linear_combination<FieldT> pb_sum(const pb_linear_combination_array<FieldT> &v);
template<typename FieldT>
linear_combination<FieldT> pb_packing_sum(const pb_linear_combination_array<FieldT> &v);
template<typename FieldT>
linear_combination<FieldT> pb_coeff_sum(const pb_linear_combination_array<FieldT> &v, const std::vector<FieldT> &coeffs);
} // libsnark
#include <libsnark/gadgetlib1/pb_variable.tcc>
#endif // PB_VARIABLE_HPP_