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_BDe.c | |
| parent | 57ebf49403b75dcf8482d174b59f7fd2a961d98e (diff) | |
| download | BNW-c4f926438dcb8abe805e910399940f79ff643c4b.tar.gz | |
Add files via upload
Diffstat (limited to 'sourcecodes/k-best/src/ls_BDe.c')
| -rw-r--r-- | sourcecodes/k-best/src/ls_BDe.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/sourcecodes/k-best/src/ls_BDe.c b/sourcecodes/k-best/src/ls_BDe.c new file mode 100644 index 00000000..83865f31 --- /dev/null +++ b/sourcecodes/k-best/src/ls_BDe.c @@ -0,0 +1,163 @@ +#include <stdlib.h> +#include <string.h> +#include<stdio.h> +#include <math.h> +#include "get_local_scores.h" +#include "ilogi.h" +#include "ls_BDe.h" + +extern int* nof_vals; +extern int N; + +score_t ess; + +int* freq2mem = NULL; +int* freq2mem2 = NULL; +int nof_freq2s; + + +#define BIG_BDE_DATA (1<<10) + +extern double lgamma(double); /* to avoid the warning with ansi-flag */ + +/* BDe */ + +score_t big_bde_score(int i, varset_t psi, int nof_freqs){ + + int vc_v = nof_vals[i]; + score_t pcc = get_nof_cfgs(psi); + score_t ess_per_pcc = ess / pcc; + score_t ess_per_cc = ess_per_pcc / vc_v; + + int* freqp = freqmem; + int* end_freqp = freqp + nof_freqs * vc_v; + + score_t res = nof_freqs * lgamma(ess_per_pcc); + int nof_zeros = 0; + + memset(freq2mem, 0, nof_freq2s*sizeof(int)); /* could reset later */ + memset(freq2mem2, 0, nof_freq2s*sizeof(int)); /* could reset later */ + + 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; + if(freq<nof_freq2s){ + ++freq2mem[freq]; + } else { + res += lgamma(ess_per_cc + freq); + } + } else { + ++ nof_zeros; + } + } + if(pcfreq<nof_freq2s){ + ++freq2mem2[pcfreq]; + } else { + res -= lgamma(ess_per_pcc + pcfreq); + } + } + + res += (nof_zeros - nof_freqs * vc_v) * lgamma(ess_per_cc); + + { + int i; + + for(i=1;i<nof_freq2s;++i){ + int freq2 = freq2mem[i]; + if(freq2) res += freq2 * lgamma(ess_per_cc + i); + } + + for(i=1;i<nof_freq2s;++i){ + int freq2 = freq2mem2[i]; + if(freq2) res -= freq2 * lgamma(ess_per_pcc + i); + } + + } + + return res > 0.0 ? 0.0 : res; +} + + +score_t bde_score(int i, varset_t psi, int nof_freqs){ +//HR +//printf ("bde score %d, %u %d",i, psi, nof_freqs); + + int vc_v = nof_vals[i]; + score_t pcc = get_nof_cfgs(psi); + score_t ess_per_pcc = ess / pcc; + score_t ess_per_cc = ess_per_pcc / vc_v; + + int* freqp = freqmem; + int* end_freqp = freqp + nof_freqs * vc_v; + + score_t res = nof_freqs * lgamma(ess_per_pcc); + int nof_zeros = 0; + + memset(freq2mem, 0, nof_freq2s*sizeof(int)); /* could reset later */ + memset(freq2mem2, 0, nof_freq2s*sizeof(int)); /* could reset later */ + + 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; + ++freq2mem[freq]; + } else { + ++ nof_zeros; + } + } + ++freq2mem2[pcfreq]; + } + + res += (nof_zeros - nof_freqs * vc_v) * lgamma(ess_per_cc); + + { + int i; + + for(i=1;i<nof_freq2s;++i){ + int freq2 = freq2mem[i]; + if(freq2) res += freq2 * lgamma(ess_per_cc + i); + } + + for(i=1;i<nof_freq2s;++i){ + int freq2 = freq2mem2[i]; + if(freq2) res -= freq2 * lgamma(ess_per_pcc + i); + } + + } + + return res > 0.0 ? 0.0 : res; +} + + + +scorefun init_BDe_scorer(char* arg){ + + scorefun sf; + + ess = atof(arg); + + if (N<BIG_BDE_DATA){ + sf = bde_score; + nof_freq2s = N+1; + } else { + sf = big_bde_score; + nof_freq2s = BIG_BDE_DATA; + } + + freq2mem = malloc(nof_freq2s * sizeof(int)); + freq2mem2 = malloc(nof_freq2s * sizeof(int)); + + return sf; +} + +void free_BDe_scorer(){ + if(freq2mem) free(freq2mem); + if(freq2mem2) free(freq2mem2); +} |
