19#include <gtest/gtest.h>
32 EntityId::kernel_calldata,
33 EntityId::kernel_calldata_read_counts,
34 EntityId::kernel_calldata_inverses,
35 EntityId::kernel_calldata_indicator,
41 for (
auto name : { EntityId::w_l,
46 EntityId::kernel_calldata,
47 EntityId::kernel_calldata_read_counts,
48 EntityId::kernel_calldata_inverses,
49 EntityId::kernel_calldata_indicator }) {
62 result[EntityId::databus_id] =
FF(5);
63 result[EntityId::kernel_calldata] =
FF(42);
66 result[EntityId::kernel_calldata_read_counts] =
FF(1);
67 result[EntityId::kernel_calldata_indicator] =
FF(1);
82 EXPECT_EQ(accumulator, expected_values);
89 const auto& beta = params.
beta;
90 const auto& gamma = params.
gamma;
92 const auto lookup_term = in[EntityId::w_l] + in[EntityId::w_r] * beta + gamma;
93 const auto column_selector = in[EntityId::q_l];
94 const auto bus_value = in[EntityId::kernel_calldata];
95 const auto read_counts = in[EntityId::kernel_calldata_read_counts];
96 const auto inverses = in[EntityId::kernel_calldata_inverses];
97 const auto indicator = in[EntityId::kernel_calldata_indicator];
99 const auto is_read = in[EntityId::q_busread] * column_selector;
100 const auto table_term = bus_value + in[EntityId::databus_id] * beta + gamma;
101 const auto common = lookup_term * table_term * inverses -
FF(1);
105 common * read_counts,
106 (is_read * table_term - read_counts * lookup_term) * inverses,
107 read_counts - indicator * read_counts,
113 const auto run_test = [](
bool random_inputs) {
114 DatabusInputElements in = random_inputs ? get_random_databus_inputs() : get_valid_calldata_read_inputs();
116 validate_relation_execution(compute_expected_values(in, parameters), in, parameters);
129 in[EntityId::q_busread] =
FF(0);
130 in[EntityId::q_l] =
FF(0);
131 in[EntityId::kernel_calldata_read_counts] =
FF(0);
133 in[EntityId::w_l] =
FF(42);
134 in[EntityId::w_r] =
FF(5);
135 in[EntityId::databus_id] =
FF(5);
136 in[EntityId::kernel_calldata] =
FF(42);
137 in[EntityId::kernel_calldata_inverses] =
FF(0);
139 std::array<FF, 4> accumulator{};
140 Relation::accumulate(accumulator, in, parameters,
FF(1));
141 for (
size_t i = 0; i < 4; i++) {
142 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Subrelation " << i <<
" should be zero for inactive gates";
151 const auto& beta = parameters.beta;
152 const auto& gamma = parameters.gamma;
155 in[EntityId::q_busread] =
FF(1);
156 in[EntityId::q_l] =
FF(1);
160 in[EntityId::w_l] =
value;
161 in[EntityId::w_r] =
index;
162 in[EntityId::databus_id] =
index;
163 in[EntityId::kernel_calldata] =
value;
165 const auto lookup_term =
value +
index * beta + gamma;
166 const auto table_term =
value +
index * beta + gamma;
167 in[EntityId::kernel_calldata_inverses] = (lookup_term * table_term).invert();
168 in[EntityId::kernel_calldata_read_counts] =
FF(1);
169 in[EntityId::kernel_calldata_indicator] =
FF(1);
170 std::array<FF, 4> accumulator{};
171 Relation::accumulate(accumulator, in, parameters,
FF(1));
173 EXPECT_EQ(accumulator[0],
FF(0));
174 EXPECT_EQ(accumulator[1],
FF(0));
175 EXPECT_EQ(accumulator[2],
FF(0));
176 EXPECT_EQ(accumulator[3],
FF(0));
183 const auto& beta = parameters.beta;
184 const auto& gamma = parameters.gamma;
187 in[EntityId::q_busread] =
FF(1);
188 in[EntityId::q_l] =
FF(1);
190 const FF read_value =
FF(42);
191 const FF bus_value =
FF(100);
193 in[EntityId::w_l] = read_value;
194 in[EntityId::w_r] =
index;
195 in[EntityId::databus_id] =
index;
196 in[EntityId::kernel_calldata] = bus_value;
198 const auto lookup_term = read_value +
index * beta + gamma;
199 const auto table_term = bus_value +
index * beta + gamma;
200 const auto inverse = (lookup_term * table_term).invert();
201 in[EntityId::kernel_calldata_inverses] = inverse;
202 in[EntityId::kernel_calldata_read_counts] =
FF(1);
203 in[EntityId::kernel_calldata_indicator] =
FF(1);
204 std::array<FF, 4> accumulator{};
205 Relation::accumulate(accumulator, in, parameters,
FF(1));
207 EXPECT_EQ(accumulator[0],
FF(0));
208 EXPECT_EQ(accumulator[1],
FF(0));
209 EXPECT_EQ(accumulator[2], (table_term - lookup_term) * inverse);
210 EXPECT_EQ(accumulator[3],
FF(0));
211 EXPECT_NE(accumulator[2],
FF(0));
221 in[EntityId::q_busread] =
FF(0);
222 in[EntityId::q_l] =
FF(0);
223 in[EntityId::kernel_calldata_read_counts] =
FF(0);
224 in[EntityId::kernel_calldata_inverses] =
FF(999);
225 in[EntityId::w_l] =
FF(42);
226 in[EntityId::w_r] =
FF(5);
227 in[EntityId::databus_id] =
FF(5);
228 in[EntityId::kernel_calldata] =
FF(42);
230 std::array<FF, 4> accumulator{};
231 Relation::accumulate(accumulator, in, parameters,
FF(1));
232 for (
size_t i = 0; i < 4; i++) {
233 EXPECT_EQ(accumulator[i],
FF(0)) <<
"Subrelation " << i <<
" should be unaffected by garbage inverse";
243 in[EntityId::q_busread] =
FF(0);
244 in[EntityId::q_l] =
FF(0);
245 in[EntityId::kernel_calldata_read_counts] =
FF(3);
246 in[EntityId::kernel_calldata_indicator] =
FF(0);
248 std::array<FF, 4> accumulator{};
249 Relation::accumulate(accumulator, in, parameters,
FF(1));
251 EXPECT_EQ(accumulator[3],
FF(3));
258 const auto& beta = parameters.beta;
259 const auto& gamma = parameters.gamma;
262 in[EntityId::q_busread] =
FF(1);
263 in[EntityId::q_l] =
FF(1);
267 in[EntityId::w_l] =
value;
268 in[EntityId::w_r] =
index;
269 in[EntityId::databus_id] =
index;
270 in[EntityId::kernel_calldata] =
value;
271 in[EntityId::kernel_calldata_inverses] =
FF(777);
272 in[EntityId::kernel_calldata_read_counts] =
FF(0);
274 const auto lookup_term =
value +
index * beta + gamma;
275 const auto table_term =
value +
index * beta + gamma;
277 std::array<FF, 4> accumulator{};
278 Relation::accumulate(accumulator, in, parameters,
FF(1));
280 EXPECT_EQ(accumulator[0], (
FF(777) * lookup_term * table_term -
FF(1)) *
FF(1));
281 EXPECT_NE(accumulator[0],
FF(0));
282 EXPECT_EQ(accumulator[1],
FF(0));
289 const auto& beta = parameters.beta;
290 const auto& gamma = parameters.gamma;
293 in[EntityId::q_busread] =
FF(0);
294 in[EntityId::q_l] =
FF(0);
298 in[EntityId::databus_id] =
index;
299 in[EntityId::kernel_calldata] =
value;
300 in[EntityId::w_l] =
FF(0);
301 in[EntityId::w_r] =
FF(0);
302 in[EntityId::kernel_calldata_read_counts] =
FF(3);
303 in[EntityId::kernel_calldata_indicator] =
FF(1);
304 in[EntityId::kernel_calldata_inverses] =
FF(999);
305 const auto lookup_term = in[EntityId::w_l] + in[EntityId::w_r] * beta + gamma;
306 const auto table_term =
value +
index * beta + gamma;
308 std::array<FF, 4> accumulator{};
309 Relation::accumulate(accumulator, in, parameters,
FF(1));
311 EXPECT_EQ(accumulator[0],
FF(0));
312 EXPECT_EQ(accumulator[1], (
FF(999) * lookup_term * table_term -
FF(1)) *
FF(3));
313 EXPECT_EQ(accumulator[3],
FF(0));
314 EXPECT_NE(accumulator[1],
FF(0));
322 const auto& beta = parameters.beta;
323 const auto& gamma = parameters.gamma;
326 in[EntityId::q_busread] =
FF(0);
327 in[EntityId::q_l] =
FF(0);
331 in[EntityId::databus_id] =
index;
332 in[EntityId::kernel_calldata] =
value;
333 in[EntityId::w_l] =
FF(0);
334 in[EntityId::w_r] =
FF(0);
336 const auto lookup_term = in[EntityId::w_l] + in[EntityId::w_r] * beta + gamma;
337 const auto table_term =
value +
index * beta + gamma;
338 in[EntityId::kernel_calldata_inverses] = (lookup_term * table_term).invert();
339 in[EntityId::kernel_calldata_read_counts] =
FF(3);
340 in[EntityId::kernel_calldata_indicator] =
FF(1);
341 std::array<FF, 4> accumulator{};
342 Relation::accumulate(accumulator, in, parameters,
FF(1));
344 EXPECT_EQ(accumulator[0],
FF(0));
345 EXPECT_EQ(accumulator[1],
FF(0));
346 EXPECT_EQ(accumulator[2], (
FF(0) * table_term -
FF(3) * lookup_term) * (lookup_term * table_term).invert());
347 EXPECT_EQ(accumulator[3],
FF(0));
348 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)
static constexpr size_t NUM_SUBRELATIONS
MegaFlavor_Generated::EntityId EntityId
Log-derivative lookup argument for a single DataBus column.
static void accumulate(ContainerOverSubrelations &accumulator, const AllEntities &in, const Parameters ¶ms, const FF &scaling_factor)
Accumulate this column's four subrelation contributions. (1a) (I*L*T - 1) * is_read = 0 (1b) (I*L*T -...
SingleBusLookupRelationImpl< FF, EntityId::kernel_calldata, EntityId::kernel_calldata_read_counts, EntityId::kernel_calldata_inverses, EntityId::kernel_calldata_indicator, EntityId::q_l > KernelCalldataRelation
MegaFlavor_Generated::AllEntities< FF > DatabusInputElements
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