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 prepended_size = (subtable_op_counts[0] + subtable_op_counts[1]) * ULTRA_ROWS_PER_OP;
271 ASSERT(fixed_offset > prepended_size);
274 for (
size_t i = 0; i < NUM_SUBTABLES; ++i) {
276 for (
const auto& op : subtables[i]) {
277 ultra_ops_table.
push(op);
281 if (merge_settings[i] == MergeSettings::APPEND) {
282 ultra_ops_table.
merge(merge_settings[i], fixed_offset);
284 ultra_ops_table.
merge(merge_settings[i]);
289 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
290 EXPECT_EQ(ultra_ops_table.
size(), expected_num_ops);
293 size_t expected_poly_size = fixed_offset + (subtable_op_counts[2] * ULTRA_ROWS_PER_OP);
300 for (
const auto& poly : ultra_ops_table_polynomials) {
301 EXPECT_EQ(poly.size(), expected_poly_size);
310 for (
auto [ultra_op_poly, expected_poly] :
311 zip_view(ultra_ops_table_polynomials, expected_prepended_table.
columns)) {
312 for (
size_t row = 0; row < prepended_size; ++row) {
313 EXPECT_EQ(ultra_op_poly.at(row), expected_poly[row]);
318 for (
auto ultra_op_poly : ultra_ops_table_polynomials) {
319 for (
size_t row = prepended_size; row < fixed_offset; ++row) {
320 EXPECT_EQ(ultra_op_poly.at(row),
Fr::zero());
327 for (
auto [ultra_op_poly, expected_poly] :
zip_view(ultra_ops_table_polynomials, expected_appended_table.
columns)) {
328 for (
size_t row = 0; row < subtable_op_counts[2] * ULTRA_ROWS_PER_OP; ++row) {
329 EXPECT_EQ(ultra_op_poly.at(fixed_offset + row), expected_poly[row]);
342 const size_t NUM_SUBTABLES = 3;
343 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
345 TableGenerator table_generator;
346 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
350 for (
const auto& subtable_ops : subtables) {
352 for (
const auto& op : subtable_ops) {
353 eccvm_ops_table.
push(op);
355 eccvm_ops_table.
merge();
358 std::reverse(subtables.begin(), subtables.end());
363 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
364 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
367 for (
size_t i = 0; i < expected_num_ops; ++i) {
368 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);
384 const size_t NUM_SUBTABLES = 3;
385 std::vector<size_t> subtable_op_counts = { 4, 2, 7 };
387 TableGenerator table_generator;
388 auto subtables = table_generator.
generate_subtables(NUM_SUBTABLES, subtable_op_counts);
391 MergeSettings::PREPEND,
392 MergeSettings::APPEND };
395 for (
const auto& [subtable_ops, setting] :
zip_view(subtables, merge_settings)) {
397 for (
const auto& op : subtable_ops) {
398 eccvm_ops_table.
push(op);
400 eccvm_ops_table.
merge(setting);
404 for (
auto [subtable, setting] :
zip_view(subtables, merge_settings)) {
405 auto it = setting == MergeSettings::PREPEND ? ordered_subtables.begin() : ordered_subtables.end();
406 ordered_subtables.insert(it, subtable);
413 auto expected_num_ops = std::accumulate(subtable_op_counts.begin(), subtable_op_counts.end(),
size_t(0));
414 EXPECT_EQ(eccvm_ops_table.
size(), expected_num_ops);
417 for (
size_t i = 0; i < expected_num_ops; ++i) {
418 EXPECT_EQ(expected_eccvm_ops_table.
eccvm_ops[i], eccvm_ops_table[i]);