Julius 4.2
libsent/src/hmminfo/rdhmmdef_dens.c
説明を見る。
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 }