% _________________________________________________________________________
% จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
% PREDICTION OF ACUTE HYPOTENSIVE EPISODES USING NEURAL NETWORK MULTIMODELS
% _________________________________________________________________________
% จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
%        Copyright (C) 2009
%          : Jorge Henriques ...  <jh@dei.uc.pt>,
%          : Teresa Rocha    ...  <teresa@sun.isec.pt>
%        This software is released under the terms of the GNU
%        General Public License (http://www.gnu.org/copyleft/gpl.html)
% จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
% mainPredictionABPSignals.m
%__________________________________________________________________________
% จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
% Prediction of ABP signals based on ..\NNNmodels
%__________________________________________________________________________
% จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ



clc; clear; close all
warning off

showValid = 0;
saveValid = 1;

disp('___________________________________________________________________')
disp('จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ')
disp('                                mainPredictionABPSignal            ')
disp('___________________________________________________________________')
disp('จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ')
pause(1)
%บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ
%                                                           DEFINITIONS  1.
%บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ

%__________________________________________________________________________
%                                                           AHE Episode 1.1
%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
FORECAST=  60;  %.. one hour
mmHG    =  60;  %.. mmHg
perTOL  = 0.9;  %.. 90%
numAHE  =  18;  %.. it should be 30! 

%__________________________________________________________________________
%                                                          Multi Models 1.2
%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
D        = 15;       %.. Window prediction size
NUMNET   =  4;       %.. num Networks
AFTER    =  4;       %.. num Windows = (D*AFTER minutes)
T0      = 600;
INI     =   1;
%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ correlation parameters
TOLCOR  = 0.77;      %..  not used
TOLSUM  = 0.2;
NUMCOR  =   5; 
WEIGHTS =   1;  % templates combination (0/1) equal/proportional to correlation
TYPECOR =   1;  % Correlation analysis - 0: corrcoef>TOLCOR
%                        1: per(sum(corrcoef))>TOLSUM 
%                        2: num templates>=NUMCOR
% Possible solutions [numAHE=18, TYPECOR=1, TOLSUM=0.2]
% Possible solutions [numAHE=20, TYPECOR=2, NUMCOR= 5  ]
%__________________________________________________________________________
%                                                          Testing Data 1.3
%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
sinal = 'BP';
nS    = '1';
option=menu(' -------- DATASET -------- ', ...
    ' .  A ', ' .  B ');
switch option
    case 1; dS='A';
    case 2; dS='B';
end


%บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ
%                                                             VALIDATION 2.
%บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ

%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ Templates + ORD/SIZE
pathTest='..\dataTest\';
if dS=='A'
    NUMSIG=1:10;
    load ..\dataTrain\DATSET_A
    load ..\dataTrain\DATHC_A
    load ..\dataTrain\DATOS_A
end
if dS=='B'
    NUMSIG=1:40; 
    load ..\dataTrain\DATSET_B
    load ..\dataTrain\DATHC_B
    load ..\dataTrain\DATOS_B
end


predictAHE  =[ ];
positionAHE =[ ];
for iS=NUMSIG

    %______________________________________________________________________
    %                                              Load Signal : DAT(660,3)
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
    cmd=['load ' char(pathTest) char(sinal) '_'  ...
        char(dS)  char(nS) '_' num2str(iS) ];
    eval(cmd);

    %______________________________________________________________________
    %                                                             Templates
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ

    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ Signal
    YBEF  =DAT(  INI:T0,2);     %.. Before
    YAFT  =DAT(T0+1:end,2);     %.. After
    YBA   =DAT( INI:end,2);     %.. Before+After

    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ Templates
    DBEF  =DATSET( INI:T0 ,:);  %.. Before
    DAFT  =DATSET(T0+1:end,:);  %.. After
    DBA   =DATSET( INI:end,:);  %.. BEfore+After
    DIM   =length(YBA);
    %______________________________________________________________________
    %                                                  Correlation Analysis
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
    [YYCOR, YYMEANCOR, CC,II,CCM ]=mmCorrelation(YBEF, DBEF, YAFT, DAFT,...
        OS, TOLCOR, TOLSUM, TYPECOR, WEIGHTS, NUMCOR);

    %______________________________________________________________________
    %                                                            Prediction
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
    % Find templates (DATSET) that are correlated with actual signal (DAT)
    % Use the correspondent GRNN models to predict the outputs (YYMEANMODEL)
    % Wighted Mean of YYMODELS (YYMEANMOD)
    [YYMEANMOD]=mmPredictionModel(YBEF, DBEF, YAFT, DAFT, II, CCM, ...
        OS, DATHC, NUMNET, D, NUMCOR);

    %______________________________________________________________________
    %                                                         AHE Episodes
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
    %  idm=position where AHE starts or
    %  idm=60 if there are no AHE
    [epixx, indxx, indm ]=mmAHEepisode(YYMEANMOD(end-FORECAST+1:end), ...
        numAHE, FORECAST, mmHG, perTOL );
    strResult=[' ... '  num2str(iS) '..... :' ];
    if indm<FORECAST
        strResult=[ strResult ' AHE episode :::::: '  ...
                    num2str(iS) '   [' num2str(indm) ']'];
    end
    disp(strResult);

    %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Results


    if showValid
        mmMaximize
        id0=DIM-FORECAST;
        figure(1)
        plot(1:DIM,YBA,'g','LineWidth',8)
        hold on
        plot(1:DIM,YYMEANMOD(1:DIM),'r','LineWidth',3)
        plot(1:DIM,YYMEANCOR(1:DIM),'b','LineWidth',2)
        plot(1:DIM,YYMEANMOD(1:DIM),'r','LineWidth',3)
        plot(1:DIM,mmHG*ones(DIM,1),'k','LineWidth',6)
        plot(            [id0 id0],...
            [min(YYMEANMOD)  max(YYMEANMOD) ],'k:','LineWidth',3 );
        plot([id0+FORECAST id0+FORECAST],...
            [min(YYMEANMOD)  max(YYMEANMOD) ],'k:','LineWidth',3 );
        plot(indm+id0,YYMEANMOD(indm+id0),'bs','MarkerSize',9,'LineWidth',8  );
        plot(indm+id0,YYMEANMOD(indm+id0),'y+','MarkerSize',9,'LineWidth',5  );

        axis([0 DIM  min(YYMEANMOD) max(YYMEANMOD) ])
        legend('Signal','Prediction','Correlation','Limit')
        strTitle=[  char(dS)  char(nS) '-'  num2str(iS) ];
        mmLabel(strTitle,'minutes','mmHG')


        %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
        pause
        close all
    end

    %______________________________________________________________________
    %                                                              RESULTS
    %จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
    predictAHE =[ predictAHE  YYMEANMOD ];
    positionAHE=[ positionAHE indm      ];

end
disp('บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ')
disp(['  RESULTS dataSet : '  char(dS) ]);
disp('บบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบบ')
disp(' ')
episodeAHE=find(positionAHE<FORECAST);
disp(['      AHE : ' num2str(episodeAHE) ])
disp([' positions: ' num2str(positionAHE(episodeAHE)) ])
disp(' ')
pause

%______________________________________________________________________
%                                                              RESULTS
%จจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจจ
if saveValid
    cmd=['save ..\Results\episodeAHE_' char(dS) ' episodeAHE'];
    eval(cmd)
    cmd=['save ..\Results\predictAHE_' char(dS) ' predictAHE'];
    eval(cmd)
    cmd=['save ..\Results\positionAHE_' char(dS) ' positionAHE'];
    eval(cmd)
end
option=1;
  