% Rede neural para o reconhecimento de padroes (10 digitos)
alfa = 1;
limiar = 0.5;
ciclo = zeros(10,1);
w = zeros(10,25);
b = zeros(10,1);
y = zeros(10,10);

zero = [  -1  1  1  1 -1 
          -1  1 -1  1 -1
          -1  1 -1  1 -1 
          -1  1 -1  1 -1 
          -1  1  1  1 -1 ];
t0 = [ 1
      -1
      -1
      -1
      -1 
      -1
      -1
      -1
      -1
      -1
        ]; 

um = [ -1  1  1 -1 -1 
       -1 -1  1 -1 -1
       -1 -1  1 -1 -1 
       -1 -1  1 -1 -1 
       -1 -1  1 -1 -1 ];
t1 = [-1
       1
      -1
      -1
      -1 
      -1
      -1
      -1
      -1
      -1 ];

dois = [ -1  1  1  1 -1 
         -1 -1 -1  1 -1
         -1  1  1  1 -1 
         -1  1 -1 -1 -1 
         -1  1  1  1 -1 ];
t2 = [-1
      -1
       1
      -1
      -1 
      -1
      -1
      -1
      -1
      -1 ];

tres = [ -1  1  1  1 -1 
         -1 -1 -1  1 -1
         -1  1  1  1 -1 
         -1 -1 -1  1 -1 
         -1  1  1  1 -1 ];
t3 = [-1
      -1
      -1
       1
      -1 
      -1
      -1
      -1
      -1
      -1 ];
      
quatro = [-1  1 -1  1 -1 
          -1  1 -1  1 -1
          -1  1  1  1 -1 
          -1 -1 -1  1 -1 
          -1 -1 -1  1 -1 ];
t4 = [-1
      -1
      -1
      -1
       1 
      -1
      -1
      -1
      -1
      -1 ];

cinco = [ -1  1  1  1 -1 
          -1  1 -1 -1 -1
          -1  1  1  1 -1 
          -1 -1 -1  1 -1 
          -1  1  1  1 -1 ];
t5 = [-1
      -1
      -1
      -1
      -1 
       1
      -1
      -1
      -1
      -1 ];

seis = [  -1  1  1  1 -1 
          -1  1 -1 -1 -1
          -1  1  1  1 -1 
          -1  1 -1  1 -1 
          -1  1  1  1 -1 ];
t6 = [-1
      -1
      -1
      -1
      -1 
      -1
       1
      -1
      -1
      -1 ];


sete = [  -1  1  1  1 -1 
          -1  1 -1  1 -1
          -1 -1 -1  1 -1 
          -1 -1 -1  1 -1 
          -1 -1 -1  1 -1 ];
t7 = [-1
      -1
      -1
      -1
      -1 
      -1
      -1
       1
      -1
      -1 ];
      
oito = [  -1  1  1  1 -1 
          -1  1 -1  1 -1
          -1  1  1  1 -1 
          -1  1 -1  1 -1 
          -1  1  1  1 -1 ];
t8 = [-1
      -1
      -1
      -1
      -1 
      -1
      -1
      -1
       1
      -1 ];      


nove = [  -1  1  1  1 -1 
          -1  1 -1  1 -1
          -1  1  1  1 -1 
          -1 -1 -1  1 -1 
          -1  1  1  1 -1 ];
t9 = [-1
      -1
      -1
      -1
      -1 
      -1
      -1
      -1
      -1
       1 ];      
            
      
x = [  reshape(zero,[1,25])         % matriz de entrada
       reshape(um,[1,25])
       reshape(dois,[1,25])
       reshape(tres,[1,25])
       reshape(quatro,[1,25])
       reshape(cinco,[1,25])
       reshape(seis,[1,25])
       reshape(sete,[1,25])
       reshape(oito,[1,25])
       reshape(nove,[1,25])];
   
t = [ t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 ];

% Treinamento 

for n = 1:10
    erro = 1;
    while erro == 1;
        ciclo(n) = ciclo(n) + 1;
        for m = 1:10
            soma = 0;
            for entrada = 1:25
                soma = soma + x(m,entrada) * w(n,entrada);
            end
            yliq = soma + b(n);
            if yliq >= limiar
                y(m,n) = 1;
            else
                y(m,n) = -1;
            end
            if y(m,n) ~= t(m,n)
                for entrada = 1:25
                    w(n,entrada) = w(n,entrada) + (alfa * t(m,n) * x(m,entrada));
                end
                b(n) = b(n) + alfa * t(m,n);    
            else
                erro = 0;   
            end
        end
        
% Limite de numero de vezes que o treinamento podera ser realizado 
if ciclo(n) == 100
    disp('erro');
    break
end

for m = 1:10
    if y(m,n) ~= t(m,n)
        erro = 1;
        break;
    end
end 
    end   
end

% Teste

num  = [  -1  1  1  1 -1 
          -1  1 -1  1 -1 
          -1 -1 -1  1 -1
          -1 -1 -1  1 -1 
          -1 -1 -1  1 -1 ];

teste = [ reshape(num,[1,25]) ];

yteste = zeros(10,1);

for n = 1:10  
    soma = 0;
    for entrada = 1:25
        soma = soma + teste(entrada) * w(n,entrada);
    end
    yliq = soma + b(n);
        
    if yliq >= limiar
        yteste(n) = 1;
    else
        yteste(n) = -1;
    end        
end

rec = 0;

for n = 1:10
    if yteste(n) == 1
        rec = rec+1;
        nao_rec = n-1;
    end
end

disp('Teste concluido.');

if rec == 1
    disp('O digito reconhecido pela rede e:', nao_rec);
else
    disp('O digito nao pode ser reconhecido pela rede!', nao_rec);
end
