1 /*---------------------------------------------------------------------------* 2 * srec_stats.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_stats.h" 21 #include "passert.h" 22 #include "portable.h" 23 24 25 #ifdef SREC_STATS_ACTIVE 26 27 typedef struct 28 { 29 int num_fsmarc_tokens; 30 int num_fsmnode_tokens; 31 int num_word_tokens; 32 int num_altword_tokens, num_altword_token_batches; 33 34 int num_astar_active_parps; 35 int num_astar_complete_parps; 36 int num_astar_parps_in_use; 37 38 int num_fsmarc_token_reprunes; 39 int num_fsmnode_token_reprunes; 40 int num_word_token_reprunes; 41 int num_altword_token_reprunes; 42 int num_bad_backtraces; 43 int num_forced_updates; 44 45 } 46 srec_stats; 47 48 srec_stats my_srec_stats; 49 50 #define MAX_IN_SAMPLE(MaX,SamPle) \ 51 if((MaX)<(SamPle)) MaX = (SamPle); 52 53 void srec_stats_clear() 54 { 55 memset(&my_srec_stats, 0, sizeof(my_srec_stats)); 56 } 57 58 void srec_stats_show() 59 { 60 #ifdef SREC_ENGINE_VERBOSE_LOGGING 61 PLogMessage( 62 L("SREC STATS: FWD tokens s %d f %d w %d aw %d // ASTAR parps a %d c %d t %d // REPRUNES s %d f %d w %d aw %d bbt %d fcu %d\n"), 63 my_srec_stats.num_fsmarc_tokens, 64 my_srec_stats.num_fsmnode_tokens, 65 my_srec_stats.num_word_tokens, 66 my_srec_stats.num_altword_tokens, 67 my_srec_stats.num_astar_active_parps, 68 my_srec_stats.num_astar_complete_parps, 69 my_srec_stats.num_astar_parps_in_use, 70 my_srec_stats.num_fsmarc_token_reprunes, 71 my_srec_stats.num_fsmnode_token_reprunes, 72 my_srec_stats.num_word_token_reprunes, 73 my_srec_stats.num_altword_token_reprunes, 74 my_srec_stats.num_bad_backtraces, 75 my_srec_stats.num_forced_updates 76 ); 77 #endif 78 } 79 80 void srec_stats_update(srec* rec, char* msg) 81 { 82 int i; 83 asr_int16_t num; 84 fsmnode_token* ftoken; 85 fsmarc_token* stoken; 86 word_token* wtoken; 87 altword_token* awtoken; 88 asr_int16_t numb; 89 stokenID st_index; 90 ftokenID ft_index; 91 wtokenID wt_index; 92 93 if (msg) PLogMessage ( msg ); 94 /* state tokens */ 95 st_index = rec->active_fsmarc_tokens; 96 for (num = 0; st_index != MAXstokenID; st_index = stoken->next_token_index) 97 { 98 stoken = &rec->fsmarc_token_array[st_index]; 99 num++; 100 } 101 if (msg) PLogMessage ( " stokens %d", num ); 102 MAX_IN_SAMPLE(my_srec_stats.num_fsmarc_tokens, num); 103 104 /* fsmnode tokens */ 105 ft_index = rec->active_fsmnode_tokens; 106 for (num = 0 ; ft_index != MAXftokenID; ft_index = ftoken->next_token_index) 107 { 108 ftoken = &rec->fsmnode_token_array[ft_index]; 109 num++; 110 } 111 if (msg) PLogMessage ( " ftokens %d", num ); 112 MAX_IN_SAMPLE(my_srec_stats.num_fsmnode_tokens, num); 113 114 /* word tokens */ 115 for (i = 0, num = 0; i < rec->current_search_frame; i++) 116 { 117 wt_index = rec->word_lattice->words_for_frame[i]; 118 for (; wt_index != MAXwtokenID; wt_index = wtoken->next_token_index) 119 { 120 wtoken = &rec->word_token_array[wt_index]; 121 num++; 122 } 123 } 124 if (msg) PLogMessage ( " wtokens %d", num ); 125 MAX_IN_SAMPLE(my_srec_stats.num_word_tokens, num); 126 127 /* altword tokens */ 128 for (num = 0, awtoken = rec->altword_token_freelist; awtoken; awtoken = awtoken->next_token) 129 num++; 130 num = rec->altword_token_array_size - num; 131 for (numb = 0, i = 0; i < rec->altword_token_array_size; i++) 132 if (rec->altword_token_array[i].next_token == AWTNULL) 133 numb++; 134 numb--; /* foreach tail, there is a head, remove the freelist head pointer */ 135 if (msg) PLogMessage ( " awtokens %d/%d", num, numb ); 136 MAX_IN_SAMPLE(my_srec_stats.num_altword_tokens, num); 137 MAX_IN_SAMPLE(my_srec_stats.num_altword_token_batches, numb); 138 if (msg) PLogMessage ( "\n" ); 139 } 140 141 void srec_stats_update_astar(AstarStack* stack) 142 { 143 int num_parps_in_use; 144 partial_path *parp; 145 /* active parps are the leaves of the tree, still being extended */ 146 MAX_IN_SAMPLE(my_srec_stats.num_astar_active_parps, 147 stack->num_active_paths); 148 /* complete parps are the leaves, for completed paths */ 149 MAX_IN_SAMPLE(my_srec_stats.num_astar_complete_parps, 150 stack->num_complete_paths); 151 152 num_parps_in_use = stack->partial_path_array_size; 153 for (parp = stack->free_parp_list; parp; parp = parp->next) 154 num_parps_in_use--; 155 156 MAX_IN_SAMPLE(my_srec_stats.num_astar_parps_in_use, num_parps_in_use); 157 } 158 159 void srec_stats_inc_stoken_reprunes(int n) 160 { 161 my_srec_stats.num_fsmarc_token_reprunes += n; 162 } 163 void srec_stats_inc_ftoken_reprunes(int n) 164 { 165 my_srec_stats.num_fsmnode_token_reprunes += n; 166 } 167 void srec_stats_inc_wtoken_reprunes(int n) 168 { 169 my_srec_stats.num_word_token_reprunes += n; 170 } 171 void srec_stats_inc_awtoken_reprunes(int n) 172 { 173 my_srec_stats.num_altword_token_reprunes += n; 174 } 175 void srec_stats_inc_bad_backtraces() 176 { 177 my_srec_stats.num_bad_backtraces++; 178 } 179 void srec_stats_inc_forced_updates() 180 { 181 my_srec_stats.num_forced_updates++; 182 } 183 #endif 184 185 186