barretenberg
Loading...
Searching...
No Matches
permutation_relation.hpp
1#pragma once
2#include "barretenberg/relations/relation_types.hpp"
3
4namespace proof_system {
5
6template <typename FF_> class UltraPermutationRelationImpl {
7 public:
8 using FF = FF_;
9
10 static constexpr std::array<size_t, 2> SUBRELATION_PARTIAL_LENGTHS{
11 6, // grand product construction sub-relation
12 3 // left-shiftable polynomial sub-relation
13 };
14
15 static constexpr std::array<size_t, 2> TOTAL_LENGTH_ADJUSTMENTS{
16 5, // grand product construction sub-relation
17 0 // left-shiftable polynomial sub-relation
18 };
19
20 inline static auto& get_grand_product_polynomial(auto& in) { return in.z_perm; }
21 inline static auto& get_shifted_grand_product_polynomial(auto& in) { return in.z_perm_shift; }
22
23 template <typename Accumulator, typename AllEntities, typename Parameters>
24 inline static Accumulator compute_grand_product_numerator(const AllEntities& in, const Parameters& params)
25 {
26 using View = typename Accumulator::View;
27 using ParameterView = GetParameterView<Parameters, View>;
28
29 auto w_1 = View(in.w_l);
30 auto w_2 = View(in.w_r);
31 auto w_3 = View(in.w_o);
32 auto w_4 = View(in.w_4);
33 auto id_1 = View(in.id_1);
34 auto id_2 = View(in.id_2);
35 auto id_3 = View(in.id_3);
36 auto id_4 = View(in.id_4);
37
38 const auto& beta = ParameterView(params.beta);
39 const auto& gamma = ParameterView(params.gamma);
40
41 // witness degree 4; fully degree 8
42 return (w_1 + id_1 * beta + gamma) * (w_2 + id_2 * beta + gamma) * (w_3 + id_3 * beta + gamma) *
43 (w_4 + id_4 * beta + gamma);
44 }
45
46 template <typename Accumulator, typename AllEntities, typename Parameters>
47 inline static Accumulator compute_grand_product_denominator(const AllEntities& in, const Parameters& params)
48 {
49 using View = typename Accumulator::View;
50 using ParameterView = GetParameterView<Parameters, View>;
51
52 auto w_1 = View(in.w_l);
53 auto w_2 = View(in.w_r);
54 auto w_3 = View(in.w_o);
55 auto w_4 = View(in.w_4);
56
57 auto sigma_1 = View(in.sigma_1);
58 auto sigma_2 = View(in.sigma_2);
59 auto sigma_3 = View(in.sigma_3);
60 auto sigma_4 = View(in.sigma_4);
61
62 const auto& beta = ParameterView(params.beta);
63 const auto& gamma = ParameterView(params.gamma);
64
65 // witness degree 4; fully degree 8
66 return (w_1 + sigma_1 * beta + gamma) * (w_2 + sigma_2 * beta + gamma) * (w_3 + sigma_3 * beta + gamma) *
67 (w_4 + sigma_4 * beta + gamma);
68 }
69
81 template <typename ContainerOverSubrelations, typename AllEntities, typename Parameters>
82 inline static void accumulate(ContainerOverSubrelations& accumulators,
83 const AllEntities& in,
84 const Parameters& params,
85 const FF& scaling_factor)
86 {
87 // Contribution (1)
88 [&]() {
89 using Accumulator = std::tuple_element_t<0, ContainerOverSubrelations>;
90 using View = typename Accumulator::View;
91 using ParameterView = GetParameterView<Parameters, View>;
92 const auto public_input_delta = ParameterView(params.public_input_delta);
93 const auto z_perm = View(in.z_perm);
94 const auto z_perm_shift = View(in.z_perm_shift);
95 const auto lagrange_first = View(in.lagrange_first);
96 const auto lagrange_last = View(in.lagrange_last);
97
98 // witness degree: deg 5 - deg 5 = deg 5
99 // total degree: deg 9 - deg 10 = deg 10
100 std::get<0>(accumulators) +=
101 (((z_perm + lagrange_first) * compute_grand_product_numerator<Accumulator>(in, params)) -
102 ((z_perm_shift + lagrange_last * public_input_delta) *
103 compute_grand_product_denominator<Accumulator>(in, params))) *
104 scaling_factor;
105 }();
106
107 // Contribution (2)
108 [&]() {
109 using Accumulator = std::tuple_element_t<1, ContainerOverSubrelations>;
110 using View = typename Accumulator::View;
111 auto z_perm_shift = View(in.z_perm_shift);
112 auto lagrange_last = View(in.lagrange_last);
113
114 std::get<1>(accumulators) += (lagrange_last * z_perm_shift) * scaling_factor;
115 }();
116 };
117};
118
119template <typename FF> using UltraPermutationRelation = Relation<UltraPermutationRelationImpl<FF>>;
120
121} // namespace proof_system
Definition: permutation_relation.hpp:6
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)
Definition: permutation_relation.hpp:82