00001
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <sent/stddefs.h>
00028 #include <sent/htk_hmm.h>
00029
00030 extern char *rdhmmdef_token;
00031
00037
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
00085 new->next = hmm->dnstart;
00086 hmm->dnstart = new;
00087
00088 if (new->name != NULL) {
00089
00090 if (hmm->dn_root == NULL) {
00091 hmm->dn_root = aptree_make_root_node(new);
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));
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
00148 if (currentis("RCLASS")) {
00149 read_token(fp);
00150 NoTokErr("no RCLASS arg");
00151 read_token(fp);
00152 }
00153
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
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
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
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
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
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
00216 tmp = dens_read(fp, hmm);
00217 tmp->name = NULL;
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
00239 new = dens_read(fp, hmm);
00240
00241
00242 new->name = name;
00243 dens_add(hmm, new);
00244 }