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,
21 const field_t<Builder>& key_b,
22 const bool is_2_to_1_lookup)
23{
24 Builder* ctx = key_a.get_context() ? key_a.get_context() : key_b.get_context();
25 const plookup::ReadData<bb::fr> lookup_data =
26 plookup::get_lookup_accumulators(id, key_a.get_value(), key_b.get_value(), is_2_to_1_lookup);
27
29
30 // If both keys are constant (or key_b unused), we can directly create constant field elements
31 if (key_a.is_constant() && (key_b.is_constant() || !is_2_to_1_lookup)) {
32 for (size_t i = 0; i < lookup_data[ColumnIdx::C1].size(); ++i) {
33 lookup[ColumnIdx::C1].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C1][i]));
34 lookup[ColumnIdx::C2].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C2][i]));
35 lookup[ColumnIdx::C3].emplace_back(field_t<Builder>(ctx, lookup_data[ColumnIdx::C3][i]));
36 }
37 } else {
38 // At least one key needs witness constraints, so create plookup gates
39 uint32_t lhs_index = key_a.get_witness_index();
40 uint32_t rhs_index = key_b.get_witness_index();
41
42 if (key_a.is_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 == stdlib::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:341
Builder * get_context() const
Definition field.hpp:419
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:828
bool is_constant() const
Definition field.hpp:429
uint32_t get_witness_index() const
Get the witness index of the current field element.
Definition field.hpp:506
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.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13