diff options
author | Determinant <[email protected]> | 2016-03-13 16:18:36 +0800 |
---|---|---|
committer | Determinant <[email protected]> | 2016-03-13 16:18:36 +0800 |
commit | 93eb84aca23526959b76401fd6509f151a589e9a (patch) | |
tree | f9abef4f3bc9b49190ec2ec775344d5cdb52388c /htk_io/tools/tnet_to_nerv.cpp | |
parent | ddc4545050b41d12cfdc19cea9ba31c940d3d537 (diff) |
add TNet tutorial; support converting global transf from TNet format
Diffstat (limited to 'htk_io/tools/tnet_to_nerv.cpp')
-rw-r--r-- | htk_io/tools/tnet_to_nerv.cpp | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/htk_io/tools/tnet_to_nerv.cpp b/htk_io/tools/tnet_to_nerv.cpp index 63a104d..067097e 100644 --- a/htk_io/tools/tnet_to_nerv.cpp +++ b/htk_io/tools/tnet_to_nerv.cpp @@ -4,6 +4,7 @@ #include <cstring> #include <cassert> #include <cstdlib> +#include <map> char token[1024]; char output[1024]; @@ -23,6 +24,18 @@ void free_matrix(double **mat, int nrow, int ncol) { 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; @@ -30,12 +43,14 @@ int main(int argc, char **argv) { fin = fopen(argv[1], "r"); fout.open(argv[2]); assert(fin != NULL); - int cnt = argc > 3 ? atoi(argv[3]) : 0; + 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); @@ -84,10 +99,38 @@ int main(int argc, char **argv) { sprintf(output, "[%13lu]\n", length); fout << output; fout.seekp(0, std::ios_base::end); - cnt++; } 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; } |