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 static HTK_HMM_Var *
00037 var_new(HTK_HMM_INFO *hmm)
00038 {
00039 HTK_HMM_Var *new;
00040
00041 new = (HTK_HMM_Var *)mybmalloc2(sizeof(HTK_HMM_Var), &(hmm->mroot));
00042
00043 new->name = NULL;
00044 new->vec = NULL;
00045 new->len = 0;
00046 new->next = NULL;
00047
00048 return(new);
00049 }
00050
00057 void
00058 var_add(HTK_HMM_INFO *hmm, HTK_HMM_Var *new)
00059 {
00060 HTK_HMM_Var *match;
00061
00062
00063 new->next = hmm->vrstart;
00064 hmm->vrstart = new;
00065
00066 if (new->name != NULL) {
00067
00068 if (hmm->vr_root == NULL) {
00069 hmm->vr_root = aptree_make_root_node(new);
00070 } else {
00071 match = aptree_search_data(new->name, hmm->vr_root);
00072 if (strmatch(match->name, new->name)) {
00073 j_printerr("Error: ~v \"%s\" is already defined\n", new->name);
00074 rderr(NULL);
00075 } else {
00076 aptree_add_entry(new->name, new, match->name, &(hmm->vr_root));
00077 }
00078 }
00079 }
00080
00081 }
00082
00091 static HTK_HMM_Var *
00092 var_lookup(HTK_HMM_INFO *hmm, char *keyname)
00093 {
00094 HTK_HMM_Var *v;
00095
00096 v = aptree_search_data(keyname, hmm->vr_root);
00097 if (strmatch(v->name, keyname)) {
00098 return v;
00099 } else {
00100 return NULL;
00101 }
00102 }
00103
00118 static HTK_HMM_Var *
00119 var_read(FILE *fp, HTK_HMM_INFO *hmm)
00120 {
00121 HTK_HMM_Var *new;
00122 int i;
00123
00124 new = var_new(hmm);
00125
00126
00127
00128 if (!currentis("VARIANCE")) {
00129 j_printerr("variance matrix type \"%s\" not supported\n", rdhmmdef_token);
00130 rderr(NULL);
00131 } else {
00132 read_token(fp);
00133 NoTokErr("missing VARIANCE vector length");
00134 new->len = atoi(rdhmmdef_token);
00135 read_token(fp);
00136 new->vec = (VECT *)mybmalloc2(sizeof(VECT) * new->len, &(hmm->mroot));
00137
00138 for (i=0;i<new->len;i++) {
00139 NoTokErr("missing some VARIANCE element");
00140 new->vec[i] = (VECT)atof(rdhmmdef_token);
00141 read_token(fp);
00142 }
00143 }
00144
00145 return (new);
00146 }
00147
00161 HTK_HMM_Var *
00162 get_var_data(FILE *fp, HTK_HMM_INFO *hmm)
00163 {
00164 HTK_HMM_Var *tmp;
00165
00166 if (currentis("~v")) {
00167
00168 read_token(fp);
00169 NoTokErr("missing VARIANCE macro name");
00170 tmp = var_lookup(hmm, rdhmmdef_token);
00171 if (tmp == NULL) {
00172 j_printerr("~v \"%s\" not defined\n", rdhmmdef_token);
00173 rderr(NULL);
00174 }
00175 read_token(fp);
00176 return tmp;
00177 } else if (currentis("VARIANCE")){
00178
00179 tmp = var_read(fp, hmm);
00180 tmp->name = NULL;
00181 var_add(hmm, tmp);
00182 return tmp;
00183 } else {
00184 rderr("no variance data");
00185 return NULL;
00186 }
00187 }
00188
00196 void
00197 def_var_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm)
00198 {
00199 HTK_HMM_Var *new;
00200
00201
00202
00203 new = var_read(fp, hmm);
00204
00205
00206 new->name = name;
00207 var_add(hmm, new);
00208 }