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



                  
                  
                  
              
 

                  















                                                    











                                                                  
                                 
              
                       



                              

                                        
                                           


                       
                     
                                       

                                                    

                                                         
                                          
                                         

                                          
                                                   



                                                                                     
                         













                                                   
                                                                         


                                          
                                                   














                                                                                 
             
                                         
         




























                                                                             


             
#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, "<biasedlinearity>") == 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, "<bias>") == 0)) ||
                strcmp(token, "<window>") == 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;
}