#include "caffe2/core/logging.h" #include "l2_minimization.h" #include #include #include using namespace std; using namespace dnnlowp; int main(int argc, const char* argv[]) { if (argc < 3) { cerr << "Usage: " << argv[0] << " in_file out_file [preserve_sparsity] [precision]" << endl; return -1; } ifstream in(argv[1]); ofstream out(argv[2]); bool preserve_sparsity = argc >= 4 ? atoi(argv[3]) : false; int precision = argc >= 5 ? atoi(argv[4]) : 8; vector> infos; vector hists; string line; while (getline(in, line)) { istringstream ist(line); int op_index, output_index; string op_type, tensor_name; float min, max; int nbins; ist >> op_index >> op_type >> output_index >> tensor_name >> min >> max >> nbins; infos.push_back(tuple( op_index, op_type, output_index, tensor_name)); vector bins; for (int i = 0; i < nbins; ++i) { uint64_t cnt; ist >> cnt; bins.push_back(cnt); } assert(bins.size() == nbins); Histogram hist = Histogram(min, max, bins); hists.emplace_back(min, max, bins); } vector qparams(hists.size()); #pragma omp parallel for for (int i = 0; i < hists.size(); ++i) { qparams[i] = L1ErrorMinimization().ChooseQuantizationParams( hists[i], preserve_sparsity, precision); } for (int i = 0; i < qparams.size(); ++i) { out << std::get<0>(infos[i]) << " " << std::get<1>(infos[i]) << " " << std::get<2>(infos[i]) << " " << std::get<3>(infos[i]) << " " << qparams[i].Min() << " " << qparams[i].Max() << endl; } return 0; }