/*============================================================================*/ static int pviterbi_propagate_free (plocal_propagate_store_t **v, int n, int max_offset_x, int max_offset_y, int len_y) { #define CUR_PROC "pviterbi_propagate_free" int j, i; mes_check_ptr(v, return(-1)); if( !*v ) return(0); for (j = 0; j < n; j++) { for (i=0; i<(*v)->mo->s[j].in_states; i++) m_free((*v)->log_in_a[j][i]); m_free((*v)->log_in_a[j]); } m_free((*v)->log_in_a); for (j=0; j<n; j++) m_free((*v)->log_b[j]); m_free((*v)->log_b); ighmm_cmatrix_3d_free(&((*v)->phi), max_offset_x + 1, len_y + max_offset_y + 1); m_free((*v)->phi_new); if ((*v)->end_of_first) { for (j=0; j<max_offset_x + 1; j++) { if ((*v)->end_of_first[j]) { for (i=0; i<len_y + max_offset_y + 1; i++) if ((*v)->end_of_first[j][i]) m_free((*v)->end_of_first[j][i]); m_free((*v)->end_of_first[j]); } } m_free((*v)->end_of_first); } m_free((*v)->topo_order); m_free(*v); return(0); #undef CUR_PROC }
/*============================================================================*/ static int pviterbi_free(plocal_store_t **v, int n, int len_x, int len_y, int max_offset_x, int max_offset_y) { #define CUR_PROC "pviterbi_free" int i, j; mes_check_ptr(v, return(-1)); if( !*v ) return(0); for (j = 0; j < n; j++) { for (i=0; i < (*v)->mo->s[j].in_states; i++) m_free((*v)->log_in_a[j][i]); m_free((*v)->log_in_a[j]); } m_free((*v)->log_in_a); for (j=0; j<n; j++) m_free((*v)->log_b[j]); m_free((*v)->log_b); ighmm_cmatrix_3d_free( &((*v)->phi), max_offset_x + 1, len_y + max_offset_y + 1); m_free((*v)->phi_new); ighmm_dmatrix_3d_free( &((*v)->psi), len_x + max_offset_x + 1, len_y + max_offset_y + 1); m_free((*v)->topo_order); (*v)->mo = NULL; m_free(*v); return(0); #undef CUR_PROC } /* viterbi_free */
//only uses first sequence int* ghmm_bayes_hmm_fbgibbs(ghmm_bayes_hmm *bayes, ghmm_cmodel *mo, ghmm_cseq* seq, int burnIn, int seed){ #define CUR_PROC "ghmm_cmodel_fbgibbs" //XXX seed GHMM_RNG_SET (RNG, seed); int max_seq = ghmm_cseq_max_len(seq); double **alpha = ighmm_cmatrix_alloc(max_seq,mo->N); double ***pmats = ighmm_cmatrix_3d_alloc(max_seq, mo->N, mo->N); int **Q; ARRAY_CALLOC(Q, seq->seq_number); int seq_iter; for(seq_iter = 0; seq_iter < seq->seq_number; seq_iter++){ ARRAY_CALLOC(Q[seq_iter], seq->seq_len[seq_iter]); } ghmm_sample_data data; ghmm_alloc_sample_data(bayes, &data); ghmm_clear_sample_data(&data, bayes);//XXX swap parameter for(; burnIn > 0; burnIn--){ for(seq_iter = 0; seq_iter < seq->seq_number; seq_iter++){ ghmm_cmodel_fbgibbstep(mo,seq->seq[seq_iter],seq->seq_len[seq_iter], Q[seq_iter], alpha, pmats, NULL); ghmm_get_sample_data(&data, bayes, Q[seq_iter], seq->seq[seq_iter], seq->seq_len[seq_iter]); ghmm_update_model(mo, bayes, &data); ghmm_clear_sample_data(&data, bayes); } } ighmm_cmatrix_free(&alpha, max_seq); ighmm_cmatrix_3d_free(&pmats, max_seq,mo->N); return Q; STOP: return NULL; //XXX error handle #undef CUR_PROC }
int* ghmm_bayes_hmm_fbgibbs_compressed(ghmm_bayes_hmm *bayes, ghmm_cmodel *mo, ghmm_cseq* seq, int burnIn, int seed, double width, double delta, int max_len_permitted){ #define CUR_PROC "ghmm_cmodel_fbgibbs" //XXX seed GHMM_RNG_SET (RNG, seed); block_stats *stats = compress_observations(seq, width*delta, delta); stats = merge_observations(seq, width, max_len_permitted, stats); print_stats(stats, seq->seq_len[0]); //get max_block_len int max_block_len = stats->length[0]; int i; for(i = 1; i < stats->total; i++){ if(max_block_len < stats->length[i]) max_block_len = stats->length[i]; } //printf("max b len %d\n", max_block_len); double ***b = ighmm_cmatrix_3d_alloc(stats->total, mo->N, 2); double **alpha = ighmm_cmatrix_alloc(seq->seq_len[0],mo->N); double ***pmats = ighmm_cmatrix_3d_alloc(seq->seq_len[0], mo->N, mo->N); int *Q; ARRAY_CALLOC(Q, seq->seq_len[0]);//XXX extra length for compressed ghmm_sample_data data; ghmm_alloc_sample_data(bayes, &data); ghmm_clear_sample_data(&data, bayes);//XXX swap parameter for(; burnIn > 0; burnIn--){ //XXX only using seq 0 precompute_block_emission(mo, stats, max_block_len, b);//XXX maxlen ghmm_cmodel_fbgibbstep(mo,seq->seq[0], stats->total, Q, alpha, pmats, b); ghmm_get_sample_data_compressed(&data, bayes, Q, seq->seq[0], stats->total, stats); ghmm_update_model(mo, bayes, &data); ghmm_clear_sample_data(&data, bayes); } ighmm_cmatrix_free(&alpha, seq->seq_len[0]); ighmm_cmatrix_3d_free(&pmats, seq->seq_len[0],mo->N); ighmm_cmatrix_3d_free(&b, stats->total, mo->N); free_block_stats(&stats); return Q; STOP: return NULL; //XXX error handle #undef CUR_PROC }