% experiment 1 Mamdani optimalizace 
% Martin Radvansky 
% Diplomova prace 2022
% automat 100x autotunem vygeneruje 100 FIS modelu
clc
clear
close all
clear global
spline_vzdal = load('.\Export_J1_Dist!.csv');
wheel_angle = load('.\Export_J1_Wheel!.csv');
prum_spline = mean(spline_vzdal,1);
prum_wheel_angle = mean(wheel_angle,1);
delka_dat = size(spline_vzdal,2);
rng(12345);
global real_otoceni;
real_otoceni = prum_wheel_angle;
warning('off');
slozka_optimalizace = ".\output_100\";
if ~isfolder(slozka_optimalizace)
  errorMessage = sprintf('Error: The following folder does not exist:\n%s', slozka_optimalizace);
  uiwait(warndlg(errorMessage));
  return;
end
for i =1:100
    %optimalizace mamdani Pravidla
    fuzzy_model = readfis('sedm_1_work');
    [in,out,rule] = getTunableSettings(fuzzy_model);
    options = tunefisOptions('OptimizationType','tuning','UseParallel',false, 'NumMaxRules',49);
    [fisTRuleTuned,info] = tunefis(fuzzy_model,rule,@(fuzzy_model)cost_rmse(fuzzy_model,prum_spline),options);
    
    fis_name_rules = sprintf('%stuned_fis_rules_%d.fis',slozka_optimalizace,i);
    writeFIS(fisTRuleTuned,fis_name_rules);
    info_save = sprintf('%stuned_info_rules_%d.mat',slozka_optimalizace,i);
    save(info_save,'info');
    
    f = figure('visible','off');
    wheel_aprox = evalfis(fisTRuleTuned,prum_spline);
    plot(prum_spline,prum_wheel_angle);
    grid on;
    hold on;
    plot(prum_spline,wheel_aprox);
    title('Závislost úhlu natočení volantu na vzdálenosti od spline');
    xlabel('Vzdálenost of spline [m]');
    ylabel('Úhel natočení volantu');
    legend('Original','Fuzzy model','Location','southeast');
    hold off;
    nazev_plotu = sprintf('%sprevodni_rules_%d.jpg',slozka_optimalizace,i);
    saveas(f,nazev_plotu);
    
    %obrazek 2
    plot(1:delka_dat,prum_wheel_angle); % prumer
    grid on;
    hold on;
    plot(1:delka_dat,wheel_aprox);
    title('Natočení volantu v čase');
    xlabel('Čas [Vzorek x 20 ms]');
    ylabel('Úhel natočení volantu');
    legend('Original','Fuzzy model','Location','southeast');
    hold off; 
    nazev_plotu = sprintf('%scasova_rules_%d.jpg',slozka_optimalizace,i);
    saveas(f,nazev_plotu);
    
    %optimalizace mamdani INPUT / OUTPUTS Mfs
    fuzzy_model = fisTRuleTuned;
    [in,out,rule] = getTunableSettings(fuzzy_model);
    options = tunefisOptions('OptimizationType','tuning','UseParallel',false);
    [fisTRuleTuned,info] = tunefis(fuzzy_model,[in,out],@(fuzzy_model)cost_rmse(fuzzy_model,prum_spline),options);
    
    fis_name_mfs = sprintf('%stuned_fis_mfs_%d.fis',slozka_optimalizace,i);  
    writeFIS(fisTRuleTuned,fis_name_mfs);
    info_save = sprintf('%stuned_info_mfs_%d.mat',slozka_optimalizace,i);
    save(info_save,'info');
    
    wheel_aprox = evalfis(fisTRuleTuned,prum_spline);
    plot(prum_spline,prum_wheel_angle);
    grid on;
    hold on;
    plot(prum_spline,wheel_aprox);
    title('Závislost úhlu natočení volantu na vzdálenosti od spline');
    xlabel('Vzdálenost of spline [m]');
    ylabel('Úhel natočení volantu');
    legend('Original','Fuzzy model','Location','southeast');
    hold off;
    nazev_plotu = sprintf('%sprevodni_mfs_%d.jpg',slozka_optimalizace,i);
    saveas(f,nazev_plotu);
    
    %obrazek 2
    plot(1:delka_dat,prum_wheel_angle); % prumer
    grid on;
    hold on;
    plot(1:delka_dat,wheel_aprox);
    title('Natočení volantu v čase');
    xlabel('Čas [Vzorek x 20 ms]');
    ylabel('Úhel natočení volantu');
    legend('Original','Fuzzy model','Location','southeast');
    hold off; 
    nazev_plotu = sprintf('%scasova_mfs_%d.jpg',slozka_optimalizace,i);
    saveas(f,nazev_plotu);
    disp(sprintf('**** Krok: %d  ****',i));
end


