Home | History | Annotate | Download | only in crec
      1 /*---------------------------------------------------------------------------*
      2  *  srec_debug.c  *
      3  *                                                                           *
      4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
      5  *                                                                           *
      6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
      7  *  you may not use this file except in compliance with the License.         *
      8  *                                                                           *
      9  *  You may obtain a copy of the License at                                  *
     10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
     11  *                                                                           *
     12  *  Unless required by applicable law or agreed to in writing, software      *
     13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
     15  *  See the License for the specific language governing permissions and      *
     16  *  limitations under the License.                                           *
     17  *                                                                           *
     18  *---------------------------------------------------------------------------*/
     19 
     20 #include "srec_debug.h"
     21 #include "passert.h"
     22 #include "portable.h"
     23 #include "srec_tokens.h"
     24 
     25 
     26 static char* sprint_altwords(srec* rec, altword_token* awtoken, char* buf)
     27 {
     28   char *bufp = &buf[0];
     29 
     30   if (awtoken == AWTNULL) buf[0] = 0;
     31   else
     32   {
     33     for (; awtoken; awtoken = awtoken->next_token)
     34     {
     35       bufp += sprintf(bufp, "%d,", awtoken->word);
     36       ASSERT(awtoken->costdelta != MAXcostdata);
     37     }
     38     if (bufp > &buf[0]) *(bufp - 1) = 0;
     39   }
     40   return &buf[0];
     41 }
     42 
     43 void print_fsmnode_token(srec* rec, ftokenID token_index, char* msg)
     44 {
     45   fsmnode_token *ftoken;
     46   char word_backtrace_trans[512];
     47   char *p;
     48   char buf[64];
     49   if (token_index == MAXftokenID)
     50   {
     51     printf("%sftoken %d\n", msg, token_index);
     52     return;
     53   }
     54   ftoken = &rec->fsmnode_token_array[token_index];
     55   printf("%sftoken %d rec %d@%d fsmnode %d cost %d word %d(%s) word_backtrace %d next_token_index %d ", msg, token_index, rec->id, rec->current_search_frame, ftoken->FSMnode_index, ftoken->cost, ftoken->word,
     56          sprint_altwords(rec, ftoken->aword_backtrace, buf),
     57          ftoken->word_backtrace, ftoken->next_token_index);
     58 
     59   p = "null";
     60   if (ftoken->word < rec->context->olabels->num_words)
     61     p = rec->context->olabels->words[ftoken->word];
     62   sprint_bword_token_backtrace(word_backtrace_trans, sizeof(word_backtrace_trans), rec, ftoken->word_backtrace);
     63   printf(" [%s] %s\n", p, word_backtrace_trans);
     64 }
     65 
     66 void print_fsmnode_token_list(srec* rec, stokenID token_index, char* msg)
     67 {
     68   printf("%s", msg);
     69 
     70   while (token_index != MAXftokenID)
     71   {
     72     fsmnode_token* ftoken = &rec->fsmnode_token_array[token_index];
     73     print_fsmnode_token(rec, token_index, "");
     74     token_index = ftoken->next_token_index;
     75   }
     76 }
     77 
     78 void print_search_status(srec* rec)
     79 {
     80   int count, count2;
     81   printf("SEARCH STATUS .. frame %d\n", rec->current_search_frame);
     82   printf("prune_delta %d active_fsmarc_tokens %d\n",
     83          rec->prune_delta, rec->active_fsmarc_tokens);
     84   printf("num_new_states %d/%d fsmarc_token_array_size %d freelist %d\n", rec->num_new_states, rec->max_new_states, rec->fsmarc_token_array_size, rec->fsmarc_token_freelist);
     85   printf("active_fsmnode_tokens %d num_models %d fsmnode_token_array_size %d freelist %d\n", rec->active_fsmnode_tokens, rec->num_model_slots_allocated, rec->fsmnode_token_array_size, rec->fsmnode_token_freelist);
     86   count = count_fsmnode_token_list(rec, rec->active_fsmnode_tokens);
     87   count2 = count_fsmarc_token_list(rec, rec->active_fsmarc_tokens);
     88   printf("number active: %d fsmnodes %d fsmarcs\n", count, count2);
     89 }
     90 
     91 void print_fsmarc_token(srec* rec, stokenID token_index, char* msg)
     92 {
     93   int i;
     94   srec_context *context = rec->context;
     95 
     96   fsmarc_token* stoken = &rec->fsmarc_token_array[token_index];
     97   FSMarc* arc = &context->FSMarc_list[stoken->FSMarc_index];
     98   costdata* costs = &stoken->cost[0];
     99   wordID* wordids = &stoken->word[0];
    100 	frameID* duration = &stoken->duration[0];
    101   wtokenID* word_backtrace = &stoken->word_backtrace[0];
    102   bigcostdata cost_offset = rec->accumulated_cost_offset[rec->current_search_frame-1];
    103   char word_backtrace_trans[256];
    104 
    105   printf("%sstoken %4d at arc %4d ilabel %4d nextnode %4d states", msg, token_index,
    106          stoken->FSMarc_index, arc->ilabel, arc->to_node);
    107   for (i = 0; i < stoken->num_hmm_states; i++)
    108   {
    109     char buf[64];
    110     char *p = "null";
    111     if (wordids[i] < context->olabels->num_words) p = context->olabels->words[wordids[i]];
    112     sprint_bword_token_backtrace(word_backtrace_trans, 256, rec, word_backtrace[i]);
    113     printf(" w%d(%s)/%s/c%d/C%d/B%d/%d(%s)", wordids[i],
    114            sprint_altwords(rec, stoken->aword_backtrace[i], buf),
    115            p, costs[i], costs[i] + cost_offset, word_backtrace[i], duration[i], word_backtrace_trans);
    116   }
    117   printf("\n");
    118 }
    119 
    120 void print_fsmarc_token_list(srec* rec, stokenID token_index, char* msg)
    121 {
    122   printf("%s", msg);
    123   while (token_index != MAXstokenID)
    124   {
    125     fsmarc_token* stoken = &rec->fsmarc_token_array[token_index];
    126     print_fsmarc_token(rec, token_index, "");
    127     token_index = stoken->next_token_index;
    128   }
    129 }
    130