blob: bd731e558e08f0dd82f085a2a02d1aa5926f8032 [file] [log] [blame]
/*---------------------------------------------------------------------------*
* srec_stats.c *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#include"srec_stats.h"
#include "passert.h"
#include "portable.h"
#ifdef SREC_STATS_ACTIVE
typedef struct
{
int num_fsmarc_tokens;
int num_fsmnode_tokens;
int num_word_tokens;
int num_altword_tokens, num_altword_token_batches;
int num_astar_active_parps;
int num_astar_complete_parps;
int num_astar_parps_in_use;
int num_fsmarc_token_reprunes;
int num_fsmnode_token_reprunes;
int num_word_token_reprunes;
int num_altword_token_reprunes;
int num_bad_backtraces;
int num_forced_updates;
}
srec_stats;
srec_stats my_srec_stats;
#define MAX_IN_SAMPLE(MaX,SamPle) \
if((MaX)<(SamPle)) MaX = (SamPle);
void srec_stats_clear()
{
memset(&my_srec_stats, 0, sizeof(my_srec_stats));
}
void srec_stats_show()
{
#ifdef SREC_ENGINE_VERBOSE_LOGGING
PLogMessage(
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"),
my_srec_stats.num_fsmarc_tokens,
my_srec_stats.num_fsmnode_tokens,
my_srec_stats.num_word_tokens,
my_srec_stats.num_altword_tokens,
my_srec_stats.num_astar_active_parps,
my_srec_stats.num_astar_complete_parps,
my_srec_stats.num_astar_parps_in_use,
my_srec_stats.num_fsmarc_token_reprunes,
my_srec_stats.num_fsmnode_token_reprunes,
my_srec_stats.num_word_token_reprunes,
my_srec_stats.num_altword_token_reprunes,
my_srec_stats.num_bad_backtraces,
my_srec_stats.num_forced_updates
);
#endif
}
void srec_stats_update(srec* rec, char* msg)
{
int i;
asr_int16_t num;
fsmnode_token* ftoken;
fsmarc_token* stoken;
word_token* wtoken;
altword_token* awtoken;
asr_int16_t numb;
stokenID st_index;
ftokenID ft_index;
wtokenID wt_index;
if (msg) PLogMessage ( msg );
/* state tokens */
st_index = rec->active_fsmarc_tokens;
for (num = 0; st_index != MAXstokenID; st_index = stoken->next_token_index)
{
stoken = &rec->fsmarc_token_array[st_index];
num++;
}
if (msg) PLogMessage ( " stokens %d", num );
MAX_IN_SAMPLE(my_srec_stats.num_fsmarc_tokens, num);
/* fsmnode tokens */
ft_index = rec->active_fsmnode_tokens;
for (num = 0 ; ft_index != MAXftokenID; ft_index = ftoken->next_token_index)
{
ftoken = &rec->fsmnode_token_array[ft_index];
num++;
}
if (msg) PLogMessage ( " ftokens %d", num );
MAX_IN_SAMPLE(my_srec_stats.num_fsmnode_tokens, num);
/* word tokens */
for (i = 0, num = 0; i < rec->current_search_frame; i++)
{
wt_index = rec->word_lattice->words_for_frame[i];
for (; wt_index != MAXwtokenID; wt_index = wtoken->next_token_index)
{
wtoken = &rec->word_token_array[wt_index];
num++;
}
}
if (msg) PLogMessage ( " wtokens %d", num );
MAX_IN_SAMPLE(my_srec_stats.num_word_tokens, num);
/* altword tokens */
for (num = 0, awtoken = rec->altword_token_freelist; awtoken; awtoken = awtoken->next_token)
num++;
num = rec->altword_token_array_size - num;
for (numb = 0, i = 0; i < rec->altword_token_array_size; i++)
if (rec->altword_token_array[i].next_token == AWTNULL)
numb++;
numb--; /* foreach tail, there is a head, remove the freelist head pointer */
if (msg) PLogMessage ( " awtokens %d/%d", num, numb );
MAX_IN_SAMPLE(my_srec_stats.num_altword_tokens, num);
MAX_IN_SAMPLE(my_srec_stats.num_altword_token_batches, numb);
if (msg) PLogMessage ( "\n" );
}
void srec_stats_update_astar(AstarStack* stack)
{
int num_parps_in_use;
partial_path *parp;
/* active parps are the leaves of the tree, still being extended */
MAX_IN_SAMPLE(my_srec_stats.num_astar_active_parps,
stack->num_active_paths);
/* complete parps are the leaves, for completed paths */
MAX_IN_SAMPLE(my_srec_stats.num_astar_complete_parps,
stack->num_complete_paths);
num_parps_in_use = stack->partial_path_array_size;
for (parp = stack->free_parp_list; parp; parp = parp->next)
num_parps_in_use--;
MAX_IN_SAMPLE(my_srec_stats.num_astar_parps_in_use, num_parps_in_use);
}
void srec_stats_inc_stoken_reprunes(int n)
{
my_srec_stats.num_fsmarc_token_reprunes += n;
}
void srec_stats_inc_ftoken_reprunes(int n)
{
my_srec_stats.num_fsmnode_token_reprunes += n;
}
void srec_stats_inc_wtoken_reprunes(int n)
{
my_srec_stats.num_word_token_reprunes += n;
}
void srec_stats_inc_awtoken_reprunes(int n)
{
my_srec_stats.num_altword_token_reprunes += n;
}
void srec_stats_inc_bad_backtraces()
{
my_srec_stats.num_bad_backtraces++;
}
void srec_stats_inc_forced_updates()
{
my_srec_stats.num_forced_updates++;
}
#endif