clear all; 
close all; 
clc;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% parametros de entrada %%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%numero de amostras para cada base de dados
amostras_bases=5;

%numero de parametros a trabalhar
num_param=amostras_bases-1;


%numero de condutores a diferenciar
num_condutores=3;


% factor de multiplicação utilizado para descartar dados %valor maximo
% testado para encontar o minimo de combinação é 1.565

%para amostra =4 
% xi_talhada=1.565486;
% xi_salvado=19.87765;
% xi_andre=1.56548;



% para obtenção de um unico valor
 xi_talhada=1;
 xi_salvado=1;
 xi_andre=1; %10


%5,15,20 ->52
%8,15,20->40
%10,15,20->30
%15,15,20->15
%10,15,20->12
%25,15,20->8
%30,15,20->6
%30,20,20->5
%30,25,20->4
%120,25,24->1
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

lin_andre=amostras_bases;
ntt_andre=amostras_bases+1:6;

lin_talhada=amostras_bases;
ntt_talhada=amostras_bases+1:6;

lin_salvado=amostras_bases;
ntt_salvado=amostras_bases+1:6;

% Criar a base de dados para o André

txt_open_andre='parking_andre_base.txt'; 

[Tempo_total_andre,Tempo_1_andre,Tempo_2_andre,Tempo_3_andre,vel_1_2_med_andre,vel_3_4_med_andre,rpm_med_1_2_andre,rpm_med_2_3_andre,rrpm_med_3_4_andre,ang_vel_med_1_2_andre,ang_vel_med_3_4_andre,ang_med_2_3_andre,ang_var_2_3_andre,blink_right_time_andre,c_throtle_l_andre,c_throtle_l_m_andre,c_throtle_m_h_andre,c_throtle_h_andre,count_clutch_andre,c_brake_l_andre,c_brake_m_andre,c_brake_h_andre]=open_data_base(txt_open_andre);

base_andre=[Tempo_total_andre(1:lin_andre),Tempo_1_andre(1:lin_andre),Tempo_2_andre(1:lin_andre),Tempo_3_andre(1:lin_andre),vel_1_2_med_andre(1:lin_andre), vel_3_4_med_andre(1:lin_andre),rpm_med_1_2_andre(1:lin_andre),rpm_med_2_3_andre(1:lin_andre),rrpm_med_3_4_andre(1:lin_andre),ang_vel_med_1_2_andre(1:lin_andre),ang_vel_med_3_4_andre(1:lin_andre),ang_med_2_3_andre(1:lin_andre),ang_var_2_3_andre(1:lin_andre),blink_right_time_andre(1:lin_andre),c_throtle_l_andre(1:lin_andre),c_throtle_l_m_andre(1:lin_andre),c_throtle_m_h_andre(1:lin_andre),c_throtle_h_andre(1:lin_andre),count_clutch_andre(1:lin_andre),c_brake_l_andre(1:lin_andre),c_brake_m_andre(1:lin_andre),c_brake_h_andre(1:lin_andre)];

test_andre=[Tempo_total_andre(ntt_andre),Tempo_1_andre(ntt_andre),Tempo_2_andre(ntt_andre),Tempo_3_andre(ntt_andre),vel_1_2_med_andre(ntt_andre), vel_3_4_med_andre(ntt_andre),rpm_med_1_2_andre(ntt_andre),rpm_med_2_3_andre(ntt_andre),rrpm_med_3_4_andre(ntt_andre),ang_vel_med_1_2_andre(ntt_andre),ang_vel_med_3_4_andre(ntt_andre),ang_med_2_3_andre(ntt_andre),ang_var_2_3_andre(ntt_andre),blink_right_time_andre(ntt_andre),c_throtle_l_andre(ntt_andre),c_throtle_l_m_andre(ntt_andre),c_throtle_m_h_andre(ntt_andre),c_throtle_h_andre(ntt_andre),count_clutch_andre(ntt_andre),c_brake_l_andre(ntt_andre),c_brake_m_andre(ntt_andre),c_brake_h_andre(ntt_andre)];




txt_open_talhada='parking_talhada_base.txt'; 

[Tempo_total_talhada,Tempo_1_talhada,Tempo_2_talhada,Tempo_3_talhada,vel_1_2_med_talhada,vel_3_4_med_talhada,rpm_med_1_2_talhada,rpm_med_2_3_talhada,rrpm_med_3_4_talhada,ang_vel_med_1_2_talhada,ang_vel_med_3_4_talhada,ang_med_2_3_talhada,ang_var_2_3_talhada,blink_right_time_talhada,c_throtle_l_talhada,c_throtle_l_m_talhada,c_throtle_m_h_talhada,c_throtle_h_talhada,count_clutch_talhada,c_brake_l_talhada,c_brake_m_talhada,c_brake_h_talhada]=open_data_base(txt_open_talhada);

base_talhada=[Tempo_total_talhada(1:lin_talhada),Tempo_1_talhada(1:lin_talhada),Tempo_2_talhada(1:lin_talhada),Tempo_3_talhada(1:lin_talhada),vel_1_2_med_talhada(1:lin_talhada), vel_3_4_med_talhada(1:lin_talhada),rpm_med_1_2_talhada(1:lin_talhada),rpm_med_2_3_talhada(1:lin_talhada),rrpm_med_3_4_talhada(1:lin_talhada),ang_vel_med_1_2_talhada(1:lin_talhada),ang_vel_med_3_4_talhada(1:lin_talhada),ang_med_2_3_talhada(1:lin_talhada),ang_var_2_3_talhada(1:lin_talhada),blink_right_time_talhada(1:lin_talhada),c_throtle_l_talhada(1:lin_talhada),c_throtle_l_m_talhada(1:lin_talhada),c_throtle_m_h_talhada(1:lin_talhada),c_throtle_h_talhada(1:lin_talhada),count_clutch_talhada(1:lin_talhada),c_brake_l_talhada(1:lin_talhada),c_brake_m_talhada(1:lin_talhada),c_brake_h_talhada(1:lin_talhada)];

test_talhada=[Tempo_total_talhada(ntt_talhada),Tempo_1_talhada(ntt_talhada),Tempo_2_talhada(ntt_talhada),Tempo_3_talhada(ntt_talhada),vel_1_2_med_talhada(ntt_talhada), vel_3_4_med_talhada(ntt_talhada),rpm_med_1_2_talhada(ntt_talhada),rpm_med_2_3_talhada(ntt_talhada),rrpm_med_3_4_talhada(ntt_talhada),ang_vel_med_1_2_talhada(ntt_talhada),ang_vel_med_3_4_talhada(ntt_talhada),ang_med_2_3_talhada(ntt_talhada),ang_var_2_3_talhada(ntt_talhada),blink_right_time_talhada(ntt_talhada),c_throtle_l_talhada(ntt_talhada),c_throtle_l_m_talhada(ntt_talhada),c_throtle_m_h_talhada(ntt_talhada),c_throtle_h_talhada(ntt_talhada),count_clutch_talhada(ntt_talhada),c_brake_l_talhada(ntt_talhada),c_brake_m_talhada(ntt_talhada),c_brake_h_talhada(ntt_talhada)];




txt_open_salvado='parking_salvado_base.txt';

[Tempo_total_salvado,Tempo_1_salvado,Tempo_2_salvado,Tempo_3_salvado,vel_1_2_med_salvado,vel_3_4_med_salvado,rpm_med_1_2_salvado,rpm_med_2_3_salvado,rrpm_med_3_4_salvado,ang_vel_med_1_2_salvado,ang_vel_med_3_4_salvado,ang_med_2_3_salvado,ang_var_2_3_salvado,blink_right_time_salvado,c_throtle_l_salvado,c_throtle_l_m_salvado,c_throtle_m_h_salvado,c_throtle_h_salvado,count_clutch_salvado,c_brake_l_salvado,c_brake_m_salvado,c_brake_h_salvado]=open_data_base(txt_open_salvado);

base_salvado=[Tempo_total_salvado(1:lin_salvado),Tempo_1_salvado(1:lin_salvado),Tempo_2_salvado(1:lin_salvado),Tempo_3_salvado(1:lin_salvado),vel_1_2_med_salvado(1:lin_salvado), vel_3_4_med_salvado(1:lin_salvado),rpm_med_1_2_salvado(1:lin_salvado),rpm_med_2_3_salvado(1:lin_salvado),rrpm_med_3_4_salvado(1:lin_salvado),ang_vel_med_1_2_salvado(1:lin_salvado),ang_vel_med_3_4_salvado(1:lin_salvado),ang_med_2_3_salvado(1:lin_salvado),ang_var_2_3_salvado(1:lin_salvado),blink_right_time_salvado(1:lin_salvado),c_throtle_l_salvado(1:lin_salvado),c_throtle_l_m_salvado(1:lin_salvado),c_throtle_m_h_salvado(1:lin_salvado),c_throtle_h_salvado(1:lin_salvado),count_clutch_salvado(1:lin_salvado),c_brake_l_salvado(1:lin_salvado),c_brake_m_salvado(1:lin_salvado),c_brake_h_salvado(1:lin_salvado)];

test_salvado=[Tempo_total_salvado(ntt_salvado),Tempo_1_salvado(ntt_salvado),Tempo_2_salvado(ntt_salvado),Tempo_3_salvado(ntt_salvado),vel_1_2_med_salvado(ntt_salvado), vel_3_4_med_salvado(ntt_salvado),rpm_med_1_2_salvado(ntt_salvado),rpm_med_2_3_salvado(ntt_salvado),rrpm_med_3_4_salvado(ntt_salvado),ang_vel_med_1_2_salvado(ntt_salvado),ang_vel_med_3_4_salvado(ntt_salvado),ang_med_2_3_salvado(ntt_salvado),ang_var_2_3_salvado(ntt_salvado),blink_right_time_salvado(ntt_salvado),c_throtle_l_salvado(ntt_salvado),c_throtle_l_m_salvado(ntt_salvado),c_throtle_m_h_salvado(ntt_salvado),c_throtle_h_salvado(ntt_salvado),count_clutch_salvado(ntt_salvado),c_brake_l_salvado(ntt_salvado),c_brake_m_salvado(ntt_salvado),c_brake_h_salvado(ntt_salvado)];


tests_files=[test_talhada;test_salvado;test_andre];

number_descriptors=1:size(base_salvado,2);
group=num_param;
combinations=combnk(number_descriptors,group);
length(combinations)


clc



%responsável pelo processo de mahalanobis e de verificação das variaveis
tic
for tot=1:size(tests_files,1)
     tic
    test_file=tests_files(tot,:);
     
    for n=1:length(combinations) %numero de combinações possiveis 
            

                Y=zeros(1);
                X_tal=zeros(lin_talhada,1);
                X_sal=zeros(lin_salvado,1);
                X_and=zeros(lin_andre,1);
                
                for it_group=1:group
                
                    Y=[Y test_file(combinations(n,it_group))];
                    X_tal=[ X_tal base_talhada(:,combinations(n,it_group))];
                    X_sal=[ X_sal base_salvado(:,combinations(n,it_group))];
                    X_and=[ X_and base_andre(:,combinations(n,it_group))];
                end
                
                Y_test(n,:)=Y(1,2:end);
                X_base_talhada(:,:,n)=X_tal(:,2:end);
                X_base_salvado(:,:,n)=X_sal(:,2:end);
                X_base_andre(:,:,n)=X_and(:,2:end);
                
                result_talhada(n,tot)=mahal(Y_test(n,:),X_base_talhada(:,:,n));
                result_salvado(n,tot)=mahal(Y_test(n,:),X_base_salvado(:,:,n));
                result_andre(n,tot)=mahal(Y_test(n,:),X_base_andre(:,:,n));
        

    end
    
    %parte subjectiva do codido serve unicamente para visualizar os valores minimos para cada ficheiro de teste 
    [val_sal(tot),min_sal(tot)]=min(result_salvado(n,tot));
    [val_tal(tot),min_tal(tot)]=min(result_talhada(n,tot));
    [val_and(tot),min_and(tot)]=min(result_andre(n,tot));
   
    toc
    disp('tempo de analise de um unico ciclo para o presente teste')
     pause(1);
      
    
    %vai buscar as combinações onde o valor do parametro identifica o
    %talhada com um factor de xi vezes menor que os 2 restantes.
    
     %%%%%%%%%%%% Primeira condição %%%%%%%%%%%
    
    %sitios onde o talhada tem valores 
    lim_count=size(tests_files,1)/num_condutores;
    if (tot>=1 && tot<=lim_count) 
            if(tot==1)
                tic
                values_talhada=zeros(1);
                xi_tal=xi_talhada; %situação onde temos parametros com ordem de grandeza superior a xi vezes o nosso valor
                for ti=1:length(combinations)
                    %verificação 
                    if(result_talhada(ti,tot)*xi_tal<result_salvado(ti,tot) && result_talhada(ti,tot)*xi_tal<result_andre(ti,tot) && result_talhada(ti,tot)>0.1 && result_talhada(ti,tot)<50 && result_andre(ti,tot)>0.1 && result_andre(ti,tot)<50 && result_salvado(ti,tot)>0.1 && result_salvado(ti,tot)<50)
                        values_talhada=[values_talhada ti];
                    end

                    if(sum(values_talhada~=0))
                        test_value_tal=values_talhada(2:end);
                    end

                end
                length(test_value_tal);
                toc
                 disp('entrou no tal 1')
                 pause(1)
                
            end
            
           
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            if(tot==2)
                
                values_talhada_2=zeros(1);
                for ti=1:length(test_value_tal)
                         %verificação 
                    if(result_talhada(test_value_tal(tot-1,ti),tot)*xi_tal<result_salvado(test_value_tal(tot-1,ti),tot) && result_talhada(test_value_tal(tot-1,ti),tot)*xi_tal<result_andre(test_value_tal(tot-1,ti),tot)  && result_talhada(test_value_tal(tot-1,ti),tot)>0.1 && result_talhada(test_value_tal(tot-1,ti),tot)<50 && result_andre(test_value_tal(tot-1,ti),tot)>0.1 && result_andre(test_value_tal(tot-1,ti),tot)<50 && result_salvado(test_value_tal(tot-1,ti),tot)>0.1 && result_salvado(test_value_tal(tot-1,ti),tot)<50)
                        values_talhada_2=[values_talhada_2 test_value_tal(tot-1,ti)];
                    end
                end
                %valores que retirei do talhada

                if(sum(values_talhada~=0))
                        talhada_values=values_talhada_2(2:end);
                end

                length(talhada_values);
                disp('entrou no tal 2')
                pause(1)
            end
            
           
    end
   
    %%%%%%%%%%%% Segunda condição %%%%%%%%%%%

    if (tot>=(lim_count)+1 && tot<=lim_count*2 )
            if(tot==(lim_count)+1)

                values_salvado=zeros(1);
                xi_sal=xi_salvado; %situação onde temos parametros com ordem de grandeza superior a xi vezes o nosso valor
                for ti=1:length(combinations)
                    %verificação 
                    if(result_salvado(ti,tot)*xi_sal<result_talhada(ti,tot) && result_salvado(ti,tot)*xi_sal<result_andre(ti,tot) && result_talhada(ti,tot)>0.1 && result_talhada(ti,tot)<50 && result_andre(ti,tot)>0.1 && result_andre(ti,tot)<50 && result_salvado(ti,tot)>0.1 && result_salvado(ti,tot)<50)
                        values_salvado=[values_salvado ti];
                    end

                    if(sum(values_salvado~=0))
                        test_value_sal=values_salvado(2:end);
                    end

                end
                disp('entrou no sal 1')
                pause(1)
                length(test_value_sal);
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            if(tot==(lim_count)+2)
                values_salvado_2=zeros(1);
                for ti=1:length(test_value_sal)
                         %verificação 
                    if(result_salvado(test_value_sal(1,ti),tot)*xi_sal<result_talhada(test_value_sal(1,ti),tot) && result_salvado(test_value_sal(1,ti),tot)*xi_sal<result_andre(test_value_sal(1,ti),tot) && result_talhada(test_value_sal(1,ti),tot)>0.1 && result_talhada(test_value_sal(1,ti),tot)<50 && result_andre(test_value_sal(1,ti),tot)>0.1 && result_andre(test_value_sal(1,ti),tot)<50 && result_salvado(ti,tot)>0.1 && result_salvado(test_value_sal(1,ti),tot)<50)
                        values_salvado_2=[values_salvado_2 test_value_sal(1,ti)];
                    end
                end
                %valores que retirei do talhada

                if(sum(values_salvado~=0))
                        salvado_values=values_salvado_2(2:end);
                end
                disp('entrou no sal 2')
                pause(1)
                length(salvado_values);
            end
            
    end
    
    %%%%%%%%%%% Terceira condição %%%%%%%%%%%%
    
    if (tot>=(lim_count*2)+1 && tot<=(lim_count*3)) 
            if(tot==(lim_count*2)+1)

                values_andre=zeros(1);
                xi_and=xi_andre; %situação onde temos parametros com ordem de grandeza superior a xi vezes o nosso valor
                for ti=1:length(combinations)
                    %verificação 
                    if(result_andre(ti,tot)*xi_and<result_talhada(ti,tot) && result_andre(ti,tot)*xi_and<result_salvado(ti,tot) && result_salvado(ti,tot)>0.1 && result_salvado(ti,tot)<50 && result_talhada(ti,tot)>0.1 && result_talhada(ti,tot)<50 && result_andre(ti,tot)>0.1 && result_andre(ti,tot)<50)
                        values_andre=[values_andre ti];
                    end

                    if(sum(values_andre~=0))
                        test_value_and=values_andre(2:end);
                    end

                end
                length(test_value_and);
                disp('entrou no and 1')
                pause(1)
            end
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            if(tot==(lim_count*2)+2)
                values_andre_2=zeros(1);
                for ti=1:length(test_value_and)
                         %verificação 
                    if(result_andre(test_value_and(1,ti),tot)*xi_and<result_talhada(test_value_and(1,ti),tot) && result_andre(test_value_and(1,ti),tot)*xi_and<result_salvado(test_value_and(1,ti),tot) && result_salvado(test_value_and(1,ti),tot)>0.1 && result_salvado(test_value_and(1,ti),tot)<50 && result_andre(test_value_and(1,ti),tot)>0.1 && result_andre(test_value_and(1,ti),tot)<50 && result_talhada(test_value_and(1,ti),tot)>0.1 && result_talhada(test_value_and(1,ti),tot)<50)
                        values_andre_2=[values_andre_2 test_value_and(1,ti)];
                    end
                end
                %valores que retirei do talhada

                if(sum(values_andre~=0))
                        andre_values=values_andre_2(2:end);
                end
                disp('entrou no and 2')
                pause(1)
                length(andre_values);
            end
            
    end
  
        
end
toc

disp('Em pausa durante 0.5 segundos ...');
pause(0.5)
%

%comparar valores iguais nestes tês vectores


tic



        if( exist('andre_values','var')==0)
            andre_values=test_value_and;
            talhada_values=test_value_tal;
            salvado_values=test_value_sal;
        end
 size(talhada_values,2)
 size(salvado_values,2)
 size(andre_values,2)
 %break;   
 pause(5)
 combinacao_final_1=zeros(1);
    for na=1:size(andre_values,2)
       tic
        for ns=1:size(salvado_values,2)
            for nt=1:size(talhada_values,2)

                if(talhada_values(nt)==salvado_values(ns)==andre_values(na))
                   %combinações possiveis tendo em conta os factores impostos a cima
                   combinacao_final_1=[combinacao_final_1 talhada_values(nt)];
                   
                   
                end

            end


        end
        toc
        sprintf('valor da iteração é : %d  / %d', na, size(andre_values,2))      
    end
toc
disp('tempo para encontrar as combinações testasdas para cada um dois condutores')
pause(1)
if (size(combinacao_final_1,2)~=0)
    combinacao_final=combinacao_final_1(1,2:end);
    
    %ciclo para mostar as combinações
    for ni=1:size(combinacao_final,2)
        combinations(combinacao_final(:,ni),:)
    end
    

    combinacao_final
    size(combinacao_final,2)    
    
else
    clc
    disp('Tente usar valores mais baixos de pois não teve sorte com os que esconheu')
    disp('Experimente baixar os valores de xi')
end

%%


% verificar as combinações escolhidas

%talhada
  
% 
% for tott=1:size(tests_files,1) %neste caso são 3 ficheiros de teste
%      
%     test_file=tests_files(tott,:); % ficheiro a testar
%              
%     
%     for n=1:length(combinacao_final) %numero de combinações escolhidas
% 
% 
%                     Y_ls=zeros(1);
%                     X_tal_ls=zeros(lin_talhada,1);
%                     X_sal_ls=zeros(lin_salvado,1);
%                     X_and_ls=zeros(lin_andre,1);
% 
%                     for it_group_ls=1:size(combinations(n,:),2) % numero de parametros
% 
%                         Y_ls=[Y_ls test_file(combinations(combinacao_final(n)))];
%                         
%                         X_tal_ls=[ X_tal_ls base_talhada(:,combinations(combinacao_final(n),it_group_ls))];
%                         X_sal_ls=[ X_sal_ls base_salvado(:,combinations(combinacao_final(n),it_group_ls))];
%                         X_and_ls=[ X_and_ls base_andre(:,combinations(combinacao_final(n),it_group_ls))];
%                     end
% 
%                     Y_test_ls(n,:)=Y_ls(1,2:end);
%                     X_base_talhada_ls(:,:,n)=X_tal_ls(:,2:end);
%                     X_base_salvado_ls(:,:,n)=X_sal_ls(:,2:end);
%                     X_base_andre_ls(:,:,n)=X_and_ls(:,2:end);
% 
%                     result_talhada_ls(n,tott)=mahal(Y_test_ls(n,:),X_base_talhada_ls(:,:,n));
%                     result_salvado_ls(n,tott)=mahal(Y_test_ls(n,:),X_base_salvado_ls(:,:,n));
%                     result_andre_ls(n,tott)=mahal(Y_test_ls(n,:),X_base_andre_ls(:,:,n));
% 
% 
%      end
%     
%      
%     
%      
%      
% end

for ti=1:length(combinacao_final)
    for total=1:size(tests_files,1)
       
    sprintf('Valor para o teste %d e id->%d  talhada %f -> salvado %f  -> andre %f', total,combinacao_final(ti),result_talhada_ls(ti,total),result_salvado_ls(ti,total),result_andre_ls(ti,total))  
    
%     if(total==1 &&  result_talhada_ls(total)<result_andre_ls(total) && result_talhada_ls(total)<result_salvado_ls(total))
%         disp('talhada é menor')
%     end
%     
%      if(total==2 &&  result_salvado_ls(total)<result_andre_ls(total) && result_salvado_ls(total)<result_talhada_ls(total))
%         disp('salvado é menor')
%     end
%     
%      if(total==3 &&  result_andre_ls(total)<result_talhada_ls(total) && result_andre_ls(total)<result_salvado_ls(total))
%         disp('andre é menor')
%     end
    end
end
%%







%%

% Ŝe o teste for do talhada


[val_sal,min_sal]=min(result_salvado);
[val_tal,min_tal]=min(result_talhada);
[val_and,min_and]=min(result_andre);

