From b4c345e6a5fa929ba20eac19183b9c777055f52d Mon Sep 17 00:00:00 2001 From: Gaspard Coulet Date: Wed, 28 Apr 2021 23:12:36 +0200 Subject: Initial commit --- Common/fonctions.cpp | 449 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 Common/fonctions.cpp (limited to 'Common/fonctions.cpp') diff --git a/Common/fonctions.cpp b/Common/fonctions.cpp new file mode 100644 index 0000000..16f5348 --- /dev/null +++ b/Common/fonctions.cpp @@ -0,0 +1,449 @@ +#include "fonctions.h" +#include +#include +#include +#include +#include +#include +#include +#include"../Neurone/Neurone.h" +#include"../Neurone/NeuroneB.h" +#include"../Layer/Layer.h" +#include"../Reseau/Reseau.h" +#include"../Common/fonctions.h" +#include"../Settings/Settings.h" + +/** +* Affichage de vecteur DOUBLE +* @method printVec +* @param vec Vecteur à afficher +*/ +void printVec (std::vector vec){ + for (unsigned int i=0;i vec){ + for (unsigned int i=0;i > vec){ + for (unsigned int i=0;i > > vec){ + std::cout<<"<"; + for(unsigned int k =0; k < vec.size();k++){ + std::cout<<"<"; + for (unsigned int i=0;i"; + if ( i != vec[k].size()-1){ + std::cout<<","; + } + } + std::cout<<">"<<(k!=vec.size() ? " ":">")< > getInput(char const * fileName){ + /** + * Counter + */ + std::ifstream in(fileName); + std::string ligne; + int nbLignes = 0; + while(std::getline(in, ligne)){ + nbLignes++; + } + in.close(); + + /** + * Parser + */ + std::ifstream fichier(fileName, std::ios::in); + if(fichier){ + std::vector< std::vector > stock(nbLignes); // Tableau de chaine de caractère qui va contenir tout le fichier ligne par ligne + std::cout << "\033[1;36m file " << "\033[1;31m" << fileName << "\033[1;36m opened with success , nbLignes= " <>ligne; + std::stringstream ss(ligne); + /** strinsplit à partir du caractère ',' */ + while (getline(ss, s, ',')) { + temp = atof(s.c_str()); + stock[j].push_back(temp); + } + } + swapVec(&stock); + fichier.close(); + return stock; + } + else { + std::cerr << "\033[0;31m ERROR [ "<< "Can't open file" << " IN FILE " << __FILE__ << " AT LINE " << __LINE__ << " ] \n \033[0m"; + std::vector< std::vector > stock(nbLignes); + return stock; + } + +} + +/** +* Extraction de la derniére colonne d'un tableau bi-dimensionnel (vecteur de vecteur) +* @method extractResult +* @param input Vecteur de vecteur +*/ +std::vector extractResult(std::vector< std::vector > * input){ + std::vector res(input->size()); + unsigned int pos =((*input)[0].size())-1; + for(unsigned int i=0;isize();i++){ + res[i]=(*input)[i][pos]; + (*input)[i].pop_back(); + } + return res; +} + +/** +* Echange de vecteur aléatoire avec synchronisation +* @method swapVec +* @param input Vecteur de vecteur à échanger +* @param result Autre vecteur à synchroniser +*/ +void swapVec (std::vector > * input, std::vector * result){ + unsigned int r; + for (unsigned int i=0;isize();i++){ + do{ + r = rand()%input->size(); + }while(r == i); + (*input)[i].swap((*input)[r]); + iter_swap(result->begin() + i ,result->begin() + r); + } +} + +/** +* Echange de vecteur aléatoire +* @method swapVec +* @param input Vecteur de vecteur à échanger +*/ +void swapVec (std::vector > * input){ + unsigned int r; + for (unsigned int i=0;isize();i++){ + do{ + r = rand()%input->size(); + }while(r == i); + (*input)[i].swap((*input)[r]); + } +} +unsigned int int_to_int(unsigned k) { + if (k == 0) return 0; + if (k == 1) return 1; /* schlagué */ + return (k % 2) + 10 * int_to_int(k / 2); +} + +/** +* Génération d'entrées pour OU et ET +* @method generateInput +* @param n Nombre d'entrées +* @param estet True si génération de ET sinon False pour OU +*/ +std::vector > generateInput(int n, bool estet){ + int nbtest = (int)pow(2,n); + std::vector< std::vector < double > > testtab(nbtest, std::vector(n,0)); + for (int i =0; i < nbtest; i ++){ + int tmp = i; + tmp = int_to_int(tmp); + for (int j =0; j < n; j ++){ + testtab[i][j]= (tmp/(int)pow(10,n-1-j)==1?1 : 0) ; + tmp = tmp- (testtab[i][j]==1? (int)pow(10,n-1-j): 0); + } + if ( !estet && i > 0){ + testtab[i].push_back(1); + } + else if ( !estet) { + testtab[i].push_back(0); + } + std::cout << "Serie I :"; + for (int k =0; k < n; k ++){ + std::cout< vec){ + double max = vec[0]; + unsigned int indMax=0; + for(unsigned int i=0;imax){ + max=vec[i]; + indMax = i; + } + } + return indMax; +} + +/** +* Récupération d'entrée dans un fichier +* @method getInputUltime +* @param fileName Nom du fichier +* @param pourcentage Pourcentage à récuperer pour le training +*/ +std::vector < std::vector > > getInputUltime(char const * fileName,float pourcentage){ + /** + * Counter + */ + std::ifstream in(fileName); + std::string ligne; + int nbLignes = 0; + while(std::getline(in, ligne)){ + nbLignes++; + } + in.close(); + + /** + * Parser + */ + std::ifstream fichier(fileName, std::ios::in); + if(fichier){ + std::vector< std::vector > stock(nbLignes); // Tableau de chaine de caractère qui va contenir tout le fichier ligne par ligne + std::cout << "\033[1;36m file " << "\033[1;31m" << fileName << "\033[1;36m opened with success , nbLignes= " <>ligne; + std::stringstream ss(ligne); + /** strinsplit à partir du caractère ',' */ + while (getline(ss, s, ',')) { + temp = atof(s.c_str()); + stock[j].push_back(temp); // On stock chaque information dans une case + } + } + swapVec(&stock); + fichier.close(); + int tailleTraining = (int)((pourcentage/100) * nbLignes); + int tailleTesting = nbLignes - tailleTraining; + std::vector< std::vector > > result(2); + for(int i=0;i > > result(2); + return result; + } +} + +/** +* Affichage de l'architecture (cf. PYTHON) +* @method displayArchi +* @param info Vecteur d'information sur l'architecture +*/ +void displayArchi(std::vector info){ + std::string endline = "network.draw()"; + std::string begin = "network = DrawNN( ["; + std::string dyNeuron= " "; + for (unsigned int i = 0; i <= info.size()-2; i++){ + dyNeuron = std::to_string(info[i]) + ","; + begin+=dyNeuron; + } + dyNeuron = std::to_string(info[info.size()-1]); + begin += dyNeuron +"] )"; + system("sed -i '$ d' Archi.py"); + system("sed -i '$ d' Archi.py"); + std::ofstream fichier("Archi.py", std::ios::app); + if(fichier) + { + fichier<< begin <<"\n"; + fichier< archi = (*Settings.getArchi()); + std::cout << "Affichage de l'architecture du reseau, Fermez pour commencer" << std::endl; + if(arch == true){ + displayArchi(archi); + } + system("clear"); + Reseau * rezo = new Reseau(archi.size(),archi,1.0,eta,fct); + std::vector > > trainingettesting = getInputUltime(fileName,80); + std::vector > training = trainingettesting[0]; + std::vector > testing = trainingettesting[1]; + int epoch = ep; + std::vector res(Settings.getDifferentOutputs()->size()); + int temp; + std::vector > > testData(training.size()); + std::cout<< "\033[1;33m"<size();k++){ + std::vector mapVect(Settings.getDifferentOutputs()->size(),0); + std::cout<<(*Settings.getDifferentOutputs())[k]<<" has been mapped to {" ; + for(unsigned int z=0;zsize();j++){ + if(temp==(*Settings.getDifferentOutputs())[j]){ + res[j]=1; + } + else res[j]=0; + } + testData[i] = {training[i],res}; + } + + std::cout << "Learning Starting..."< > expectedRes(testing.size()); + for (unsigned int i = 0; i < testing.size(); i++){ + temp=(int)testing[i][testing[i].size()-1]; + for(unsigned int j=0;jsize();j++){ + if(temp==(*Settings.getDifferentOutputs())[j]){ + res[j]=1; + } + else res[j]=0; + } + expectedRes[i]=res; + } + std::vector result (Settings.getDifferentOutputs()->size()); + int tmp = 0; + int nberr = 0; + int anciennenberr=0; + + for(int i=0;ilearn(testData,gradient); + int deltat = time(NULL) - deb; + + if (auto_off) { + tmp = 0; + nberr = 0; + anciennenberr=0; + for(unsigned int i=0;ifire_all(testing[i]); + std::vector print (Settings.getDifferentOutputs()->size(),0); + print[findIndMax(result)]=1; + anciennenberr=nberr; + bool err = false; + for(unsigned int l =0;l> " << (int)pourcentage << "% | " << i << " epoch | "<< deltat <<" secondes | Error "<< ((float)nberr/tmp)*100 <<"% \r"<< std::flush; + if (((float)nberr/tmp)*100> " << (int)pourcentage << "% | " << i << " epoch | "<< deltat <<" secondes \r"<< std::flush; + } + } + int delta = time(NULL)-deb; + std::cout << "\r\033[1;36m 100% \033[0m"; + std::cout << "<\033[1;33m DONE \033[0m> "<< std::endl; + std::cout << "\033[1;36m Learning Completed \033[0m" << std::endl; + std::cout << "Displaying last recorded weights..." << std::endl; + rezo->printWeight(); + tmp = 0; + nberr = 0; + anciennenberr=0; + + /** Nouveau test avec des valeurs inconnues pour le résaux neuronal */ + for(unsigned int i=0;ifire_all(testing[i]); + std::vector print (Settings.getDifferentOutputs()->size(),0); + print[findIndMax(result)]=1; + anciennenberr=nberr; + bool err = false; + for(unsigned int l =0;l anciennenberr){ + std::cout<< "\033[1;31m /!\\"<<"\033[0m"; + } + std::cout<("<