15#include <gtest/gtest.h>
104 result.databus_id =
FF(5);
105 result.kernel_calldata =
FF(42);
108 result.q_busread =
FF(1);
116 result.kernel_calldata_read_counts =
FF(1);
119 result.first_app_calldata_read_counts =
FF(0);
120 result.second_app_calldata_read_counts =
FF(0);
121 result.third_app_calldata_read_counts =
FF(0);
122 result.return_data_read_counts =
FF(0);
142 EXPECT_EQ(accumulator, expected_values);
152 const auto& beta = params.
beta;
153 const auto& gamma = params.
gamma;
156 std::fill(expected_values.begin(), expected_values.end(),
FF(0));
159 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
162 auto compute_column_subrelations =
163 [&](
size_t bus_idx,
FF column_selector,
FF bus_value,
FF read_counts,
FF inverses) {
164 auto is_read = in.
q_busread * column_selector;
165 auto table_term = bus_value + in.
databus_id * beta + gamma;
168 auto common = lookup_term * table_term * inverses -
FF(1);
171 expected_values[bus_idx * 3] = common * is_read;
174 expected_values[bus_idx * 3 + 1] = common * read_counts;
177 expected_values[bus_idx * 3 + 2] = (is_read * table_term - read_counts * lookup_term) * inverses;
181 compute_column_subrelations(
185 compute_column_subrelations(
189 compute_column_subrelations(
193 compute_column_subrelations(
199 return expected_values;
208 const auto run_test = [](
bool random_inputs) {
213 auto expected_values = compute_expected_values(in, parameters);
215 validate_relation_execution(expected_values, in, parameters);
258 Relation::accumulate(accumulator, in, parameters,
FF(1));
261 for (
size_t i = 0; i < NUM_SUBRELATIONS; i++) {
262 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Subrelation " << i <<
" should be zero for inactive gates";
273 const auto& beta = parameters.beta;
274 const auto& gamma = parameters.gamma;
293 auto lookup_term =
value +
index * beta + gamma;
294 auto table_term =
value +
index * beta + gamma;
295 auto inverse = (lookup_term * table_term).invert();
311 Relation::accumulate(accumulator, in, parameters,
FF(1));
314 EXPECT_EQ(accumulator[0],
FF(0));
317 EXPECT_EQ(accumulator[1],
FF(0));
320 EXPECT_EQ(accumulator[2],
FF(0));
323 for (
size_t i = 3; i < NUM_SUBRELATIONS; i++) {
324 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Inactive column subrelation " << i <<
" should be zero";
334 const auto& beta = parameters.beta;
335 const auto& gamma = parameters.gamma;
346 FF read_value =
FF(42);
347 FF bus_value =
FF(100);
355 auto lookup_term = read_value +
index * beta + gamma;
356 auto table_term = bus_value +
index * beta + gamma;
357 auto inverse = (lookup_term * table_term).invert();
371 Relation::accumulate(accumulator, in, parameters,
FF(1));
374 EXPECT_EQ(accumulator[0],
FF(0));
377 EXPECT_EQ(accumulator[1],
FF(0));
381 FF expected_lookup = (table_term - lookup_term) * inverse;
382 EXPECT_EQ(accumulator[2], expected_lookup);
383 EXPECT_NE(accumulator[2],
FF(0));
419 Relation::accumulate(accumulator, in, parameters,
FF(1));
422 EXPECT_EQ(accumulator[0],
FF(0));
423 EXPECT_EQ(accumulator[3],
FF(0));
424 EXPECT_EQ(accumulator[6],
FF(0));
427 EXPECT_EQ(accumulator[1],
FF(0));
428 EXPECT_EQ(accumulator[4],
FF(0));
429 EXPECT_EQ(accumulator[7],
FF(0));
432 EXPECT_EQ(accumulator[2],
FF(0));
433 EXPECT_EQ(accumulator[5],
FF(0));
434 EXPECT_EQ(accumulator[8],
FF(0));
444 const auto& beta = parameters.beta;
445 const auto& gamma = parameters.gamma;
472 auto lookup_term =
value +
index * beta + gamma;
473 auto table_term =
value +
index * beta + gamma;
476 Relation::accumulate(accumulator, in, parameters,
FF(1));
479 FF expected_1a = (
FF(777) * lookup_term * table_term -
FF(1)) *
FF(1);
480 EXPECT_EQ(accumulator[0], expected_1a);
481 EXPECT_NE(accumulator[0],
FF(0));
484 EXPECT_EQ(accumulator[1],
FF(0));
494 const auto& beta = parameters.beta;
495 const auto& gamma = parameters.gamma;
524 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
525 auto table_term =
value +
index * beta + gamma;
528 Relation::accumulate(accumulator, in, parameters,
FF(1));
531 EXPECT_EQ(accumulator[0],
FF(0));
534 FF expected_1b = (
FF(999) * lookup_term * table_term -
FF(1)) *
FF(3);
535 EXPECT_EQ(accumulator[1], expected_1b);
536 EXPECT_NE(accumulator[1],
FF(0));
547 const auto& beta = parameters.beta;
548 const auto& gamma = parameters.gamma;
563 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
564 auto table_term =
value +
index * beta + gamma;
580 Relation::accumulate(accumulator, in, parameters,
FF(1));
583 EXPECT_EQ(accumulator[0],
FF(0));
586 EXPECT_EQ(accumulator[1],
FF(0));
589 FF expected_lookup = (
FF(0) * table_term -
FF(3) * lookup_term) * (lookup_term * table_term).
invert();
590 EXPECT_EQ(accumulator[2], expected_lookup);
591 EXPECT_NE(accumulator[2],
FF(0));
static void validate_relation_execution(const std::array< FF, NUM_SUBRELATIONS > &expected_values, const DatabusInputElements &input_elements, const RelationParameters< FF > ¶meters)
Validate that the relation's accumulate function produces expected values.
static constexpr size_t NUM_SUBRELATIONS
Log-derivative lookup argument relation for establishing DataBus reads.
static constexpr std::array< size_t, NUM_SUB_RELATION_PER_IDX *NUM_BUS_COLUMNS > SUBRELATION_PARTIAL_LENGTHS
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Accumulate the log derivative databus lookup argument subrelation contributions for each databus colu...
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Container for parameters used by the grand product (permutation, lookup) Honk relations.
static RelationParameters get_random()
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept