65 trace.visit_column(PermutationSettings::SRC_SELECTOR, [&](uint32_t row,
const FF&) {
69 trace.visit_column(PermutationSettings::DST_SELECTOR, [&](uint32_t row,
const FF&) {
73 auto build_error_message =
74 [&](
const ArrayTuple& tuple,
const auto& columns,
const auto& src_rows,
const auto& dst_rows) {
75 std::string error =
"Failure to build permutation " + std::string(PermutationSettings::NAME) +
".\n";
80 " in the source, but ",
82 " in the destination.\n");
83 error +=
format(
"Source rows: ");
84 for (
auto row : src_rows) {
88 error +=
format(
"Destination rows: ");
89 for (
auto row : dst_rows) {
98 : std::unordered_set<uint32_t>();
99 if (src_rows.size() != dst_rows.size()) {
100 throw std::runtime_error(
101 build_error_message(src_tuple, PermutationSettings::SRC_COLUMNS, src_rows, dst_rows));
108 if (src_rows.size() != dst_rows.size()) {
109 throw std::runtime_error(
110 build_error_message(dst_tuple, PermutationSettings::DST_COLUMNS, src_rows, dst_rows));