40 column_idx < dimension ? 1ul << (dimension - 1 - column_idx)
41 : 1ul << (column_idx - dimension));
60 const size_t dimension,
61 const size_t column_idx,
66 return (use_top ? row_idx & ~mask : row_idx | mask);
85 const size_t dimension,
86 const size_t column_idx,
91 dimension, column_idx - 1, row_idx, use_top);
100 const size_t dimension,
101 const size_t column_idx,
102 const size_t row_idx,
117 const size_t dimension,
const size_t column_idx,
const size_t row_idx)
120 return row_idx ^ mask;
130 const size_t dimension,
const size_t column_idx,
const size_t packet_idx)
133 dimension, column_idx - 1, packet_idx);
138 const size_t dimension = libff::log2(num_packets);
139 assert(num_packets == 1ul << dimension);
141 return 2 * dimension;
147 const size_t dimension = libff::log2(num_packets);
148 assert(num_packets == 1ul << dimension);
152 for (
size_t column_idx = 0; column_idx < num_columns; ++column_idx) {
153 result[column_idx].resize(num_packets);
154 for (
size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
155 result[column_idx][packet_idx].first = packet_idx;
156 result[column_idx][packet_idx].second =
158 dimension, column_idx, packet_idx);
177 const size_t dimension,
180 const size_t column_idx_start,
181 const size_t column_idx_end,
182 const size_t subnetwork_offset,
183 const size_t subnetwork_size,
187 assert(permutation.
size() == subnetwork_size);
189 assert(permutation.
inverse() == permutation_inv);
192 if (column_idx_start == column_idx_end) {
197 libff::bit_vector lhs_routed(subnetwork_size,
false);
200 size_t w = subnetwork_offset;
201 size_t last_unrouted = subnetwork_offset;
204 subnetwork_offset, subnetwork_offset + subnetwork_size - 1);
206 subnetwork_offset, subnetwork_offset + subnetwork_size - 1);
216 size_t wprime = permutation.
get(w);
220 dimension, column_idx_start, w,
true);
224 lhs_routed[w - subnetwork_offset] =
true;
228 dimension, column_idx_end, wprime,
true)] =
230 dimension, column_idx_end - 1, wprime,
true);
231 new_permutation_inv.
set(
238 const size_t vprime =
240 const size_t v = permutation_inv.
get(vprime);
241 assert(!lhs_routed[v - subnetwork_offset]);
245 dimension, column_idx_end, vprime,
false)] =
247 dimension, column_idx_end - 1, vprime,
false);
248 new_permutation_inv.
set(
251 dimension, column_idx_start, v,
false));
255 dimension, column_idx_start, v,
false);
259 lhs_routed[v - subnetwork_offset] =
true;
265 dimension, column_idx_start, v) -
266 subnetwork_offset]) {
269 while ((last_unrouted < subnetwork_offset + subnetwork_size) &&
270 lhs_routed[last_unrouted - subnetwork_offset]) {
274 if (last_unrouted == subnetwork_offset + subnetwork_size) {
284 subnetwork_offset, subnetwork_offset + subnetwork_size / 2 - 1);
286 subnetwork_offset + subnetwork_size / 2,
287 subnetwork_offset + subnetwork_size - 1);
290 new_permutation_inv.
slice(
291 subnetwork_offset, subnetwork_offset + subnetwork_size / 2 - 1);
293 new_permutation_inv.
slice(
294 subnetwork_offset + subnetwork_size / 2,
295 subnetwork_offset + subnetwork_size - 1);
300 new_permutation_upper,
301 new_permutation_inv_upper,
302 column_idx_start + 1,
311 new_permutation_lower,
312 new_permutation_inv_lower,
313 column_idx_start + 1,
315 subnetwork_offset + subnetwork_size / 2,
322 const size_t num_packets = permutation.
size();
324 const size_t dimension = libff::log2(num_packets);
326 benes_routing routing(num_columns, libff::bit_vector(num_packets));
346 const size_t num_packets = start.size();
348 const size_t dimension = libff::log2(num_packets);
350 std::vector<std::vector<T>> res(
351 num_columns + 1, std::vector<T>(num_packets));
354 for (
size_t column_idx = 0; column_idx < num_columns; ++column_idx) {
357 for (
size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
358 size_t next_packet_idx = (routing[column_idx][packet_idx] ==
false)
361 res[column_idx + 1][next_packet_idx] = res[column_idx][packet_idx];
371 const size_t num_packets = permutation.
size();
374 std::vector<size_t> input_packets(num_packets);
375 for (
size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
376 input_packets[packet_idx] = packet_idx;
379 const std::vector<std::vector<size_t>> routed_packets =
382 for (
size_t packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
383 if (routed_packets[num_columns][permutation.
get(packet_idx)] !=
384 input_packets[packet_idx]) {