-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsequence.c
124 lines (104 loc) · 2.79 KB
/
sequence.c
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
/*
** Author: Tapas Kanungo, kanungo@cfar.umd.edu
** Date: 22 February 1998
** File: sequence.c
** Purpose: Routines for generating, reading and writing sequence of
** observation symbols.
** Organization: University of Maryland
**
** Update:
** Author: Tapas Kanungo
** Purpose: To make calls to generic random number generators
** and to change the seed everytime the software is executed.
**
** $Id: sequence.c,v 1.2 1998/02/23 06:19:41 kanungo Exp kanungo $
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "nrutil.h"
#include "hmm.h"
static char rcsid[] = "$Id: sequence.c,v 1.2 1998/02/23 06:19:41 kanungo Exp kanungo $";
void GenSequenceArray(HMM *phmm, int seed, int T, int *O, int *q)
{
int t = 1;
int q_t, o_t;
hmmsetseed(seed);
q[1] = GenInitalState(phmm);
O[1] = GenSymbol(phmm, q[1]);
for (t = 2; t <= T; t++) {
q[t] = GenNextState(phmm, q[t-1]);
O[t] = GenSymbol(phmm, q[t]);
}
}
int GenInitalState(HMM *phmm)
{
double val, accum;
int i, q_t;
val = hmmgetrand();
accum = 0.0;
q_t = phmm->N;
for (i = 1; i <= phmm->N; i++) {
if (val < phmm->pi[i] + accum) {
q_t = i;
break;
}
else {
accum += phmm->pi[i];
}
}
return q_t;
}
int GenNextState(HMM *phmm, int q_t)
{
double val, accum;
int j, q_next;
val = hmmgetrand();
accum = 0.0;
q_next = phmm->N;
for (j = 1; j <= phmm->N; j++) {
if ( val < phmm->A[q_t][j] + accum ) {
q_next = j;
break;
}
else
accum += phmm->A[q_t][j];
}
return q_next;
}
int GenSymbol(HMM *phmm, int q_t)
{
double val, accum;
int j, o_t;
val = hmmgetrand();
accum = 0.0;
o_t = phmm->M;
for (j = 1; j <= phmm->M; j++) {
if ( val < phmm->B[q_t][j] + accum ) {
o_t = j;
break;
}
else
accum += phmm->B[q_t][j];
}
return o_t;
}
void ReadSequence(FILE *fp, int *pT, int **pO)
{
int *O;
int i;
fscanf(fp, "T= %d\n", pT);
O = ivector(1,*pT);
for (i=1; i <= *pT; i++)
fscanf(fp,"%d", &O[i]);
*pO = O;
}
void PrintSequence(FILE *fp, int T, int *O)
{
int i;
fprintf(fp, "T= %d\n", T);
for (i=1; i <= T; i++)
fprintf(fp,"%d ", O[i]);
printf("\n");
}