2 *****************************************************************************
3 * @author This file is part of libsnark, developed by SCIPR Lab
4 * and contributors (see AUTHORS).
5 * @copyright MIT license (see LICENSE file)
6 *****************************************************************************/
8 #ifndef PROTOBOARD_TCC_
9 #define PROTOBOARD_TCC_
13 #include <libff/common/profiling.hpp>
18 template<typename FieldT> protoboard<FieldT>::protoboard()
20 constant_term = FieldT::one();
23 constraint_system.variable_annotations[0] = "ONE";
26 next_free_var = 1; /* to account for constant 1 term */
30 template<typename FieldT> void protoboard<FieldT>::clear_values()
32 std::fill(values.begin(), values.end(), FieldT::zero());
35 template<typename FieldT>
36 var_index_t protoboard<FieldT>::allocate_var_index(
37 const std::string &annotation)
40 assert(annotation != "");
41 constraint_system.variable_annotations[next_free_var] = annotation;
43 libff::UNUSED(annotation);
45 ++constraint_system.auxiliary_input_size;
46 values.emplace_back(FieldT::zero());
47 return next_free_var++;
50 template<typename FieldT> lc_index_t protoboard<FieldT>::allocate_lc_index()
52 lc_values.emplace_back(FieldT::zero());
53 return next_free_lc++;
56 template<typename FieldT>
57 FieldT &protoboard<FieldT>::val(const pb_variable<FieldT> &var)
59 assert(var.index <= values.size());
60 return (var.index == 0 ? constant_term : values[var.index - 1]);
63 template<typename FieldT>
64 FieldT protoboard<FieldT>::val(const pb_variable<FieldT> &var) const
66 assert(var.index <= values.size());
67 return (var.index == 0 ? constant_term : values[var.index - 1]);
70 template<typename FieldT>
71 FieldT &protoboard<FieldT>::lc_val(const pb_linear_combination<FieldT> &lc)
74 return this->val(pb_variable<FieldT>(lc.index));
76 assert(lc.index < lc_values.size());
77 return lc_values[lc.index];
81 template<typename FieldT>
82 FieldT protoboard<FieldT>::lc_val(const pb_linear_combination<FieldT> &lc) const
85 return this->val(pb_variable<FieldT>(lc.index));
87 assert(lc.index < lc_values.size());
88 return lc_values[lc.index];
92 template<typename FieldT>
93 void protoboard<FieldT>::add_r1cs_constraint(
94 const r1cs_constraint<FieldT> &constr, const std::string &annotation)
97 assert(annotation != "");
99 .constraint_annotations[constraint_system.constraints.size()] =
102 libff::UNUSED(annotation);
104 constraint_system.constraints.emplace_back(constr);
107 template<typename FieldT>
108 void protoboard<FieldT>::augment_variable_annotation(
109 const pb_variable<FieldT> &v, const std::string &postfix)
112 auto it = constraint_system.variable_annotations.find(v.index);
113 constraint_system.variable_annotations[v.index] =
114 (it == constraint_system.variable_annotations.end()
116 : it->second + " ") +
120 libff::UNUSED(postfix);
124 template<typename FieldT> bool protoboard<FieldT>::is_satisfied() const
126 return constraint_system.is_satisfied(primary_input(), auxiliary_input());
129 template<typename FieldT> void protoboard<FieldT>::dump_variables() const
132 for (size_t i = 0; i < constraint_system.num_variables(); ++i) {
133 printf("%-40s --> ", constraint_system.variable_annotations[i].c_str());
134 values[i].as_bigint().print_hex();
139 template<typename FieldT> size_t protoboard<FieldT>::num_constraints() const
141 return constraint_system.num_constraints();
144 template<typename FieldT> size_t protoboard<FieldT>::num_inputs() const
146 return constraint_system.num_inputs();
149 template<typename FieldT> size_t protoboard<FieldT>::num_variables() const
151 return next_free_var - 1;
154 template<typename FieldT>
155 void protoboard<FieldT>::set_input_sizes(const size_t primary_input_size)
157 assert(primary_input_size <= num_variables());
158 constraint_system.primary_input_size = primary_input_size;
159 constraint_system.auxiliary_input_size =
160 num_variables() - primary_input_size;
163 template<typename FieldT>
164 const r1cs_variable_assignment<FieldT>
165 &protoboard<FieldT>::full_variable_assignment() const
170 template<typename FieldT>
171 r1cs_primary_input<FieldT> protoboard<FieldT>::primary_input() const
173 return r1cs_primary_input<FieldT>(
174 values.begin(), values.begin() + num_inputs());
177 template<typename FieldT>
178 r1cs_auxiliary_input<FieldT> protoboard<FieldT>::auxiliary_input() const
180 return r1cs_auxiliary_input<FieldT>(
181 values.begin() + num_inputs(), values.end());
184 template<typename FieldT>
185 const r1cs_constraint_system<FieldT>
186 &protoboard<FieldT>::get_constraint_system() const
188 return constraint_system;
191 } // namespace libsnark
192 #endif // PROTOBOARD_TCC_