81 template <
typename FF>
119 using BlockBase =
typename TraceBlocks::BlockBase;
127 &blocks.poseidon2_external,
128 &blocks.poseidon2_internal,
132 template <
typename TraceBlocks>
static auto get_gate_blocks(TraceBlocks
const& blocks)
134 using BlockBase =
typename TraceBlocks::BlockBase;
142 &blocks.poseidon2_external,
143 &blocks.poseidon2_internal,
158 block.q_m(), block.q_1(), block.q_2(), block.q_3(), block.q_4(), block.q_c(),
166 std::array<DataType, NUM_ALL_ENTITIES>
data{};
177 DataType&
sigma_1() {
return data[
static_cast<size_t>(EntityId::sigma_1)]; }
178 const DataType&
sigma_1()
const {
return data[
static_cast<size_t>(EntityId::sigma_1)]; }
179 DataType&
sigma_2() {
return data[
static_cast<size_t>(EntityId::sigma_2)]; }
180 const DataType&
sigma_2()
const {
return data[
static_cast<size_t>(EntityId::sigma_2)]; }
181 DataType&
sigma_3() {
return data[
static_cast<size_t>(EntityId::sigma_3)]; }
182 const DataType&
sigma_3()
const {
return data[
static_cast<size_t>(EntityId::sigma_3)]; }
183 DataType&
sigma_4() {
return data[
static_cast<size_t>(EntityId::sigma_4)]; }
184 const DataType&
sigma_4()
const {
return data[
static_cast<size_t>(EntityId::sigma_4)]; }
185 DataType&
id_1() {
return data[
static_cast<size_t>(EntityId::id_1)]; }
186 const DataType&
id_1()
const {
return data[
static_cast<size_t>(EntityId::id_1)]; }
187 DataType&
id_2() {
return data[
static_cast<size_t>(EntityId::id_2)]; }
188 const DataType&
id_2()
const {
return data[
static_cast<size_t>(EntityId::id_2)]; }
189 DataType&
id_3() {
return data[
static_cast<size_t>(EntityId::id_3)]; }
190 const DataType&
id_3()
const {
return data[
static_cast<size_t>(EntityId::id_3)]; }
191 DataType&
id_4() {
return data[
static_cast<size_t>(EntityId::id_4)]; }
192 const DataType&
id_4()
const {
return data[
static_cast<size_t>(EntityId::id_4)]; }
194 const DataType&
lagrange_first()
const {
return data[
static_cast<size_t>(EntityId::lagrange_first)]; }
196 const DataType&
lagrange_last()
const {
return data[
static_cast<size_t>(EntityId::lagrange_last)]; }
197 DataType&
q_lookup() {
return data[
static_cast<size_t>(EntityId::q_lookup)]; }
198 const DataType&
q_lookup()
const {
return data[
static_cast<size_t>(EntityId::q_lookup)]; }
199 DataType&
table_1() {
return data[
static_cast<size_t>(EntityId::table_1)]; }
200 const DataType&
table_1()
const {
return data[
static_cast<size_t>(EntityId::table_1)]; }
201 DataType&
table_2() {
return data[
static_cast<size_t>(EntityId::table_2)]; }
202 const DataType&
table_2()
const {
return data[
static_cast<size_t>(EntityId::table_2)]; }
203 DataType&
table_3() {
return data[
static_cast<size_t>(EntityId::table_3)]; }
204 const DataType&
table_3()
const {
return data[
static_cast<size_t>(EntityId::table_3)]; }
205 DataType&
table_4() {
return data[
static_cast<size_t>(EntityId::table_4)]; }
206 const DataType&
table_4()
const {
return data[
static_cast<size_t>(EntityId::table_4)]; }
207 DataType&
q_m() {
return data[
static_cast<size_t>(EntityId::q_m)]; }
208 const DataType&
q_m()
const {
return data[
static_cast<size_t>(EntityId::q_m)]; }
209 DataType&
q_r() {
return data[
static_cast<size_t>(EntityId::q_r)]; }
210 const DataType&
q_r()
const {
return data[
static_cast<size_t>(EntityId::q_r)]; }
211 DataType&
q_o() {
return data[
static_cast<size_t>(EntityId::q_o)]; }
212 const DataType&
q_o()
const {
return data[
static_cast<size_t>(EntityId::q_o)]; }
213 DataType&
q_c() {
return data[
static_cast<size_t>(EntityId::q_c)]; }
214 const DataType&
q_c()
const {
return data[
static_cast<size_t>(EntityId::q_c)]; }
215 DataType&
q_l() {
return data[
static_cast<size_t>(EntityId::q_l)]; }
216 const DataType&
q_l()
const {
return data[
static_cast<size_t>(EntityId::q_l)]; }
217 DataType&
q_4() {
return data[
static_cast<size_t>(EntityId::q_4)]; }
218 const DataType&
q_4()
const {
return data[
static_cast<size_t>(EntityId::q_4)]; }
219 DataType&
q_arith() {
return data[
static_cast<size_t>(EntityId::q_arith)]; }
220 const DataType&
q_arith()
const {
return data[
static_cast<size_t>(EntityId::q_arith)]; }
222 const DataType&
q_delta_range()
const {
return data[
static_cast<size_t>(EntityId::q_delta_range)]; }
223 DataType&
q_elliptic() {
return data[
static_cast<size_t>(EntityId::q_elliptic)]; }
224 const DataType&
q_elliptic()
const {
return data[
static_cast<size_t>(EntityId::q_elliptic)]; }
225 DataType&
q_memory() {
return data[
static_cast<size_t>(EntityId::q_memory)]; }
226 const DataType&
q_memory()
const {
return data[
static_cast<size_t>(EntityId::q_memory)]; }
227 DataType&
q_nnf() {
return data[
static_cast<size_t>(EntityId::q_nnf)]; }
228 const DataType&
q_nnf()
const {
return data[
static_cast<size_t>(EntityId::q_nnf)]; }
232 return data[
static_cast<size_t>(EntityId::q_poseidon2_external)];
237 return data[
static_cast<size_t>(EntityId::q_poseidon2_internal)];
239 DataType&
w_l() {
return data[
static_cast<size_t>(EntityId::w_l)]; }
240 const DataType&
w_l()
const {
return data[
static_cast<size_t>(EntityId::w_l)]; }
241 DataType&
w_r() {
return data[
static_cast<size_t>(EntityId::w_r)]; }
242 const DataType&
w_r()
const {
return data[
static_cast<size_t>(EntityId::w_r)]; }
243 DataType&
w_o() {
return data[
static_cast<size_t>(EntityId::w_o)]; }
244 const DataType&
w_o()
const {
return data[
static_cast<size_t>(EntityId::w_o)]; }
245 DataType&
w_4() {
return data[
static_cast<size_t>(EntityId::w_4)]; }
246 const DataType&
w_4()
const {
return data[
static_cast<size_t>(EntityId::w_4)]; }
247 DataType&
z_perm() {
return data[
static_cast<size_t>(EntityId::z_perm)]; }
248 const DataType&
z_perm()
const {
return data[
static_cast<size_t>(EntityId::z_perm)]; }
255 DataType&
w_l_shift() {
return data[
static_cast<size_t>(EntityId::w_l_shift)]; }
256 const DataType&
w_l_shift()
const {
return data[
static_cast<size_t>(EntityId::w_l_shift)]; }
257 DataType&
w_r_shift() {
return data[
static_cast<size_t>(EntityId::w_r_shift)]; }
258 const DataType&
w_r_shift()
const {
return data[
static_cast<size_t>(EntityId::w_r_shift)]; }
259 DataType&
w_o_shift() {
return data[
static_cast<size_t>(EntityId::w_o_shift)]; }
260 const DataType&
w_o_shift()
const {
return data[
static_cast<size_t>(EntityId::w_o_shift)]; }
261 DataType&
w_4_shift() {
return data[
static_cast<size_t>(EntityId::w_4_shift)]; }
262 const DataType&
w_4_shift()
const {
return data[
static_cast<size_t>(EntityId::w_4_shift)]; }
264 const DataType&
z_perm_shift()
const {
return data[
static_cast<size_t>(EntityId::z_perm_shift)]; }
327 return { (*this)[EntityId::sigma_1],
328 (*this)[EntityId::sigma_2],
329 (*this)[EntityId::sigma_3],
330 (*this)[EntityId::sigma_4] };
334 return { (*this)[EntityId::sigma_1],
335 (*this)[EntityId::sigma_2],
336 (*this)[EntityId::sigma_3],
337 (*this)[EntityId::sigma_4] };
342 (*this)[EntityId::id_1], (*this)[EntityId::id_2], (*this)[EntityId::id_3], (*this)[EntityId::id_4]
348 (*this)[EntityId::id_1], (*this)[EntityId::id_2], (*this)[EntityId::id_3], (*this)[EntityId::id_4]
353 return { (*this)[EntityId::q_lookup],
354 (*this)[EntityId::q_arith],
355 (*this)[EntityId::q_delta_range],
356 (*this)[EntityId::q_elliptic],
357 (*this)[EntityId::q_memory],
358 (*this)[EntityId::q_nnf],
359 (*this)[EntityId::q_poseidon2_external],
360 (*this)[EntityId::q_poseidon2_internal] };
364 return { (*this)[EntityId::q_lookup],
365 (*this)[EntityId::q_arith],
366 (*this)[EntityId::q_delta_range],
367 (*this)[EntityId::q_elliptic],
368 (*this)[EntityId::q_memory],
369 (*this)[EntityId::q_nnf],
370 (*this)[EntityId::q_poseidon2_external],
371 (*this)[EntityId::q_poseidon2_internal] };
375 return { (*this)[EntityId::table_1],
376 (*this)[EntityId::table_2],
377 (*this)[EntityId::table_3],
378 (*this)[EntityId::table_4] };
382 return { (*this)[EntityId::table_1],
383 (*this)[EntityId::table_2],
384 (*this)[EntityId::table_3],
385 (*this)[EntityId::table_4] };
389 return { (*this)[EntityId::w_l], (*this)[EntityId::w_r], (*this)[EntityId::w_o], (*this)[EntityId::w_4] };
393 return { (*this)[EntityId::w_l], (*this)[EntityId::w_r], (*this)[EntityId::w_o], (*this)[EntityId::w_4] };
397 return { (*this)[EntityId::q_m], (*this)[EntityId::q_l], (*this)[EntityId::q_r],
398 (*this)[EntityId::q_o], (*this)[EntityId::q_4], (*this)[EntityId::q_c] };
402 return { (*this)[EntityId::q_m], (*this)[EntityId::q_l], (*this)[EntityId::q_r],
403 (*this)[EntityId::q_o], (*this)[EntityId::q_4], (*this)[EntityId::q_c] };
413 static const std::vector<std::string> labels = {
414 "GEMINI_MASKING_POLY",
441 "Q_POSEIDON2_EXTERNAL",
442 "Q_POSEIDON2_INTERNAL",
449 "LOOKUP_READ_COUNTS",
465 std::array<DataType, NUM_PRECOMPUTED_ENTITIES>
data{};
566 return { this->
q_m(), this->
q_l(), this->
q_r(), this->
q_o(), this->
q_4(), this->
q_c() };
570 return { this->
q_m(), this->
q_l(), this->
q_r(), this->
q_o(), this->
q_4(), this->
q_c() };
579 static const std::vector<std::string> labels = {
606 "Q_POSEIDON2_EXTERNAL",
607 "Q_POSEIDON2_INTERNAL",
617 std::array<DataType, NUM_WITNESS_ENTITIES>
data{};
659 static const std::vector<std::string> labels = {
660 "W_L",
"W_R",
"W_O",
"W_4",
"Z_PERM",
"LOOKUP_INVERSES",
"LOOKUP_READ_COUNTS",
"LOOKUP_READ_TAGS",
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
const DataType & q_memory() const
DataType & gemini_masking_poly()
const DataType & lookup_read_tags() const
RefArray< DataType, 4 > get_wires()
RefArray< const DataType, 4 > get_sigmas() const
const DataType & w_l_shift() const
RefArray< const DataType, 4 > get_ids() const
const DataType & sigma_3() const
const DataType & lookup_inverses() const
const DataType & lagrange_last() const
const DataType & operator[](EntityId id) const
const DataType & w_4() const
const DataType & q_delta_range() const
const DataType & sigma_4() const
const DataType & id_1() const
const DataType & sigma_1() const
const DataType & q_4() const
DataType & lagrange_first()
DataType & lookup_read_tags()
const DataType & z_perm() const
RefArray< DataType, 4 > get_ids()
DataType & lagrange_last()
RefArray< DataType, 6 > get_non_gate_selectors()
const DataType & w_l() const
const DataType & z_perm_shift() const
const DataType & q_nnf() const
const DataType & table_3() const
const DataType & q_c() const
DataType & q_delta_range()
std::span< const DataType, NUM_MASKING_ENTITIES > get_masking() const
std::span< const DataType, NUM_UNSHIFTED_ENTITIES > get_unshifted() const
std::span< DataType, NUM_PRECOMPUTED_ENTITIES > get_precomputed()
DataType & z_perm_shift()
std::span< const DataType, NUM_ALL_ENTITIES > get_all() const
const DataType & gemini_masking_poly() const
const DataType & q_poseidon2_external() const
const DataType & table_4() const
const DataType & q_poseidon2_internal() const
std::span< DataType, NUM_SHIFTED_ENTITIES > get_to_be_shifted()
DataType & q_poseidon2_internal()
const DataType & q_o() const
const DataType & id_4() const
const DataType & lookup_read_counts() const
RefArray< DataType, 4 > get_tables()
const DataType & w_o() const
std::span< const DataType, NUM_WITNESS_ENTITIES > get_witness() const
const DataType & q_m() const
const DataType & sigma_2() const
std::array< DataType, NUM_ALL_ENTITIES > data
RefArray< const DataType, 4 > get_wires() const
const DataType & table_2() const
const DataType & q_elliptic() const
const DataType & lagrange_first() const
const DataType & w_o_shift() const
std::span< DataType, NUM_UNSHIFTED_ENTITIES > get_unshifted()
static const std::vector< std::string > & get_labels()
const DataType & q_arith() const
std::span< DataType, NUM_ALL_ENTITIES > get_all()
DataType & lookup_inverses()
DataType & q_poseidon2_external()
const DataType & id_3() const
std::span< DataType, NUM_SHIFTED_ENTITIES > get_shifted()
RefArray< const DataType, 4 > get_tables() const
const DataType & w_r_shift() const
RefArray< const DataType, 8 > get_gate_selectors() const
const DataType & q_r() const
const DataType & q_lookup() const
std::span< DataType, NUM_WITNESS_ENTITIES > get_witness()
DataType & operator[](EntityId id)
RefArray< const DataType, 6 > get_non_gate_selectors() const
auto get_selectors() const
RefArray< DataType, 8 > get_gate_selectors()
const DataType & id_2() const
const DataType & w_4_shift() const
const DataType & w_r() const
std::span< const DataType, NUM_PRECOMPUTED_ENTITIES > get_precomputed() const
RefArray< DataType, 4 > get_sigmas()
std::span< const DataType, NUM_SHIFTED_ENTITIES > get_to_be_shifted() const
const DataType & table_1() const
std::span< DataType, NUM_MASKING_ENTITIES > get_masking()
std::span< const DataType, NUM_SHIFTED_ENTITIES > get_shifted() const
DataType & lookup_read_counts()
const DataType & q_l() const
const DataType & q_poseidon2_external() const
const DataType & q_elliptic() const
const DataType & q_poseidon2_internal() const
auto get_selectors() const
const DataType & id_2() const
RefArray< DataType, 8 > get_gate_selectors()
const DataType & q_r() const
std::array< DataType, NUM_PRECOMPUTED_ENTITIES > data
DataType & lagrange_first()
RefArray< const DataType, 8 > get_gate_selectors() const
RefArray< DataType, 4 > get_tables()
const DataType & q_memory() const
const DataType & q_lookup() const
const DataType & q_delta_range() const
const DataType & lagrange_last() const
RefArray< DataType, 6 > get_non_gate_selectors()
const DataType & q_m() const
RefArray< const DataType, 4 > get_tables() const
const DataType & sigma_1() const
const DataType & table_2() const
RefArray< const DataType, 4 > get_sigmas() const
const DataType & q_l() const
const DataType & sigma_3() const
const DataType & id_3() const
const DataType & table_4() const
DataType & q_delta_range()
const DataType & table_3() const
const DataType & q_nnf() const
const DataType & lagrange_first() const
const DataType & q_c() const
const DataType & sigma_4() const
const DataType & q_4() const
bool operator==(const PrecomputedEntities &) const =default
std::span< DataType, NUM_PRECOMPUTED_ENTITIES > get_all()
static const std::vector< std::string > & get_labels()
const DataType & q_o() const
const DataType & id_1() const
std::span< const DataType, NUM_PRECOMPUTED_ENTITIES > get_all() const
DataType & q_poseidon2_internal()
const DataType & table_1() const
const DataType & q_arith() const
static constexpr size_t size()
DataType & q_poseidon2_external()
RefArray< DataType, 4 > get_ids()
const DataType & sigma_2() const
RefArray< const DataType, 4 > get_ids() const
RefArray< const DataType, 6 > get_non_gate_selectors() const
DataType & lagrange_last()
const DataType & id_4() const
RefArray< DataType, 4 > get_sigmas()
const DataType & w_r() const
std::span< DataType, NUM_WITNESS_ENTITIES > get_all()
RefArray< const DataType, 5 > get_to_be_shifted() const
bool operator==(const WitnessEntities &) const =default
DataType & lookup_read_counts()
RefArray< const DataType, 4 > get_wires() const
static const std::vector< std::string > & get_labels()
const DataType & z_perm() const
RefArray< DataType, 5 > get_to_be_shifted()
DataType & lookup_read_tags()
const DataType & lookup_read_counts() const
static constexpr size_t size()
const DataType & lookup_read_tags() const
std::span< const DataType, NUM_WITNESS_ENTITIES > get_all() const
const DataType & lookup_inverses() const
std::array< DataType, NUM_WITNESS_ENTITIES > data
DataType & lookup_inverses()
const DataType & w_o() const
const DataType & w_4() const
const DataType & w_l() const
RefArray< DataType, 4 > get_wires()
static auto get_block_non_gate_selectors(TraceBlock &block)
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_PRECOMPUTED_ENTITIES
static constexpr bool HasLogDerivLookup
static constexpr std::array< GateKind, 8 > GATE_KINDS
static constexpr size_t NUM_UNSHIFTED_ENTITIES
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
static auto get_gate_blocks(TraceBlocks const &blocks)
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t NUM_SHIFTED_ENTITIES
static constexpr bool HasMemory
static auto get_gate_blocks(TraceBlocks &blocks)
static constexpr bool HasNonNativeField
static constexpr size_t NUM_BUS_COLUMNS
static constexpr bool HasDataBus
static constexpr bool HasEccOpQueue
static constexpr std::array< DuplicatePair, NUM_SHIFTED_ENTITIES > REPEATED_COMMITMENT_PAIRS
static constexpr bool HasElliptic
static constexpr size_t NUM_MASKING_ENTITIES
static constexpr size_t NUM_COMMITTED_WITNESS_ENTITIES
std::tuple< bb::UltraPermutationRelation< FF >, bb::LogDerivLookupRelation< FF >, bb::ArithmeticRelation< FF >, bb::DeltaRangeConstraintRelation< FF >, bb::EllipticRelation< FF >, bb::MemoryRelation< FF >, bb::NonNativeFieldRelation< FF >, bb::Poseidon2ExternalRelation< FF >, bb::Poseidon2InternalRelation< FF > > Relations_
Entry point for Barretenberg command-line interface.
constexpr RepeatedCommitmentsData repeated_commitments_from_pairs(std::span< const DuplicatePair > pairs)
Collapse a span of (original, duplicate) pairs into a RepeatedCommitmentsData of up to two contiguous...
RefArray< T,(Ns+...)> constexpr concatenate(const RefArray< T, Ns > &... ref_arrays)
Concatenates multiple RefArray objects into a single RefArray.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
One commitment shared by an unshifted polynomial and its shifted copy.