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()
00038 {
00039 HTK_HMM_Var *new;
00040
00041 new = (HTK_HMM_Var *)mymalloc(sizeof(HTK_HMM_Var));
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
00117 static HTK_HMM_Var *
00118 var_read(FILE *fp)
00119 {
00120 HTK_HMM_Var *new;
00121 int i;
00122
00123 new = var_new();
00124
00125
00126
00127 if (!currentis("VARIANCE")) {
00128 j_printerr("variance matrix type \"%s\" not supported\n", rdhmmdef_token);
00129 rderr(NULL);
00130 } else {
00131 read_token(fp);
00132 NoTokErr("missing VARIANCE vector length");
00133 new->len = atoi(rdhmmdef_token);
00134 read_token(fp);
00135 new->vec = (VECT *)mybmalloc(sizeof(VECT) * new->len);
00136
00137 for (i=0;i<new->len;i++) {
00138 NoTokErr("missing some VARIANCE element");
00139 new->vec[i] = (VECT)atof(rdhmmdef_token);
00140 read_token(fp);
00141 }
00142 }
00143
00144 return (new);
00145 }
00146
00160 HTK_HMM_Var *
00161 get_var_data(FILE *fp, HTK_HMM_INFO *hmm)
00162 {
00163 HTK_HMM_Var *tmp;
00164
00165 if (currentis("~v")) {
00166
00167 read_token(fp);
00168 NoTokErr("missing VARIANCE macro name");
00169 tmp = var_lookup(hmm, rdhmmdef_token);
00170 if (tmp == NULL) {
00171 j_printerr("~v \"%s\" not defined\n", rdhmmdef_token);
00172 rderr(NULL);
00173 }
00174 read_token(fp);
00175 return tmp;
00176 } else if (currentis("VARIANCE")){
00177
00178 tmp = var_read(fp);
00179 tmp->name = NULL;
00180 var_add(hmm, tmp);
00181 return tmp;
00182 } else {
00183 rderr("no variance data");
00184 return NULL;
00185 }
00186 }
00187
00195 void
00196 def_var_macro(char *name, FILE *fp, HTK_HMM_INFO *hmm)
00197 {
00198 HTK_HMM_Var *new;
00199
00200
00201
00202 new = var_read(fp);
00203
00204
00205 new->name = name;
00206 var_add(hmm, new);
00207 }