static Alignment *Optimal_find_path_reduced_space(Optimal *optimal, Region *region, gpointer user_data, SubOpt *subopt){ register Alignment *alignment; register SListSet *slist_set = SListSet_create(); register SList *vsa_list = SList_create(slist_set); register SListNode *node; register gint cell_size = optimal->find_checkpoint_continuation->cell_size; register C4_Score score, *dummy_first_cell = g_new0(C4_Score, cell_size), *dummy_final_cell = g_new0(C4_Score, cell_size); register C4_Model *model; register Viterbi_SubAlignment *vsa; g_assert(Viterbi_use_reduced_space(optimal->find_path, region)); model = optimal->find_checkpoint_continuation->model; score = Optimal_find_checkpoints_recur(optimal, region, user_data, subopt, vsa_list, model->start_state->state, dummy_first_cell, model->end_state->state, dummy_final_cell); alignment = Optimal_compute_subalignments(optimal, region, user_data, subopt, vsa_list, score, cell_size); SList_for_each(vsa_list, node){ vsa = node->data; Viterbi_SubAlignment_destroy(vsa); }
SList *SList_merge(SList *left, SList *right, SList_CompareFunc compare_func, gpointer user_data){ register SList *merged = SList_create(left->set); register SList swap; g_assert(left->set == right->set); while(!(SList_isempty(left) || SList_isempty(right))){ if(compare_func(left->head->next->data, right->head->next->data, user_data)){ SList_queue(merged, SList_pop(left)); } else { SList_queue(merged, SList_pop(right)); } } SList_join(merged, left); SList_join(merged, right); SList_destroy(left); /* Swap left and merged */ swap.head = left->head; swap.tail = left->tail; left->head = merged->head; left->tail = merged->tail; merged->head = swap.head; merged->tail = swap.tail; return merged; }
void setup(){ list = SList_create(); it = SList_iterator(list); };