#include<stdlib.h>
#include<iostream>
using namespace std;
#include<math.h>

#define FORCE 200
#define NB_C1 8
//#define DEBUG

int main(void){
    cout<<"Perceptron"<<endl;
    
    //ensembles d'apprentissage
    float E1[NB_C1][3]={{.5,.6,-1},{.6,.4,-1},{.4,.1,-1},{.6,.5,-1},{.2,.4,1},{.2,.2,1},{.4,.5,1},{.3,.3,1}};

    //initialisation des poids du neurone
    float poids[2]={0.,0.};
    
    //increment d'apprentissage
    float inc=.1;
    float biais=0.;
    
    //autres variables
    int i,j;
    
    //boucle d'apprentissage 
    for(i=0;i<FORCE;i++){    	
        //verification du premier ensemble E1
        for(j=0;j<NB_C1;j++){
            float reponse=E1[j][0]*poids[0]+E1[j][1]*poids[1]+biais;
            float seuil=(reponse>0)?1:-1;
            //si reponse<0 alors mal classé
            if(seuil!=E1[j][2]){
                poids[0]=poids[0]+E1[j][2]*E1[j][0]*inc;
                poids[1]=poids[1]+E1[j][2]*E1[j][1]*inc;
                biais+=inc*E1[j][2];
            }
        }
        #ifdef DEBUG
        cout<<"("<<poids[0]<<"*x";
    	(biais<0)? cout<<"":cout<<"+";
    	cout<<biais<<")/"<<(-1*poids[1])<<", ";
    	#endif
    }
    cout<<
    #ifdef DEBUG 
    endl <<
    #endif
    "  p["<<poids[0]<<","<<poids[1]<<","<<biais<<"]"<<endl;
    cout<<"  droite separatrice : 0=("<<poids[0]<<")*x + ("<<poids[1]<<")*y + ("<<biais<<")"<<endl;
    cout<<"                       y=("<<poids[0]<<"*x";
    (biais<0)? cout<<"":cout<<"+";
    cout<<biais<<")/"<<(-1*poids[1])<<endl;
    cout<<"  Passe par (0, "<<(-biais/poids[1])<<"), et par (1, "<<(-biais-poids[1])/poids[0]<<")"<<endl;
    return 1;   
}

