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(HTK_HMM_INFO *hmm)
00041 {
00042 HTK_HMM_Trans *new;
00043
00044 new = (HTK_HMM_Trans *)mybmalloc2(sizeof(HTK_HMM_Trans), &(hmm->mroot));
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
00119 static HTK_HMM_Trans *
00120 trans_read(FILE *fp, HTK_HMM_INFO *hmm)
00121 {
00122 HTK_HMM_Trans *new;
00123 int i,j;
00124 PROB prob;
00125 PROB *atmp;
00126
00127
00128 if (!currentis("TRANSP")) rderr("<TRANSP> not found");
00129 read_token(fp);
00130
00131
00132 new = trans_new(hmm);
00133 NoTokErr("missing TRANSP state num");
00134 new->statenum = atoi(rdhmmdef_token);
00135 read_token(fp);
00136
00137
00138 new->a = (PROB **)mybmalloc2(sizeof(PROB *) * new->statenum, &(hmm->mroot));
00139 atmp = (PROB *)mybmalloc2(sizeof(PROB) * new->statenum * new->statenum, &(hmm->mroot));
00140 new->a[0] = &(atmp[0]);
00141 for (i=1;i<new->statenum;i++) {
00142 new->a[i] = &(atmp[i*new->statenum]);
00143 }
00144
00145
00146 for (i=0;i<new->statenum; i++) {
00147 for (j=0;j<new->statenum; j++) {
00148 NoTokErr("missing some TRANSP value");
00149 prob = (PROB)atof(rdhmmdef_token);
00150 new->a[i][j] = prob;
00151 read_token(fp);
00152 }
00153 }
00154
00155 return(new);
00156 }
00157
00171 HTK_HMM_Trans *
00172 get_trans_data(FILE *fp, HTK_HMM_INFO *hmm)
00173 {
00174 HTK_HMM_Trans *tmp;
00175
00176 if (currentis("TRANSP")) {
00177
00178 tmp = trans_read(fp, hmm);
00179 tmp->name = NULL;
00180 trans_add(hmm, tmp);
00181 return(tmp);
00182 } else if (currentis("~t")) {
00183
00184 read_token(fp);
00185 NoTokErr("missing TRANSP macro name");
00186 tmp = trans_lookup(hmm, rdhmmdef_token);
00187 if (tmp == NULL) {
00188 j_printerr("~t \"%s\" not defined\n", rdhmmdef_token);
00189 rderr(NULL);
00190 }
00191 read_token(fp);
00192 return(tmp);
00193 } else {
00194 rderr("no transition data");
00195 return(NULL);
00196 }
00197 }
00198
00206 void
00207 def_trans_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm)
00208 {
00209 HTK_HMM_Trans *new;
00210
00211
00212 new = trans_read(fp, hmm);
00213
00214
00215 new->name = name;
00216 trans_add(hmm, new);
00217 }