📄 main.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "hmm.h"
/* 颇老狼 沥焊甫 佬绰 窃荐 */
void read_data(int[], char*);
/* 角力利栏肺 厚磐厚 舅绊府硫阑 角青矫虐绰 窃荐 */
void viterbi();
Fair fair_die =
{.95l, .05l, {.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l, 1.0l/6.0l}};
Loaded loaded_die =
{.9l, .1l, {.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/10.0l, 1.0l/2.0l}};
/* 皋牢窃荐 矫累 */
int main(int argc, char *argv[])
{
read_data(result, which_dice);
viterbi();
system("PAUSE");
return 0;
}
void read_data(int result[], char* which_idce){
FILE* fp = NULL;
char ch;
unsigned int line_num = 0;
unsigned int result_count = 0;
unsigned int which_dice_count = 0;
/* 林绢柳 单捞磐 颇老阑 绊摹绰 巴 绝捞 佬绢甸捞扁 困秦辑 */
fp = fopen("1802_TEST.txt", "r");
while((ch = getc(fp)) != EOF){
if(ch == '\n'){
line_num++;
continue;
}
if(line_num == 0 || line_num == 6) continue;
if(line_num >= 1 && line_num <= 5){/* 林荤困 传狼 荐甫 佬绢甸牢促. */
result[result_count++] = atoi(&ch);
}
if(line_num >= 7 && line_num <= 11){/* 林绢柳 搬苞 单捞磐甫 佬绢甸牢促. */
*(which_dice+(which_dice_count++)) = ch;
}
}
fclose(fp);
}
void viterbi(){
long double delta_prev[2]; /* (load , fair)街 */
long double delta_now[2];
long double max_value;
int t; /* 矫埃阑 唱鸥晨 */
int back_track_t, count;
long double best_score;
int index_of_end_back = -1;
char induct_result[NUM_OF_RESULT+1];
induct_result[NUM_OF_RESULT] = '\0';
/* initialization 矫累 */
delta_now[0] = pi_load * loaded_die.face[result[0]];
delta_now[1] = pi_fair * fair_die.face[result[0]];
back_track[0][0] = 'S'; /* 飘发欧且锭 付瘤阜阑 唱鸥晨 */
back_track[0][1] = 'S';
/* initialization 场 */
/* Induction 矫累 */
for(t=1;t < NUM_OF_RESULT;t++){
delta_prev[0] = delta_now[0];
delta_prev[1] = delta_now[1];
/* Load state俊 措茄 拌魂 */
max_value = delta_prev[0] * loaded_die.transition_to_self;
back_track[t][0] = 'L';
if( max_value < (delta_prev[1] * fair_die.transition_to_loaded)){
max_value = delta_prev[1] * fair_die.transition_to_loaded;
back_track[t][0] = 'F';
}
delta_now[0] = max_value * loaded_die.face[result[t]];
/* Fair State俊 措茄 拌魂 */
max_value = delta_prev[0] * loaded_die.transition_to_fair;
back_track[t][1] = 'L';
if( max_value < (delta_prev[1] * fair_die.transition_to_self)){
max_value = delta_prev[1] * fair_die.transition_to_self;
back_track[t][1] = 'F';
}
delta_now[1] = max_value * fair_die.face[result[t]];
}
/* Induction 场 */
/* Termination 矫累 */
if(delta_now[0] < delta_now[1]){
best_score = delta_now[1];
index_of_end_back = 1;
induct_result[299] = 'F';
}else if(delta_now[0] > delta_now[1]){
best_score = delta_now[0];
index_of_end_back = 0;
induct_result[299] = 'L';
}
/* Termination 场 */
/* Back Tracking 矫累 */
for(back_track_t = NUM_OF_RESULT-2 ; back_track_t >= 0 ; back_track_t--){
induct_result[back_track_t] = back_track[back_track_t+1][index_of_end_back];
if(induct_result[back_track_t] == 'L'){
index_of_end_back = 0;
}else if(induct_result[back_track_t] == 'F'){
index_of_end_back = 1;
}
}
/* Back Tracking 场 */
/* 搬苞 免仿 */
printf("Given Result!\n%s\n\n", which_dice);
printf("Viterbi Result!\n%s\n\n", induct_result);
count = 0;
for(t = 0; t < NUM_OF_RESULT;t++){
if(induct_result[t] != which_dice[t]){
count++;
}
}
printf("Error rate %f %%\n", (((float)count/(float)NUM_OF_RESULT)*100));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -