Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
permutation_relation.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
9namespace bb {
30template <typename FF_> class UltraPermutationRelationImpl {
31 public:
32 using FF = FF_;
33
34 static constexpr std::array<size_t, 2> SUBRELATION_PARTIAL_LENGTHS{
35 6, // grand product construction sub-relation
36 3 // left-shiftable polynomial sub-relation
37 };
38
39 static constexpr std::array<size_t, 2> TOTAL_LENGTH_ADJUSTMENTS{
40 5, // grand product construction sub-relation
41 0 // left-shiftable polynomial sub-relation
42 };
43
48 template <typename AllEntities> inline static bool skip(const AllEntities& in)
49 {
50 // If z_perm == z_perm_shift, this implies that none of the wire values for the present input are involved in
51 // non-trivial copy constraints.
52 return (in.z_perm - in.z_perm_shift).is_zero();
53 }
54
55 inline static auto& get_grand_product_polynomial(auto& in) { return in.z_perm; }
56 inline static auto& get_shifted_grand_product_polynomial(auto& in) { return in.z_perm_shift; }
57
58 template <typename Accumulator, typename AllEntities, typename Parameters>
59 inline static Accumulator compute_grand_product_numerator(const AllEntities& in, const Parameters& params)
60 {
61 using View = typename Accumulator::View;
62 using ParameterView = GetParameterView<Parameters, View>;
63
64 auto w_1 = View(in.w_l);
65 auto w_2 = View(in.w_r);
66 auto w_3 = View(in.w_o);
67 auto w_4 = View(in.w_4);
68 auto id_1 = View(in.id_1);
69 auto id_2 = View(in.id_2);
70 auto id_3 = View(in.id_3);
71 auto id_4 = View(in.id_4);
72
73 const auto& beta = ParameterView(params.beta);
74 const auto& gamma = ParameterView(params.gamma);
75
76 // witness degree 4; full degree 8
77 return (w_1 + id_1 * beta + gamma) * (w_2 + id_2 * beta + gamma) * (w_3 + id_3 * beta + gamma) *
78 (w_4 + id_4 * beta + gamma);
79 }
80
81 template <typename Accumulator, typename AllEntities, typename Parameters>
82 inline static Accumulator compute_grand_product_denominator(const AllEntities& in, const Parameters& params)
83 {
84 using View = typename Accumulator::View;
85 using ParameterView = GetParameterView<Parameters, View>;
86
87 auto w_1 = View(in.w_l);
88 auto w_2 = View(in.w_r);
89 auto w_3 = View(in.w_o);
90 auto w_4 = View(in.w_4);
91
92 auto sigma_1 = View(in.sigma_1);
93 auto sigma_2 = View(in.sigma_2);
94 auto sigma_3 = View(in.sigma_3);
95 auto sigma_4 = View(in.sigma_4);
96
97 const auto& beta = ParameterView(params.beta);
98 const auto& gamma = ParameterView(params.gamma);
99
100 // witness degree 4; full degree 8
101 return (w_1 + sigma_1 * beta + gamma) * (w_2 + sigma_2 * beta + gamma) * (w_3 + sigma_3 * beta + gamma) *
102 (w_4 + sigma_4 * beta + gamma);
103 }
104
121 template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
122 inline static void accumulate(ContainerOverSubrelations& accumulators,
123 const AllEntities& in,
124 const Parameters& params,
125 const FF& scaling_factor)
126 {
127 // Contribution (1)
129 using View = typename Accumulator::View;
130 using CoefficientAccumulator = typename Accumulator::CoefficientAccumulator;
131 using ParameterView = GetParameterView<Parameters, View>;
132 using ParameterCoefficientAccumulator = typename ParameterView::CoefficientAccumulator;
133
134 const CoefficientAccumulator w_1_m(in.w_l);
135 const CoefficientAccumulator w_2_m(in.w_r);
136 const CoefficientAccumulator w_3_m(in.w_o);
137 const CoefficientAccumulator w_4_m(in.w_4);
138 const CoefficientAccumulator id_1_m(in.id_1);
139 const CoefficientAccumulator id_2_m(in.id_2);
140 const CoefficientAccumulator id_3_m(in.id_3);
141 const CoefficientAccumulator id_4_m(in.id_4);
142 const CoefficientAccumulator sigma_1_m(in.sigma_1);
143 const CoefficientAccumulator sigma_2_m(in.sigma_2);
144 const CoefficientAccumulator sigma_3_m(in.sigma_3);
145 const CoefficientAccumulator sigma_4_m(in.sigma_4);
146
147 const ParameterCoefficientAccumulator gamma_m(params.gamma);
148 const ParameterCoefficientAccumulator beta_m(params.beta);
149
150 const auto w_1_plus_gamma = w_1_m + gamma_m;
151 const auto w_2_plus_gamma = w_2_m + gamma_m;
152 const auto w_3_plus_gamma = w_3_m + gamma_m;
153 const auto w_4_plus_gamma = w_4_m + gamma_m;
154
155 auto t1 = (id_1_m * beta_m);
156 t1 += w_1_plus_gamma;
157 t1 *= scaling_factor;
158 auto t2 = id_2_m * beta_m;
159 t2 += w_2_plus_gamma;
160 auto t3 = id_3_m * beta_m;
161 t3 += w_3_plus_gamma;
162 auto t4 = id_4_m * beta_m;
163 t4 += w_4_plus_gamma;
164
165 auto t5 = sigma_1_m * beta_m;
166 t5 += w_1_plus_gamma;
167 t5 *= scaling_factor;
168 auto t6 = sigma_2_m * beta_m;
169 t6 += w_2_plus_gamma;
170 auto t7 = sigma_3_m * beta_m;
171 t7 += w_3_plus_gamma;
172 auto t8 = sigma_4_m * beta_m;
173 t8 += w_4_plus_gamma;
174
175 Accumulator numerator(t1);
176 numerator *= Accumulator(t2);
177 numerator *= Accumulator(t3);
178 numerator *= Accumulator(t4);
179
180 Accumulator denominator(t5);
181 denominator *= Accumulator(t6);
182 denominator *= Accumulator(t7);
183 denominator *= Accumulator(t8);
184
185 const ParameterCoefficientAccumulator public_input_delta_m(params.public_input_delta);
186 const auto z_perm_m = CoefficientAccumulator(in.z_perm);
187 const auto z_perm_shift_m = CoefficientAccumulator(in.z_perm_shift);
188 const auto lagrange_first_m = CoefficientAccumulator(in.lagrange_first);
189 const auto lagrange_last_m = CoefficientAccumulator(in.lagrange_last);
190
191 auto public_input_term_m = lagrange_last_m * public_input_delta_m;
192 public_input_term_m += z_perm_shift_m;
193 const Accumulator public_input_term(public_input_term_m);
194 // witness degree: deg 5 - deg 5 = deg 5
195 // total degree: deg 9 - deg 10 = deg 10
196 std::get<0>(accumulators) +=
197 ((Accumulator(z_perm_m + lagrange_first_m) * numerator) - (public_input_term * denominator));
198
199 // Contribution (2)
201
202 std::get<1>(accumulators) += ShortAccumulator((lagrange_last_m * z_perm_shift_m) * scaling_factor);
203 };
204};
205
207
208} // namespace bb
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
static auto & get_grand_product_polynomial(auto &in)
static bool skip(const AllEntities &in)
Returns true if the contribution from all subrelations for the provided inputs is identically zero.
static constexpr std::array< size_t, 2 > SUBRELATION_PARTIAL_LENGTHS
static auto & get_shifted_grand_product_polynomial(auto &in)
static void accumulate(ContainerOverSubrelations &accumulators, const AllEntities &in, const Parameters &params, const FF &scaling_factor)
Compute contribution of the permutation relation for a given edge (internal function)
static Accumulator compute_grand_product_numerator(const AllEntities &in, const Parameters &params)
static Accumulator compute_grand_product_denominator(const AllEntities &in, const Parameters &params)
static constexpr std::array< size_t, 2 > TOTAL_LENGTH_ADJUSTMENTS
Entry point for Barretenberg command-line interface.
std::conditional_t< IsField< typename Params::DataType >, typename Params::DataType, View > GetParameterView
A type to optionally extract a view of a relation parameter in a relation.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13