% echo on
clear

%    Informacoes sobre a rede e os dados

numEntradas   = 46;     % Numero de nodos de entrada
numSaidas     = 2;      % Numero de nodos de saida
numTr         = 40000;    %40000;  % Numero de padroes de treinamento
numVal        = 20000;    %20000;  % Numero de padroes de validacao
numTeste      = 10175;  % Numero de padroes de teste

% echo off

%    endereço diretorio
diretorio = 'H:\public_html\redes\replicando\';

%    Abrindo arquivos 
arquivoTreinamento    = fopen(strcat(diretorio,'Treinamento.txt'),'rt');  
arquivoValidacao      = fopen(strcat(diretorio,'Validacao.txt'),'rt');    
arquivoTeste          = fopen(strcat(diretorio,'Teste.txt'),'rt');

% log de erros
arquivoErro = fopen(strcat(diretorio, 'erro.txt'), 'w');
fopen(arquivoErro);

%    Lendo arquivos e armazenando dados em matrizes
dadosTreinamento    = fscanf(arquivoTreinamento,'%f',[(numEntradas + numSaidas), numTr]);   % Lendo arquivo de treinamento
entradasTreinamento = dadosTreinamento(1:numEntradas, 1:numTr);
saidasTreinamento   = dadosTreinamento((numEntradas + 1):(numEntradas + numSaidas), 1:numTr);       

dadosValidacao      = fscanf(arquivoValidacao,'%f',[(numEntradas + numSaidas), numVal]);    % Mesmo processo para validacao
entradasValidacao   = dadosValidacao(1:numEntradas, 1:numVal);
saidasValidacao     = dadosValidacao((numEntradas + 1):(numEntradas + numSaidas), 1:numVal);

dadosTeste          = fscanf(arquivoTeste,'%f',[(numEntradas + numSaidas), numTeste]);      % Mesmo processo para teste
entradasTeste       = dadosTeste(1:numEntradas, 1:numTeste);
saidasTeste         = dadosTeste((numEntradas + 1):(numEntradas + numSaidas), 1:numTeste);

%    Fechando arquivos
fclose(arquivoTreinamento);
fclose(arquivoValidacao);
fclose(arquivoTeste);

%Parametrizando treinamento

numEscondidos = [50,65];   % Numero de nodos escondidos
funcaoAtivacao = {'logsig', 'tansig'}; 
iteracoes = [50000 ,100000]; %, 5000, 7500];
calculoErro = {'mse' }; 
% traingd - grandient descendent backpropagation
% tranindm - Gradient descent with momentum backpropagation
% trainlm - Reduced Memory Levenberg-Marquardt
% trainoss - One spet secant
algoritmoTreinamento = {'traingd', 'traingdm'}; % ,'trainlm'}; 

% learndg - Gradient descent weight and bias learning function
% learngdm - Gradient descent with momentum weight and bias learning function
funcaoAprendizagem = {'learngd', 'learngdm'};
numMaxFalhasValidacao = [15,1000];
taxaAprendizagem = [0.04,0.4];

state_k=1;
state_j=2;
state_x=2;
state_i=2;
state_l=2;
state_f=2;
state_n=2;
state_t=2;

for k = state_k : length(calculoErro)
    for j = state_j : length(iteracoes)
        for x = state_x: length(numMaxFalhasValidacao)
           for i = state_i : length(funcaoAtivacao)
              for l = state_l: length(algoritmoTreinamento)
                  for f = state_f: length(funcaoAprendizagem)
                      for n = state_n : length(numEscondidos)
                          for t = state_t: length(taxaAprendizagem)
                              try
                                arquivoLog = fopen (strcat (diretorio,'log.txt'), 'w');
                                fopen(arquivoLog);
                                f_k = int2str(k);
                                f_j = int2str(j);
                                f_x = int2str(x);
                                f_i = int2str(i);
                                f_l = int2str(l);
                                f_f = int2str(f);
                                f_n = int2str(n);
                                f_t = int2str(t);
                                atual = strcat(f_k, f_j, f_x, f_i, f_l, f_f, f_n, f_t);
                                fprintf(arquivoLog, '%i%i%i%i%i%i%i%i', k,j,x,i,l,f,n,t);
                                fclose(arquivoLog);
                                treinarLikeABoss(diretorio, numEntradas, numSaidas, entradasValidacao,saidasValidacao,entradasTreinamento,saidasTreinamento,entradasTeste,saidasTeste,numTeste,numEscondidos(n), char(funcaoAtivacao(i)), iteracoes(j), char(calculoErro(k)), char(algoritmoTreinamento(l)), char(funcaoAprendizagem(f)), numMaxFalhasValidacao(x), taxaAprendizagem(t), atual)
                              catch ME
                                fprintf(arquivoErro, '%i%i%i%i%i%i%i%i - %s: %s\n',k,j,x,i,l,f,n,t, ME.identifier, ME.message);
                              end
                          end
                          state_t = 1;
                      end
                      state_n = 1;
                  end
                  state_f = 1;
              end
              state_l = 1;
           end
           state_i = 1;
        end 
       state_x = 1;
    end
   state_j = 1;
end
