libsent/src/hmminfo/rdhmmdef_trans.c

説明を見る。
00001 
00022 /*
00023  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00024  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00025  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00026  * All rights reserved
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   /* link data structure */
00065   new->next = hmm->trstart;
00066   hmm->trstart = new;
00067 
00068   if (new->name != NULL) {
00069     /* add index to search index tree */
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   /* read tag */
00128   if (!currentis("TRANSP")) rderr("<TRANSP> not found"); /* not match */
00129   read_token(fp);
00130 
00131   /* read statenum */
00132   new = trans_new(hmm);
00133   NoTokErr("missing TRANSP state num");
00134   new->statenum = atoi(rdhmmdef_token);
00135   read_token(fp);
00136 
00137   /* allocate array */
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   /* begin reading transition prob */
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     /* definition: define transition data, and return the pointer */
00178     tmp = trans_read(fp, hmm);
00179     tmp->name = NULL; /* no name */
00180     trans_add(hmm, tmp);
00181     return(tmp);
00182   } else if (currentis("~t")) {
00183     /* macro reference: lookup and return the pointer */
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   /* read in data and return newly malloced data */
00212   new = trans_read(fp, hmm);
00213 
00214   /* register it to the grobal HMM structure */
00215   new->name = name;
00216   trans_add(hmm, new);
00217 }

Julianに対してTue Dec 26 12:56:19 2006に生成されました。  doxygen 1.5.0