00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <sent/stddefs.h>
00027 #include <sent/htk_hmm.h>
00028
00029 extern char *rdhmmdef_token;
00030
00036
00037 static void
00038 update_gconst(HTK_HMM_Dens *d)
00039 {
00040 LOGPROB gconst;
00041 int i;
00042
00043 gconst = (LOGPROB)(d->var->len * LOGTPI);
00044 for (i=0;i<d->var->len;i++) {
00045 gconst += (LOGPROB)log(d->var->vec[i]);
00046 }
00047 d->gconst = gconst;
00048 }
00049
00055 static HTK_HMM_Dens *
00056 dens_new()
00057 {
00058 HTK_HMM_Dens *new;
00059
00060 new = (HTK_HMM_Dens *)mybmalloc(sizeof(HTK_HMM_Dens));
00061
00062 new->name = NULL;
00063 new->meanlen = 0;
00064 new->mean = NULL;
00065 new->var = NULL;
00066 new->gconst = 0.0;
00067 new->next = NULL;
00068
00069 return(new);
00070 }
00071
00078 void
00079 dens_add(HTK_HMM_INFO *hmm, HTK_HMM_Dens *new)
00080 {
00081 HTK_HMM_Dens *match;
00082
00083
00084 new->next = hmm->dnstart;
00085 hmm->dnstart = new;
00086
00087 if (new->name != NULL) {
00088
00089 if (hmm->dn_root == NULL) {
00090 hmm->dn_root = aptree_make_root_node(new);
00091 } else {
00092 match = aptree_search_data(new->name, hmm->dn_root);
00093 if (strmatch(match->name, new->name)) {
00094 j_printerr("Error: ~m \"%s\" is already defined\n", new->name);
00095 rderr(NULL);
00096 } else {
00097 aptree_add_entry(new->name, new, match->name, &(hmm->dn_root));
00098 }
00099 }
00100 }
00101 }
00102
00111 HTK_HMM_Dens *
00112 dens_lookup(HTK_HMM_INFO *hmm, char *keyname)
00113 {
00114 HTK_HMM_Dens *d;
00115
00116 d = aptree_search_data(keyname, hmm->dn_root);
00117 if (strmatch(d->name, keyname)) {
00118 return d;
00119 } else {
00120 return NULL;
00121 }
00122 }
00123
00138 static HTK_HMM_Dens *
00139 dens_read( FILE *fp, HTK_HMM_INFO *hmm)
00140 {
00141 HTK_HMM_Dens *new;
00142 int i;
00143
00144 new = dens_new();
00145
00146
00147 if (currentis("RCLASS")) {
00148 read_token(fp);
00149 NoTokErr("no RCLASS arg");
00150 read_token(fp);
00151 }
00152
00153 if (!currentis("MEAN")) rderr("<MEAN> not found");
00154 read_token(fp); NoTokErr("MEAN vector length not found");
00155 new->meanlen = atoi(rdhmmdef_token);
00156 read_token(fp);
00157 new->mean = (VECT *)mybmalloc(sizeof(VECT) * new->meanlen);
00158
00159 for (i=0;i<new->meanlen;i++) {
00160 NoTokErr("missing MEAN element");
00161 new->mean[i] = (VECT)atof(rdhmmdef_token);
00162 read_token(fp);
00163 }
00164
00165
00166 new->var = get_var_data(fp, hmm);
00167 if ((new->var)->len != new->meanlen) {
00168 rderr("mean vector length != variance vector len");
00169 }
00170
00171
00172 if (currentis("GCONST")) {
00173 read_token(fp);
00174 NoTokErr("GCONST found but no value");
00175 new->gconst = (LOGPROB)atof(rdhmmdef_token);
00176 read_token(fp);
00177 } else {
00178
00179 update_gconst(new);
00180 }
00181
00182 return (new);
00183 }
00184
00198 HTK_HMM_Dens *
00199 get_dens_data(FILE *fp, HTK_HMM_INFO *hmm)
00200 {
00201 HTK_HMM_Dens *tmp = NULL;
00202
00203 if (currentis("~m")) {
00204
00205 read_token(fp);
00206 NoTokErr("missing macro name");
00207 tmp = dens_lookup(hmm, rdhmmdef_token);
00208 if (tmp == NULL) {
00209 j_printerr("~m \"%s\" not defined\n", rdhmmdef_token);
00210 rderr(NULL);
00211 }
00212 read_token(fp);
00213 } else if (currentis("MEAN") || currentis("RCLASS")) {
00214
00215 tmp = dens_read(fp, hmm);
00216 tmp->name = NULL;
00217 dens_add(hmm, tmp);
00218 } else {
00219 rderr("no density data");
00220 }
00221 return tmp;
00222 }
00223
00224
00232 void
00233 def_dens_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm)
00234 {
00235 HTK_HMM_Dens *new;
00236
00237
00238 new = dens_read(fp, hmm);
00239
00240
00241 new->name = name;
00242 dens_add(hmm, new);
00243 }