Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
plookup.cpp
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#include "./plookup.hpp"
11
12namespace bb::stdlib {
13
16using namespace bb;
17
18template <typename Builder>
20 const field_t<Builder>& key_a_in,
21 const field_t<Builder>& key_b_in,
22 const bool is_2_to_1_lookup)
23{
24 auto key_a = key_a_in.normalize();
25 auto key_b = key_b_in.normalize();
26 Builder* ctx = key_a.get_context() ? key_a.get_context() : key_b.get_context();
27 const plookup::ReadData<bb::fr> lookup_data =
28 plookup::get_lookup_accumulators(id, key_a.get_value(), key_b.get_value(), is_2_to_1_lookup);
29
30 const bool is_key_a_constant = key_a.is_constant();
32 if (is_key_a_constant && (key_b.is_constant() || !is_2_to_1_lookup)) {
33 for (size_t i = 0; i < lookup_data[ColumnIdx::C1].size(); ++i) {
34 lookup[ColumnIdx::C1].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C1][i]));
35 lookup[ColumnIdx::C2].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C2][i]));
36 lookup[ColumnIdx::C3].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C3][i]));
37 }
38 } else {
39 uint32_t lhs_index = key_a.witness_index;
40 uint32_t rhs_index = key_b.witness_index;
41 // If only one lookup key is constant, we need to instantiate it as a real witness
42 if (is_key_a_constant) {
43 lhs_index = ctx->put_constant_variable(key_a.get_value());
44 }
45 if (key_b.is_constant() && is_2_to_1_lookup) {
46 rhs_index = ctx->put_constant_variable(key_b.get_value());
47 }
48
49 auto key_b_witness = std::make_optional(rhs_index);
50 if (rhs_index == IS_CONSTANT) {
51 key_b_witness = std::nullopt;
52 }
53
54 const auto accumulator_witnesses =
55 ctx->create_gates_from_plookup_accumulators(id, lookup_data, lhs_index, key_b_witness);
56
57 for (size_t i = 0; i < lookup_data[ColumnIdx::C1].size(); ++i) {
58 lookup[ColumnIdx::C1].emplace_back(
59 field_t<Builder>::from_witness_index(ctx, accumulator_witnesses[ColumnIdx::C1][i]));
60 lookup[ColumnIdx::C2].emplace_back(
61 field_t<Builder>::from_witness_index(ctx, accumulator_witnesses[ColumnIdx::C2][i]));
62 lookup[ColumnIdx::C3].emplace_back(
63 field_t<Builder>::from_witness_index(ctx, accumulator_witnesses[ColumnIdx::C3][i]));
64 }
65 }
66 return lookup;
67}
68
69template <typename Builder>
71 const field_t<Builder>& key)
72{
73 const auto lookup = get_lookup_accumulators(id, key);
74
75 return { lookup[ColumnIdx::C2][0], lookup[ColumnIdx::C3][0] };
76}
77
78template <typename Builder>
80 const field_t<Builder>& key_a,
81 const field_t<Builder>& key_b)
82{
83 const auto lookup = get_lookup_accumulators(id, key_a, key_b, /*is_2_to_1_lookup=*/true);
84
85 return lookup[ColumnIdx::C3][0];
86}
87
88template <typename Builder>
90{
91 const auto lookup = get_lookup_accumulators(id, key_a);
92
93 return lookup[ColumnIdx::C2][0];
94}
95
98} // namespace bb::stdlib
Container type for lookup table reads.
Definition types.hpp:418
field_t normalize() const
Return a new element, where the in-circuit witness contains the actual represented value (multiplicat...
Definition field.cpp:635
static plookup::ReadData< field_pt > get_lookup_accumulators(const plookup::MultiTableId id, const field_pt &key_a, const field_pt &key_b=0, const bool is_2_to_1_lookup=false)
Definition plookup.cpp:19
static field_pt read_from_2_to_1_table(const plookup::MultiTableId id, const field_pt &key_a, const field_pt &key_b)
Definition plookup.cpp:79
static field_pt read_from_1_to_2_table(const plookup::MultiTableId id, const field_pt &key_a)
Definition plookup.cpp:89
static std::pair< field_pt, field_pt > read_pair_from_table(const plookup::MultiTableId id, const field_pt &key)
Definition plookup.cpp:70
ReadData< bb::fr > get_lookup_accumulators(const MultiTableId id, const fr &key_a, const fr &key_b, const bool is_2_to_1_lookup)
Given a table ID and the key(s) for a key-value lookup, return the lookup accumulators.
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13