14 #include <libff/common/default_types/ec_pp.hpp>
15 #include <libff/common/profiling.hpp>
21 template<
typename FieldT>
25 size_t &num_constraints,
26 size_t &num_variables)
30 std::vector<pb_variable_array<FieldT>> randbits(n), outbits(n);
31 for (
size_t y = 0; y < n; ++y) {
32 randbits[y].allocate(pb, l, FMT(
"",
"randbits_%zu", y));
33 outbits[y].allocate(pb, l, FMT(
"",
"outbits_%zu", y));
37 pb, n, randbits, outbits,
"main_routing_gadget");
44 template<
typename FieldT>
48 size_t &num_constraints,
49 size_t &num_variables)
51 const size_t t = libff::log2(n);
52 assert(n == 1ul << t);
56 std::vector<pb_variable_array<FieldT>> randbits(1ul << t),
58 for (
size_t y = 0; y < 1ul << t; ++y) {
59 randbits[y].allocate(pb, l, FMT(
"",
"randbits_%zu", y));
60 outbits[y].allocate(pb, l, FMT(
"",
"outbits_%zu", y));
64 pb, n, randbits, outbits, n,
"main_routing_gadget");
73 printf(
"profiling number of constraints for powers-of-2\n");
74 for (
size_t n = 2; n <= 65; ++n) {
75 size_t as_waksman_constr, as_waksman_vars;
76 get_as_waksman_size<FieldT>(n, l, as_waksman_constr, as_waksman_vars);
78 const size_t rounded_n = 1ul << libff::log2(n);
79 size_t benes_constr, benes_vars;
80 get_benes_size<FieldT>(rounded_n, l, benes_constr, benes_vars);
83 "n = %zu (rounded = %zu), l = %zu, benes_constr = %zu, benes_vars "
84 "= %zu, as_waksman_constr = %zu, as_waksman_vars = %zu, "
85 "constr_ratio = %0.3f, var_ratio = %0.3f\n",
93 1. * benes_constr / as_waksman_constr,
94 1. * benes_vars / as_waksman_vars);
100 printf(
"profiling number of switches in arbitrary size networks (and "
101 "rounded-up for Benes)\n");
102 for (
size_t n = 2; n <= 65; ++n) {
103 size_t as_waksman_constr, as_waksman_vars;
104 get_as_waksman_size<FieldT>(n, l, as_waksman_constr, as_waksman_vars);
106 const size_t rounded_n = 1ul << libff::log2(n);
107 size_t benes_constr, benes_vars;
108 get_benes_size<FieldT>(rounded_n, l, benes_constr, benes_vars);
110 const size_t as_waksman_switches =
111 (as_waksman_constr - n * (2 + l)) / 2;
112 const size_t benes_switches = (benes_constr - rounded_n * (2 + l)) / 2;
116 "n = %zu (rounded_n = %zu), l = %zu, benes_switches = %zu, "
117 "as_waksman_switches = %zu, ratio = %0.3f\n",
123 1. * benes_switches / as_waksman_switches);
129 libff::start_profiling();
130 libff::default_ec_pp::init_public_params();
131 profile_routing_gadgets<libff::Fr<libff::default_ec_pp>>(32 + 16 + 3 + 2);
132 profile_num_switches<libff::Fr<libff::default_ec_pp>>(1);