-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathhmm.h
73 lines (62 loc) · 2.48 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
/*
** Author: Tapas Kanungo, kanungo@cfar.umd.edu
** Date: 15 December 1997
** File: hmm.h
** Purpose: datastructures used for HMM.
** Organization: University of Maryland
**
** Update:
** Author: Tapas Kanungo
** Purpose: include <math.h>. Not including this was
** creating a problem with forward.c
** $Id: hmm.h,v 1.9 1999/05/02 18:38:11 kanungo Exp kanungo $
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
typedef struct {
int N; /* number of states; Q={1,2,...,N} */
int M; /* number of observation symbols; V={1,2,...,M}*/
double **A; /* A[1..N][1..N]. a[i][j] is the transition prob
of going from state i at time t to state j
at time t+1 */
double **B; /* B[1..N][1..M]. b[j][k] is the probability of
of observing symbol k in state j */
double *pi; /* pi[1..N] pi[i] is the initial state distribution. */
} HMM;
void ReadHMM(FILE *fp, HMM *phmm);
void PrintHMM(FILE *fp, HMM *phmm);
void InitHMM(HMM *phmm, int N, int M, int seed);
void CopyHMM(HMM *phmm1, HMM *phmm2);
void FreeHMM(HMM *phmm);
void ReadSequence(FILE *fp, int *pT, int **pO);
void PrintSequence(FILE *fp, int T, int *O);
void GenSequenceArray(HMM *phmm, int seed, int T, int *O, int *q);
int GenInitalState(HMM *phmm);
int GenNextState(HMM *phmm, int q_t);
int GenSymbol(HMM *phmm, int q_t);
void Forward(HMM *phmm, int T, int *O, double **alpha, double *pprob);
void ForwardWithScale(HMM *phmm, int T, int *O, double **alpha,
double *scale, double *pprob);
void Backward(HMM *phmm, int T, int *O, double **beta, double *pprob);
void BackwardWithScale(HMM *phmm, int T, int *O, double **beta,
double *scale, double *pprob);
void BaumWelch(HMM *phmm, int T, int *O, double **alpha, double **beta,
double **gamma, int *niter,
double *plogprobinit, double *plogprobfinal);
double *** AllocXi(int T, int N);
void FreeXi(double *** xi, int T, int N);
void ComputeGamma(HMM *phmm, int T, double **alpha, double **beta,
double **gamma);
void ComputeXi(HMM* phmm, int T, int *O, double **alpha, double **beta,
double ***xi);
void Viterbi(HMM *phmm, int T, int *O, double **delta, int **psi,
int *q, double *pprob);
void ViterbiLog(HMM *phmm, int T, int *O, double **delta, int **psi,
int *q, double *pprob);
/* random number generator related functions*/
int hmmgetseed(void);
void hmmsetseed(int seed);
double hmmgetrand(void);
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))