#include <cstdio>
#include <fstream>
#include <string>
#include <cstring>
#include <cassert>
#include <cstdlib>
#include <map>
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<std::string, int> param_cnt;
int get_param_cnt(const std::string &key) {
std::map<std::string, int>::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, "<AffineTransform>") == 0)
{
double lrate, blrate, mnorm;
fscanf(fin, "%d %d", &ncol, &nrow);
fscanf(fin, "%s %lf %s %lf %s %lf",
token, &lrate, token, &blrate, token, &mnorm);
fscanf(fin, "%s", token);
assert(*token == '[');
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);
fscanf(fin, "%s", token);
assert(*token == ']');
if (fscanf(fin, "%s", token) == 1 && *token == '[')
{
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, "<AddShift>") == 0)) ||
strcmp(token, "<Rescale>") == 0)
{
double lrate, blrate, mnorm;
fscanf(fin, "%d %d", &ncol, &ncol);
mat = new_matrix(1, ncol);
fscanf(fin, "%s %lf",
token, &lrate);
fscanf(fin, "%s", token);
assert(*token == '[');
printf("%d\n", ncol);
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);
fscanf(fin, "%s", token);
assert(*token == ']');
free_matrix(mat, 1, ncol);
}
}
return 0;
}