Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

rdhmmdef_trans.c

Go to the documentation of this file.
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, 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()
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   /* 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 
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   /* read tag */
00127   if (!currentis("TRANSP")) rderr("<TRANSP> not found"); /* not match */
00128   read_token(fp);
00129 
00130   /* read statenum */
00131   new = trans_new();
00132   NoTokErr("missing TRANSP state num");
00133   new->statenum = atoi(rdhmmdef_token);
00134   read_token(fp);
00135 
00136   /* allocate array */
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   /* begin reading transition prob */
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     /* definition: define transition data, and return the pointer */
00177     tmp = trans_read(fp);
00178     tmp->name = NULL; /* no name */
00179     trans_add(hmm, tmp);
00180     return(tmp);
00181   } else if (currentis("~t")) {
00182     /* macro reference: lookup and return the pointer */
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   /* read in data and return newly malloced data */
00211   new = trans_read(fp);
00212 
00213   /* register it to the grobal HMM structure */
00214   new->name = name;
00215   trans_add(hmm, new);
00216 }

Generated on Tue Mar 28 16:01:39 2006 for Julius by  doxygen 1.4.2