2 *****************************************************************************
4 Implementation of interfaces for:
6 - a USCS variable assignment, and
7 - a USCS constraint system.
11 *****************************************************************************
12 * @author This file is part of libsnark, developed by SCIPR Lab
13 * and contributors (see AUTHORS).
14 * @copyright MIT license (see LICENSE file)
15 *****************************************************************************/
22 #include <libff/algebra/fields/bigint.hpp>
23 #include <libff/common/profiling.hpp>
24 #include <libff/common/utils.hpp>
30 template<typename FieldT>
31 size_t uscs_constraint_system<FieldT>::num_inputs() const
33 return primary_input_size;
36 template<typename FieldT>
37 size_t uscs_constraint_system<FieldT>::num_variables() const
39 return primary_input_size + auxiliary_input_size;
42 template<typename FieldT>
43 size_t uscs_constraint_system<FieldT>::num_constraints() const
45 return constraints.size();
48 template<typename FieldT> bool uscs_constraint_system<FieldT>::is_valid() const
50 if (this->num_inputs() > this->num_variables())
53 for (size_t c = 0; c < constraints.size(); ++c) {
54 if (!valid_vector(constraints[c], this->num_variables())) {
62 template<typename FieldT>
63 void dump_uscs_constraint(
64 const uscs_constraint<FieldT> &constraint,
65 const uscs_variable_assignment<FieldT> &full_variable_assignment,
66 const std::map<size_t, std::string> &variable_annotations)
69 constraint.print_with_assignment(
70 full_variable_assignment, variable_annotations);
73 template<typename FieldT>
74 bool uscs_constraint_system<FieldT>::is_satisfied(
75 const uscs_primary_input<FieldT> &primary_input,
76 const uscs_auxiliary_input<FieldT> &auxiliary_input) const
78 assert(primary_input.size() == num_inputs());
79 assert(primary_input.size() + auxiliary_input.size() == num_variables());
81 uscs_variable_assignment<FieldT> full_variable_assignment = primary_input;
82 full_variable_assignment.insert(
83 full_variable_assignment.end(),
84 auxiliary_input.begin(),
85 auxiliary_input.end());
87 for (size_t c = 0; c < constraints.size(); ++c) {
88 FieldT res = constraints[c].evaluate(full_variable_assignment);
89 if (!(res.squared() == FieldT::one())) {
91 auto it = constraint_annotations.find(c);
93 "constraint %zu (%s) unsatisfied\n",
95 (it == constraint_annotations.end() ? "no annotation"
96 : it->second.c_str()));
97 printf("<a,(1,x)> = ");
99 printf("constraint was:\n");
100 dump_uscs_constraint(
101 constraints[c], full_variable_assignment, variable_annotations);
110 template<typename FieldT>
111 void uscs_constraint_system<FieldT>::add_constraint(
112 const uscs_constraint<FieldT> &c)
114 constraints.emplace_back(c);
117 template<typename FieldT>
118 void uscs_constraint_system<FieldT>::add_constraint(
119 const uscs_constraint<FieldT> &c, const std::string &annotation)
122 constraint_annotations[constraints.size()] = annotation;
124 libff::UNUSED(annotation);
126 constraints.emplace_back(c);
129 template<typename FieldT>
130 bool uscs_constraint_system<FieldT>::operator==(
131 const uscs_constraint_system<FieldT> &other) const
134 this->constraints == other.constraints &&
135 this->primary_input_size == other.primary_input_size &&
136 this->auxiliary_input_size == other.auxiliary_input_size);
139 template<typename FieldT>
140 std::ostream &operator<<(
141 std::ostream &out, const uscs_constraint_system<FieldT> &cs)
143 out << cs.primary_input_size << "\n";
144 out << cs.auxiliary_input_size << "\n";
146 out << cs.num_constraints() << "\n";
147 for (const uscs_constraint<FieldT> &c : cs.constraints) {
154 template<typename FieldT>
155 std::istream &operator>>(std::istream &in, uscs_constraint_system<FieldT> &cs)
157 in >> cs.primary_input_size;
158 in >> cs.auxiliary_input_size;
160 cs.constraints.clear();
168 cs.constraints.reserve(s);
170 for (size_t i = 0; i < s; ++i) {
171 uscs_constraint<FieldT> c;
173 cs.constraints.emplace_back(c);
179 template<typename FieldT>
180 void uscs_constraint_system<FieldT>::report_linear_constraint_statistics() const
183 for (size_t i = 0; i < constraints.size(); ++i) {
184 auto &constr = constraints[i];
185 bool a_is_const = true;
186 for (auto &t : constr.terms) {
187 a_is_const = a_is_const && (t.index == 0);
191 auto it = constraint_annotations.find(i);
194 (it == constraint_annotations.end()
195 ? FMT("", "constraint_%zu", i)
203 } // namespace libsnark