% 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);


%   Criando a rede (para ajuda, digite 'help newff')
for entrada = 1 : numEntradas;  % Cria 'matrizFaixa', que possui 'numEntradas' linhas, cada uma sendo igual a [0 1].
     matrizFaixa(entrada,:) = [0 1];  
end

%Parametrizando treinamento

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

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

state_i = 1;

for i = state_i : length(numEscondidos)
    for qtd = 0 : 10
        try
			arquivoLog = fopen (strcat (diretorio,'log.txt'), 'w');
			fopen(arquivoLog);
			f_i = int2str(i);
			f_qtd = int2str(qtd);
			atual = strcat(f_i, f_qtd);
			fprintf(arquivoLog, '%i%i', i,qtd);
			fclose(arquivoLog);
			treinarLikeABoss(diretorio, matrizFaixa, numSaidas, entradasValidacao,saidasValidacao,entradasTreinamento,saidasTreinamento,entradasTeste,saidasTeste,numTeste,numEscondidos(i), char(funcaoAtivacao(i)), iteracoes(i), char(calculoErro(i)), char(algoritmoTreinamento(i)), char(funcaoAprendizagem(i)), numMaxFalhasValidacao(i), taxaAprendizagem(i), atual)
		catch ME
		fprintf(arquivoErro, '%i%i - %s: %s\n',i,qtd, ME.identifier, ME.message);
        end
    end
end
