forked from synalp/NER
-
Notifications
You must be signed in to change notification settings - Fork 0
/
deten.c
54 lines (48 loc) · 1.37 KB
/
deten.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "stats.h"
#include "samplib.h"
/* repasse sur l'initialisation de H en remplacant le random sur le voc par le premier mot du contexte gauche, ou droit */
void detinitH(int *h, int **ctxt, int N, int *N2) {
int i,j;
for (i=0;i<N;i++) {
if (N2[i]>0) {
j=0;
if (ctxt[i][j]==-1) {
// pas de contexte gauche
j++;
}
if (j<N2[i]) {
h[i]=ctxt[i][j];
} // sinon, pas de contexte, on garde une init uniforme sur tout le voc
} // sinon, pas de contexte, on garde une init uniforme sur tout le voc
// note: ceci ne doit jamais arrivé depuis que j'ai le -1 pour séparer les contextes gauche et droit
}
}
static int hs[20];
/* il ne faut pas utiliser celui-ci, car la fonction rand() retourne des nombres bizarres...
je l'ai deplace dans stats.c, et ca marche !
*/
int ddetsample_Mult_smooth(double eta, double*th, int lo, int hi, int *possibleH, int possibleHlen) {
int nhs=0;
int i,j,h;
for (i=0;i<possibleHlen;i++) {
h=possibleH[i];
if (h<0) continue;
for (j=0;j<nhs;j++)
if (hs[j]==h) break;
if (j==nhs) hs[nhs++]=h;
}
double s=0;
for (i=0;i<nhs;i++) { s+=th[hs[i]] + eta; }
double rv = ranf();
printf("debug ran %e\n",rv);
s = rv * s;
for (i=0; i<nhs; i++) {
s -= th[hs[i]] + eta;
if (s<0) { return hs[i]; }
}
return hs[0];
}