clear;

nty=500;

% Ler e organizar os dados. Xr é usado para treinamento e Xt é usado para teste!
[Xr,Xt]=furnas;
ycor=reshape(Xt',1,12*8);

% Normalizar os dados!
for mes=1:12
    mu(mes)=mean(Xr(:,mes));
    sigma(mes)=std(Xr(:,mes));
    Xr(:,mes)=(Xr(:,mes)-mu(mes))/sigma(mes);
    Xt(:,mes)=(Xt(:,mes)-mu(mes))/sigma(mes);
end

% Criar matrizes com 24 colunas para facilitar a manipulação dos dados:
% As 12 primeiras colunas correspondem aos dados do ano n e as demais correspondem aos dados do ano n+1;
nr=size(Xr,1); Xr=[[zeros(1,12);Xr(1:nr-1,:)],Xr];  
nt=size(Xt,1); Xt=[[Xr(nr,13:24);Xt(1:nt-1,:)],Xt];

for mes=1:12
   % Gerar os dados para o agrupamento - Data
   clear Data;
   Data=Xr(2:nr,mes+12-3:mes+12);
   nD=size(Data,2)-1;
            
   % Agrupar os dados (criação das regras);
   clear C;
   [C,S]=subclust(Data,0.5);
   nc=size(C,1);
   
   % Imprimir o número de regras de cada mês!
   disp(sprintf('Mes: %2d,Numero de Regras: %2d',mes,nc));
   
   % Calcular o espalhamento das gaussianas;
   vx=sqrt(1./2*S(1:nD));
   vy=sqrt(1./2*S(nD+1));
            
   % Gerando as saídas fundamentais;
   ty=linspace(-5,5,nty);
   clear Y;
   for xi=1:nc
   	  clear y;
          y=gaussbf(ty,C(xi,nD+1),vy)';
          Y(:,xi)=y;
   end
   
   % Recordar os padrões;
   for i=1:nt
   	clear input;
      	input=Xt(i,mes+12-3:mes+12-1);
   	clear fsIFAM;
   	fsIFAM=ones(nty,1);
   	for xi=1:nc
   		fsIFAM=min(fsIFAM,Y(:,xi)+1-gaussbf(input',C(xi,1:nD)',vx'));
	end   
        
   	% Defuzzificação
	yIFAM(i,mes)=sigma(mes)*defuzz(ty,fsIFAM,'centroid')+mu(mes);
   	
		
	if (i==nt)&((mes==1)|(mes==2)|(mes==3)|(mes==4))
	   figure(2);
	   subplot(2,2,mes);
	   plot(sigma(mes)*ty+mu(mes),fsIFAM,...
	      (sigma(mes)*Xt(i,mes+12)+mu(mes))*[1;1],[0;1],'-k',yIFAM(i,mes)*[1;1],[0,1],'--b','Linewidth',1.6);
	   axis([0 3000 0 1])
	   if mes==1
	   	title('Janeiro','FontSize',12); 
	   end
	   if mes==2
	   	title('Fevereiro','FontSize',12);
	   end
	   if mes==3
	   	title('Março','FontSize',12);
	   end
	   if mes==4
	   	title('Abril','FontSize',12);
	   end
	end
	
   end
end
                
% Calculo dos erros
yIFAM=reshape(yIFAM',1,12*nt);

ErroIFAM=[mean((ycor-yIFAM).^2),mean(abs(ycor-yIFAM)),100*mean(abs(ycor-yIFAM)./ycor),100*max(abs(ycor-yIFAM)./ycor)];

% Gerando o gráfico
figure(1); clf;
x=([1:12*8]-1)/12+1991;
plot(x,ycor,'b',x,yIFAM,'--r','Linewidth',1);
legend('Valor Real','Valor Estimado');
print -depsc prevIFAM.eps

% Imprimendo os erros na tela
disp(sprintf('IFAM -- EQM %2.3g, EAM %5.2f, EPM %5.2f, EPmax %5.2f.',ErroIFAM(1),ErroIFAM(2),ErroIFAM(3),ErroIFAM(4)));
