SphinxBase
5prealpha
|
Fast integer logarithmic addition operations. More...
#include <sphinxbase/sphinxbase_export.h>
#include <sphinxbase/prim_type.h>
#include <sphinxbase/cmd_ln.h>
Go to the source code of this file.
Data Structures | |
struct | logadd_s |
Macros | |
#define | LOGMATH_TABLE(lm) ((logadd_t *)lm) |
Obtain the log-add table from a logmath_t *. | |
Typedefs | |
typedef struct logadd_s | logadd_t |
Integer log math computation table. More... | |
typedef struct logmath_s | logmath_t |
Integer log math computation class. | |
Functions | |
SPHINXBASE_EXPORT logmath_t * | logmath_init (float64 base, int shift, int use_table) |
Initialize a log math computation table. More... | |
SPHINXBASE_EXPORT logmath_t * | logmath_read (const char *filename) |
Memory-map (or read) a log table from a file. | |
SPHINXBASE_EXPORT int32 | logmath_write (logmath_t *lmath, const char *filename) |
Write a log table to a file. | |
SPHINXBASE_EXPORT int32 | logmath_get_table_shape (logmath_t *lmath, uint32 *out_size, uint32 *out_width, uint32 *out_shift) |
Get the log table size and dimensions. | |
SPHINXBASE_EXPORT float64 | logmath_get_base (logmath_t *lmath) |
Get the log base. | |
SPHINXBASE_EXPORT int | logmath_get_zero (logmath_t *lmath) |
Get the smallest possible value represented in this base. | |
SPHINXBASE_EXPORT int | logmath_get_width (logmath_t *lmath) |
Get the width of the values in a log table. | |
SPHINXBASE_EXPORT int | logmath_get_shift (logmath_t *lmath) |
Get the shift of the values in a log table. | |
SPHINXBASE_EXPORT logmath_t * | logmath_retain (logmath_t *lmath) |
Retain ownership of a log table. More... | |
SPHINXBASE_EXPORT int | logmath_free (logmath_t *lmath) |
Free a log table. More... | |
SPHINXBASE_EXPORT int | logmath_add_exact (logmath_t *lmath, int logb_p, int logb_q) |
Add two values in log space exactly and slowly (without using add table). | |
SPHINXBASE_EXPORT int | logmath_add (logmath_t *lmath, int logb_p, int logb_q) |
Add two values in log space (i.e. More... | |
SPHINXBASE_EXPORT int | logmath_log (logmath_t *lmath, float64 p) |
Convert linear floating point number to integer log in base B. | |
SPHINXBASE_EXPORT float64 | logmath_exp (logmath_t *lmath, int logb_p) |
Convert integer log in base B to linear floating point. | |
SPHINXBASE_EXPORT int | logmath_ln_to_log (logmath_t *lmath, float64 log_p) |
Convert natural log (in floating point) to integer log in base B. | |
SPHINXBASE_EXPORT float64 | logmath_log_to_ln (logmath_t *lmath, int logb_p) |
Convert integer log in base B to natural log (in floating point). | |
SPHINXBASE_EXPORT int | logmath_log10_to_log (logmath_t *lmath, float64 log_p) |
Convert base 10 log (in floating point) to integer log in base B. | |
SPHINXBASE_EXPORT float | logmath_log10_to_log_float (logmath_t *lmath, float64 log_p) |
Convert base 10 log (in floating point) to float log in base B. | |
SPHINXBASE_EXPORT float64 | logmath_log_to_log10 (logmath_t *lmath, int logb_p) |
Convert integer log in base B to base 10 log (in floating point). | |
SPHINXBASE_EXPORT float64 | logmath_log_float_to_log10 (logmath_t *lmath, float log_p) |
Convert float log in base B to base 10 log. | |
Fast integer logarithmic addition operations.
In evaluating HMM models, probability values are often kept in log domain, to avoid overflow. To enable these logprob values to be held in int32 variables without significant loss of precision, a logbase of (1+epsilon) (where epsilon < 0.01 or so) is used. This module maintains this logbase (B).
However, maintaining probabilities in log domain creates a problem when adding two probability values. This problem can be solved by table lookup. Note that:
So:
The first entry in logadd_table is simply , for the case where
and thus
. The last entry is zero, where
due to loss of precision.
Since this table can be quite large particularly for small logbases, an option is provided to compress it by dropping the least significant bits of the table.
Definition in file logmath.h.
SPHINXBASE_EXPORT int logmath_add | ( | logmath_t * | lmath, |
int | logb_p, | ||
int | logb_q | ||
) |
Add two values in log space (i.e.
return log(exp(p)+exp(q)))
Definition at line 392 of file logmath.c.
References LOGMATH_TABLE, and logadd_s::table.
SPHINXBASE_EXPORT int logmath_free | ( | logmath_t * | lmath | ) |
SPHINXBASE_EXPORT logmath_t* logmath_init | ( | float64 | base, |
int | shift, | ||
int | use_table | ||
) |
Initialize a log math computation table.
base | The base B in which computation is to be done. |
shift | Log values are shifted right by this many bits. |
use_table | Whether to use an add table or not |
Definition at line 62 of file logmath.c.
References E_ERROR.
Referenced by jsgf_write_fsg().