% MAIN - CASO STATICO

clc
close all
clear all

global pp n_f n Q b_ideale


%% Creazione database
% Input da tastiera: scelta del numero di dati da analizzare
disp('Inserire il NUMERO di punti da analizzare:')
index = input ('Numero punti: ');
disp(' ')

N_r = index;
N_b = index;

y_r = ones(N_r,1);           % etichette rosse iniziali (1)
y_b = -ones(N_b,1);          % etichette blu iniziali (-1)


% Scelta tra caso linearm.separabile e quello NON linearm.separabile
disp('Scegliere la TIPOLOGIA di dati da analizzare')
disp('(1) - caso dati linearmente separabili')
disp('(2) - caso dati NON linearmente separabili')
caso = input('Caso: ');
disp(' ')

if caso == 1
    
    % comando utilizzato per mantenere fissa la posizione dei punti
    % load('stat_sep.mat');
    
    
    % DATI LIN.SEPARABILI
    % Costruzione matrici range iniziali punti
    range_x_r = [0 3];
    range_y_r = [4 7];
    range_x_b = [5 8];
    range_y_b = [0 3];
    
    Pos_r_x = range_x_r(1) + (range_x_r(2)-range_x_r(1)).*rand(N_r,1);
    Pos_r_y = range_y_r(1) + (range_y_r(2)-range_y_r(1)).*rand(N_r,1);
    % Posizioni iniziali punti ROSSI
    Posiz_r(:,:) = [Pos_r_x Pos_r_y];
    
    Pos_b_x = range_x_b(1) + (range_x_b(2)-range_x_b(1)).*rand(N_b,1);
    Pos_b_y = range_y_b(1) + (range_y_b(2)-range_y_b(1)).*rand(N_b,1);
    % Posizioni iniziali punti BLU
    Posiz_b(:,:) = [Pos_b_x Pos_b_y];
    
else
    
    % comando utilizzato per mantenere fissa la posizione dei punti
    % load('stat_nonsep.mat');
    
    
    % DATI NON LIN.SEPARABILI
    % Costruzione matrici range iniziali punti
    range_x_r = [0 3];
    range_y_r = [1 4];
    range_x_b = [2 5];
    range_y_b = [0 3];
    
    Pos_r_x = range_x_r(1) + (range_x_r(2)-range_x_r(1)).*rand(N_r,1);
    Pos_r_y = range_y_r(1) + (range_y_r(2)-range_y_r(1)).*rand(N_r,1);
    % Posizioni iniziali punti ROSSI
    Posiz_r(:,:) = [Pos_r_x Pos_r_y];
    
    Pos_b_x = range_x_b(1) + (range_x_b(2)-range_x_b(1)).*rand(N_b,1);
    Pos_b_y = range_y_b(1) + (range_y_b(2)-range_y_b(1)).*rand(N_b,1);
    % Posizioni iniziali punti BLU
    Posiz_b(:,:) = [Pos_b_x Pos_b_y];
    
end


%% Dati fissi
n_f = 2;            % n° features
n = n_f + 1;        % dimensione stato
Q = zeros(n);       % varianza rumore random-walk
pp = 0.1;           % pausa utilizzata nei plot

%% Test statico
% Si richiama la funzione test_statico che utilizza l'algoritmo SQP con le
% impostazioni appena fissate per effettuare il training sul dataset creato

test_statico(Posiz_r,Posiz_b,y_r,y_b);


%% Comandi utilizzati per studiare le prestazioni
% figure(4)
% hold on
% bar(n_train,diff(3))
% bar(n_train,diff(1),'r')
% bar(n_train,diff(2),'k')
% grid on
% 
% figure(5)
% hold on
% bar(n_train,abs(diff_ang))
% grid on
