#include #include #include #include #include #include #include char token[1024]; char output[1024]; double **new_matrix(int nrow, int ncol) { double **mat = new double *[nrow]; int i; for (i = 0; i < nrow; i++) mat[i] = new double[ncol]; return mat; } void free_matrix(double **mat, int nrow, int ncol) { int i; for (i = 0; i < nrow; i++) delete [] mat[i]; delete [] mat; } int cnt0; std::map param_cnt; int get_param_cnt(const std::string &key) { std::map::iterator it = param_cnt.find(key); if (it == param_cnt.end()) { param_cnt[key] = cnt0 + 1; return cnt0; } return it->second++; } int main(int argc, char **argv) { FILE *fin; std::ofstream fout; assert(argc >= 3); fin = fopen(argv[1], "r"); fout.open(argv[2]); assert(fin != NULL); cnt0 = argc > 3 ? atoi(argv[3]) : 0; bool shift; while (fscanf(fin, "%s", token) != EOF) { int nrow, ncol; int i, j; double **mat; int cnt = get_param_cnt(token); if (strcmp(token, "") == 0) { fscanf(fin, "%d %d", &ncol, &nrow); fscanf(fin, "%s %d %d", token, &ncol, &nrow); printf("%d %d\n", nrow, ncol); mat = new_matrix(nrow, ncol); for (j = 0; j < ncol; j++) for (i = 0; i < nrow; i++) fscanf(fin, "%lf", mat[i] + j); long base = fout.tellp(); sprintf(output, "%16d", 0); fout << output; sprintf(output, "{type=\"nerv.LinearTransParam\",id=\"affine%d_ltp\"}\n", cnt); fout << output; sprintf(output, "%d %d\n", nrow, ncol); fout << output; for (i = 0; i < nrow; i++) { for (j = 0; j < ncol; j++) fout << mat[i][j] << " "; fout << std::endl; } long length = fout.tellp() - base; fout.seekp(base); sprintf(output, "[%13lu]\n", length); fout << output; fout.seekp(0, std::ios_base::end); if (fscanf(fin, "%s %d", token, &ncol) == 2 && *token == 'v') { base = fout.tellp(); for (j = 0; j < ncol; j++) fscanf(fin, "%lf", mat[0] + j); sprintf(output, "%16d", 0); fout << output; sprintf(output, "{type=\"nerv.BiasParam\",id=\"affine%d_bp\"}\n", cnt); fout << output; sprintf(output, "1 %d\n", ncol); fout << output; for (j = 0; j < ncol; j++) fout << mat[0][j] << " "; fout << std::endl; length = fout.tellp() - base; fout.seekp(base); sprintf(output, "[%13lu]\n", length); fout << output; fout.seekp(0, std::ios_base::end); } free_matrix(mat, nrow, ncol); } else if ((shift = (strcmp(token, "") == 0)) || strcmp(token, "") == 0) { fscanf(fin, "%d %d", &ncol, &nrow); printf("%d %d\n", nrow, ncol); assert(nrow == ncol); mat = new_matrix(1, ncol); assert(fscanf(fin, "%s %d", token, &ncol) == 2 && *token == 'v'); for (j = 0; j < ncol; j++) fscanf(fin, "%lf", mat[0] + j); long base = fout.tellp(); sprintf(output, "%16d", 0); fout << output; sprintf(output, "{type=\"nerv.BiasParam\",id=\"%s%d\"}\n", shift ? "bias" : "window", cnt); fout << output; sprintf(output, "%d %d\n", 1, ncol); fout << output; for (j = 0; j < ncol; j++) fout << mat[0][j] << " "; fout << std::endl; long length = fout.tellp() - base; fout.seekp(base); sprintf(output, "[%13lu]\n", length); fout << output; fout.seekp(0, std::ios_base::end); free_matrix(mat, 1, ncol); } } return 0; }