-
Notifications
You must be signed in to change notification settings - Fork 0
/
hmm.h
134 lines (109 loc) · 3.46 KB
/
hmm.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#ifndef HMM_HEADER_
#define HMM_HEADER_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#ifndef MAX_STATE
# define MAX_STATE 10
#endif
#ifndef MAX_OBSERV
# define MAX_OBSERV 26
#endif
#ifndef MAX_SEQ
# define MAX_SEQ 200
#endif
#ifndef MAX_LINE
# define MAX_LINE 256
#endif
typedef struct{
char *model_name;
int state_num; //number of state
int observ_num; //number of observation
double initial[MAX_STATE]; //initial prob.
double transition[MAX_STATE][MAX_STATE]; //transition prob.
double observation[MAX_OBSERV][MAX_STATE]; //observation prob.
} HMM;
static FILE *open_or_die( const char *filename, const char *ht )
{
FILE *fp = fopen( filename, ht );
if( fp == NULL ){
perror( filename);
exit(1);
}
return fp;
}
static void loadHMM( HMM *hmm, const char *filename )
{
int i, j;
FILE *fp = open_or_die( filename, "r");
hmm->model_name = (char *)malloc( sizeof(char) * (strlen( filename)+1));
strcpy( hmm->model_name, filename );
char token[MAX_LINE] = "";
while( fscanf( fp, "%s", token ) > 0 )
{
if( token[0] == '\0' || token[0] == '\n' ) continue;
if( strcmp( token, "initial:" ) == 0 ){
fscanf(fp, "%d", &hmm->state_num );
for( i = 0 ; i < hmm->state_num ; i++ )
fscanf(fp, "%lf", &( hmm->initial[i] ) );
}
else if( strcmp( token, "transition:" ) == 0 ){
fscanf(fp, "%d", &hmm->state_num );
for( i = 0 ; i < hmm->state_num ; i++ )
for( j = 0 ; j < hmm->state_num ; j++ )
fscanf(fp, "%lf", &( hmm->transition[i][j] ));
}
else if( strcmp( token, "observation:" ) == 0 ){
fscanf(fp, "%d", &hmm->observ_num );
for( i = 0 ; i < hmm->observ_num ; i++ )
for( j = 0 ; j < hmm->state_num ; j++ )
fscanf(fp, "%lf", &( hmm->observation[i][j]) );
}
}
}
static void dumpHMM( FILE *fp, HMM *hmm )
{
int i, j;
//fprintf( fp, "model name: %s\n", hmm->model_name );
fprintf( fp, "initial: %d\n", hmm->state_num );
for( i = 0 ; i < hmm->state_num - 1; i++ )
fprintf( fp, "%.5lf ", hmm->initial[i]);
fprintf(fp, "%.5lf\n", hmm->initial[ hmm->state_num - 1 ] );
fprintf( fp, "\ntransition: %d\n", hmm->state_num );
for( i = 0 ; i < hmm->state_num ; i++ ){
for( j = 0 ; j < hmm->state_num - 1 ; j++ )
fprintf( fp, "%.5lf ", hmm->transition[i][j] );
fprintf(fp,"%.5lf\n", hmm->transition[i][hmm->state_num - 1]);
}
fprintf( fp, "\nobservation: %d\n", hmm->observ_num );
for( i = 0 ; i < hmm->observ_num ; i++ ){
for( j = 0 ; j < hmm->state_num - 1 ; j++ )
fprintf( fp, "%.5lf ", hmm->observation[i][j] );
fprintf(fp,"%.5lf\n", hmm->observation[i][hmm->state_num - 1]);
}
}
static int load_models( const char *listname, HMM *hmm, const int max_num )
{
FILE *fp = open_or_die( listname, "r" );
int count = 0;
char filename[MAX_LINE] = "";
while( fscanf(fp, "%s", filename) == 1 ){
loadHMM( &hmm[count], filename );
count ++;
if( count >= max_num ){
return count;
}
}
fclose(fp);
return count;
}
static void dump_models( HMM *hmm, const int num )
{
int i = 0;
for( ; i < num ; i++ ){
// FILE *fp = open_or_die( hmm[i].model_name, "w" );
dumpHMM( stderr, &hmm[i] );
}
}
#endif