Julius 4.2
|
00001 00018 /* 00019 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00020 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00021 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00022 * All rights reserved 00023 */ 00024 00025 /* $Id: rdhmmdef_dens.c,v 1.4 2011/04/29 05:09:16 sumomo Exp $ */ 00026 00027 #include <sent/stddefs.h> 00028 #include <sent/htk_hmm.h> 00029 00030 extern char *rdhmmdef_token; 00031 00037 /* GCONST = log((2*PI)^n|\sigma|) */ 00038 static void 00039 update_gconst(HTK_HMM_Dens *d) 00040 { 00041 LOGPROB gconst; 00042 int i; 00043 00044 gconst = (LOGPROB)(d->var->len * LOGTPI); 00045 for (i=0;i<d->var->len;i++) { 00046 gconst += (LOGPROB)log(d->var->vec[i]); 00047 } 00048 d->gconst = gconst; 00049 } 00050 00056 static HTK_HMM_Dens * 00057 dens_new(HTK_HMM_INFO *hmm) 00058 { 00059 HTK_HMM_Dens *new; 00060 00061 new = (HTK_HMM_Dens *)mybmalloc2(sizeof(HTK_HMM_Dens), &(hmm->mroot)); 00062 00063 new->name = NULL; 00064 new->meanlen = 0; 00065 new->mean = NULL; 00066 new->var = NULL; 00067 new->gconst = 0.0; 00068 new->next = NULL; 00069 00070 return(new); 00071 } 00072 00079 void 00080 dens_add(HTK_HMM_INFO *hmm, HTK_HMM_Dens *new) 00081 { 00082 HTK_HMM_Dens *match; 00083 00084 /* link data structure */ 00085 new->next = hmm->dnstart; 00086 hmm->dnstart = new; 00087 00088 if (new->name != NULL) { 00089 /* add index to search index tree */ 00090 if (hmm->dn_root == NULL) { 00091 hmm->dn_root = aptree_make_root_node(new, &(hmm->mroot)); 00092 } else { 00093 match = aptree_search_data(new->name, hmm->dn_root); 00094 if (match != NULL && strmatch(match->name, new->name)) { 00095 jlog("Error: rdhmmdef_dens: ~m \"%s\" is already defined\n", new->name); 00096 rderr(NULL); 00097 } else { 00098 aptree_add_entry(new->name, new, match->name, &(hmm->dn_root), &(hmm->mroot)); 00099 } 00100 } 00101 } 00102 } 00103 00112 HTK_HMM_Dens * 00113 dens_lookup(HTK_HMM_INFO *hmm, char *keyname) 00114 { 00115 HTK_HMM_Dens *d; 00116 00117 d = aptree_search_data(keyname, hmm->dn_root); 00118 if (d != NULL && strmatch(d->name, keyname)) { 00119 return d; 00120 } else { 00121 return NULL; 00122 } 00123 } 00124 00139 static HTK_HMM_Dens * 00140 dens_read( FILE *fp, HTK_HMM_INFO *hmm) 00141 { 00142 HTK_HMM_Dens *new; 00143 int i; 00144 00145 new = dens_new(hmm); 00146 00147 /* read regression class ID (just skip) */ 00148 if (currentis("RCLASS")) { 00149 read_token(fp); 00150 NoTokErr("no RCLASS arg"); 00151 read_token(fp); 00152 } 00153 /* read mean vector */ 00154 if (!currentis("MEAN")) rderr("<MEAN> not found"); 00155 read_token(fp); NoTokErr("MEAN vector length not found"); 00156 new->meanlen = atoi(rdhmmdef_token); 00157 read_token(fp); 00158 new->mean = (VECT *)mybmalloc2(sizeof(VECT) * new->meanlen, &(hmm->mroot)); 00159 /* needs comversion if integerized */ 00160 for (i=0;i<new->meanlen;i++) { 00161 NoTokErr("missing MEAN element"); 00162 new->mean[i] = (VECT)atof(rdhmmdef_token); 00163 read_token(fp); 00164 } 00165 00166 /* read covariance matrix data */ 00167 new->var = get_var_data(fp, hmm); 00168 if ((new->var)->len != new->meanlen) { 00169 rderr("mean vector length != variance vector len"); 00170 } 00171 00172 /* read GCONST if any */ 00173 if (currentis("GCONST")) { 00174 read_token(fp); 00175 NoTokErr("GCONST found but no value"); 00176 new->gconst = (LOGPROB)atof(rdhmmdef_token); 00177 read_token(fp); 00178 } else { 00179 /* calc */ 00180 update_gconst(new); 00181 } 00182 00183 return (new); 00184 } 00185 00199 HTK_HMM_Dens * 00200 get_dens_data(FILE *fp, HTK_HMM_INFO *hmm) 00201 { 00202 HTK_HMM_Dens *tmp = NULL; 00203 00204 if (currentis("~m")) { 00205 /* macro reference: lookup and return the pointer */ 00206 read_token(fp); 00207 NoTokErr("missing macro name"); 00208 tmp = dens_lookup(hmm, rdhmmdef_token); 00209 if (tmp == NULL) { 00210 jlog("Error: rdhmmdef_dens: ~m \"%s\" not defined\n", rdhmmdef_token); 00211 rderr(NULL); 00212 } 00213 read_token(fp); 00214 } else if (currentis("MEAN") || currentis("RCLASS")) { 00215 /* definition: define density data, and return the pointer */ 00216 tmp = dens_read(fp, hmm); 00217 tmp->name = NULL; /* no name */ 00218 dens_add(hmm, tmp); 00219 } else { 00220 rderr("no density data"); 00221 } 00222 return tmp; 00223 } 00224 00225 00233 void 00234 def_dens_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm) 00235 { 00236 HTK_HMM_Dens *new; 00237 00238 /* read in data and return newly malloced data */ 00239 new = dens_read(fp, hmm); 00240 00241 /* register it to the grobal HMM structure */ 00242 new->name = name; 00243 dens_add(hmm, new); 00244 }