Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
relation_checker.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
8
13
14namespace bb {
15
21template <typename Flavor> class RelationChecker {
22 public:
24 std::map<size_t,
25 uint32_t>; // key is the subrelation idx, value is the row idx.
26 // for relations which `has_linearly_dependent`, those subrelations which are "not
27 // linearly independent" (i.e., are only required to vanish on the entire execution trace)
28 // are treated as follows: if they do _not_ vanish when evaluated over the entire execution
29 // trace, we set the row_idx in this data structure to 0.
31 std::map<std::string, FirstSubrelationFailures>; // key is the name of a Relation, value is of type
32 // `FirstSubrelationFailures`. Theck if there are no failures,
33 // simply check if this hashmap is empty.
37 static AllSubrelationFailures check_all([[maybe_unused]] const auto& polynomials,
38 [[maybe_unused]] const auto& params)
39 {
40 // default
42 }
43
47 template <typename Relation, bool has_linearly_dependent = false>
48 static FirstSubrelationFailures check(const auto& polynomials,
49 const auto& params,
50 [[maybe_unused]] std::string label = "Relation")
51 {
52 FirstSubrelationFailures first_failure_per_subrelation;
53 // Define the appropriate accumulator type for the relation and initialize to zero
55 for (auto& element : result) {
56 element = 0;
57 }
58
59 for (uint32_t i = 0; i < polynomials.get_polynomial_size(); i++) {
60
61 Relation::accumulate(result, polynomials.get_row(i), params, 1);
62 size_t subrelation_idx = 0;
63
64 // Iterate over all the subrelation results and report if a linearly independent one failed
65 for (auto& element : result) {
66 if constexpr (has_linearly_dependent) {
67 if (element != 0 && Relation::SUBRELATION_LINEARLY_INDEPENDENT[subrelation_idx]) {
68 // only record the first failure for this subrelation
69 if (!first_failure_per_subrelation.contains(subrelation_idx)) {
70 first_failure_per_subrelation[subrelation_idx] = i;
71 }
72 }
73 } else {
74 if (element != 0) {
75 // only record the first failure for this subrelation
76 if (!first_failure_per_subrelation.contains(subrelation_idx)) {
77 first_failure_per_subrelation[subrelation_idx] = i;
78 }
79 }
80 }
81 subrelation_idx++;
82 }
83 }
84
85 if constexpr (has_linearly_dependent) {
86 size_t subrelation_idx = 0;
87 for (auto& element : result) {
88 // Check that linearly _dependent_ subrelation result is 0 over the entire execution trace
89 if (element != 0 && !Relation::SUBRELATION_LINEARLY_INDEPENDENT[subrelation_idx]) {
90 if (!first_failure_per_subrelation.contains(subrelation_idx)) {
91 first_failure_per_subrelation[subrelation_idx] = 0;
92 }
93 }
94 subrelation_idx++;
95 }
96 }
97 return first_failure_per_subrelation;
98 };
99};
100
101// Specialization for Ultra
102template <> class RelationChecker<bb::UltraFlavor> : public RelationChecker<void> {
104
105 public:
106 static AllSubrelationFailures check_all(const auto& polynomials, const auto& params)
107 {
108 using FF = UltraFlavor::FF;
109
110 AllSubrelationFailures all_subrelation_failures;
111
112 // Linearly independent relations (must be satisfied at each row)
113 auto ultra_arithmetic_subrelation_failures =
114 Base::check<ArithmeticRelation<FF>>(polynomials, params, "UltraArithmetic");
115 if (!ultra_arithmetic_subrelation_failures.empty()) {
116 all_subrelation_failures["UltraArithmetic"] = ultra_arithmetic_subrelation_failures;
117 }
118 auto ultra_permutation_subrelation_failures =
119 Base::check<UltraPermutationRelation<FF>>(polynomials, params, "UltraPermutation");
120 if (!ultra_permutation_subrelation_failures.empty()) {
121 all_subrelation_failures["UltraPermutation"] = ultra_permutation_subrelation_failures;
122 }
123 auto ultra_delta_range_subrelation_failures =
124 Base::check<DeltaRangeConstraintRelation<FF>>(polynomials, params, "DeltaRangeConstraint");
125 if (!ultra_delta_range_subrelation_failures.empty()) {
126 all_subrelation_failures["UltraDeltaRange"] = ultra_delta_range_subrelation_failures;
127 }
128 auto ultra_elliptic_subrelation_failures = Base::check<EllipticRelation<FF>>(polynomials, params, "Elliptic");
129 if (!ultra_elliptic_subrelation_failures.empty()) {
130 all_subrelation_failures["UltraElliptic"] = ultra_elliptic_subrelation_failures;
131 }
132 auto ultra_memory_subrelation_failures = Base::check<MemoryRelation<FF>>(polynomials, params, "Memory");
133 if (!ultra_memory_subrelation_failures.empty()) {
134 all_subrelation_failures["UltraMemory"] = ultra_memory_subrelation_failures;
135 }
136 auto ultra_non_native_field_subrelation_failures =
137 Base::check<NonNativeFieldRelation<FF>>(polynomials, params, "NonNativeField");
138 if (!ultra_non_native_field_subrelation_failures.empty()) {
139 all_subrelation_failures["NonNativeField"] = ultra_non_native_field_subrelation_failures;
140 }
141 auto ultra_poseidon2_external_subrelation_failures =
142 Base::check<Poseidon2ExternalRelation<FF>>(polynomials, params, "Poseidon2External");
143 if (!ultra_poseidon2_external_subrelation_failures.empty()) {
144 all_subrelation_failures["UltraPoseidon2External"] = ultra_poseidon2_external_subrelation_failures;
145 }
146 auto ultra_poseidon2_internal_subrelation_failures =
147 Base::check<Poseidon2InternalRelation<FF>>(polynomials, params, "Poseidon2Internal");
148 if (!ultra_poseidon2_internal_subrelation_failures.empty()) {
149 all_subrelation_failures["UltraPoseidon2Internal"] = ultra_poseidon2_internal_subrelation_failures;
150 }
151
152 // Relations that have "linearly dependent" subrelations
153 auto ultra_log_derivative_subrelation_failures =
154 Base::check<LogDerivLookupRelation<FF>, true>(polynomials, params, "LogDerivLookup");
155 if (!ultra_log_derivative_subrelation_failures.empty()) {
156 all_subrelation_failures["UltraLogDerivative"] = ultra_log_derivative_subrelation_failures;
157 }
158 return all_subrelation_failures;
159 }
160};
161
162// Specialization for Mega
163template <> class RelationChecker<MegaFlavor> : public RelationChecker<void> {
165
166 public:
167 static AllSubrelationFailures check_all(const auto& polynomials, const auto& params)
168 {
169 using FF = MegaFlavor::FF;
170
171 // Start with all relations that are shared with Ultra
172 AllSubrelationFailures all_subrelation_failures = RelationChecker<UltraFlavor>::check_all(polynomials, params);
173
174 // Mega-specific relations
175 // There is one relation that does not `have_linearly_dependent`.
176 auto mega_ecc_op_queue_subrelation_failures =
177 Base::check<EccOpQueueRelation<FF>>(polynomials, params, "EccOpQueue");
178 if (!mega_ecc_op_queue_subrelation_failures.empty()) {
179 all_subrelation_failures["MegaEccOpQueue"] = mega_ecc_op_queue_subrelation_failures;
180 }
181
182 // There is one one relation that satisfies `have_linearly_dependent`
183 auto mega_databus_lookup_subrelation_failures =
184 Base::check<DatabusLookupRelation<FF>, true>(polynomials, params, "DatabusLookup");
185 if (!mega_databus_lookup_subrelation_failures.empty()) {
186 all_subrelation_failures["MegaDatabusLookup"] = mega_databus_lookup_subrelation_failures;
187 }
188
189 return all_subrelation_failures;
190 }
191};
192} // namespace bb
193
194// namespace bb
Curve::ScalarField FF
static AllSubrelationFailures check_all(const auto &polynomials, const auto &params)
static AllSubrelationFailures check_all(const auto &polynomials, const auto &params)
A debugging utility for checking whether a set of polynomials satisfies the relations for a given Fla...
static AllSubrelationFailures check_all(const auto &polynomials, const auto &params)
Check that the provided polynomials satisfy all relations for a given Flavor.
static FirstSubrelationFailures check(const auto &polynomials, const auto &params, std::string label="Relation")
Check that a single specified relation is satisfied for a set of polynomials.
std::map< size_t, uint32_t > FirstSubrelationFailures
std::map< std::string, FirstSubrelationFailures > AllSubrelationFailures
ArrayOfValues< FF, RelationImpl::SUBRELATION_PARTIAL_LENGTHS > SumcheckArrayOfValuesOverSubrelations
Curve::ScalarField FF
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13