?? main.c
字號(hào):
#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'; /* 飄發(fā)歐且錠 付瘤阜闌 唱鷗晨 */
back_track[0][1] = 'S';
/* initialization 場(chǎng) */
/* 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 場(chǎng) */
/* 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 場(chǎng) */
/* 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 場(chǎng) */
/* 搬苞 免仿 */
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));
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -