919d4a1006
in the future I may add the SVN history
112 lines
5.5 KiB
C++
112 lines
5.5 KiB
C++
/***************************************************************************
|
|
pfa.h - Probabilistic Finite Automaton
|
|
-------------------
|
|
begin : 7 Dec 2002
|
|
copyright : (C) 2002 by Yann Esposito
|
|
email : esposito@cmi.univ-mrs.fr
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
/*________________________ DÈscription plus prÈcise ______________________*\
|
|
Classe qui hÈrite de la classe spfa, la seule diffÈrence est que l'on
|
|
peut gÈnÈrer des mots avec une distribution de probabilitÈ.
|
|
\***************************************************************************/
|
|
|
|
#ifndef PFA_H
|
|
#define PFA_H
|
|
|
|
#include "spfa.H"
|
|
#include "sample.H"
|
|
//#include "simplex.H"
|
|
|
|
|
|
// ------------------------ La Classe ----------------------------------
|
|
|
|
class PFA : public SPFA
|
|
{
|
|
public:
|
|
RESULT rend_PFA(void);
|
|
|
|
// cree un PFA aleatoire
|
|
RESULT becomeRandom(int num_etat, int num_lettre, // le nombre d'etats et le nombre de lettres
|
|
int num_graphe = 0, // le numero du graphe (donner deux fois le mÍme numero avec
|
|
// les memes paramËtres donne le mÍme graphe
|
|
float densite=0.3, // densitÈ du ffa (0 ffa vide, 1 ffa complet)
|
|
float prob_init=0.3, // probabilitÈ d'Ítre initial
|
|
float prob_term=0.3, // probabilitÈ d'Ítre terminal
|
|
float min_trans=0,
|
|
float max_trans=1); // valeur maximale des transitions
|
|
|
|
RESULT becomeRandomPrefix(const int nb_etats, // le nombre d'Ètats
|
|
const int nb_lettres, // le nombre de lettres
|
|
const int num_graphe = 0, // le numero du graphe
|
|
const float densite=0.3, // densitÈ du ffa (0 ffa vide, 1 ffa complet)
|
|
const float prob_init=0.3, // la probabilitÈ pour un Ètat d'etre initial
|
|
const float prob_term=0.3, // probabilitÈ pour un Ètat d'Ítre terminal
|
|
const float min_trans = 0, // la valeur minimale des transitions
|
|
const float max_trans = 1); // la valeur maximale des transitions
|
|
// Cree un MA aleatoire avec un nombre maximal d'aretes
|
|
RESULT becomeRandomMax (const int nb_etats, const int nb_lettres,
|
|
const int num_graphe=0, const int nb_succ=2,
|
|
const int nb_init=1, const int nb_term=INT_MAX,
|
|
const float min_trans=0, const float max_trans=1);
|
|
|
|
// genere un mot en corelation avec la distribution
|
|
RESULT genere_mot(Word &w, const bool safe = true);
|
|
// -- dans MA maintenant -- // genere un Èchantillon de mots
|
|
RESULT genere_echantillon(const int taille, Sample &S, const int num_echantillon=0);
|
|
// -- dans MA maintenant -- // genere un Èchantillon de mots
|
|
RESULT genere_echantillon(const int taille, Sample &S, const char *Filename, const int num_echantillon=0);
|
|
|
|
// transforme un MA avec valeurs positives en SPFA
|
|
RESULT rend_spfa(void);
|
|
|
|
// Lissage
|
|
RESULT lisse(int mode=0, float delta=0.01);
|
|
|
|
// become the PTA representing S
|
|
RESULT becomePrefixTree(Sample &S);
|
|
|
|
// ----------- DISTANCES ENTRE PFAs -----------
|
|
|
|
// renvoie la perplexitÈ du PFA par rappor ‡ l'echantillon S
|
|
double perplexite(const Sample &S) const;
|
|
// renvoie la divergence de Kullback Leibler relativemant ‡ l'Èchantillon S
|
|
double divKL(const PFA &B, const Sample &S);
|
|
// renvoie la divergence de Kullback Leibler relativemant ‡ l'Èchantillon S en utilisant B
|
|
double divKL (PFA &B, const Sample & S) const;
|
|
// renvoie la norme 2 entre ce PFA et le PTA correspondant ‡ S
|
|
double d_2(const Sample &S) const;
|
|
// renvoie la norme 2 entre ce PFA et un autre
|
|
double d_2(const PFA &B, const Sample &S) const;
|
|
// revoie la norme L1 entre ce PFA et un autre en fonction de l'Èchantillon
|
|
double L_1(const PFA &B, const Sample &S) const;
|
|
// renvoie la norme 2 entre ce PFA et un autre calculée sans passer par les logs
|
|
double d_2nlog(const PFA &B, const Sample &S) const;
|
|
// revoie la norme L1 entre ce PFA et un autre en fonction de l'Èchantillon calculé sans passer par les logs
|
|
double L_1nlog(const PFA &B, const Sample &S) const;
|
|
// renvoie la moyenne des Ècarts de log en fonction d'un Èchantillon S
|
|
double dlog(const PFA &B, const Sample &S) const;
|
|
// renvoie dlog sans prendre en compte les mots non gÈnÈrables par l'un des deux PFAs
|
|
double dlog_safe(const PFA &B, const Sample &S) const;
|
|
// renvoie la vraissemblance
|
|
float Likelihood(const Sample &S);
|
|
|
|
|
|
// return true if the MA is a PRFA
|
|
bool isPRFA(bool verbose=false);
|
|
|
|
// return true if the PFA is a PDFA
|
|
bool isPDFA();
|
|
|
|
};
|
|
|
|
#endif
|