126 const size_t NUM_SUBTABLES = 3;
127 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
129 TableGenerator table_generator;
130 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
134 for (
const auto& subtable_ops : subtables) {
136 for (
const auto& op : subtable_ops) {
137 ultra_ops_table.
push(op);
139 ultra_ops_table.
merge();
146 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
147 EXPECT_EQ(ultra_ops_table.
num_ops(), expected_num_ops);
156 for (
auto [expected_column, poly, no_zk_poly] :
157 zip_view(expected_ultra_ops_table.
columns, ultra_ops_table_polynomials, no_zk_ultra_ops_table_polynomials)) {
159 EXPECT_EQ(no_zk_poly.size(), expected_column.size());
160 for (
size_t row = 0; row < expected_column.size(); ++row) {
162 EXPECT_EQ(expected_column[row], no_zk_poly.at(row));
173 const size_t NUM_SUBTABLES = 3;
174 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
176 TableGenerator table_generator;
177 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
181 for (
size_t i = 0; i < NUM_SUBTABLES; ++i) {
183 for (
const auto& op : subtables[i]) {
184 ultra_ops_table.
push(op);
187 if (i == NUM_SUBTABLES - 1) {
189 const size_t no_gap_offset = subtable_op_counts[0] + subtable_op_counts[1];
192 ultra_ops_table.
merge();
205 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
206 EXPECT_EQ(ultra_ops_table.
num_ops(), expected_num_ops);
213 for (
auto [expected_column, poly] :
zip_view(expected_ultra_ops_table.
columns, ultra_ops_table_polynomials)) {
215 for (
size_t row = 0; row < expected_column.size(); ++row) {
229 const size_t NUM_SUBTABLES = 3;
230 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
232 TableGenerator table_generator;
233 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
238 const size_t fixed_offset = 20;
239 const size_t fixed_offset_num_rows = fixed_offset * ULTRA_ROWS_PER_OP;
240 const size_t prior_subtables_size = (subtable_op_counts[0] + subtable_op_counts[1]) * ULTRA_ROWS_PER_OP;
241 BB_ASSERT(fixed_offset_num_rows > prior_subtables_size);
244 for (
size_t i = 0; i < NUM_SUBTABLES; ++i) {
246 for (
const auto& op : subtables[i]) {
247 ultra_ops_table.
push(op);
250 if (i == NUM_SUBTABLES - 1) {
253 ultra_ops_table.
merge();
258 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
259 EXPECT_EQ(ultra_ops_table.
num_ops(), expected_num_ops);
263 size_t expected_poly_size = fixed_offset_num_rows + LEADING_ZEROS + (subtable_op_counts[2] * ULTRA_ROWS_PER_OP);
272 for (
const auto& poly : ultra_ops_table_polynomials) {
273 EXPECT_EQ(poly.size(), zk_prefix_rows + expected_poly_size);
282 for (
auto [ultra_op_poly, expected_poly] :
zip_view(ultra_ops_table_polynomials, expected_prior_table.
columns)) {
283 for (
size_t row = 0; row < prior_subtables_size; ++row) {
284 EXPECT_EQ(ultra_op_poly.at(zk_prefix_rows + row), expected_poly[row]);
289 for (
auto ultra_op_poly : ultra_ops_table_polynomials) {
290 for (
size_t row = prior_subtables_size; row < fixed_offset_num_rows + LEADING_ZEROS; ++row) {
291 EXPECT_EQ(ultra_op_poly.at(zk_prefix_rows + row),
Fr::zero());
298 for (
auto [ultra_op_poly, expected_poly] :
zip_view(ultra_ops_table_polynomials, expected_appended_table.
columns)) {
299 for (
size_t row = 0; row < subtable_op_counts[2] * ULTRA_ROWS_PER_OP; row++) {
300 EXPECT_EQ(ultra_op_poly.at(zk_prefix_rows + fixed_offset_num_rows + LEADING_ZEROS + row),
308 std::vector<UltraOp> expected_reconstructed;
309 expected_reconstructed.reserve(expected_num_ops + fixed_offset);
312 for (
const auto& op : subtables[0]) {
313 expected_reconstructed.push_back(op);
315 for (
const auto& op : subtables[1]) {
316 expected_reconstructed.push_back(op);
322 size_t size_before = expected_reconstructed.size();
323 for (
size_t i = size_before; i < fixed_offset + PREAMBLE_OP_SLOTS; i++) {
324 expected_reconstructed.push_back(no_op);
327 for (
const auto& op : subtables[2]) {
328 expected_reconstructed.push_back(op);
332 EXPECT_EQ(expected_reconstructed.size(), reconstructed.size());
335 EXPECT_EQ(expected_reconstructed, reconstructed);
347 const size_t NUM_SUBTABLES = 3;
348 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
350 TableGenerator table_generator;
351 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
355 for (
const auto& subtable_ops : subtables) {
357 for (
const auto& op : subtable_ops) {
358 eccvm_ops_table.
push(op);
360 eccvm_ops_table.
merge();
367 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
368 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
371 for (
size_t i = 0; i < expected_num_ops; ++i) {
372 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);
388 const size_t NUM_SUBTABLES = 3;
389 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
391 TableGenerator table_generator;
392 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
396 for (
const auto& subtable_ops : subtables) {
398 for (
const auto& op : subtable_ops) {
399 eccvm_ops_table.
push(op);
401 eccvm_ops_table.
merge();
408 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
409 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
412 for (
size_t i = 0; i < expected_num_ops; ++i) {
413 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);