65 trace.visit_column(PermutationSettings::SRC_SELECTOR, [&](uint32_t row,
const FF&) {
66 auto src_values =
trace.get_multiple(PermutationSettings::SRC_COLUMNS, row);
70 trace.visit_column(PermutationSettings::DST_SELECTOR, [&](uint32_t row,
const FF&) {
71 auto dst_values =
trace.get_multiple(PermutationSettings::DST_COLUMNS, row);
75 auto build_error_message =
76 [&](
const ArrayTuple& tuple,
const auto& columns,
const auto& src_rows,
const auto& dst_rows) {
77 std::string error =
"Failure to build permutation " + std::string(PermutationSettings::NAME) +
".\n";
82 " in the source, but ",
84 " in the destination.\n");
85 error +=
format(
"Source rows: ");
86 for (
auto row : src_rows) {
90 error +=
format(
"Destination rows: ");
91 for (
auto row : dst_rows) {
100 : std::unordered_set<uint32_t>();
101 if (src_rows.size() != dst_rows.size()) {
102 throw std::runtime_error(
103 build_error_message(src_tuple, PermutationSettings::SRC_COLUMNS, src_rows, dst_rows));
110 if (src_rows.size() != dst_rows.size()) {
111 throw std::runtime_error(
112 build_error_message(dst_tuple, PermutationSettings::DST_COLUMNS, src_rows, dst_rows));