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