15#include <gtest/gtest.h>
84 result.databus_id =
FF(5);
85 result.calldata =
FF(42);
88 result.q_busread =
FF(1);
94 result.calldata_read_counts =
FF(1);
97 result.secondary_calldata_read_counts =
FF(0);
98 result.return_data_read_counts =
FF(0);
118 EXPECT_EQ(accumulator, expected_values);
127 const auto& beta = params.
beta;
128 const auto& gamma = params.
gamma;
131 std::fill(expected_values.begin(), expected_values.end(),
FF(0));
134 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
137 auto compute_column_subrelations =
138 [&](
size_t bus_idx,
FF column_selector,
FF bus_value,
FF read_counts,
FF inverses) {
139 auto is_read = in.
q_busread * column_selector;
140 auto table_term = bus_value + in.
databus_id * beta + gamma;
143 auto common = lookup_term * table_term * inverses -
FF(1);
146 expected_values[bus_idx * 3] = common * is_read;
149 expected_values[bus_idx * 3 + 1] = common * read_counts;
152 expected_values[bus_idx * 3 + 2] = (is_read * table_term - read_counts * lookup_term) * inverses;
159 compute_column_subrelations(
165 return expected_values;
174 const auto run_test = [](
bool random_inputs) {
179 auto expected_values = compute_expected_values(in, parameters);
181 validate_relation_execution(expected_values, in, parameters);
212 Relation::accumulate(accumulator, in, parameters,
FF(1));
215 for (
size_t i = 0; i < NUM_SUBRELATIONS; i++) {
216 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Subrelation " << i <<
" should be zero for inactive gates";
227 const auto& beta = parameters.beta;
228 const auto& gamma = parameters.gamma;
247 auto lookup_term =
value +
index * beta + gamma;
248 auto table_term =
value +
index * beta + gamma;
249 auto inverse = (lookup_term * table_term).invert();
261 Relation::accumulate(accumulator, in, parameters,
FF(1));
264 EXPECT_EQ(accumulator[0],
FF(0));
267 EXPECT_EQ(accumulator[1],
FF(0));
270 EXPECT_EQ(accumulator[2],
FF(0));
273 for (
size_t i = 3; i < NUM_SUBRELATIONS; i++) {
274 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Inactive column subrelation " << i <<
" should be zero";
284 const auto& beta = parameters.beta;
285 const auto& gamma = parameters.gamma;
296 FF read_value =
FF(42);
297 FF bus_value =
FF(100);
305 auto lookup_term = read_value +
index * beta + gamma;
306 auto table_term = bus_value +
index * beta + gamma;
307 auto inverse = (lookup_term * table_term).invert();
317 Relation::accumulate(accumulator, in, parameters,
FF(1));
320 EXPECT_EQ(accumulator[0],
FF(0));
323 EXPECT_EQ(accumulator[1],
FF(0));
327 FF expected_lookup = (table_term - lookup_term) * inverse;
328 EXPECT_EQ(accumulator[2], expected_lookup);
329 EXPECT_NE(accumulator[2],
FF(0));
361 Relation::accumulate(accumulator, in, parameters,
FF(1));
364 EXPECT_EQ(accumulator[0],
FF(0));
365 EXPECT_EQ(accumulator[3],
FF(0));
366 EXPECT_EQ(accumulator[6],
FF(0));
369 EXPECT_EQ(accumulator[1],
FF(0));
370 EXPECT_EQ(accumulator[4],
FF(0));
371 EXPECT_EQ(accumulator[7],
FF(0));
374 EXPECT_EQ(accumulator[2],
FF(0));
375 EXPECT_EQ(accumulator[5],
FF(0));
376 EXPECT_EQ(accumulator[8],
FF(0));
386 const auto& beta = parameters.beta;
387 const auto& gamma = parameters.gamma;
410 auto lookup_term =
value +
index * beta + gamma;
411 auto table_term =
value +
index * beta + gamma;
414 Relation::accumulate(accumulator, in, parameters,
FF(1));
417 FF expected_1a = (
FF(777) * lookup_term * table_term -
FF(1)) *
FF(1);
418 EXPECT_EQ(accumulator[0], expected_1a);
419 EXPECT_NE(accumulator[0],
FF(0));
422 EXPECT_EQ(accumulator[1],
FF(0));
432 const auto& beta = parameters.beta;
433 const auto& gamma = parameters.gamma;
458 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
459 auto table_term =
value +
index * beta + gamma;
462 Relation::accumulate(accumulator, in, parameters,
FF(1));
465 EXPECT_EQ(accumulator[0],
FF(0));
468 FF expected_1b = (
FF(999) * lookup_term * table_term -
FF(1)) *
FF(3);
469 EXPECT_EQ(accumulator[1], expected_1b);
470 EXPECT_NE(accumulator[1],
FF(0));
481 const auto& beta = parameters.beta;
482 const auto& gamma = parameters.gamma;
497 auto lookup_term = in.
w_l + in.
w_r * beta + gamma;
498 auto table_term =
value +
index * beta + gamma;
510 Relation::accumulate(accumulator, in, parameters,
FF(1));
513 EXPECT_EQ(accumulator[0],
FF(0));
516 EXPECT_EQ(accumulator[1],
FF(0));
519 FF expected_lookup = (
FF(0) * table_term -
FF(3) * lookup_term) * (lookup_term * table_term).
invert();
520 EXPECT_EQ(accumulator[2], expected_lookup);
521 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 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