Blame view

tools/lia_ltbox/lia_phon/src/libgram/libgram.h.old 5.95 KB
e6be5137b   Jean-François Rey   reinitialized pro...
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  /*  Usefule things for the 'gram' module  */
  /*  FRED 0498 - Modif multi ML - 0399  */
  
  /*................................................................*/
  
  /*  Les indispensables  */
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <math.h>
  #include <ailleur_siroco.h>
  #include <gere_lexique.h>
  #include <proba_mot_classe.h>
  
  /*................................................................*/
  
  /*  Type de stockage des 1.2.3-gram  */
  
  #define MARGE	1
  
  #define Nb1Byte	3
  typedef struct
  	{
  	unsigned char cle[Nb1Byte];
  	flogprob_t lp,fr;
  	} type_1gram;
  
  #define Nb2Byte	6
  typedef struct
  	{
  	unsigned char cle[Nb2Byte];
  	flogprob_t lp,fr;
  	} type_2gram;
  
  #define Nb3Byte	9
  typedef struct
  	{
  	unsigned char cle[Nb3Byte];
  	flogprob_t lp;
  	} type_3gram;
  
  /*  Declaration du type ML  */
  
  typedef struct type_ml
  	{
  	/* un modele proba mot classe (pmc) */
  	ty_pmc pmc;
  	/* un lexique de la librairie gere_lexique */
  	ty_lexique lexique;
  	/* Taille des tableaux de Hash : ATTENTION prendre
  	   des nombres premiers !! */
  	long NB1GRAM,NB2GRAM,NB3GRAM;
  	/* les tableaux de Hash */
  	type_1gram *TABL1GRAM;
  	type_2gram *TABL2GRAM;
  	type_3gram *TABL3GRAM;
  	/* Si on utilise le hash-code ou la dichotomie */
  	int GRAM_SI_HASH;
  	/* If we have a 2gram or a 3gram model */
  	int GRAM_SI_2G;
  	/* If LOG10 or LOGe */
  	int GRAM_LOG10;
  	} *ty_ml;
  
  /*................................................................*/
  
  /* Variables globales de stockage des ML */
  
  #define NB_MAX_ML       10
  
  extern ty_ml Table_ML[]; 
  
  /*  Nombre de ML present en memoire  */
  
  extern int NB_ML;
  
  /* Macro permettant de renvoyer un pointeur sur un modele pmc */
  #define MODELE_PMC(n)	(Table_ML[(n)]->pmc)
  
  /* Macro permettant de renvoyer un pointeur sur un lexique */
  #define LEXIQUE(n)	(Table_ML[(n)]->lexique)
  
  /* Macro permettant de renvoyer un pointeur sur un ML */
  #define ML(n)		(Table_ML[(n)])
  
  /* Macro permettant de renvoyer le nombre de 1,2,3 grams */
  #define NOMBRE_1GRAM(n)           (Table_ML[(n)]->NB1GRAM)
  #define NOMBRE_2GRAM(n)           (Table_ML[(n)]->NB2GRAM)
  #define NOMBRE_3GRAM(n)           (Table_ML[(n)]->NB3GRAM)
  
  /* allocation des objets ml */
  
  ty_ml cons_ml(long ,long ,long ,int ,int ,int );
  
  /*................................................................*/
  
  /*  Gestion des NGrams  */
  
  #define BYTE1(a) (a & 0xFF)
  #define BYTE2(a) ((a & 0xFF00)>>8)
  #define BYTE3(a) ((a & 0xFF0000)>>16)
  
  /*  Test de case vide  */
  
  /* le dernier bit du dernier octet du tableau de cles est utilise
     comme booleen de case vide. Exemple : pour les 1grams, la cle
     est composee de 3 octets, X1111111 11111111 11111111, si le
     bit X est a 1, la case est vide, s'il est a 0 la case est pleine.
     ATTENTION, ce codage limite la taille du vocabulaire a 8388607 mots. */
  
  #define Case1Vide(i,pt_ml) ((pt_ml->TABL1GRAM[i].cle[Nb1Byte-1]&128)>>7)
  #define Case2Vide(i,pt_ml) ((pt_ml->TABL2GRAM[i].cle[Nb2Byte-1]&128)>>7)
  #define Case3Vide(i,pt_ml) ((pt_ml->TABL3GRAM[i].cle[Nb3Byte-1]&128)>>7)
  
  /*................................................................*/
  
  /*  Addition circulaire  */
  /* on doit faire (valh1+(valh2*(essai-1)))%nbgram */
  
  #define EssaiSuivant(valh1,valh2,essai,nbgram) \
  ((long)fmod(((double)valh1+((double)valh2*(double)(essai-1))),(double)(nbgram)))
  
  /*................................................................*/
  
  /*  Fonction de Hachage  */
  
  #define TETA1	((double)0.6180339887)
  #define TETA2	((double)0.3819660113)
  
  /* on ajoute 1 aux valeurs de i pour eviter que la cle soit a 0 */
  
  #define Combine2Indice(i1,i2) (i1+i2+1)
  #define Combine3Indice(i1,i2,i3) (i1+i2+i3+1)
  
  /* premiere fonction */
  #define H1Value(i,pt_ml) ((long)(fmod((double)((i)+1)*TETA1,(double)1)*(double)(pt_ml)->NB1GRAM)+1)
  #define H2Value(i1,i2,pt_ml) ((long)(fmod((double)(Combine2Indice((i1),(i2)))*TETA1,\
  (double)1)*(double)(pt_ml)->NB2GRAM)+1)
  #define H3Value(i1,i2,i3,pt_ml) ((long)(fmod((double)(Combine3Indice((i1),(i2),(i3)))*TETA1,\
  (double)1)*(double)(pt_ml)->NB3GRAM)+1)
  
  /* deuxieme fonction */
  #define Double1H(i,pt_ml) ((long)(fmod((double)(i+1)*TETA2,(double)1)*(double)(pt_ml->NB1GRAM-1))+1)
  #define Double2H(i1,i2,pt_ml) ((long)(fmod((double)(Combine2Indice(i1,i2))*TETA2,\
  (double)1)*(double)(pt_ml->NB2GRAM-1))+1)
  #define Double3H(i1,i2,i3,pt_ml) ((long)(fmod((double)(Combine3Indice(i1,i2,i3))*TETA2,\
  (double)1)*(double)(pt_ml->NB3GRAM-2))+1)
  
  /*................................................................*/
  
  /*  Egalite  */
  
  int H1compar(void * ,void * ) ;
  int H2compar(void * ,void * ) ;
  int H3compar(void * ,void * ) ;
  
  int SiEgal1(wrd_index_t  ,long, ty_ml) ;
  int SiEgal2(wrd_index_t  ,wrd_index_t ,long, ty_ml) ;
  int SiEgal3(wrd_index_t  ,wrd_index_t ,wrd_index_t ,long, ty_ml) ;
  
  /*................................................................*/
  
  /*  Passage des log 10 aux log e  */
  
  #define LOG10_2_LOGe(a)         ((double)(a)*(log((double)10)))
   
  /*................................................................*/
  
  /*  Gestion des 1.2.3-gram au format arpa  */
  
  /*  FRED 0398 - Modif multi ML 0399  */
  
  err_t  gram_module_init(char *, int *, int , const err_t);
  
  err_t gram_module_reset(const int, const err_t);
  
  err_t gram_proba_to_bigram(logprob_t *,const wrd_index_t , const wrd_index_t ,
  	const int, const err_t );
  
  err_t gram_proba_to_trigram(logprob_t *,const wrd_index_t , const wrd_index_t ,
  	const wrd_index_t , const int, const err_t );
  
  int Recherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  int HashRecherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  int DichoRecherche1Gram(wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  
  int Recherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  int HashRecherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  int DichoRecherche2Gram(wrd_index_t, wrd_index_t, flogprob_t *, flogprob_t *, ty_ml);
  
  int Recherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml);
  int HashRecherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml);
  int DichoRecherche3Gram(wrd_index_t, wrd_index_t, wrd_index_t, flogprob_t *, ty_ml);