clear all; 
close all; 
clc;

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

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

%numero de parametros a trabalhar(arranjos)
num_param=3;
%percentagem de variancia em relação á media
percentagem=0.14


%numero de condutores a diferenciar
num_condutores=3;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

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





base_talhada;
base_salvado;
base_andre;

% fazer a média de todos os parametros da base de dados, e em seguida comparar com todos os valores  
    
    med_base_talhada=mean(base_talhada);
    med_base_salvado=mean(base_salvado);
    med_base_andre=mean(base_andre);
    
    med_base_total=[med_base_talhada; med_base_salvado; med_base_andre];
    %med_base_total=[base_talhada;base_salvado;base_andre];

    
    %normalizar todas as colunas
    max_base=max(med_base_total);
    
    for ni=1:size(med_base_total,1)
        med_base_total_final(ni,:)=med_base_total(ni,:)./max_base;
    end
    
    
    
    med_base_total
   
    max_base
    med_base_total_final
    clc
    choice_param_var=var(med_base_total_final,0)
      
  % Fazer uma percentagem de variancia em relação à média
     
  var_1=0;
  for ni=1:size(choice_param_var,2) % numero de colunas de parametros a compara com a média de valores obtidos
            
          if(choice_param_var(ni)>percentagem)
            var_1=[var_1 ni];
          end
  end
    varia=var_1(2:end)
    


%descartei parametros com uma variancia inferior a 1/4 o valor da média
%varia=[4 7 8 14 18 21 22];

% var=[18 21 22];
% var=[14 18 21 4];
% var=[4 8 18 22];
vectors=combnk(varia,num_param);


    
    combinations=0;
    for fin=1:size(vectors,1) %para cada combinação
        verifica_cond_1=0;
        verifica_cond_2=0;  
        
        var_f=vectors(fin,:); %escolha de uma combinação
        
              
              
              %contrução das variaveis a testar
            for s=1:size(var_f,2) % desta variavel temos de fazer a média para cada coluna!
                med_base_and(s)=mean(base_andre(:,var_f(s))); %vai à posição s di vector linha var e em seguida escolhe a coluna na matriz de base_andre e faz a média
                med_base_sal(s)=mean(base_salvado(:,var_f(s))) ; 
                med_base_tal(s)=mean(base_talhada(:,var_f(s)));
                tests_var(:,s)=tests_files(:,var_f(s)); %vai buscar aos ficheiro de testes a coluna correspondente a cada uma das variaveis
            end
              
              %utilização do algoritmo de euclides
            for test=1:size(tests_files,1) %escolha de um teste 
                test_now=tests_var(test,:); %teste numero 1

                euclides_tal(test,fin)=pdist2(med_base_tal,test_now);
                euclides_and(test,fin)=pdist2(med_base_and,test_now);
                euclides_sal(test,fin)=pdist2(med_base_sal,test_now);
                      
              if(test==1)
                  if(euclides_tal(test,fin)<euclides_and(test,fin) & euclides_tal(test,fin)<euclides_sal(test,fin))
                    verifica_cond_1=1;
                  end
              end
              
              if( test==2 && verifica_cond_1==1 )
                  if(euclides_sal(test,fin)<euclides_and(test,fin) & euclides_sal(test,fin)<euclides_tal(test,fin) )
                    verifica_cond_2=1;
                  end
              end
              
              if(test==3 && verifica_cond_2==1)
                  if( euclides_and(test,fin)<euclides_tal(test,fin) & euclides_and(test,fin)<euclides_sal(test,fin))   
                    combinations=[combinations  fin];
                    sprintf('Valor para a combinação-> %d /teste-> %d e talhada %f -> salvado %f  -> andre %f', fin,test-2,euclides_tal(test-2,fin),euclides_sal(test-2,fin),euclides_and(test-2,fin))
                    sprintf('Valor para a combinação-> %d /teste-> %d e talhada %f -> salvado %f  -> andre %f', fin,test-1,euclides_tal(test-1,fin),euclides_sal(test-1,fin),euclides_and(test-1,fin))
                    sprintf('Valor para a combinação-> %d /teste-> %d e talhada %f -> salvado %f  -> andre %f', fin,test,euclides_tal(test,fin),euclides_sal(test,fin),euclides_and(test,fin))
                  end
              end 
              
              
            end
        
    end
    
   
    
    if (length(combinations)~=0)
    
                  combinations_final=combinations(2:end)



                  %mostrar as variaaveis que cumprem os requesitos e o final


                  for comb=1:size(combinations_final,2)

                      var_f=vectors(combinations_final(comb),:); %escolha de uma combinação
                        %contrução das variaveis a testar
                            for s=1:size(var_f,2) % desta variavel temos de fazer a média para cada coluna!
                                med_base_and(s)=mean(base_andre(:,var_f(s))); %vai à posição s di vector linha var e em seguida escolhe a coluna na matriz de base_andre e faz a média
                                med_base_sal(s)=mean(base_salvado(:,var_f(s))) ; 
                                med_base_tal(s)=mean(base_talhada(:,var_f(s)));
                                tests_var(:,s)=tests_files(:,var_f(s)); %vai buscar aos ficheiro de testes a coluna correspondente a cada uma das variaveis
                            end

                              %utilização do algoritmo de euclides
                            for test=1:size(tests_files,1) %escolha de um teste 
                                test_now=tests_var(test,:); %teste numero 1

                                euclides_tal(test,comb)=pdist2(med_base_tal,test_now);
                                euclides_and(test,comb)=pdist2(med_base_and,test_now);
                                euclides_sal(test,comb)=pdist2(med_base_sal,test_now);

                                sprintf('Valor para a combinação-> %d /teste-> %d e talhada %f -> salvado %f  -> andre %f', combinations_final(comb),test,euclides_tal(test,comb),euclides_sal(test,comb),euclides_and(test,comb))        

                            end

                  end


                  for ni=1:length(combinations_final)
                     the_ones(ni,:)=vectors(combinations_final(ni),:);

                  end
                
    else
      the_ones=0;  
        
    end
  the_ones
  


%%escolha do melhor parametro para descrever a situação
%%o que contem a maior distancia ao segundo valor descrito




%%
med_base_tal
tests_var(1,:)
med_base_sal
tests_var(2,:)
med_base_and
tests_var(3,:)

