22 const bool is_2_to_1_lookup)
26 Builder* ctx = key_a.get_context() ? key_a.get_context() : key_b.get_context();
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]));
39 uint32_t lhs_index = key_a.witness_index;
40 uint32_t rhs_index = key_b.witness_index;
42 if (is_key_a_constant) {
43 lhs_index = ctx->put_constant_variable(key_a.get_value());
45 if (key_b.is_constant() && is_2_to_1_lookup) {
46 rhs_index = ctx->put_constant_variable(key_b.get_value());
50 if (rhs_index == IS_CONSTANT) {
54 const auto accumulator_witnesses =
55 ctx->create_gates_from_plookup_accumulators(
id, lookup_data, lhs_index, key_b_witness);
57 for (
size_t i = 0; i < lookup_data[ColumnIdx::C1].size(); ++i) {
58 lookup[ColumnIdx::C1].emplace_back(
60 lookup[ColumnIdx::C2].emplace_back(
62 lookup[ColumnIdx::C3].emplace_back(
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.