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);