function varargout = NN(varargin)

%% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @NN_OpeningFcn, ...
                   'gui_OutputFcn',  @NN_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
%End initialization code - DO NOT EDIT

%% Nastaveni zakladnich parametru site
function NN_OpeningFcn(hObject, eventdata, handles, varargin)
global misto;
clc;
handles.output = hObject;
load('NN_test_AF.mat');
handles.ID_test = ID_mat_AF;

load('NN_tren_AF.mat');
handles.test_vstup = 'NN_test_AF.mat';
handles.patterns = patterns;
handles.targets = targets;
handles.PR = [min(patterns,[],2),max(patterns,[],2)];
handles.S = [size(patterns,1) 5 3];
handles.TF = {'tansig','tansig','tansig'}; 
handles.epochs = 1000;
handles.time = inf;
handles.lr = 0.4;
handles.mu = 0.03;
handles.mc = 0.9;
handles.goal = 1e-8;
handles.noise = 0.1;

handles.misto = 'a. femoralis';
misto = handles.misto;

% přepínání klasifikace pro radio buttony
handles.provedene_trenovani = 0;
handles.provedena_klasifikace = 0;
handles.provedena_klasifikace_testovaci = 0;
handles.provedena_klasifikace_trenovaci = 0;

set(handles.layer1_edit,'String',num2str(size(patterns,1)));
guidata(hObject, handles);

% UIWAIT makes NN wait for user response (see UIRESUME)
% uiwait(handles.figure1);

function varargout = NN_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

%%  Vyber vstupu
function vstup_popup_Callback(hObject, eventdata, handles)
%contents={str2double(get(hObject,'String'))};
global misto;
n=get(hObject,'Value');
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','off');

switch n
    case 1 %AF 
        load('NN_test_AF.mat');
        handles.misto = 'a. femoralis';
        handles.test_vstup = 'NN_test_AF.mat';
        handles.ID_test = ID_mat_AF;
        load('NN_tren_AF.mat');
        handles.patterns = patterns;
        handles.targets = targets;
        handles.PR = [min(patterns,[],2),max(patterns,[],2)];
        set(handles.layer1_edit,'String',num2str(size(patterns,1)));
        set(handles.presnost,'String',num2str((0),'%1.2e'),'ForegroundColor','k');
    case 2 %AP
        load('NN_test_AP.mat');
        handles.misto = 'a. poplitea';
        handles.test_vstup = 'NN_test_AP.mat';
        handles.ID_test = ID_mat_AP;
        load('NN_tren_AP.mat');
        handles.patterns = patterns;
        handles.targets = targets;
        handles.PR = [min(patterns,[],2),max(patterns,[],2)];
        set(handles.layer1_edit,'String',num2str(size(patterns,1)));
        set(handles.presnost,'String',num2str((0),'%1.2e'),'ForegroundColor','k');
    case 3 %ATP
        load('NN_test_ATP.mat');
        handles.misto =  'a. tibialis posterior';
        handles.test_vstup = 'NN_test_ATP.mat';
        handles.ID_test = ID_mat_ATP;
        load('NN_tren_ATP.mat');
        handles.patterns = patterns;
        handles.targets = targets;
        handles.PR = [min(patterns,[],2),max(patterns,[],2)];
        set(handles.layer1_edit,'String',num2str(size(patterns,1)));
        set(handles.presnost,'String',num2str((0),'%1.2e'),'ForegroundColor','k');
    case 4 %AF+AP+ATP
        load('NN_test_LEG.mat');
        handles.misto =  'AF+AP+ATP';
        handles.test_vstup = 'NN_test_LEG.mat';
        handles.ID_test = ID_mat_LEG;
        load('NN_tren_LEG.mat');
        handles.patterns = patterns;
        handles.targets = targets;
        handles.PR = [min(patterns,[],2),max(patterns,[],2)];
        set(handles.layer1_edit,'String',num2str(size(patterns,1)));
        set(handles.presnost,'String',num2str((0),'%1.2e'),'ForegroundColor','k');
end
misto = handles.misto;
set(handles.Pacientska_data,'Enable','off');
guidata(hObject, handles);

function vstup_popup_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


%% Trenovani site
function train_button_Callback(hObject, eventdata, handles)

set(handles.net_button,'Enable','off');
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','off');

% Obnovení dat
Pu = handles.patterns;
Tu = handles.targets;
net=handles.net;

% Nastavení parametrů trénování
net.trainParam.epochs = handles.epochs; % maximální počet epoch
net.trainParam.time = handles.time;     % maximalni doba trenovani (option)
net.trainParam.goal = handles.goal;	    % požadovaná přesnost
net.trainParam.lr = handles.lr;	        % koeficient učení
net.trainParam.show = 10;	            % počet epoch mezi zobrazením chyby
net.trainParam.time = 100;	            % maximální doba učení
net.trainParam.mu = handles.mu;         % koeficient chyby
net.trainParam.mc = handles.mc;	        % momentum (setrvačnost)
net.trainParam.max_perf_inc = 100;	    % inkrement maximálního výkonu
% net.trainParam.mu_dec = 0.1000
% net.trainParam.mu_inc = 10
% net.trainParam.mu_max = 1.0000e+010
% net.trainParam.max_fail = 1
net.trainParam.min_grad = 0;            % minimální gradient
net.trainParam.mem_reduc = 1;           % redukce nároků na systémovou paměť

% Trénování sítě
[net,tr]=train(net,Pu,Tu);

% Zobrazeni přesnosti sitě
goal = handles.goal;
if tr.perf(end)<=goal
    set(handles.presnost,'String',num2str(tr.perf(end),'%1.2e'),...
        'ForegroundColor',[0 200 50]/255);
else
    set(handles.presnost,'String',num2str(tr.perf(end),'%1.2e'),...
        'ForegroundColor','r');
end


handles.Pu = Pu;
handles.Tu = Tu;

% Zobrazení tréninkové množiny ve 2D s konturami

% přepínání klasifikace pro radio buttony
handles.provedene_trenovani = 1;
handles.provedena_klasifikace = 1;
handles.provedena_klasifikace_testovaci = 0;
handles.provedena_klasifikace_trenovaci = 0;

set(handles.net_button,'Enable','on');
set(handles.sim_button,'Enable','on');
set(handles.train_sim_button,'Enable','on');

handles.net=net;
guidata(hObject, handles);

%% Simulace NN s nastavenymy parametry testovacich dat
function sim_button_Callback(hObject, eventdata, handles)
set(handles.train_button,'Enable','off');
set(handles.train_sim_button,'Enable','off');
load(handles.test_vstup); %Nacteni testovacich dat
global ID_test;
ID_test = handles.ID_test;
net = handles.net;

Pt=patterns;
Tt=targets;

% Simulace sítě
Yt = sim(net,Pt,[],[],Tt);   % simulace sítě

maxima = max(Yt);
for index=1:length(maxima)
    Yt(:,index)=Yt(:,index)==maxima(index);
end
handles.Pt_test = Pt; %uložení vzoru testovaci množiny
handles.Yt_test = Yt; %uložení výsledků testovací množiny
handles.Tt_test = Tt;
% Zobrazení testovací množiny
axes(handles.axes2);
if get(handles.D2_radio,'Value')==1
    hold off; rotate3d off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot(Ptor(5,:),Ptor(6,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot(Ptxr(5,:),Ptxr(6,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvr(5,:),Ptvr(6,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot(Ptow(5,:),Ptow(6,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot(Ptxw(5,:),Ptxw(6,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvw(5,:),Ptvw(6,:),'rv');
    hold off; rotate3d off;
    xlabel('T0'); ylabel('PI');
    set(handles.axes2,'xGrid','on','yGrid','on');

else
% Zobrazení tréninkové množiny ve 3D
    hold off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot3(Ptor(5,:),Ptor(6,:),Ptor(3,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot3(Ptxr(5,:),Ptxr(6,:),Ptxr(3,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvr(5,:),Ptvr(6,:),Ptvr(3,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot3(Ptow(5,:),Ptow(6,:),Ptow(3,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot3(Ptxw(5,:),Ptxw(6,:),Ptxw(3,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvw(5,:),Ptvw(6,:),Ptvw(3,:),'rv');
    xlabel('T0'); ylabel('PI'); zlabel('A');    
    view(-30,15); hold off; rotate3d on;
 
    set(handles.axes2,'xGrid','on','yGrid','on','zGrid','on');
end
set(handles.Title_axes2,'String',['Simulace testovací množiny - ',handles.misto]);

% Určení chybovosti

mistakes = sum(sum(xor(Yt,Tt)/2));

set(handles.correct_text,'String',num2str(length(Tt)-mistakes)); % správné klasifikace
set(handles.mistakes_text,'String',num2str(mistakes)); % chyby
set(handles.error_rate_text,'String',[num2str(fix(10000*mistakes/length(Yt))/100),'%']); % chybovost se zaokrouhlením na 2 des. místa
set(handles.uipanel5,'Title','Simulace sítě - testovací data');

%Urceni senzitvity a specificity
TP = sum(Yt(3,:)==1&Tt(3,:)==1);
TN = sum(Yt(1,:)==1&Tt(1,:)==1);
FP = sum(Yt(3,:)==1&Tt(2,:)==1)+sum(Yt(3,:)==1&Tt(1,:)==1);
FN = sum(Yt(1,:)==1&Tt(2,:)==1)+sum(Yt(1,:)==1&Tt(3,:)==1);

senzitivita = TP/(TP+FN);
specificita = TN/(TN+FP);
set(handles.senzitivity_text,'String',[num2str(fix(10000*senzitivita)/100),'%']); % senzitivita
set(handles.specificity_text,'String',[num2str(fix(10000*specificita)/100),'%']); % specificita

for i=1:3 
    vysledek(Yt(i,:)==1) = Yt(i,Yt(i,:)==1)*i ; 
end
global IDX;
IDX = vysledek';

% přepínání klasifikace pro radio buttony
handles.provedena_klasifikace = 1;
handles.provedena_klasifikace_testovaci = 1;
handles.provedena_klasifikace_trenovaci = 0;

set(handles.Pacientska_data,'Enable','on');
set(handles.train_button,'Enable','on');
set(handles.train_sim_button,'Enable','on');

guidata(hObject, handles);

%% Nastaveni parametru site pro uceni 
%   lr-koeficient uceni
%   mu-koeficient chyby
%   goal-pozadovana chybovost
%   mc-momentum (setrvacnost)
%   epochs-pocet epoch pro uceni
%   time-pocet s pro trenovani site
function epochs_edit_Callback(hObject, eventdata, handles)
handles.epochs=str2double(get(hObject,'String'));
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','off');
guidata(hObject, handles);

function epochs_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function lr_edit_Callback(hObject, eventdata, handles)
handles.lr = str2double(get(hObject,'String'));
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','on');
guidata(hObject, handles);

function lr_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function mu_edit_Callback(hObject, eventdata, handles)
handles.mu=str2double(get(hObject,'String'));
set(handles.sim_button,'Enable','off'); 
set(handles.train_sim_button,'Enable','on');
guidata(hObject, handles);

function mu_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function goal_edit_Callback(hObject, eventdata, handles)
handles.goal=str2double(get(hObject,'String'));
set(handles.sim_button,'Enable','off'); 
set(handles.train_sim_button,'Enable','on');
guidata(hObject, handles);

function goal_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function mc_edit_Callback(hObject, eventdata, handles)
handles.mc=str2double(get(hObject,'String'));
set(handles.sim_button,'Enable','off'); 
set(handles.train_sim_button,'Enable','on');
guidata(hObject, handles);

function mc_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%% Nastaveni poctu vrstev site (popup menu (3-5))
function pocet_vrstev_popup_Callback(hObject, eventdata, handles)
contents={str2double(get(hObject,'String'))};
n=get(hObject,'Value');
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','off');

switch contents{1}(n)
    case 3 
        set(handles.layer3_edit,'String',num2str(3),'Enable','Inactive');
        set(handles.layer4_edit,'Enable','off');
        set(handles.fun4_popup,'Enable','off');
        set(handles.layer5_edit,'Enable','off');
        set(handles.fun5_popup,'Enable','off');
        handles.S=handles.S(1:3);
        handles.S(end) = 3;
        %nastaveni prenos. fukce 
        handles.TF=handles.TF(1:3);
    case 4
        set(handles.layer3_edit,'Enable','on');
        set(handles.layer4_edit,'String',num2str(3),'Enable','Inactive');
        set(handles.fun4_popup,'Enable','on');
        set(handles.layer5_edit,'Enable','off');
        set(handles.fun5_popup,'Enable','off');
        handles.S=[handles.S(1:3),str2double(get(handles.layer4_edit,'String'))]; 
        handles.S(end) = 3;
        %nastaveni prenos. funkce
        contents_fun4={get(handles.fun4_popup,'String')};
        value_fun4=get(handles.fun4_popup,'Value');
        handles.TF=[handles.TF(1:3),contents_fun4{1}(value_fun4)]; 
    case 5
        set(handles.layer3_edit,'Enable','on');
        set(handles.layer4_edit,'Enable','on');
        set(handles.fun4_popup,'Enable','on');
        set(handles.layer5_edit,'String',num2str(3),'Enable','Inactive');
        set(handles.fun5_popup,'Enable','on');
        handles.S=[handles.S(1:3),str2double(get(handles.layer4_edit,'String')), ...
                                  str2double(get(handles.layer5_edit,'String'))];
        handles.S(end) = 3;
        %nastaveni prenos. funkce
        contents_fun4={get(handles.fun4_popup,'String')};
        value_fun4=get(handles.fun4_popup,'Value');
        contents_fun5={get(handles.fun5_popup,'String')};
        value_fun5=get(handles.fun5_popup,'Value');
        handles.TF=[handles.TF(1:3),contents_fun4{1}(value_fun4), ...
                                    contents_fun5{1}(value_fun5)];                      
end

guidata(hObject, handles);

function pocet_vrstev_popup_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


%% Nastaveni funkce site (neuronu)
function fun1_popup_Callback(hObject, eventdata, handles)
contents={get(hObject,'String')};
n=get(hObject,'Value');
handles.TF(1)=contents{1}(n);
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function fun1_popup_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function fun2_popup_Callback(hObject, eventdata, handles)
contents={get(hObject,'String')};
n=get(hObject,'Value');
handles.TF(2)=contents{1}(n);
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function fun2_popup_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function fun3_popup_Callback(hObject, eventdata, handles)
contents={get(hObject,'String')};
n=get(hObject,'Value');
handles.TF(3)=contents{1}(n);
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function fun3_popup_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function fun4_popup_Callback(hObject, eventdata, handles)
contents={get(hObject,'String')};
n=get(hObject,'Value');
handles.TF(4)=contents{1}(n);
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function fun4_popup_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function fun5_popup_Callback(hObject, eventdata, handles)
contents={get(hObject,'String')};
n=get(hObject,'Value');
handles.TF(5)=contents{1}(n);
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function fun5_popup_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%% Nastaveni parametru NN site (pocet neuronu ...)
function layer1_edit_Callback(hObject, eventdata, handles)
handles.S(1)=uint8(str2double(get(hObject,'String')));
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function layer1_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function layer2_edit_Callback(hObject, eventdata, handles)
handles.S(2)=uint8(str2double(get(hObject,'String')));
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function layer2_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function layer3_edit_Callback(hObject, eventdata, handles)
handles.S(3)=uint8(str2double(get(hObject,'String')));
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function layer3_edit_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function layer4_edit_Callback(hObject, eventdata, handles)
handles.S(4)=uint8(str2double(get(hObject,'String')));
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function layer4_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%------------------------
function layer5_edit_Callback(hObject, eventdata, handles)
handles.S(5)=uint8(str2double(get(hObject,'String')));
set(handles.train_button,'Enable','off'); 
set(handles.sim_button,'Enable','off'); 
guidata(hObject, handles);

function layer5_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

%% Vytvoreni NN podle zadanych parametru
function net_button_Callback(hObject, eventdata, handles)
% Obnovení dat
patterns=handles.patterns;
targets=handles.targets;

% Nastavení parametrů sítě
BTF = 'trainlm';
BLF = 'learngdm';
PF = 'mse';

PR=handles.PR;
S=handles.S;
TF=handles.TF; 

% Vytvoření sítě
net = newff(PR, S, TF, BTF, BLF, PF); 

%zobrazeni trenovaci množiny dat
Pu = handles.patterns;
Tu = handles.targets;
handles.Pu = Pu;
handles.Tu = Tu;
axes(handles.axes1);
if get(handles.D2_radio,'Value')==1
    hold off;
    Puo = Pu(:,Tu(1,:)==1); % kolečka
    plot(Puo(5,:),Puo(6,:),'ob');
    hold on;
    Pux = Pu(:,Tu(2,:)==1); % křížky
    plot(Pux(5,:),Pux(6,:),'xm');
    Puv = Pu(:,Tu(3,:)==1); % trojuhelnicky
    plot(Puv(5,:),Puv(6,:),'vk');
    hold off;
    xlabel('T0'); ylabel('PI');
    set(handles.axes1,'xGrid','on','yGrid','on');
    rotate3d off;
else
% Zobrazení tréninkové množiny ve 3D
    hold off;
    Puo = Pu(:,Tu(1,:)==1); % kolečka
    plot3(Puo(5,:),Puo(6,:),Puo(3,:),'ob');
    hold on;
    Pux = Pu(:,Tu(2,:)==1); % křížky
    plot3(Pux(5,:),Pux(6,:),Pux(3,:),'xm');
    Puv = Pu(:,Tu(3,:)==1); % trojuhelnicky
    plot3(Puv(5,:),Puv(6,:),Puv(3,:),'vk');
    set(handles.axes1,'xGrid','on','yGrid','on','zGrid','on');
    xlabel('T0'); ylabel('PI'); zlabel('A');    
    view(-30,15); hold off; 
    rotate3d on;
end

    legend('Zdraví','Stenózy','S uzávěry');
    set(legend,'Units','normalized','Orientation','horizontal',...
    'Position',[0.33 0.365 0.3 0.02]);

set(handles.Title_axes1,'String',['Tréninková množina - ',handles.misto]);
handles.provedena_klasifikace = 1;
set(handles.train_button,'Enable','on');
set(handles.sim_button,'Enable','on');
set(handles.train_sim_button,'Enable','on');
handles.net=net;
guidata(hObject, handles);

%% Simulace natrenovani site
function train_sim_button_Callback(hObject, eventdata, handles)
set(handles.train_button,'Enable','off');
set(handles.sim_button,'Enable','off');
set(handles.train_sim_button,'Enable','on');

net = handles.net;

% Testování
Pt = handles.patterns;  % vstup (t jako testovací)
Tt = handles.targets;   % požadovaný výstup, cíl
% Simulace sítě
Yt = sim(net,Pt,[],[],Tt);   % simulace sítě
maxima = max(Yt);
for index=1:length(maxima)
    Yt(:,index)=Yt(:,index)==maxima(index);
end
handles.Pt_tren = Pt;
handles.Yt_tren = Yt;
handles.Tt_tren = Tt;
% Zobrazení testovací množiny
axes(handles.axes2);
if get(handles.D2_radio,'Value')==1
    hold off; rotate3d off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot(Ptor(5,:),Ptor(6,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot(Ptxr(5,:),Ptxr(6,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvr(5,:),Ptvr(6,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot(Ptow(5,:),Ptow(6,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot(Ptxw(5,:),Ptxw(6,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvw(5,:),Ptvw(6,:),'rv');
    hold off; rotate3d off;
    xlabel('T0'); ylabel('PI');
    set(handles.axes2,'xGrid','on','yGrid','on');
else
% Zobrazení tréninkové množiny ve 3D s konturami
    hold off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot3(Ptor(5,:),Ptor(6,:),Ptor(3,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot3(Ptxr(5,:),Ptxr(6,:),Ptxr(3,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvr(5,:),Ptvr(6,:),Ptvr(3,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot3(Ptow(5,:),Ptow(6,:),Ptow(3,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot3(Ptxw(5,:),Ptxw(6,:),Ptxw(3,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvw(6,:),Ptvw(6,:),Ptvw(3,:),'rv');
    view(-30,15); hold off; rotate3d on;
    xlabel('T0'); ylabel('PI'); zlabel('A');
    set(handles.axes2,'xGrid','on','yGrid','on','zGrid','on');
end
set(handles.Title_axes2,'String',['Simulace trénovací množiny - ',handles.misto]);

% Určení chybovosti

mistakes = sum(sum(xor(Yt,Tt)/2));

set(handles.correct_text,'String',num2str(length(Tt)-mistakes)); % správné klasifikace
set(handles.mistakes_text,'String',num2str(mistakes)); % chyby
set(handles.error_rate_text,'String',[num2str(fix(10000*mistakes/length(Yt))/100),'%']); % chybovost se zaokrouhlením na 2 des. místa
set(handles.uipanel5,'Title','Simulace sítě - trénovací data');

set(handles.senzitivity_text,'String',[num2str(0),'%']); % senzitivita
set(handles.specificity_text,'String',[num2str(0),'%']); % specificita

% přepínání provedene klasifikace pro radio buttony
handles.provedena_klasifikace = 1;
handles.provedena_kalsifikace_testovaci = 0;
handles.provedena_klasifikace_trenovaci = 1;

set(handles.train_button,'Enable','on');
set(handles.sim_button,'Enable','on');
set(handles.train_sim_button,'Enable','on');

guidata(hObject, handles);

%% Konec
function Konec_button_Callback(hObject, eventdata, handles)
selection = questdlg('Opravdu si prejete ukoncit program?',...
                     'Ukonceni programu',...
                     'Yes','No','Yes');
switch selection,
   case 'Yes',
     delete(gcf); clear all; close all; clc;
   case 'No'
     return
end


%% --------------------------------------------------------------------
function MenuItem_Callback(hObject, eventdata, handles)

%% --------------------------------------------------------------------
function Pacientska_data_Callback(hObject, eventdata, handles)
run Anamneza;

%% --------------------------------------------------------------------
function menu_tisk_Callback(hObject, eventdata, handles)
printdlg(NN);

%% --------------------------------------------------------------------
function menu_konec_Callback(hObject, eventdata, handles)
selection = questdlg('Opravdu si prejete ukoncit program?',...
                     'Ukonceni programu',...
                     'Yes','No','Yes');
switch selection,
   case 'Yes',
     delete(gcf); clear all; close all; clc;
   case 'No'
     return
end

%% --- Executes on button press in D2_radio.
function D2_radio_Callback(hObject, eventdata, handles)
if handles.provedena_klasifikace
    if handles.provedena_klasifikace_trenovaci
        Pt = handles.Pt_tren;
        Yt = handles.Yt_tren;
        Tt = handles.Tt_tren;
    elseif handles.provedena_klasifikace_testovaci
        Pt = handles.Pt_test;
        Yt = handles.Yt_test;
        Tt = handles.Tt_test;
    end
    if handles.provedena_klasifikace_trenovaci || handles.provedena_klasifikace_testovaci
    axes(handles.axes2);
    hold off; rotate3d off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot(Ptor(5,:),Ptor(6,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot(Ptxr(5,:),Ptxr(6,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvr(5,:),Ptvr(6,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot(Ptow(5,:),Ptow(6,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot(Ptxw(5,:),Ptxw(6,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot(Ptvw(5,:),Ptvw(6,:),'rv');
    hold off; rotate3d off;

    xlabel('T0'); ylabel('PI'); 
    hold off; grid on;

    set(handles.axes2,'xGrid','on','yGrid','on');
    end
    
    Pu = handles.Pu;
    Tu = handles.Tu;
axes(handles.axes1);
    
    Puo = Pu(:,Tu(1,:)==1); % kolečka
    plot(Puo(5,:),Puo(6,:),'ob');
    hold on;
    Pux = Pu(:,Tu(2,:)==1); % křížky
    plot(Pux(5,:),Pux(6,:),'xm');
    Puv = Pu(:,Tu(3,:)==1); % trojuhelnicky
    plot(Puv(5,:),Puv(6,:),'vk');
    hold off;
    set(handles.axes1,'xGrid','on','yGrid','on');
    legend('Zdraví','Stenózy','S uzávěry');
    set(legend,'Units','normalized','Orientation','horizontal',...
    'Position',[0.33 0.36 0.3 0.02]);
    xlabel('T0'); ylabel('PI'); 
    rotate3d off;

end

%% --- Executes on button press in D3_radio.
function D3_radio_Callback(hObject, eventdata, handles)
if handles.provedena_klasifikace
    if handles.provedena_klasifikace_trenovaci
        Pt = handles.Pt_tren;
        Yt = handles.Yt_tren;
        Tt = handles.Tt_tren;
    elseif handles.provedena_klasifikace_testovaci
        Pt = handles.Pt_test;
        Yt = handles.Yt_test;
        Tt = handles.Tt_test;
    end
    if handles.provedena_klasifikace_trenovaci || handles.provedena_klasifikace_testovaci
    axes(handles.axes2);
    hold off;
    Ptor = Pt(:,Tt(1,:)==1&Yt(1,:)==1); % správně klasifikovaná kolečka zelene
    plot3(Ptor(5,:),Ptor(6,:),Ptor(3,:),'go');
    hold on;
    Ptxr = Pt(:,Tt(2,:)==1&Yt(2,:)==1); % správně klasifikované křížky zelene
    plot3(Ptxr(5,:),Ptxr(6,:),Ptxr(3,:),'gx');
    Ptvr = Pt(:,Tt(3,:)==1&Yt(3,:)==1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvr(5,:),Ptvr(6,:),Ptvr(3,:),'gv');

    Ptow = Pt(:,Tt(1,:)==1&Yt(1,:)~=1); % špatně klasifikovaná kolečka cervene
    plot3(Ptow(5,:),Ptow(6,:),Ptow(3,:),'ro');
    Ptxw = Pt(:,Tt(2,:)==1&Yt(2,:)~=1); % špatně klasifikované křížky cervene
    plot3(Ptxw(5,:),Ptxw(6,:),Ptxw(3,:),'rx');
    Ptvw = Pt(:,Tt(3,:)==1&Yt(3,:)~=1); % správně klasifikované trojuhelnicky zelene
    plot3(Ptvw(5,:),Ptvw(6,:),Ptvw(3,:),'rv');
    view(-30,15); hold off; rotate3d on;
    xlabel('T0'); ylabel('PI'); zlabel('A');
    set(handles.axes2,'xGrid','on','yGrid','on','zGrid','on');
    end
    %provedene pouze trenovani
    Pu = handles.Pu;
    Tu = handles.Tu;
axes(handles.axes1);
    Puo = Pu(:,Tu(1,:)==1); % kolečka
    plot3(Puo(5,:),Puo(6,:),Puo(3,:),'ob');
    hold on;
    Pux = Pu(:,Tu(2,:)==1); % křížky
    plot3(Pux(5,:),Pux(6,:),Pux(3,:),'xm');
    Puv = Pu(:,Tu(3,:)==1); % trojuhelnicky
    plot3(Puv(5,:),Puv(6,:),Puv(3,:),'vk');
    legend('Zdraví','Stenózy','S uzávěry');
    set(legend,'Units','normalized','Orientation','horizontal',...
    'Position',[0.33 0.36 0.3 0.02]);
    xlabel('T0'); ylabel('PI'); zlabel('A');
    set(handles.axes1,'xGrid','on','yGrid','on','zGrid','on');
    view(-30,15); hold off; 
    rotate3d on;
  

end
