[go: up one dir, main page]

Menu

[r3]: / src / fsm.h  Maximize  Restore  History

Download this file

127 lines (113 with data), 5.6 kB

  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
/*---------------------------------------------------------------*/
/* Tipos para representar una Red de Estados Finitos Generica */
/*----------------------------------------------------------------------------*/
/*
La red se representara con un registro (T_REDGEN) que contendra
algunos datos de la red (nombre, num estados, num aristas, num
simbolos de salida, num estados iniciales, num estados finales,
etc.). Y principalmente, tendra dos vectores que contendran los
estados y las aristas. A su vez, cada estado y cada arista (en
los vectores) sera un registro que contendra informacion sobre
el estado y la arista, respectivamente.
Cada estado contiene cuatro datos: estado inicial, estado final,
checksum y cadena de salida. Y ademas, tiene la lista de aristas
que salen del estado. En realidad, solo tiene el puntero a la
primera arista que es un indice en el vector de aristas. Las
siguientes aristas salientes de ese estado se obtienen a partir
de la primera con el campo 'ssig' del registro de cada arista.
Este campo 'ssig' vuelve a ser un indice en el vector de aristas.
Las cadenas de salida de se representan en el estado como un
puntero (indice) y un offset (longitud) en un vector de cadenas
de salida, 'out'. En este vector se insertan secuencialmente
todas las cadenas de salida (de aristas o de estados) de la red.
Y 'pt' sera el indice en 'out' del primer simbolo de la cadena,
y 'ot' es la longitud de la cadena, de forma que el ultimo simbolo
de la cadena es 'pt+ot-1' en 'out'.
El vector de aristas viene a ser un bloque de memoria dividido
en registros, cada cual representa a una arista. Los datos de
una arista son: el simbolo (de entrada), la cadena de salida,
la probabilidad y el estado destino. El estado destino es un
indice en el vector de estados. La cadena de salida se repre-
senta igual que en los estados. El simbolo es un numero que
se correpondera con una entrada en un diccionario. Los
simbolos de salida tambien son numeros que se corresponden
con entradas en un diccionario. Ademas, en la arista, el
campo 'ssal' lleva a la siguiente arista del estado corres-
pondiente o vale INDNULO.
*/
#define MAXLINLR 256
#define Ending -3
#define Unknown -2
#define Beginning -1
#define Transit 0
#define Backoff 1
#define IN 1
#define OUT 2
#define Training 3
#define Decoding 4
#include "giati.h"
#include "hash.h"
typedef struct lint {
int n;
char *word;
struct lint *next;
} l_int;
typedef struct t_arista
{
//int pt; /* Indice del primer simbolo de salida de la arista */
//int ssal; /* Indice de la siguiente arista en la lista */
//char ot; /* Numero de simbolos de la cadena de salida de la arista */
//int simb; /* Simbolo terminal de entrada */
int origen; /* Estado de origen de la arista */
int input;
l_int *output;
double prob[MaxProb]; /* Frecuencia o probabilidad de la arista */
int np;
int dest; /* Estado de destino de la arista */
struct t_arista *siguiente; /* Indice de la siguiente arista en la lista */
} T_ARISTA;
typedef struct
{
//int pt; /* Indice del primer simbolo de salida del estado */
//char ot; /* Numero de simbolos de la cadena de salida del estado */
//int psal; /* Indice a las aristas que salen de este estado */
//double checksum; /* Frecuencia (o probabilidad = 1) total del estado */
//char *output;
int active;
double initial; /* Frecuencia o probabilidad de ser estado Inicial */
double final; /* Frecuencia o probabilidad de ser estado Final */
T_ARISTA *cabeza; /* Las aristas del estado */
T_ARISTA *cola;
T_ARISTA *BACKOFF;
T_ARISTA *UNKNOWN;
} T_ESTADO;
typedef struct
{
//int *fin; /* Estados Finales */
//DICCIONARIO *alfaent, *alfasal, *alfaest;
//int maxE,maxA,maxO,maxI,maxF; /* maximos de lo anterior disponibles */
//int *out; /* Salidas (en traductores) */
//T_ARISTA *arc; /* Aristas */
//int tipo; /* Tipo de red (aut., trad., etc.) */
//int no,nf; /* numeros de est, arc, out, ini, fin */
//double totchk; /* Frecuencia ("checksum") Total */
h_t *table, *table_in, *table_out;
int n_in, n_out;
char **alfa_in, **alfa_out;
char nombre[MAXLINLR]; /* Como su nombre indica */
int ne; /* numero de est, arc, out, ini, fin */
T_ESTADO *est; /* Estados */
int ini; /* Estado Inicial */
} T_REDGEN;
extern T_REDGEN *CrearRed(int ne, int hts);
extern l_int *insert(l_int *output, int n, char *simb);
extern l_int *append(l_int *a, l_int *b, int *UNK, char *simb, int flag);
extern void enter_state(T_REDGEN *A, int state, double ini, double fin);
extern void enter_transition(T_REDGEN *A, int stage, int type, int source,
int target, char *symbols, double weight, lexicon *l);
extern void get_final_probs(T_REDGEN *A);
extern T_REDGEN *read_fsm(char *file, int hts);
extern void write_fsm(T_REDGEN *A, char *file, int n, struct options *opt);
extern void LiberarRed(T_REDGEN *A);
extern int LeerRed(FILE *fd, T_REDGEN *A, int numred, char *nombre);
extern void EscribirRed(T_REDGEN *A, int renom, int desplz);