barretenberg
Loading...
Searching...
No Matches
relation_types.hpp
1#pragma once
2#include "barretenberg/ecc/curves/bn254/fr.hpp"
3#include "nested_containers.hpp"
4#include <algorithm>
5
6template <typename T>
7concept IsField = std::same_as<T, barretenberg::fr> /* || std::same_as<T, grumpkin::fr> */;
8
9namespace proof_system {
10
21template <typename Params, typename View>
22using GetParameterView = std::conditional_t<IsField<typename Params::DataType>, typename Params::DataType, View>;
23
24template <typename T, size_t subrelation_idx>
26 {
27 std::get<subrelation_idx>(T::SUBRELATION_LINEARLY_INDEPENDENT)
28 } -> std::convertible_to<bool>;
29 };
30
31template <typename T>
32concept HasParameterLengthAdjustmentsMember = requires { T::TOTAL_LENGTH_ADJUSTMENTS; };
33
42template <typename Relation, size_t subrelation_index> constexpr bool subrelation_is_linearly_independent()
43{
45 return std::get<subrelation_index>(Relation::SUBRELATION_LINEARLY_INDEPENDENT);
46 } else {
47 return true;
48 }
49}
50
55template <typename RelationImpl>
56consteval std::array<size_t, RelationImpl::SUBRELATION_PARTIAL_LENGTHS.size()> compute_total_subrelation_lengths()
57{
58 if constexpr (HasParameterLengthAdjustmentsMember<RelationImpl>) {
59 constexpr size_t NUM_SUBRELATIONS = RelationImpl::SUBRELATION_PARTIAL_LENGTHS.size();
60 std::array<size_t, NUM_SUBRELATIONS> result;
61 for (size_t idx = 0; idx < NUM_SUBRELATIONS; idx++) {
62 result[idx] = RelationImpl::SUBRELATION_PARTIAL_LENGTHS[idx] + RelationImpl::TOTAL_LENGTH_ADJUSTMENTS[idx];
63 }
64 return result;
65 } else {
66 return RelationImpl::SUBRELATION_PARTIAL_LENGTHS;
67 }
68};
69
81template <size_t NUM_INSTANCES, size_t NUM_SUBRELATIONS>
82consteval std::array<size_t, NUM_SUBRELATIONS> compute_composed_subrelation_partial_lengths(
83 std::array<size_t, NUM_SUBRELATIONS> SUBRELATION_PARTIAL_LENGTHS)
84{
85 std::transform(SUBRELATION_PARTIAL_LENGTHS.begin(),
86 SUBRELATION_PARTIAL_LENGTHS.end(),
87 SUBRELATION_PARTIAL_LENGTHS.begin(),
88 [](const size_t x) { return (x - 1) * (NUM_INSTANCES - 1) + 1; });
89 return SUBRELATION_PARTIAL_LENGTHS;
90};
91
121template <typename RelationImpl> class Relation : public RelationImpl {
122 public:
123 using FF = typename RelationImpl::FF;
124
125 static constexpr std::array<size_t, RelationImpl::SUBRELATION_PARTIAL_LENGTHS.size()> SUBRELATION_TOTAL_LENGTHS =
126 compute_total_subrelation_lengths<RelationImpl>();
127
128 static constexpr size_t RELATION_LENGTH = *std::max_element(RelationImpl::SUBRELATION_PARTIAL_LENGTHS.begin(),
129 RelationImpl::SUBRELATION_PARTIAL_LENGTHS.end());
130
131 static constexpr size_t TOTAL_RELATION_LENGTH =
132 *std::max_element(SUBRELATION_TOTAL_LENGTHS.begin(), SUBRELATION_TOTAL_LENGTHS.end());
133
134 template <size_t NUM_INSTANCES>
135 using ProtogalaxyTupleOfUnivariatesOverSubrelations =
136 TupleOfUnivariates<FF, compute_composed_subrelation_partial_lengths<NUM_INSTANCES>(SUBRELATION_TOTAL_LENGTHS)>;
137 using SumcheckTupleOfUnivariatesOverSubrelations =
138 TupleOfUnivariates<FF, RelationImpl::SUBRELATION_PARTIAL_LENGTHS>;
139 using SumcheckArrayOfValuesOverSubrelations = ArrayOfValues<FF, RelationImpl::SUBRELATION_PARTIAL_LENGTHS>;
140
141 // These are commonly needed, most importantly, for explicitly instantiating
142 // compute_foo_numerator/denomintor.
143 using UnivariateAccumulator0 = std::tuple_element_t<0, SumcheckTupleOfUnivariatesOverSubrelations>;
144 using ValueAccumulator0 = std::tuple_element_t<0, SumcheckArrayOfValuesOverSubrelations>;
145};
146} // namespace proof_system
The templates defined herein facilitate sharing the relation arithmetic between the prover and the ve...
Definition: relation_types.hpp:121
Definition: relation_types.hpp:7
Definition: relation_types.hpp:32