libsent/src/hmminfo/rdhmmdef_dens.c

説明を見る。
00001 
00017 /*
00018  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00019  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00020  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00021  * All rights reserved
00022  */
00023 
00024 /* $Id: rdhmmdef_dens.c,v 1.4 2006/11/10 02:27:43 sumomo Exp $ */
00025 
00026 #include <sent/stddefs.h>
00027 #include <sent/htk_hmm.h>
00028 
00029 extern char *rdhmmdef_token;    
00030 
00036 /* GCONST = log((2*PI)^n|\sigma|) */
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(HTK_HMM_INFO *hmm)
00057 {
00058   HTK_HMM_Dens *new;
00059 
00060   new = (HTK_HMM_Dens *)mybmalloc2(sizeof(HTK_HMM_Dens), &(hmm->mroot));
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   /* link data structure */
00084   new->next = hmm->dnstart;
00085   hmm->dnstart = new;
00086 
00087   if (new->name != NULL) {
00088     /* add index to search index tree */
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(hmm);
00145 
00146   /* read regression class ID (just skip) */
00147   if (currentis("RCLASS")) {
00148     read_token(fp);
00149     NoTokErr("no RCLASS arg");
00150     read_token(fp);
00151   }
00152   /* read mean vector */
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 *)mybmalloc2(sizeof(VECT) * new->meanlen, &(hmm->mroot));
00158   /* needs comversion if integerized */
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   /* read covariance matrix data */
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   /* read GCONST if any */
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     /* calc */
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     /* macro reference: lookup and return the pointer */
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     /* definition: define density data, and return the pointer */
00215     tmp = dens_read(fp, hmm);
00216     tmp->name = NULL; /* no name */
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   /* read in data and return newly malloced data */
00238   new = dens_read(fp, hmm);
00239 
00240   /* register it to the grobal HMM structure */
00241   new->name = name;
00242   dens_add(hmm, new);
00243 }

Julianに対してTue Dec 26 12:56:19 2006に生成されました。  doxygen 1.5.0