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 }