package GUI;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import parser.Chargeur;
import fonctions.Heaviside;
import fonctions.Sigmoide;
import nets.Couche;
import nets.Neurone;
import nets.ReseauFF;
public class GestionReseau {
private ReseauFF reseau;
private Neurone neurone_courant;
private ConteneurSchema conteneur_schema;
private ConteneurNeurone conteneur_neurone;
private StatBars conteneur_caracteristiques;
private ConteneurReconnaissance conteneur_reconnaissance;
private int largeur_images;
private int partie; // 0 == calcul, 1 == propagation_erreur, 2 == recalcul
private int sequence_courante;
private int image_courante;
private ArrayList<ArrayList<ArrayList<Double>>> vecteur_sequences;
private ArrayList<ArrayList<Double>> vecteur_reconnaissances;
private boolean infos;
private Neurone neurone_visu;
private ZFenetre zFen;
private ConteneurLecture conteneur_lecture;
private boolean afficher_reconnaissance;
public GestionReseau(){
vecteur_sequences = new ArrayList<ArrayList<ArrayList<Double>>>();
vecteur_reconnaissances = new ArrayList<ArrayList<Double>>();
}
public Neurone getCourant() {
return neurone_courant;
}
public Neurone getVisu() {
return neurone_visu;
}
public Neurone setVisu(Neurone n) {
return neurone_visu = n;
}
public void avancerSequence(){
sequence_courante++;
image_courante = -1;
avancerImage();
}
private void avancerImage() {
partie = 0;
image_courante++;
reseau.input(vecteur_sequences.get(sequence_courante).get(image_courante));
reseau.ini_iterateur_neurone();
conteneur_schema.setImage(vecteur_sequences.get(sequence_courante).get(image_courante));
}
public boolean suivant() {
Neurone ancien;
conteneur_caracteristiques.repaint();
if(partie == 0) {
if(neurone_courant == null)
avancerSequence();
if(!reseau.hasNext_neurone()) {
if(reseau.apprendre_forme(sequence_courante)) {
if(infos)
JOptionPane.showMessageDialog(null,"Il n'y a pas besoin de correction !","",JOptionPane.INFORMATION_MESSAGE);
if(vecteur_sequences.get(sequence_courante).size()-1 != image_courante)
avancerImage();
else if(vecteur_sequences.size()-1 != sequence_courante)
avancerSequence();
else {
return false;
}
suivant();
}
else {
if(infos)
JOptionPane.showMessageDialog(null,"Il y a besoin d'une correction !","",JOptionPane.WARNING_MESSAGE);
reseau.ini_iterateurInv_neurone();
partie = 1;
suivant();
}
}
else
{
ancien = neurone_courant;
neurone_courant = reseau.update_neurone();
conteneur_schema.suivant(ancien, neurone_courant);
}
}
else if(partie == 1) {
if(!reseau.hasNext_neurone()) {
if(infos)
JOptionPane.showMessageDialog(null,"Recalcul des poids","",JOptionPane.INFORMATION_MESSAGE);
partie = 2;
reseau.ini_iterateur_neurone();
suivant();
}
else {
ancien = neurone_courant;
neurone_courant = reseau.propagation_neurone();
conteneur_schema.suivant(ancien, neurone_courant);
}
}
else if(partie == 2) {
if(!reseau.hasNext_neurone()) {
if(infos)
JOptionPane.showMessageDialog(null,"Image suivante","",JOptionPane.INFORMATION_MESSAGE);
if(vecteur_sequences.get(sequence_courante).size()-1 != image_courante)
avancerImage();
else if(vecteur_sequences.size()-1 != sequence_courante)
avancerSequence();
else {
return false;
}
suivant();
}
else{
ancien = neurone_courant;
neurone_courant = reseau.correctionPoids_neurone();;
conteneur_schema.suivant(ancien, neurone_courant);
}
}
return true;
}
public boolean fin(){
if(vecteur_sequences.size()-1 == sequence_courante
&& vecteur_sequences.get(sequence_courante).size()-1 == image_courante
&& !reseau.hasNext_neurone()
&& (partie==2 || partie==0 && reseau.apprendre_forme(sequence_courante)))
{
conteneur_reconnaissance.set();
afficher_reconnaissance = true;
// conteneur_reconnaissance.repaint();
return true;
}
return false;
}
public boolean changementSequence(){
return changementImage() && image_courante == 0;
}
public boolean changementImage() {
return neurone_courant != null
&& neurone_courant.getIndiceCouche() == 1
&& neurone_courant.getIndiceNeurone()== 0
&& partie == 0;
}
public ReseauFF getReseau() {
return reseau;
}
public void chargerFichierXML() {
/* recup�re le fichier */
File jf = zFen.chargerFileChooser();
if(jf != null) {
XMLReader xr = null;
try {
xr = XMLReaderFactory.createXMLReader();
} catch (SAXException e) {
e.printStackTrace();
}
Chargeur handler = new Chargeur();
xr.setContentHandler(handler);
xr.setErrorHandler(handler);
FileReader r;
try {
r = new FileReader(jf);
try {
xr.parse(new InputSource(r));
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
/* initialise le reseau */
reseau = handler.getReseau();
/*
for(int i=0;i<reseau.getNbCouchesCachees()+2;i++) {
System.out.println(i+" : "+reseau.getTaillecouche(i));
for(int j=0;j<reseau.getTaillecouche(i);j++) {
System.out.println(" "+j+" : "+reseau.get(i).get(j).getIndiceNeurone()+" - "+reseau.get(i).get(j).getIndiceCouche());
}
}*/
largeur_images = handler.getColonne();
//System.out.println(largeur_images);
vecteur_sequences = handler.getVecteur_sequences_appr();
vecteur_reconnaissances = handler.getVecteur_sequences_reco();
/*
for(int i=0; i<vecteur_sequences.size();i++) {
System.out.println(i+" : "+vecteur_sequences.get(i).size());
for(int j=0; j<vecteur_sequences.get(i).size();j++) {
System.out.println(" "+ j +" : "+vecteur_sequences.get(i).get(j).size());
for(int k=0; k<vecteur_sequences.get(i).get(j).size();k++) {
System.out.println(" "+ k +" : "+vecteur_sequences.get(i).get(j).get(k));
}
}
}*/
init();
}
}
public void init(){
afficher_reconnaissance = false;
image_courante = -1;
sequence_courante = -1;
neurone_courant = null;
neurone_visu = null;
partie = 0;
conteneur_schema.set();
conteneur_lecture.set();
conteneur_neurone.set();
conteneur_neurone.repaint();
conteneur_schema.repaint();
conteneur_lecture.repaint();
conteneur_reconnaissance.repaint();
conteneur_caracteristiques.repaint();
suivant();
}
@SuppressWarnings("serial")
public void chargerReseauDefaut() {
zFen.charger();
reseau = new ReseauFF(15);
reseau.add(new Couche (15,new Sigmoide()));
reseau.add(new Couche (18,new Sigmoide()));
reseau.add(new Couche (9,new Sigmoide()));
largeur_images = 3;
vecteur_sequences.clear();
ArrayList<ArrayList<Double>> vecteur_images1 = new ArrayList<ArrayList<Double>>();
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images1.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_sequences.add(vecteur_images1);
ArrayList<ArrayList<Double>> vecteur_images2 = new ArrayList<ArrayList<Double>>();
vecteur_images2.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images2.add(new ArrayList<Double> () {{ add(-1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_images2.add(new ArrayList<Double> () {{ add(-1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0);;};});
vecteur_sequences.add(vecteur_images2);
vecteur_reconnaissances.clear();
vecteur_reconnaissances.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(1.0);;};});
vecteur_reconnaissances.add(new ArrayList<Double> () {{ add(1.0); add(1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(-1.0); add(-1.0); add(1.0); add(1.0); add(-1.0); add(1.0); add(1.0); add(1.0); add(1.0);;};});
reseau.add(new Couche (vecteur_sequences.size(),new Heaviside(-1,1)));
/*
for(int i=0;i<reseau.getNbCouchesCachees()+2;i++) {
System.out.println(i+" : "+reseau.getTaillecouche(i));
}*/
/*
for(int i=0;i<reseau.getNbCouchesCachees()+2;i++) {
System.out.println(i+" : "+reseau.getTaillecouche(i));
for(int j=0;j<reseau.getTaillecouche(i);j++) {
System.out.println(" "+j+" : "+reseau.get(i).get(j));
}
}
*/
init();
}
public int getLargeurImage() {
return largeur_images;
}
public void setPanSchema(ConteneurSchema panSchema) {
conteneur_schema = panSchema;
}
public void setPanNeurone(ConteneurNeurone panNeurone) {
conteneur_neurone = panNeurone;
}
public void setPanCaracteristiques(StatBars panCarac) {
conteneur_caracteristiques = panCarac;
}
public void setPanReconnaissance(ConteneurReconnaissance panReconnaissance) {
conteneur_reconnaissance = panReconnaissance;
}
public void setPanLecture(ConteneurLecture panLecture) {
conteneur_lecture = panLecture;
}
public void setPanFenetre(ZFenetre panFenetre) {
zFen = panFenetre;
}
public void setInfos(boolean b) {
infos = b;
}
public void invInfos() {
infos = !infos;
}
public int getPartie(){
return partie;
}
public ArrayList<ArrayList<Double>> getReconnaissance() {
return vecteur_reconnaissances;
}
public boolean getInfos() {
return infos;
}
public void golast() {
boolean temp = getInfos();
setInfos(false);
suivant();
while(!fin() && suivant());
setInfos(temp);
}
public void nextseq() {
boolean temp = getInfos();
setInfos(false);
suivant();
while(!fin() && !changementSequence())
suivant();
setInfos(temp);
}
public void nextimg() {
boolean temp = getInfos();
setInfos(false);
suivant();
while(!fin() && !changementImage())
suivant();
setInfos(temp);
}
public ArrayList<ArrayList<ArrayList<Double>>> getVecteurSequence() {
return vecteur_sequences;
}
public int getSequenceCourante() {
return sequence_courante;
}
public int getImageCourante() {
return image_courante;
}
public boolean getAfficherReconnaissance() {
return afficher_reconnaissance;
}
}