15#include <gtest/gtest.h>
90 result.databus_id =
FF(5);
91 result.calldata =
FF(42);
94 result.q_busread =
FF(1);
100 result.calldata_read_counts =
FF(1);
101 result.calldata_read_tags =
FF(1);
104 result.secondary_calldata_read_counts =
FF(0);
105 result.secondary_calldata_read_tags =
FF(0);
106 result.return_data_read_counts =
FF(0);
107 result.return_data_read_tags =
FF(0);
127 EXPECT_EQ(accumulator, expected_values);
136 const auto& beta = params.
beta;
137 const auto& gamma = params.
gamma;
140 std::fill(expected_values.begin(), expected_values.end(),
FF(0));
143 auto read_term = in.
w_l + in.
w_r * beta + gamma;
146 auto compute_column_subrelations =
147 [&](
size_t bus_idx,
FF column_selector,
FF bus_value,
FF read_counts,
FF read_tags,
FF inverses) {
148 auto is_read_gate = in.
q_busread * column_selector;
149 auto inverse_exists = is_read_gate + read_tags - is_read_gate * read_tags;
150 auto write_term = bus_value + in.
databus_id * beta + gamma;
153 expected_values[bus_idx * 3] = read_term * write_term * inverses - inverse_exists;
156 expected_values[bus_idx * 3 + 1] = (is_read_gate * write_term - read_counts * read_term) * inverses;
159 expected_values[bus_idx * 3 + 2] = read_tags * read_tags - read_tags;
163 compute_column_subrelations(
167 compute_column_subrelations(1,
175 compute_column_subrelations(
178 return expected_values;
187 const auto run_test = [](
bool random_inputs) {
192 auto expected_values = compute_expected_values(in, parameters);
194 validate_relation_execution(expected_values, in, parameters);
217 Relation::accumulate(accumulator, in, parameters,
FF(1));
220 EXPECT_EQ(accumulator[2],
FF(0));
221 EXPECT_EQ(accumulator[5],
FF(0));
222 EXPECT_EQ(accumulator[8],
FF(0));
233 std::fill(accumulator.begin(), accumulator.end(),
FF(0));
234 Relation::accumulate(accumulator, in, parameters,
FF(1));
237 EXPECT_EQ(accumulator[2],
FF(0));
238 EXPECT_EQ(accumulator[5],
FF(0));
239 EXPECT_EQ(accumulator[8],
FF(0));
258 std::fill(accumulator.begin(), accumulator.end(),
FF(0));
259 Relation::accumulate(accumulator, in, parameters,
FF(1));
263 EXPECT_EQ(accumulator[2],
FF(2));
265 EXPECT_EQ(accumulator[5],
FF(20));
267 EXPECT_EQ(accumulator[8],
FF(9900));
298 Relation::accumulate(accumulator, in, parameters,
FF(1));
302 EXPECT_EQ(accumulator[0],
FF(0));
303 EXPECT_EQ(accumulator[3],
FF(0));
304 EXPECT_EQ(accumulator[6],
FF(0));
307 EXPECT_EQ(accumulator[1],
FF(0));
308 EXPECT_EQ(accumulator[4],
FF(0));
309 EXPECT_EQ(accumulator[7],
FF(0));
312 EXPECT_EQ(accumulator[2],
FF(0));
313 EXPECT_EQ(accumulator[5],
FF(0));
314 EXPECT_EQ(accumulator[8],
FF(0));
325 const auto& beta = parameters.beta;
326 const auto& gamma = parameters.gamma;
345 auto read_term =
value +
index * beta + gamma;
346 auto write_term =
value +
index * beta + gamma;
347 auto inverse = (read_term * write_term).invert();
364 Relation::accumulate(accumulator, in, parameters,
FF(1));
370 EXPECT_EQ(accumulator[0],
FF(0));
373 EXPECT_EQ(accumulator[2],
FF(0));
376 EXPECT_EQ(accumulator[3],
FF(0));
377 EXPECT_EQ(accumulator[5],
FF(0));
378 EXPECT_EQ(accumulator[6],
FF(0));
379 EXPECT_EQ(accumulator[8],
FF(0));
389 const auto& beta = parameters.beta;
390 const auto& gamma = parameters.gamma;
401 FF read_value =
FF(42);
402 FF bus_value =
FF(100);
411 auto read_term = read_value +
index * beta + gamma;
412 auto write_term = bus_value +
index * beta + gamma;
414 auto inverse = (read_term * write_term).invert();
428 Relation::accumulate(accumulator, in, parameters,
FF(1));
431 EXPECT_EQ(accumulator[0],
FF(0));
438 FF expected_lookup = (write_term - read_term) * inverse;
439 EXPECT_EQ(accumulator[1], expected_lookup);
440 EXPECT_NE(accumulator[1],
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()
static field random_element(numeric::RNG *engine=nullptr) noexcept