115 const size_t NUM_SUBTABLES = 3;
116 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
118 TableGenerator table_generator;
119 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
123 for (
const auto& subtable_ops : subtables) {
125 for (
const auto& op : subtable_ops) {
126 ultra_ops_table.
push(op);
128 ultra_ops_table.
merge();
131 std::reverse(subtables.begin(), subtables.end());
136 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
137 EXPECT_EQ(ultra_ops_table.
size(), expected_num_ops);
143 for (
auto [expected_column, poly] :
zip_view(expected_ultra_ops_table.
columns, ultra_ops_table_polynomials)) {
144 for (
auto [expected_value,
value] :
zip_view(expected_column, poly.coeffs())) {
145 EXPECT_EQ(expected_value,
value);
156 const size_t NUM_SUBTABLES = 3;
157 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
159 TableGenerator table_generator;
160 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
165 MergeSettings::PREPEND,
166 MergeSettings::APPEND };
167 for (
const auto& [subtable_ops, setting] :
zip_view(subtables, merge_settings)) {
169 for (
const auto& op : subtable_ops) {
170 ultra_ops_table.
push(op);
172 ultra_ops_table.
merge(setting);
176 for (
auto [subtable, setting] :
zip_view(subtables, merge_settings)) {
177 auto it = setting == MergeSettings::PREPEND ? ordered_subtables.begin() : ordered_subtables.end();
178 ordered_subtables.insert(it, subtable);
185 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
186 EXPECT_EQ(ultra_ops_table.
size(), expected_num_ops);
192 for (
auto [expected_column, poly] :
zip_view(expected_ultra_ops_table.
columns, ultra_ops_table_polynomials)) {
193 for (
auto [expected_value,
value] :
zip_view(expected_column, poly.coeffs())) {
194 EXPECT_EQ(expected_value,
value);
205 const size_t NUM_SUBTABLES = 3;
206 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
208 TableGenerator table_generator;
209 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
214 MergeSettings::PREPEND,
215 MergeSettings::APPEND };
217 for (
size_t i = 0; i < NUM_SUBTABLES; ++i) {
219 for (
const auto& op : subtables[i]) {
220 ultra_ops_table.
push(op);
224 ultra_ops_table.
merge(merge_settings[i]);
234 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
235 EXPECT_EQ(ultra_ops_table.
size(), expected_num_ops);
241 for (
auto [expected_column, poly] :
zip_view(expected_ultra_ops_table.
columns, ultra_ops_table_polynomials)) {
242 for (
auto [expected_value,
value] :
zip_view(expected_column, poly.coeffs())) {
243 EXPECT_EQ(expected_value,
value);
256 const size_t NUM_SUBTABLES = 3;
257 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
259 TableGenerator table_generator;
260 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
265 MergeSettings::PREPEND,
266 MergeSettings::APPEND };
269 const size_t fixed_offset = 20;
270 const size_t fixed_offset_num_rows = fixed_offset * ULTRA_ROWS_PER_OP;
271 const size_t prepended_size = (subtable_op_counts[0] + subtable_op_counts[1]) * ULTRA_ROWS_PER_OP;
272 ASSERT(fixed_offset_num_rows > prepended_size);
275 for (
size_t i = 0; i < NUM_SUBTABLES; ++i) {
277 for (
const auto& op : subtables[i]) {
278 ultra_ops_table.
push(op);
282 if (merge_settings[i] == MergeSettings::APPEND) {
283 ultra_ops_table.
merge(merge_settings[i], fixed_offset);
285 ultra_ops_table.
merge(merge_settings[i]);
290 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
291 EXPECT_EQ(ultra_ops_table.
size(), expected_num_ops);
294 size_t expected_poly_size = fixed_offset_num_rows + (subtable_op_counts[2] * ULTRA_ROWS_PER_OP);
301 for (
const auto& poly : ultra_ops_table_polynomials) {
302 EXPECT_EQ(poly.size(), expected_poly_size);
311 for (
auto [ultra_op_poly, expected_poly] :
312 zip_view(ultra_ops_table_polynomials, expected_prepended_table.
columns)) {
313 for (
size_t row = 0; row < prepended_size; ++row) {
314 EXPECT_EQ(ultra_op_poly.at(row), expected_poly[row]);
319 for (
auto ultra_op_poly : ultra_ops_table_polynomials) {
320 for (
size_t row = prepended_size; row < fixed_offset_num_rows; ++row) {
321 EXPECT_EQ(ultra_op_poly.at(row),
Fr::zero());
328 for (
auto [ultra_op_poly, expected_poly] :
zip_view(ultra_ops_table_polynomials, expected_appended_table.
columns)) {
329 for (
size_t row = 0; row < subtable_op_counts[2] * ULTRA_ROWS_PER_OP; row++) {
330 EXPECT_EQ(ultra_op_poly.at(fixed_offset_num_rows + row), expected_poly[row]);
337 std::vector<UltraOp> expected_reconstructed;
338 expected_reconstructed.reserve(expected_num_ops + fixed_offset);
341 for (
const auto& op : subtables[1]) {
342 expected_reconstructed.push_back(op);
344 for (
const auto& op : subtables[0]) {
345 expected_reconstructed.push_back(op);
350 size_t size_before = expected_reconstructed.size();
351 for (
size_t i = size_before; i < fixed_offset; i++) {
352 expected_reconstructed.push_back(no_op);
355 for (
const auto& op : subtables[2]) {
356 expected_reconstructed.push_back(op);
359 EXPECT_EQ(expected_reconstructed.size(), ultra_ops_table.
get_reconstructed().size());
374 const size_t NUM_SUBTABLES = 3;
375 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
377 TableGenerator table_generator;
378 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
382 for (
const auto& subtable_ops : subtables) {
384 for (
const auto& op : subtable_ops) {
385 eccvm_ops_table.
push(op);
387 eccvm_ops_table.
merge();
390 std::reverse(subtables.begin(), subtables.end());
395 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
396 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
399 for (
size_t i = 0; i < expected_num_ops; ++i) {
400 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);
416 const size_t NUM_SUBTABLES = 3;
417 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
419 TableGenerator table_generator;
420 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
423 MergeSettings::PREPEND,
424 MergeSettings::APPEND };
427 for (
const auto& [subtable_ops, setting] :
zip_view(subtables, merge_settings)) {
429 for (
const auto& op : subtable_ops) {
430 eccvm_ops_table.
push(op);
432 eccvm_ops_table.
merge(setting);
436 for (
auto [subtable, setting] :
zip_view(subtables, merge_settings)) {
437 auto it = setting == MergeSettings::PREPEND ? ordered_subtables.begin() : ordered_subtables.end();
438 ordered_subtables.insert(it, subtable);
445 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
446 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
449 for (
size_t i = 0; i < expected_num_ops; ++i) {
450 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);