62 trace.visit_column(PermutationSettings::SRC_SELECTOR, [&](uint32_t row,
const FF&) {
63 auto src_values =
trace.get_multiple(PermutationSettings::SRC_COLUMNS, row);
67 trace.visit_column(PermutationSettings::DST_SELECTOR, [&](uint32_t row,
const FF&) {
68 auto dst_values =
trace.get_multiple(PermutationSettings::DST_COLUMNS, row);
72 auto build_error_message =
73 [&](
const ArrayTuple& tuple,
const auto& columns,
const auto& src_rows,
const auto& dst_rows) {
74 std::string error =
"Failure to build permutation " + std::string(PermutationSettings::NAME) +
".\n";
79 " in the source, but ",
81 " in the destination.\n");
82 error +=
format(
"Source rows: ");
83 for (
auto row : src_rows) {
87 error +=
format(
"Destination rows: ");
88 for (
auto row : dst_rows) {
97 : std::unordered_set<uint32_t>();
98 if (src_rows.size() != dst_rows.size()) {
99 throw std::runtime_error(
100 build_error_message(src_tuple, PermutationSettings::SRC_COLUMNS, src_rows, dst_rows));
107 if (src_rows.size() != dst_rows.size()) {
108 throw std::runtime_error(
109 build_error_message(dst_tuple, PermutationSettings::DST_COLUMNS, src_rows, dst_rows));