diff options
| author | ziejd2 | 2017-09-14 15:39:41 -0500 |
|---|---|---|
| committer | ziejd2 | 2017-09-14 15:57:50 -0500 |
| commit | c4f926438dcb8abe805e910399940f79ff643c4b (patch) | |
| tree | 3146d05ada5cf4b48d9bdd16c1baa498e8df7192 /sourcecodes/k-best/src/ls_XIC.c | |
| parent | 57ebf49403b75dcf8482d174b59f7fd2a961d98e (diff) | |
| download | BNW-c4f926438dcb8abe805e910399940f79ff643c4b.tar.gz | |
Add files via upload
Diffstat (limited to 'sourcecodes/k-best/src/ls_XIC.c')
| -rw-r--r-- | sourcecodes/k-best/src/ls_XIC.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/sourcecodes/k-best/src/ls_XIC.c b/sourcecodes/k-best/src/ls_XIC.c new file mode 100644 index 00000000..22d51d04 --- /dev/null +++ b/sourcecodes/k-best/src/ls_XIC.c @@ -0,0 +1,82 @@ +#include <math.h> +#include <string.h> +#include "get_local_scores.h" +#include "ilogi.h" +#include "ls_XIC.h" + +extern int* nof_vals; +extern int N; + +static int bic = 0; + +#define BIG_XIC_DATA (1<<16) + +/* XIC = log(ML) - 0.5*nof_params*log(n) */ + +score_t big_xic_score(int i, varset_t psi, int nof_freqs){ + + int vc_v = nof_vals[i]; + score_t pcc = get_nof_cfgs(psi); + score_t nof_params = pcc * (vc_v-1); + int* freqp = freqmem; + int* end_freqp = freqp + nof_freqs * vc_v; + + score_t res = bic ? (-0.5 * nof_params * log(N)) : nof_params; + + for(;freqp < end_freqp; freqp += vc_v) { + int pcfreq = 0; + int v; + for(v = 0; v<vc_v; ++v) { + int freq = freqp[v]; + if (freq) { + pcfreq += freq; + res += (freq < BIG_XIC_DATA) ? ilogi[freq] : freq * log(freq); + } + } + res -= (pcfreq < BIG_XIC_DATA) ? ilogi[pcfreq] : pcfreq * log(pcfreq); + } + + return res; +} + +score_t xic_score(int i, varset_t psi, int nof_freqs){ + + int vc_v = nof_vals[i]; + score_t pcc = get_nof_cfgs(psi); + score_t nof_params = pcc * (vc_v-1); + int* freqp = freqmem; + int* end_freqp = freqp + nof_freqs * vc_v; + + score_t res = bic ? (-0.5 * nof_params * log(N)) : -nof_params; + + for(;freqp < end_freqp; freqp += vc_v) { + int pcfreq = 0; + int v; + for(v = 0; v<vc_v; ++v) { + int freq = freqp[v]; + if (freq) { + pcfreq += freq; + res += ilogi[freq]; + } + } + res -= ilogi[pcfreq]; + } + + return res; +} + +scorefun init_XIC_scorer(char* essarg){ + bic = strncmp(essarg,"BIC", 3) == 0; + + if (N<BIG_XIC_DATA){ + ensure_ilogi(N); + return xic_score; + } else { + ensure_ilogi(BIG_XIC_DATA); + return big_xic_score; + } +} + +void free_XIC_scorer(){ + free_ilogi(); +} |
