-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathr1cs.i
130 lines (127 loc) · 4.31 KB
/
r1cs.i
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
//template<typename FieldT>
//class r1cs_constraint;
//
//template<typename FieldT>
//std::ostream& operator<<(std::ostream &out, const r1cs_constraint<FieldT> &c);
//
//template<typename FieldT>
//std::istream& operator>>(std::istream &in, r1cs_constraint<FieldT> &c);
//
///**
// * A R1CS constraint is a formal expression of the form
// *
// * < A , X > * < B , X > = < C , X > ,
// *
// * where X = (x_0,x_1,...,x_m) is a vector of formal variables and A,B,C each
// * consist of 1+m elements in <FieldT>.
// *
// * A R1CS constraint is used to construct a R1CS constraint system (see below).
// */
template<typename FieldT>
class r1cs_constraint {
public:
//
linear_combination<FieldT> a, b, c;
//
// r1cs_constraint() {};
r1cs_constraint(const linear_combination<FieldT> &a,
const linear_combination<FieldT> &b,
const linear_combination<FieldT> &c);
//
// r1cs_constraint(const std::initializer_list<linear_combination<FieldT> > &A,
// const std::initializer_list<linear_combination<FieldT> > &B,
// const std::initializer_list<linear_combination<FieldT> > &C);
//
// bool operator==(const r1cs_constraint<FieldT> &other) const;
//
// friend std::ostream& operator<< <FieldT>(std::ostream &out, const r1cs_constraint<FieldT> &c);
// friend std::istream& operator>> <FieldT>(std::istream &in, r1cs_constraint<FieldT> &c);
};
//
///************************* R1CS variable assignment **************************/
//
///**
// * A R1CS variable assignment is a vector of <FieldT> elements that represents
// * a candidate solution to a R1CS constraint system (see below).
// */
//
///* TODO: specify that it does *NOT* include the constant 1 */
//template<typename FieldT>
//using r1cs_primary_input = std::vector<FieldT>;
template<typename FieldT>
class r1cs_primary_input {
public:
int size();
FieldT at(int index) const;
};
template<typename FieldT>
class r1cs_auxiliary_input {
public:
int size();
FieldT at(int index) const;
};
//
//template<typename FieldT>
//using r1cs_auxiliary_input = std::vector<FieldT>;
//
//template<typename FieldT>
//using r1cs_variable_assignment = std::vector<FieldT>; /* note the changed name! (TODO: remove this comment after primary_input transition is complete) */
//
///************************* R1CS constraint system ****************************/
//
//template<typename FieldT>
//class r1cs_constraint_system;
//
//template<typename FieldT>
//std::ostream& operator<<(std::ostream &out, const r1cs_constraint_system<FieldT> &cs);
//
//template<typename FieldT>
//std::istream& operator>>(std::istream &in, r1cs_constraint_system<FieldT> &cs);
//
///**
// * A system of R1CS constraints looks like
// *
// * { < A_k , X > * < B_k , X > = < C_k , X > }_{k=1}^{n} .
// *
// * In other words, the system is satisfied if and only if there exist a
// * USCS variable assignment for which each R1CS constraint is satisfied.
// *
// * NOTE:
// * The 0-th variable (i.e., "x_{0}") always represents the constant 1.
// * Thus, the 0-th variable is not included in num_variables.
// */
template<typename FieldT>
class r1cs_constraint_system {
public:
// size_t primary_input_size;
// size_t auxiliary_input_size;
//
// std::vector<r1cs_constraint<FieldT> > constraints;
//
// r1cs_constraint_system() : primary_input_size(0), auxiliary_input_size(0) {}
//
// size_t num_inputs() const;
// size_t num_variables() const;
// size_t num_constraints() const;
//
//#ifdef DEBUG
// std::map<size_t, std::string> constraint_annotations;
// std::map<size_t, std::string> variable_annotations;
//#endif
//
// bool is_valid() const;
// bool is_satisfied(const r1cs_primary_input<FieldT> &primary_input,
// const r1cs_auxiliary_input<FieldT> &auxiliary_input) const;
//
// void add_constraint(const r1cs_constraint<FieldT> &c);
// void add_constraint(const r1cs_constraint<FieldT> &c, const std::string &annotation);
//
// void swap_AB_if_beneficial();
//
// bool operator==(const r1cs_constraint_system<FieldT> &other) const;
//
// friend std::ostream& operator<< <FieldT>(std::ostream &out, const r1cs_constraint_system<FieldT> &cs);
// friend std::istream& operator>> <FieldT>(std::istream &in, r1cs_constraint_system<FieldT> &cs);
//
// void report_linear_constraint_statistics() const;
};