testfor.c

来自「HMM的演示源程序」· C语言 代码 · 共 73 行

C
73
字号
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "hmm.h"
#include "nrutil.h"
#include "forward.c"
#include "nrutil.c"
#include "hmmutils.c"
#include "hmmrand.c"
#include "sequence.c"

int getpid()
{
	return 1;
}

int main (int argc, char **argv)
{
	int 	t, T;
	HMM  	hmm;
	int	*O;
	double **alpha;
	double *scale;
	double 	proba, logproba;
	FILE	*fp;

	if (argc != 3) {
		printf("Usage error \n");
		printf("Usage: testfor <model.hmm> <obs.seq> \n");
		exit (1);
	}

	fp = fopen(argv[1], "r");
	if (fp == NULL) {
		fprintf(stderr, "Error: File %s not found\n", argv[1]);
		exit (1);
	}
	ReadHMM(fp, &hmm);
	fclose(fp);

	fp = fopen(argv[2], "r");
	if (fp == NULL) {
		fprintf(stderr, "Error: File %s not found\n", argv[2]);
		exit (1);
	}
	ReadSequence(fp, &T, &O);
	fclose(fp);

	alpha = dmatrix(1, T, 1, hmm.N);
	scale = dvector(1, T);

	printf("------------------------------------\n");
	printf("Forward without scaling \n");
	Forward(&hmm, T, O, alpha, &proba);
	fprintf(stdout, "log prob(O| model) = %E\n",log(proba));

	printf("------------------------------------\n");
	printf("Forward with scaling \n");

	ForwardWithScale(&hmm, T, O, alpha, scale, &logproba);

	fprintf(stdout, "log prob(O| model) = %E\n", logproba);
	printf("------------------------------------\n");
	printf("The two log probabilites should identical \n");
	printf("(within numerical precision). When observation\n");
	printf("sequence is very large, use scaling. \n");

	free_ivector(O, 1, T);
	free_dmatrix(alpha, 1, T, 1, hmm.N);
	free_dvector(scale, 1, T);
	FreeHMM(&hmm);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?