package parser;
import java.util.ArrayList;
import nets.Couche;
import nets.ReseauFF;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import fonctions.Fonction;
import fonctions.Heaviside;
import fonctions.Identite;
import fonctions.Sigmoide;
public class Chargeur extends DefaultHandler {
// Declaration des variables locales
double nbneurones;
static double eta;
double pixel;
String fonction;
int taille, ligne, colonne;
ReseauFF reseau;
Couche input, cc1, cc2, cc3, cc4, cc5, output;
ArrayList<Double> image_courante = new ArrayList<Double>();
ArrayList<ArrayList<Double>> seq_courante = new ArrayList<ArrayList<Double>>();
ArrayList<ArrayList<ArrayList<Double>>> vecteur_sequences_appr = new ArrayList<ArrayList<ArrayList<Double>>>() ;
ArrayList<ArrayList<Double>> vecteur_sequences_reco = new ArrayList<ArrayList<Double>>();
public Chargeur () {
super();
}
public void startDocument () {
System.out.println("Start of document");
System.out.println();
}
public void endDocument () {
System.out.println("End document");
}
public void startElement (String uri, String name,
String qName, Attributes atts){
if ("input".equals(name)){
vecteur_sequences_appr.clear();//RAZ
}
if ("categorie".equals(name)){
ArrayList<ArrayList<Double>> seq = new ArrayList<ArrayList<Double>>();
seq_courante = seq;//RAZ
//String nom = atts.getValue(0);
//int id = Integer.valueOf(atts.getValue(1));
}
if ("image".equals(name)){
ArrayList<Double> image = new ArrayList<Double>();
image_courante = image;
}
if ("imagereco".equals(name)){
ArrayList<Double> imagereco = new ArrayList<Double>();
image_courante = imagereco;
}
if ("taille".equals(name)){
ligne = Integer.valueOf(atts.getValue(0)).intValue();
colonne = Integer.valueOf(atts.getValue(1)).intValue();
}
if ("pixel".equals(name)){
pixel = Double.valueOf(atts.getValue(0)).doubleValue();
}
if ("couchcach1".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("couchcach2".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("couchcach3".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("couchcach4".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("couchcach5".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("output".equals(name)){
nbneurones = Double.valueOf(atts.getValue(0)).doubleValue();
fonction = atts.getValue(1);
}
if ("reco".equals(name)){
vecteur_sequences_reco.clear();
}
if ("eta".equals(name)){
eta = Double.valueOf(atts.getValue(0)).doubleValue();
}
if (name != "pixel"){
System.out.println("Start of element: "+ name);
System.out.println();
}
}
public void endElement (String uri, String name, String qName)
{
if ("taille".equals(name)){
taille = ligne * colonne;
System.out.println("- taille = "+taille);
}
if ("pixel".equals(name)){
image_courante.add(pixel);//Construction image
//System.out.println("- Valeur du pixel = "+pixel);
}
if ("image".equals(name)){
seq_courante.add(image_courante);//Construction sequence
// Affichage de l'image ajoute
System.out.println("On a ajoute l'image suivante");
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
if (image_courante.get(j+i*3) == -1.0)
System.out.print(". ");
if (image_courante.get(j+i*3) == 1.0)
System.out.print("# ");
}
System.out.println();
}
}
if ("categorie".equals(name)){
vecteur_sequences_appr.add(seq_courante);//Construction liste de sequence
// Affichage de la sequence ajoutee
System.out.println("On a ajoute la categorie contenant les images suivantes");
int k;
for(k=0;k<seq_courante.size();k++){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
if (seq_courante.get(k).get(j+i*3) == -1.0)
System.out.print(". ");
if (seq_courante.get(k).get(j+i*3) == 1.0)
System.out.print("# ");
}
System.out.println();
}
System.out.println();
}
}
if ("imagereco".equals(name)){
vecteur_sequences_reco.add(image_courante);
}
if ("input".equals(name)){
//Affichage des sequences d'apprentissage ajoutees
System.out.println("On a ajoute le vecteur contenant les sequences suivantes classées par categorie");
int l;
for(l=0;l<vecteur_sequences_appr.size();l++){
System.out.println("Categorie n°"+l+":");
int k;
for(k=0;k<vecteur_sequences_appr.get(l).size();k++){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
if (vecteur_sequences_appr.get(l).get(k).get(j+i*3) == -1.0)
System.out.print(". ");
if (vecteur_sequences_appr.get(l).get(k).get(j+i*3) == 1.0)
System.out.print("# ");
}
System.out.println();
}
System.out.println();
}
}
}
if ("reco".equals(name)){
// Affichage de la sequence ajoutee
System.out.println("On a ajoute la categorie contenant les images suivantes");
int k;
for(k=0;k<vecteur_sequences_reco.size();k++){
int i;
for(i=0;i<ligne;i++){
int j;
for(j=0;j<colonne;j++){
if (vecteur_sequences_reco.get(k).get(j+i*3) == -1.0)
System.out.print(". ");
if (vecteur_sequences_reco.get(k).get(j+i*3) == 1.0)
System.out.print("# ");
}
System.out.println();
}
System.out.println();
}
}
if ("couchcach1".equals(name)){
int n = calcul_nbneurones(colonne,taille,nbneurones);
Fonction f = reco_fct(fonction);
cc1 = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche cachee n°1 = "+fonction);
System.out.println("- Nombre de neurones de la couche cachee n°1 = "+n);
}
if ("couchcach2".equals(name)){
int n = calcul_nbneurones(colonne,taille,nbneurones);
Fonction f = reco_fct(fonction);
cc2 = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche cachee n°2 = "+fonction);
System.out.println("- Nombre de neurones de la couche cachee n°2= "+n);
}
if ("couchcach3".equals(name)){
int n = calcul_nbneurones(colonne,taille,nbneurones);
Fonction f = reco_fct(fonction);
cc3 = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche cachee n°3 = "+fonction);
System.out.println("- Nombre de neurones de la couche cachee n°3 = "+n);
}
if ("couchcach4".equals(name)){
int n = calcul_nbneurones(colonne,taille,nbneurones);
Fonction f = reco_fct(fonction);
cc4 = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche cachee n°4 = "+fonction);
System.out.println("- Nombre de neurones de la couche cachee n°4 = "+n);
}
if ("couchcach5".equals(name)){
int n = calcul_nbneurones(colonne,taille,nbneurones);
Fonction f = reco_fct(fonction);
cc5 = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche cachee n°5 = "+fonction);
System.out.println("- Nombre de neurones de la couche cachee n°5 = "+n);
}
if ("output".equals(name)){
int n = vecteur_sequences_appr.size();
Fonction f = reco_fct(fonction);
output = new Couche(n,f);
System.out.println("- Fonction d'activation de la couche de sortie = "+fonction);
System.out.println("- Nombre de neurones de la couche de sortie = "+n);
}
if ("eta".equals(name)){
System.out.println("- eta = "+eta);
}
if ("reseau".equals(name)){
reseau = new ReseauFF(taille,eta);
if (cc1 != null){
reseau.add(cc1);
if (cc2 != null){
reseau.add(cc2);
if (cc3 != null){
reseau.add(cc3);
if (cc4 != null){
reseau.add(cc4);
if (cc5 != null){
reseau.add(cc5);
}
}
}
}
}
reseau.add(output);
}
// Affichage du parsage
if (name != "pixel" ){ // trop lourd pour les pixels
System.out.println();
System.out.println("End of element: "+name);
System.out.println();
}
}
public int getColonne() {
return colonne;
}
public void setColonne(int colonne) {
this.colonne = colonne;
}
public static double getEta() {
return eta;
}
public static void setEta(double eta) {
Chargeur.eta = eta;
}
public ReseauFF getReseau() {
return reseau;
}
public void setReseau(ReseauFF reseau) {
this.reseau = reseau;
}
public ArrayList<ArrayList<ArrayList<Double>>> getVecteur_sequences_appr() {
return vecteur_sequences_appr;
}
public void setVecteur_sequences_appr(
ArrayList<ArrayList<ArrayList<Double>>> vecteurSequencesAppr) {
vecteur_sequences_appr = vecteurSequencesAppr;
}
public ArrayList<ArrayList<Double>> getVecteur_sequences_reco() {
return vecteur_sequences_reco;
}
public void setVecteur_sequences_reco(
ArrayList<ArrayList<Double>> vecteurSequencesReco) {
vecteur_sequences_reco = vecteurSequencesReco;
}
public void characters (char ch[], int start, int length)
{/*
System.out.print("Characters: \"");
for (int i = start; i < start + length; i++) {
switch (ch[i]) {
case '\\':
System.out.print("\\\\");
break;
case '"':
System.out.print("\\\"");
break;
case '\n':
System.out.print("\\n");
break;
case '\r':
System.out.print("\\r");
break;
case '\t':
System.out.print("\\t");
break;
default:
System.out.print(ch[i]);
break;
* @param fct le nom de la fonction
}
}
System.out.print("\"\n");*/
}
/**
* Retourne une fonction a partir d'une chaine de caractere
* @param fct le nom de la fonction
* @return la fonction
*/
public Fonction reco_fct (String fct){
if("heaviside".equals(fct)){
Fonction f = new Heaviside(-1,1);
return f;
}
if("sigmoide".equals(fct)){
Fonction f = new Sigmoide();
return f;
}
if("identite".equals(fct)){
Fonction f = new Identite();
return f;
}
else
return null;
}
/**
* Retourne un nombre de neurones multiple de la largeur
* @param colonne est la largeur de l'image
* @param taille est le nombre de neurones d'entree
* @param nbneurones est le pourcentage de neurones sur la couche
* @return un nombre de neurones multiple de la largeur
*/
public int calcul_nbneurones(int colonne,int taille,double nbneurones){
int n = (int) (taille * nbneurones);
int reste = n % colonne;
if (reste == 0)
return n;
else
return n-reste;
}
}