summaryrefslogblamecommitdiff
path: root/htk_io/tools/tnet_to_nerv.cpp
blob: f96781ad42b13bbd58fc1304696c7f9ab2dbdcc6 (plain) (tree)
1
2
3
4
5
6
7
8
9



                  
                   

                  
             
                                 





                                                             
                       



                                   








                                                    
                                                             

                                                                 


                                             
                                












                                                                                     
                                         


























                                                                                 























































                                                                                     


             
#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;
}