https://hal.archives-ouvertes.fr/hal-02177293
Tip revision: a5c3a632ff52caf942ac0457ce1ec733926a867b authored by Software Heritage on 01 January 2004, 00:00:00 UTC
hal: Deposit 315 in collection hal
hal: Deposit 315 in collection hal
Tip revision: a5c3a63
MoteurDeterministe.java
/*
* Créé le 10 sept. 2004
*
*/
package traitement.moteur;
import information.DomaineIncompatibleException;
import information.magnitude.Magnitude;
import information.tpt.TPT;
import information.type.Type;
import java.io.IOException;
import java.util.Vector;
import principal.copiercoller.HomonymeIntrouvableException;
import principal.copiercoller.InterfaceHomonyme;
import fichier.ContenuFichierIncompatibleException;
import gui.InterfaceAffichable;
import traitement.TraitementEvent;
import traitement.TraitementIncompletException;
import traitement.TraitementListener;
import traitement.modele.Modele;
import traitement.noeud.InterfaceNoeud;
import traitement.noeud.fonctionnel.NoeudFonctionnelEndogene;
import traitement.noeud.fonctionnel.NoeudFonctionnelExogene;
import traitement.noeud.fonctionnel.VectorNoeudFonctionnel;
/**
* les Magnitudes sont traitées comme des variables déterministes,
* on ne tient pas du tout compte des écart-types.
* C'est plutot un premier moteur de test.
*
* @author Vincent Labatut
* @version 1
* @see traitement.modele.Modele
*/
public class MoteurDeterministe implements InterfaceMoteur
{
// ----------------------------------------
// Moteur
// ----------------------------------------
/**
* Liste des TraitementListeners écoutant cette Moteur.
*
*/
private Vector vectorTraitementListener;
/**
* Modele parent de ce Moteur.
*
*/
private Modele parent;
/**
* indique si cet objet a été modifé depuis sa derničre sauvegarde.
*/
private boolean modifie;
// ----------------------------------------
// Listes de Noeuds
// ----------------------------------------
/**
* Liste des NoeudExogenes utilisée pendant le traitement.
*
*/
private VectorNoeudFonctionnel vectorNoeudExogene;
/**
* Liste des NoeudEndogenes non observés pour l'activation, utilisée pendant le traitement.
*
*/
private VectorNoeudFonctionnel vectorNoeudEndogene;
// ----------------------------------------
// Constructeurs
// ----------------------------------------
/**
* Constructeur pour créer un Moteur
* de parent le Modele
* passé en paramčtre.
*
* @param m parent de ce Moteur.
*
*/
public MoteurDeterministe(Modele m)
{ parent = m;
vectorTraitementListener = new Vector();
setModifie();
}
// ----------------------------------------
// Parent
// ----------------------------------------
/*
*
*/
public Modele getParent()
{ return parent;
}
/*
*
*/
public void setParent(Modele p)
{ parent = p;
}
// ----------------------------------------
// Modele
// ----------------------------------------
/*
*
*/
public Modele getModele()
{ return parent;
}
// ----------------------------------------
// InterfaceTraitement
// ----------------------------------------
/*
*
*/
public void addTraitementListener(TraitementListener i)
{ vectorTraitementListener.add(i);
}
/*
*
*/
public void removeTraitementListener(TraitementListener i)
{ vectorTraitementListener.remove(i);
}
/**
* annonce la suppression de cette Distance.
* Chaque TraitementListener doit se supprimer lui-mźme de la liste des listeners de cette Distance.
*
* @param e le TraitementEvent qui est émis vers les TraitementListeners.
*/
private void fireTraitementSuppr(TraitementEvent e)
{
while (vectorTraitementListener.size()!=0)
try
{ ((TraitementListener) vectorTraitementListener.get(0)).traitementSuppr(e);
}
catch (TraitementIncompletException e1)
{ e1.printStackTrace();
}
}
/**
* annonce un raffraichissement de cette Distance.
*
* @param e le TraitementEvent qui est émis vers les TraitementListeners.
*/
private void fireTraitementRaffr(TraitementEvent e)
{
for (int i=0;i<vectorTraitementListener.size();i++)
try
{ ((TraitementListener) vectorTraitementListener.get(i)).traitementRaffr(e);
}
catch (TraitementIncompletException e1)
{ e1.printStackTrace();
}
}
/**
* annonce un raffraichissement de cette Distance.
*
* @param e le TraitementEvent qui est émis vers les TraitementListeners.
*/
private void fireTraitementRempl(TraitementEvent e)
{ for (int i=0;i<vectorTraitementListener.size();i++)
try
{ ((TraitementListener) vectorTraitementListener.get(i)).traitementRempl(e);
}
catch (TraitementIncompletException e1)
{ e1.printStackTrace();
}
}
/**
* annonce un raffraichissement de cette Distance.
*
* @param e le TraitementEvent qui est émis vers les TraitementListeners.
*/
private void fireTraitementCache(TraitementEvent e)
{ for (int i=0;i<vectorTraitementListener.size();i++)
try
{ ((TraitementListener) vectorTraitementListener.get(i)).traitementCache(e);
}
catch (TraitementIncompletException e1)
{ e1.printStackTrace();
}
}
//----------------------------------------
// This
//----------------------------------------
/*
*
*/
public void remove()
{ fireTraitementSuppr(new TraitementEvent(this));
//
parent = null;
//
}
// ----------------------------------------
// Simulation
// ----------------------------------------
/*
*
*/
public boolean estComplet()
{ return true;
}
/*
*
*/
public void preparerSimulation()
{ VectorNoeudFonctionnel vectorNoeudFonctionnel = parent.getVectorNoeudFonctionnel();
// déterminer la liste de NoeudFonctionnelEndogene et celle de NoeudFonctionnelExogene
// on néglige les observations
vectorNoeudExogene = new VectorNoeudFonctionnel();
vectorNoeudEndogene = new VectorNoeudFonctionnel();
for (int i=0;i<vectorNoeudFonctionnel.size();i++)
{ InterfaceNoeud n = vectorNoeudFonctionnel.getNoeudFonctionnel(i);
if (n instanceof NoeudFonctionnelEndogene)
vectorNoeudEndogene.addNoeudFonctionnel((NoeudFonctionnelEndogene)n);
else if (n instanceof NoeudFonctionnelExogene)
vectorNoeudExogene.addNoeudFonctionnel((NoeudFonctionnelExogene)n);
}
fireTraitementRaffr(new TraitementEvent(this));
}
/*
*
*/
public void evaluer(int instant) throws IOException, ClassNotFoundException, ContenuFichierIncompatibleException
{ // algo général :
// 1) mąj valeurs d'émission des NoeudExogenes
// 2) mąj valeurs d'activation des NoeudEndogenes
// 3+4) mąj des valeurs d'émission des NoeudEndogenes
// 5) mąj TPT (apprentissage) des NoeudEndogenes
// ------------------------------------------------------
// 1) mąj valeurs d'émission des NoeudExogenes
// ------------------------------------------------------
for (int i=0;i<vectorNoeudExogene.size();i++)
{ NoeudFonctionnelExogene n = (NoeudFonctionnelExogene)vectorNoeudExogene.getNoeudFonctionnel(i);
if (instant != 0)
{ Vector resultat;
resultat = n.lireEntreeFichier();
// Magnitude
Magnitude resM = (Magnitude) resultat.get(0);
n.addMagnitudeEmission(resM);
// Type
Type resT = (Type) resultat.get(1);
try
{ n.addTypeEmission(resT);
}
catch (DomaineIncompatibleException e)
{ e.printStackTrace();
}
}
}
// ------------------------------------------------------
// 2) mąj valeurs d'activation des NoeudEndogenes
// ------------------------------------------------------
// non-observables
for (int i=0;i<vectorNoeudEndogene.size();i++)
{ NoeudFonctionnelEndogene n = (NoeudFonctionnelEndogene)vectorNoeudEndogene.getNoeudFonctionnel(i);
// Magnitude d'activation
Magnitude resM = n.getSectionActivation().getFonctionMagnitude().evaluer(instant);
n.addMagnitudeActivation(resM);
// Type d'activation
Type resT = n.getSectionActivation().getFonctionType().evaluer(instant);
try
{ n.addTypeActivation(resT);
}
catch (DomaineIncompatibleException e)
{ e.printStackTrace();
}
// mise ą jour des variables persistantes du Noeud
n.getSectionApprentissage().getFonctionTPT().raffraichirNoeud(instant);
}
// ------------------------------------------------------
// 3+4) mąj valeurs d'émission des NoeudEndogenes
// ------------------------------------------------------
for (int i=0;i<vectorNoeudEndogene.size();i++)
{ NoeudFonctionnelEndogene n = (NoeudFonctionnelEndogene)vectorNoeudEndogene.getNoeudFonctionnel(i);
// Magnitude d'émission
Magnitude resM = n.getSectionEmission().getFonctionMagnitude().evaluer(instant);
n.addMagnitudeEmission(resM);
// Type d'émission
Type resT = n.getSectionEmission().getFonctionType().evaluer(instant);
try
{ n.addTypeEmission(resT);
}
catch (DomaineIncompatibleException e)
{ e.printStackTrace();
}
}
// ------------------------------------------------------
// 5) mąj TPT (apprentissage) des NoeudEndogenes
// ------------------------------------------------------
// non-observables
for (int i=0;i<vectorNoeudEndogene.size();i++)
{ NoeudFonctionnelEndogene n = (NoeudFonctionnelEndogene)vectorNoeudEndogene.getNoeudFonctionnel(i);
TPT res = n.getSectionApprentissage().getFonctionTPT().evaluer(instant);
try
{ n.addTPT(res);
}
catch (DomaineIncompatibleException e)
{ e.printStackTrace();
}
}
}
/*
*
*/
public void interrompreSimulation()
{
}
/*
*
*/
public void terminerSimulation()
{
}
// ----------------------------------------
// Copier/Coller
// ----------------------------------------
/*
*
*/
public InterfaceMoteur cloner()
{ MoteurDeterministe resultat = new MoteurDeterministe(parent);
resultat.setNonModifie();
return resultat;
}
/*
*
*/
public InterfaceHomonyme getHomonyme(Modele modele) throws HomonymeIntrouvableException
{ InterfaceHomonyme resultat;
if (modele == getModele())
resultat = this;
else
{ resultat = modele.getMoteur();
}
return resultat;
}
// ----------------------------------------
// InterfaceAffichable
// ----------------------------------------
/*
*
*/
public void remplacer(InterfaceAffichable ia)
{ fireTraitementRempl(new TraitementEvent(this,(MoteurDD2)ia));
}
/*
*
*/
public void cacher()
{ fireTraitementCache(new TraitementEvent(this));
}
// ----------------------------------------
// Modification
// ----------------------------------------
/*
*
*/
public void setModifie()
{ modifie = true;
}
/*
*
*/
public boolean estModifie()
{ return modifie;
}
/*
*
*/
public void setNonModifie()
{ modifie = false;
fireTraitementRaffr(new TraitementEvent(this));
}
}