00001
00022
00023
00024
00025
00026
00027
00028
00029 #include <sent/stddefs.h>
00030 #include <sent/htk_hmm.h>
00031
00032 extern char *rdhmmdef_token;
00033
00039 static HTK_HMM_Trans *
00040 trans_new()
00041 {
00042 HTK_HMM_Trans *new;
00043
00044 new = (HTK_HMM_Trans *)mybmalloc(sizeof(HTK_HMM_Trans));
00045 new->name = (char *)NULL;
00046 new->statenum = 0;
00047 new->a = (PROB **)NULL;
00048 new->next = NULL;
00049
00050 return(new);
00051 }
00052
00059 void
00060 trans_add(HTK_HMM_INFO *hmm, HTK_HMM_Trans *new)
00061 {
00062 HTK_HMM_Trans *match;
00063
00064
00065 new->next = hmm->trstart;
00066 hmm->trstart = new;
00067
00068 if (new->name != NULL) {
00069
00070 if (hmm->tr_root == NULL) {
00071 hmm->tr_root = aptree_make_root_node(new);
00072 } else {
00073 match = aptree_search_data(new->name, hmm->tr_root);
00074 if (strmatch(match->name,new->name)) {
00075 j_printerr("Error: ~t \"%s\" is already defined\n", new->name);
00076 rderr(NULL);
00077 } else {
00078 aptree_add_entry(new->name, new, match->name, &(hmm->tr_root));
00079 }
00080 }
00081 }
00082 }
00083
00092 static HTK_HMM_Trans *
00093 trans_lookup(HTK_HMM_INFO *hmm, char *keyname)
00094 {
00095 HTK_HMM_Trans *t;
00096
00097 t = aptree_search_data(keyname, hmm->tr_root);
00098 if (strmatch(t->name, keyname)) {
00099 return t;
00100 } else {
00101 return NULL;
00102 }
00103 }
00104
00118 static HTK_HMM_Trans *
00119 trans_read(FILE *fp)
00120 {
00121 HTK_HMM_Trans *new;
00122 int i,j;
00123 PROB prob;
00124 PROB *atmp;
00125
00126
00127 if (!currentis("TRANSP")) rderr("<TRANSP> not found");
00128 read_token(fp);
00129
00130
00131 new = trans_new();
00132 NoTokErr("missing TRANSP state num");
00133 new->statenum = atoi(rdhmmdef_token);
00134 read_token(fp);
00135
00136
00137 new->a = (PROB **)mybmalloc(sizeof(PROB *) * new->statenum);
00138 atmp = (PROB *)mybmalloc(sizeof(PROB) * new->statenum * new->statenum);
00139 new->a[0] = &(atmp[0]);
00140 for (i=1;i<new->statenum;i++) {
00141 new->a[i] = &(atmp[i*new->statenum]);
00142 }
00143
00144
00145 for (i=0;i<new->statenum; i++) {
00146 for (j=0;j<new->statenum; j++) {
00147 NoTokErr("missing some TRANSP value");
00148 prob = (PROB)atof(rdhmmdef_token);
00149 new->a[i][j] = prob;
00150 read_token(fp);
00151 }
00152 }
00153
00154 return(new);
00155 }
00156
00170 HTK_HMM_Trans *
00171 get_trans_data(FILE *fp, HTK_HMM_INFO *hmm)
00172 {
00173 HTK_HMM_Trans *tmp;
00174
00175 if (currentis("TRANSP")) {
00176
00177 tmp = trans_read(fp);
00178 tmp->name = NULL;
00179 trans_add(hmm, tmp);
00180 return(tmp);
00181 } else if (currentis("~t")) {
00182
00183 read_token(fp);
00184 NoTokErr("missing TRANSP macro name");
00185 tmp = trans_lookup(hmm, rdhmmdef_token);
00186 if (tmp == NULL) {
00187 j_printerr("~t \"%s\" not defined\n", rdhmmdef_token);
00188 rderr(NULL);
00189 }
00190 read_token(fp);
00191 return(tmp);
00192 } else {
00193 rderr("no transition data");
00194 return(NULL);
00195 }
00196 }
00197
00205 void
00206 def_trans_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm)
00207 {
00208 HTK_HMM_Trans *new;
00209
00210
00211 new = trans_read(fp);
00212
00213
00214 new->name = name;
00215 trans_add(hmm, new);
00216 }