#include <cstdio>
#include <fstream>
#include <string>
#include <cstring>
#include <stdlib.h>
char token[1024];
char output[1024];
double **mat;
int main(int argc, char **argv) {
if (argc != 3)
{
printf("%s tnet.model.in nerv.model.out\n", argv[0]);
}
std::ofstream fout;
freopen(argv[1], "r", stdin);
fout.open(argv[2]);
int cnt = 0, bias = 1, win = 1;
long length = 0, base = 0;
while (scanf("%s", token) != EOF)
{
int nrow, ncol;
int i, j;
if (strcmp(token, "<biasedlinearity>") == 0)
{
scanf("%d %d", &ncol, &nrow);
scanf("%s %d %d", token, &ncol, &nrow);
printf("%d %d\n", nrow, ncol);
mat = (double **)malloc(nrow * sizeof(double *));
for (i = 0; i < nrow; i++)
mat[i] = (double *)malloc(ncol * sizeof(double));
for (j = 0; j < ncol; j++)
for (i = 0; i < nrow; i++)
scanf("%lf", mat[i] + j);
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;
}
length = fout.tellp() - base;
fout.seekp(base);
sprintf(output, "[%13lu]\n", length);
fout << output;
fout.seekp(0, std::ios_base::end);
if (scanf("%s %d", token, &ncol) == 2 && *token == 'v')
{
base = fout.tellp();
for (j = 0; j < ncol; j++)
scanf("%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);
cnt++;
}
}
else if (strcmp(token, "<bias>") == 0)
{
scanf("%d %d", &ncol, &nrow);
scanf("%s %d", token, &ncol);
base = fout.tellp();
nrow = 1;
mat = (double **)malloc(nrow * sizeof(double *));
for (i = 0; i < nrow; i++)
mat[i] = (double *)malloc(ncol * sizeof(double));
for (j = 0; j < ncol; j++)
for (i = 0; i < nrow; i++)
scanf("%lf", mat[i] + j);
sprintf(output, "%16d", 0);
fout << output;
sprintf(output, "{type=\"nerv.MatrixParam\",id=\"bias%d\"}\n",bias);
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);
bias++;
}
else if (strcmp(token, "<window>") == 0)
{
scanf("%d %d", &ncol, &nrow);
scanf("%s %d", token, &ncol);
base = fout.tellp();
nrow = 1;
mat = (double **)malloc(nrow * sizeof(double *));
for (i = 0; i < nrow; i++)
mat[i] = (double *)malloc(ncol * sizeof(double));
for (j = 0; j < ncol; j++)
for (i = 0; i < nrow; i++)
scanf("%lf", mat[i] + j);
sprintf(output, "%16d", 0);
fout << output;
sprintf(output, "{type=\"nerv.MatrixParam\",id=\"window%d\"}\n",win);
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);
win++;
}
}
return 0;
}