14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  srec_stats.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include"srec_stats.h"
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_STATS_ACTIVE
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_fsmarc_tokens;
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_fsmnode_tokens;
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_word_tokens;
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_altword_tokens, num_altword_token_batches;
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_astar_active_parps;
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_astar_complete_parps;
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_astar_parps_in_use;
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_fsmarc_token_reprunes;
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_fsmnode_token_reprunes;
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_word_token_reprunes;
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_altword_token_reprunes;
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_bad_backtraces;
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_forced_updates;
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectsrec_stats;
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectsrec_stats my_srec_stats;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_IN_SAMPLE(MaX,SamPle) \
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if((MaX)<(SamPle)) MaX = (SamPle);
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_clear()
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memset(&my_srec_stats, 0, sizeof(my_srec_stats));
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_show()
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef SREC_ENGINE_VERBOSE_LOGGING
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogMessage(
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    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"),
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_fsmarc_tokens,
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_fsmnode_tokens,
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_word_tokens,
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_altword_tokens,
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_astar_active_parps,
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_astar_complete_parps,
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_astar_parps_in_use,
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_fsmarc_token_reprunes,
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_fsmnode_token_reprunes,
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_word_token_reprunes,
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_altword_token_reprunes,
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_bad_backtraces,
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    my_srec_stats.num_forced_updates
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  );
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_update(srec* rec, char* msg)
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int16_t num;
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fsmnode_token* ftoken;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fsmarc_token* stoken;
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  word_token* wtoken;
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  altword_token* awtoken;
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  asr_int16_t numb;
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  stokenID st_index;
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ftokenID ft_index;
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  wtokenID wt_index;
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( msg );
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* state tokens */
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  st_index = rec->active_fsmarc_tokens;
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (num = 0; st_index != MAXstokenID; st_index = stoken->next_token_index)
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    stoken = &rec->fsmarc_token_array[st_index];
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    num++;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( " stokens %d", num );
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_fsmarc_tokens, num);
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* fsmnode tokens */
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ft_index = rec->active_fsmnode_tokens;
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (num = 0 ; ft_index != MAXftokenID; ft_index = ftoken->next_token_index)
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ftoken = &rec->fsmnode_token_array[ft_index];
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    num++;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( " ftokens %d", num );
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_fsmnode_tokens, num);
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* word tokens */
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0, num = 0; i < rec->current_search_frame; i++)
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    wt_index = rec->word_lattice->words_for_frame[i];
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (; wt_index != MAXwtokenID; wt_index = wtoken->next_token_index)
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      wtoken = &rec->word_token_array[wt_index];
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num++;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( " wtokens %d", num );
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_word_tokens, num);
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* altword tokens */
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (num = 0, awtoken = rec->altword_token_freelist; awtoken; awtoken = awtoken->next_token)
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    num++;
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num = rec->altword_token_array_size - num;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (numb = 0, i = 0; i < rec->altword_token_array_size; i++)
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rec->altword_token_array[i].next_token == AWTNULL)
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      numb++;
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  numb--; /* foreach tail, there is a head, remove the freelist head pointer */
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( " awtokens %d/%d", num, numb );
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_altword_tokens, num);
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_altword_token_batches, numb);
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (msg) PLogMessage ( "\n" );
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_update_astar(AstarStack* stack)
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_parps_in_use;
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  partial_path *parp;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* active parps are the leaves of the tree, still being extended */
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_astar_active_parps,
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                stack->num_active_paths);
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* complete parps are the leaves, for completed paths */
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_astar_complete_parps,
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                stack->num_complete_paths);
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_parps_in_use = stack->partial_path_array_size;
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (parp = stack->free_parp_list; parp; parp = parp->next)
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    num_parps_in_use--;
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  MAX_IN_SAMPLE(my_srec_stats.num_astar_parps_in_use, num_parps_in_use);
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_stoken_reprunes(int n)
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_fsmarc_token_reprunes   += n;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_ftoken_reprunes(int n)
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_fsmnode_token_reprunes += n;
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_wtoken_reprunes(int n)
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_word_token_reprunes    += n;
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_awtoken_reprunes(int n)
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_altword_token_reprunes += n;
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_bad_backtraces()
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_bad_backtraces++;
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid srec_stats_inc_forced_updates()
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  my_srec_stats.num_forced_updates++;
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
186