int main(int argc, char **argv) { ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 1, argc, argv, banner, usage); ESL_ALPHABET *abc = esl_alphabet_Create(eslAMINO); ESL_SQ *sq = esl_sq_CreateDigital(abc); ESL_SQFILE *sqfp = NULL; ESL_HMM *hmm = create_test_hmm(abc); ESL_HMM *bg = create_null_hmm(abc); ESL_HMX *hmx = esl_hmx_Create(400, hmm->M); int format = eslSQFILE_UNKNOWN; char *seqfile = esl_opt_GetArg(go, 1); float fwdsc, nullsc; int status; status = esl_sqfile_OpenDigital(abc, seqfile, format, NULL, &sqfp); if (status == eslENOTFOUND) esl_fatal("No such file."); else if (status == eslEFORMAT) esl_fatal("Format unrecognized."); else if (status != eslOK) esl_fatal("Open failed, code %d.", status); while ((status = esl_sqio_Read(sqfp, sq)) == eslOK) { esl_hmx_GrowTo(hmx, sq->n, hmm->M); esl_hmm_Forward(sq->dsq, sq->n, hmm, hmx, &fwdsc); esl_hmm_Forward(sq->dsq, sq->n, bg, hmx, &nullsc); printf("%-16s %5d %11.4f %8.4f %11.4f %8.4f %11.4f %8.4f\n", sq->name, (int) sq->n, fwdsc * eslCONST_LOG2R, (fwdsc * eslCONST_LOG2R) / sq->n, nullsc * eslCONST_LOG2R, (nullsc * eslCONST_LOG2R) / sq->n, (fwdsc - nullsc) * eslCONST_LOG2R, (fwdsc-nullsc) * eslCONST_LOG2R / sq->n); esl_sq_Reuse(sq); } if (status == eslEFORMAT) esl_fatal("Parse failed (sequence file %s)\n%s\n", sqfp->filename, sqfp->get_error(sqfp)); else if (status != eslEOF) esl_fatal("Unexpected error %d reading sequence file %s", status, sqfp->filename); esl_sqfile_Close(sqfp); esl_sq_Destroy(sq); esl_hmm_Destroy(hmm); esl_hmm_Destroy(bg); esl_hmx_Destroy(hmx); esl_alphabet_Destroy(abc); esl_getopts_Destroy(go); return 0; }
/* Function: p7_bg_Destroy() * Incept: SRE, Fri Jan 12 14:04:30 2007 [Janelia] * * Purpose: Frees a <P7_BG> object. * * Returns: (void) * * Xref: STL11/125. */ void p7_bg_Destroy(P7_BG *bg) { if (bg != NULL) { if (bg->f != NULL) free(bg->f); if (bg->fhmm != NULL) esl_hmm_Destroy(bg->fhmm); free(bg); } return; }
/* Function: esl_hmm_Create() * Synopsis: Allocates a new HMM. * * Purpose: Allocates a new HMM of <M> states for * generating or modeling strings in the * alphabet <abc>. * * Returns: a pointer to the new HMM. * * Throws: <NULL> on allocation failure. */ ESL_HMM * esl_hmm_Create(const ESL_ALPHABET *abc, int M) { ESL_HMM *hmm = NULL; int k,x; int status; ESL_ALLOC(hmm, sizeof(ESL_HMM)); hmm->t = NULL; hmm->e = NULL; hmm->eo = NULL; hmm->pi = NULL; ESL_ALLOC(hmm->t, sizeof(float *) * M); hmm->t[0] = NULL; ESL_ALLOC(hmm->e, sizeof(float *) * M); hmm->e[0] = NULL; ESL_ALLOC(hmm->eo, sizeof(float *) * abc->Kp); hmm->eo[0] = NULL; ESL_ALLOC(hmm->pi, sizeof(float) * (M+1)); // initial transition to state M means a L=0 sequence ESL_ALLOC(hmm->t[0], sizeof(float) * M * (M+1)); // state M is the implicit end state ESL_ALLOC(hmm->e[0], sizeof(float) * M * abc->K); ESL_ALLOC(hmm->eo[0], sizeof(float) * abc->Kp * M); for (k = 1; k < M; k++) { hmm->t[k] = hmm->t[0] + k*(M+1); hmm->e[k] = hmm->e[0] + k*abc->K; } for (x = 1; x < abc->Kp; x++) hmm->eo[x] = hmm->eo[0] + x*M; hmm->M = M; hmm->K = abc->K; hmm->abc = abc; return hmm; ERROR: esl_hmm_Destroy(hmm); return NULL; }
int main(int argc, char **argv) { ESL_GETOPTS *go = esl_getopts_CreateDefaultApp(options, 0, argc, argv, banner, usage); ESL_RANDOMNESS *r = esl_randomness_Create(esl_opt_GetInteger(go, "-s")); ESL_ALPHABET *abc = NULL; ESL_HMM *hmm = NULL; ESL_DSQ *dsq = NULL; int *path = NULL; ESL_HMX *fwd = NULL; ESL_HMX *bck = NULL; ESL_HMX *pp = NULL; int be_verbose = esl_opt_GetBoolean(go, "-v"); float fsc, bsc; int L; int i; float fsum, bsum; make_occasionally_dishonest_casino(&hmm, &abc); esl_hmm_Emit(r, hmm, &dsq, &path, &L); fwd = esl_hmx_Create(L, hmm->M); bck = esl_hmx_Create(L, hmm->M); pp = esl_hmx_Create(L, hmm->M); esl_hmm_Forward (dsq, L, hmm, fwd, &fsc); esl_hmm_Backward(dsq, L, hmm, bck, &bsc); esl_hmm_PosteriorDecoding(dsq, L, hmm, fwd, bck, pp); fsum = 0.0; bsum = bsc; fsum += fwd->sc[0]; if (be_verbose) printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[0], bck->sc[0]); bsum -= bck->sc[0]; for (i = 1; i <= L; i++) { fsum += fwd->sc[i]; if (be_verbose) printf("%4d %c %s %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n", i, abc->sym[dsq[i]], path[i] == 0 ? "F " : " L", fwd->sc[i], bck->sc[i], fsum, bsum, fsum+bsum, pp->dp[i][0], pp->dp[i][1]); bsum -= fwd->sc[i]; } if (be_verbose) { printf("%4d %c %s %8.3f %8.3f\n", 0, '-', "--", fwd->sc[L+1], bck->sc[L+1]); printf("Forward score = %f\n", fsc); printf("Backward score = %f\n", bsc); } free(path); free(dsq); esl_hmx_Destroy(pp); esl_hmx_Destroy(bck); esl_hmx_Destroy(fwd); esl_alphabet_Destroy(abc); esl_hmm_Destroy(hmm); esl_randomness_Destroy(r); esl_getopts_Destroy(go); return 0; }