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