barretenberg
Loading...
Searching...
No Matches
utils.hpp
1#pragma once
2#include "barretenberg/polynomials/pow.hpp"
3#include "barretenberg/relations/relation_parameters.hpp"
4
5namespace barretenberg {
6
7template <typename Flavor> class RelationUtils {
8 public:
9 using FF = typename Flavor::FF;
10 using Relations = typename Flavor::Relations;
11 using PolynomialEvaluations = typename Flavor::AllValues;
12 using RelationEvaluations = typename Flavor::TupleOfArraysOfValues;
13
14 static constexpr size_t NUM_RELATIONS = Flavor::NUM_RELATIONS;
15
28 template <size_t outer_idx = 0, size_t inner_idx = 0, class Operation>
29 static void apply_to_tuple_of_tuples(auto& tuple, Operation&& operation)
30 {
31 auto& inner_tuple = std::get<outer_idx>(tuple);
32 auto& univariate = std::get<inner_idx>(inner_tuple);
33
34 // Apply the specified operation to each Univariate
35 operation.template operator()<outer_idx, inner_idx>(univariate);
36
37 const size_t inner_size = std::tuple_size_v<std::decay_t<decltype(std::get<outer_idx>(tuple))>>;
38 const size_t outer_size = std::tuple_size_v<std::decay_t<decltype(tuple)>>;
39
40 // Recurse over inner and outer tuples
41 if constexpr (inner_idx + 1 < inner_size) {
42 apply_to_tuple_of_tuples<outer_idx, inner_idx + 1, Operation>(tuple, std::forward<Operation>(operation));
43 } else if constexpr (outer_idx + 1 < outer_size) {
44 apply_to_tuple_of_tuples<outer_idx + 1, 0, Operation>(tuple, std::forward<Operation>(operation));
45 }
46 }
47
53 static void zero_univariates(auto& tuple)
54 {
55 auto set_to_zero = []<size_t, size_t>(auto& element) {
56 std::fill(element.evaluations.begin(), element.evaluations.end(), FF(0));
57 };
58 apply_to_tuple_of_tuples(tuple, set_to_zero);
59 }
60
68 static void scale_univariates(auto& tuple, const FF& challenge, FF& current_scalar)
69 {
70 auto scale_by_consecutive_powers_of_challenge = [&]<size_t, size_t>(auto& element) {
71 element *= current_scalar;
72 current_scalar *= challenge;
73 };
74 apply_to_tuple_of_tuples(tuple, scale_by_consecutive_powers_of_challenge);
75 }
76
86 template <typename... T>
87 static constexpr void add_tuples(std::tuple<T...>& tuple_1, const std::tuple<T...>& tuple_2)
88 {
89 auto add_tuples_helper = [&]<std::size_t... I>(std::index_sequence<I...>)
90 {
91 ((std::get<I>(tuple_1) += std::get<I>(tuple_2)), ...);
92 };
93
94 add_tuples_helper(std::make_index_sequence<sizeof...(T)>{});
95 }
96
108 template <typename Tuple, std::size_t Index = 0>
109 static constexpr void add_nested_tuples(Tuple& tuple_1, const Tuple& tuple_2)
110 {
111 if constexpr (Index < std::tuple_size<Tuple>::value) {
112 add_tuples(std::get<Index>(tuple_1), std::get<Index>(tuple_2));
113 add_nested_tuples<Tuple, Index + 1>(tuple_1, tuple_2);
114 }
115 }
116
125 template <typename Parameters, size_t relation_idx = 0>
126 // TODO(#224)(Cody): Input should be an array?
127 inline static void accumulate_relation_evaluations(PolynomialEvaluations evaluations,
128 RelationEvaluations& relation_evaluations,
129 const Parameters& relation_parameters,
130 const FF& partial_evaluation_constant)
131 {
132 using Relation = std::tuple_element_t<relation_idx, Relations>;
133 Relation::accumulate(std::get<relation_idx>(relation_evaluations),
134 evaluations,
135 relation_parameters,
136 partial_evaluation_constant);
137
138 // Repeat for the next relation.
139 if constexpr (relation_idx + 1 < NUM_RELATIONS) {
140 accumulate_relation_evaluations<Parameters, relation_idx + 1>(
141 evaluations, relation_evaluations, relation_parameters, partial_evaluation_constant);
142 }
143 }
144
154 template <size_t idx = 0> static void zero_elements(auto& tuple)
155 {
156 auto set_to_zero = [](auto& element) { std::fill(element.begin(), element.end(), FF(0)); };
157 apply_to_tuple_of_arrays(set_to_zero, tuple);
158 };
159
164 static void scale_and_batch_elements(auto& tuple, const FF& challenge, FF current_scalar, FF& result)
165 {
166 auto scale_by_challenge_and_accumulate = [&](auto& element) {
167 for (auto& entry : element) {
168 result += entry * current_scalar;
169 current_scalar *= challenge;
170 }
171 };
172 apply_to_tuple_of_arrays(scale_by_challenge_and_accumulate, tuple);
173 }
174
181 template <typename Operation, size_t idx = 0, typename... Ts>
182 static void apply_to_tuple_of_arrays(Operation&& operation, std::tuple<Ts...>& tuple)
183 {
184 auto& element = std::get<idx>(tuple);
185
186 std::invoke(std::forward<Operation>(operation), element);
187
188 if constexpr (idx + 1 < sizeof...(Ts)) {
189 apply_to_tuple_of_arrays<Operation, idx + 1>(operation, tuple);
190 }
191 }
192};
193} // namespace barretenberg
Definition: utils.hpp:7
static void zero_elements(auto &tuple)
Set each element in a tuple of arrays to zero.
Definition: utils.hpp:154
static void zero_univariates(auto &tuple)
Set all coefficients of Univariates to zero.
Definition: utils.hpp:53
static void scale_and_batch_elements(auto &tuple, const FF &challenge, FF current_scalar, FF &result)
Scale elements by consecutive powers of the challenge then sum.
Definition: utils.hpp:164
static void apply_to_tuple_of_arrays(Operation &&operation, std::tuple< Ts... > &tuple)
General purpose method for applying a tuple of arrays (of FFs)
Definition: utils.hpp:182
static void accumulate_relation_evaluations(PolynomialEvaluations evaluations, RelationEvaluations &relation_evaluations, const Parameters &relation_parameters, const FF &partial_evaluation_constant)
Calculate the contribution of each relation to the expected value of the full Honk relation.
Definition: utils.hpp:127
static void apply_to_tuple_of_tuples(auto &tuple, Operation &&operation)
General purpose method for applying an operation to a tuple of tuples of Univariates.
Definition: utils.hpp:29
static void scale_univariates(auto &tuple, const FF &challenge, FF &current_scalar)
Scale Univaraites by consecutive powers of the provided challenge.
Definition: utils.hpp:68
static constexpr void add_nested_tuples(Tuple &tuple_1, const Tuple &tuple_2)
Componentwise addition of nested tuples (tuples of tuples)
Definition: utils.hpp:109
static constexpr void add_tuples(std::tuple< T... > &tuple_1, const std::tuple< T... > &tuple_2)
Componentwise addition of two tuples.
Definition: utils.hpp:87
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16