%{ #include "dyna2.h" #include "dynafunc.h" #include "dpimpl.h" #define ExprSetLISTLENGTH 50 %} struct ExprSet ExprTree ** expr !list %{ #include "dynadebug.h" void write_debug_funcs(DYNFILE * dfp,GenericMatrix * gm) { explicit_debug_func(dfp,gm); transition_debug_func(dfp,gm); make_debug_struct_func(dfp,gm); state_debug_func(dfp,gm); } ExprSet * build_ExprSet(ExprTree * root) { ExprSet * out; assert(root); assert(root->type == ETR_STATEMENT); assert(root->child[0]); out = ExprSet_alloc_std(); /* deal with simple cases: number,tag, method */ if( root->child[0]->type != ETR_EXPRESSION ) { /* only one child */ add_ExprSet(out,hard_link_ExprTree(root->child[0])); } else { if( descend_ExprTree_for_ExprSet(out,root->child[0]) == FALSE ) { free_ExprSet(out); return NULL; } } return out; } boolean descend_ExprTree_for_ExprSet(ExprSet * set,ExprTree * t) { boolean ret = TRUE; assert(set); assert(t); if( t->type != ETR_EXPRESSION ) { warn("In descending ExprTree for making an ExprSet, failed!"); return FALSE; } if( t->child[0]->type == ETR_EXPRESSION ) { if( descend_ExprTree_for_ExprSet(set,t->child[0]) == FALSE ) { ret = FALSE; } } else { add_ExprSet(set,hard_link_ExprTree(t->child[0])); } if( t->child[2]->type == ETR_EXPRESSION ) { if( descend_ExprTree_for_ExprSet(set,t->child[2]) == FALSE ) { ret = FALSE; } } else { add_ExprSet(set,hard_link_ExprTree(t->child[2])); } return ret; } void make_debug_struct_func(DYNFILE * dfp,GenericMatrix * gm) { FuncInfo * fi; int k,l,m; fi = FuncInfo_named_from_varstr(FI_CALLABLE,"create_debug_%s",gm->name); start_function_FuncInfo(fi,dfp,"DebugMatrix * create_debug_%s(void)",gm->name); expr(dfp,"DebugMatrix * out;"); expr(dfp,"DebugState * st;"); expr(dfp,"DebugTransition * tr;"); add_break(dfp); expr(dfp,"out = std_DebugMatrix();"); expr(dfp,"out->show_cell = cell_debug_%s;",gm->name); add_break(dfp); for(k=0;klen;k++) { expr(dfp,"st = DebugState_alloc_std();"); expr(dfp,"st->statename = \"%s\";",gm->state[k]->name); expr(dfp,"st->state_num = %d",k); expr(dfp,"st->show_state = state_debug_%s_%s;",gm->name,gm->state[k]->name); expr(dfp,"add_DebugMatrix(out,st);"); for(l=0;lstate[k]->len;l++) { expr(dfp,"tr = DebugTransition_alloc();"); expr(dfp,"tr->fromstate = \"%s\";",gm->state[k]->source[l]->state_source); expr(dfp,"tr->show_transition = transition_debug_%s_%s_%s_%d_%d;",gm->name,gm->state[k]->name,gm->state[k]->source[l]->state_source,gm->state[k]->source[l]->offi,gm->state[k]->source[l]->offj); expr(dfp,"add_DebugState(st,tr);"); } } expr(dfp,"return out;"); close_function(dfp); add_break(dfp); } void state_debug_func(DYNFILE * dfp,GenericMatrix * gm) { FuncInfo * fi; int k,l; fi = FuncInfo_named_from_varstr(FI_INTERNAL,"cell_debug_%s",gm->name); start_function_FuncInfo(fi,dfp,"void cell_debug_%s(void * matrixpoi,int i,int j,FILE * ofp)",gm->name); expr(dfp,"%s * mat",gm->name); add_break(dfp); expr(dfp,"mat = (%s *) matrixpoi;",gm->name); add_break(dfp); for(k=0;klen;k++) { expr(dfp,"fprintf(ofp,\"State %9s %%d\\n\",%s_EXPL_MATRIX(mat,i,j,%s));",gm->state[k]->name,gm->name,gm->state[k]->name); } close_function(dfp); add_break(dfp); for(k=0;klen;k++) { fi = FuncInfo_named_from_varstr(FI_INTERNAL,"state_debug_%s_%s",gm->name,gm->state[k]->name); start_function_FuncInfo(fi,dfp,"void state_debug_%s_%s(void * matrixpoi,int i,int j,FILE * ofp)",gm->name,gm->state[k]->name); expr(dfp,"%s * mat",gm->name); add_break(dfp); expr(dfp,"mat = (%s *) matrixpoi;",gm->name); add_break(dfp); expr(dfp,"fprintf(ofp,\"State %s Score %%d\\n\",%s_EXPL_MATRIX(mat,i,j,%s));",gm->state[k]->name,gm->name,gm->state[k]->name); for(l=0;lstate[k]->len;l++) { auto CellSource * source; source = gm->state[k]->source[l]; expr(dfp,"fprintf(ofp,\" From %8s Matrix %%5d Score %%d\\n\",%s_EXPL_%s(mat,i-%d,j-%d,%s),%s);",source->state_source,gm->name,source->isspecial == TRUE ? "SPECIAL" : "MATRIX",source->offi,source->offj,source->state_source,source->calc_expr); } close_function(dfp); add_break; } } void transition_debug_func(DYNFILE * dfp,GenericMatrix * gm) { int k,l,m; FuncInfo * fi; ExprSet * set; char buffer[512]; assert(dfp); assert(gm); for(k=0;klen;k++) { for(l=0;lstate[k]->len;l++) { auto CellSource * source; source = gm->state[k]->source[l]; fi = FuncInfo_named_from_varstr(FI_INTERNAL,"transition_debug_%s_%s_%s_%d_%d",gm->name,gm->state[k]->name,source->state_source,source->offi,source->offj); start_function_FuncInfo(fi,dfp,"void transition_debug_%s_%s_%s_%d_%d(void * matrixpoi,int i,int j,FILE * ofp)",gm->name,gm->state[k]->name,source->state_source,source->offi,source->offj); expr(dfp,"%s * mat;",gm->name); add_break(dfp); expr(dfp,"mat = (%s *) matrixpoi;",gm->name); add_break(dfp); set = build_ExprSet(source->etr); for(m=0;mlen;m++) { buffer[0] = '\0'; strcat_ExprTree_Scoped(set->expr[m],buffer,gm->sc,gm->mts,NULL,NULL,NULL); expr(dfp,"fprintf(ofp,\"%s : %%d\\n\",%s);",buffer,buffer); } free_ExprSet(set); close_function(dfp); add_break(dfp); } } } void explicit_debug_func(DYNFILE * dfp,GenericMatrix * gm) { FuncInfo * fi; ArgInfo * ai; char * arg_str; char * chainstr; int k,l; /*** prepare function information ***/ fi = FuncInfo_named_from_varstr(FI_CALLABLE,"explicit_debug_%s",gm->name); add_line_to_Ftext(fi->ft,"This function provides debugging support",gm->name); add_line_to_Ftext(fi->ft,"for the dynamic programming models"); add_break_to_Ftext(fi->ft); ai = ArgInfo_in_FuncInfo_from_varstr(fi,"mat"); ai->desc=stringallocf("%s which contains explicit basematrix memory",gm->name); start_function_FuncInfo(fi,dfp,"boolean explicit_debug_%s(DebugMatrix * de,boolean do_one_cell)",gm->name); expr(dfp,"int i;"); expr(dfp,"int j;"); expr(dfp,"int leni;"); expr(dfp,"int lenj;"); expr(dfp,"int num;"); expr(dfp,"%s * mat;",gm->name); add_break(dfp); expr(dfp,"mat = (%s *) de->matrix;",gm->name); expr(dfp,"if( mat->basematrix->type != BASEMATRIX_TYPE_EXPLICIT )"); startbrace(dfp); warn_expr(dfp,"in explicit_debug_%s, passed a non Explicit matrix type, cannot calculate!",gm->name); expr(dfp,"return FALSE;"); closebrace(dfp); add_break(dfp); expr(dfp,"leni = mat->leni;"); expr(dfp,"lenj = mat->lenj;"); /*** see if there any specials to specials to do ***/ add_break(dfp); add_block_comment(dfp,"Enter debug matrix before matrix, reset"); expr(dfp,"user_DebugMatrix(de);"); add_break(dfp); expr(dfp,"if( de->reset == FALSE)"); startbrace(dfp); expr(dfp,"de->currenti = de->currentj = 0;"); closebrace(dfp); expr(dfp,"for(j=de->currentj;jcurrenti;ireset == TRUE )"); startbrace(dfp); expr(dfp,"i = de->currenti;"); expr(dfp,"j = de->currentj;"); expr(dfp,"continue;"); closebrace(dfp); closebrace(dfp); write_score_block(dfp,gm,"EXPL_MATRIX","mat","EXPL_SPECIAL",TRUE); add_break(dfp); add_block_comment(dfp,"Now update DebugMatrix datastructure."); add_break(dfp); for(k=0;klen;k++) { expr(dfp,"if( %s_EXPL_MATRIX(mat,i,j,%s) > de->max_score )",gm->name,gm->state[k]->name); startbrace(dfp); expr(dfp,"de->max_score = %s_EXPL_MATRIX(mat,i,j,%s);",gm->name,gm->state[k]->name); expr(dfp,"de->max_score_i = i;"); expr(dfp,"de->max_score_j = j;"); expr(dfp,"de->max_score_cell = %s;",gm->state[k]->name); closebrace(dfp); add_break(dfp); } expr(dfp,"de->currenti = i;"); expr(dfp,"de->currentj = j;"); add_break(dfp); closebrace(dfp); write_special_block(dfp,gm,"EXPL_MATRIX","EXPL_SPECIAL",NULL); add_block_comment(dfp,"Update currenti"); expr(dfp,"de->currenti = 0;"); add_break(dfp); closebrace(dfp); expr(dfp,"return TRUE"); close_function(dfp); add_break(dfp); } %}