function [Pk,M,B,t]=absorb(P)
% funkce pro výpočet základních charakteristik absorpčního řetězce
% Autor: Stanislav Tvrz
% function [Pk,M,B,t]=absorb(P)
% vstupní parametr: matice přechodu P
% výstupní parametry: Pk ... matice přechodu v kanonickém tvaru
%                     M ... fundamentální matice
%                     B ... matice přechodu do absorpčních stavů
%                     t ... vektor středních hodnot počtu kroků před absorpcí

%vypíše pro kontrolu přechodovou matici P
P
vel=size(P);
[i,j]=find(P==1); % najdu prvky matice P o hodnotě 1
vi=size(i);
st=0; % počet nalezených absorpčních stavů

%převod P na kanonický tvar

for k=1:vi
    if i(k)==j(k)
       st=st+1;
       
       if st==1 % varianta pro první nalezený absorpční stav
          if (i(k)>1)&(i(k)<vel) % první řádek, pokud odpovídá absorpčnímu stavu se nepřesouvá
            P=[P(i(k),:);P(1:i(k)-1,:);P(i(k)+1:vel,:)]; % přesun k-tého řádku na místo prvního
            P=[P(:,i(k)),P(:,1:i(k)-1),P(:,i(k)+1:vel)]; % přesun k-tého sloupce na místo prvního
          elseif (i(k)==vel)&(st<vel)    % varianta pro přesun posledního řádku/sloupce
            P=[P(i(k),:);P(1:i(k)-1,:)]; % přesun k-tého řádku na místo prvního
            P=[P(:,i(k)),P(:,1:i(k)-1)]; % přesun k-tého sloupce na místo prvního
          end;
       else
         if ((i(k))>st+1)&(i(k)<vel) % varianta pro další nalezený absorpční stav
            P=[P(1:st-1,:);P(i(k),:);P(st:i(k)-1,:);P(i(k)+1:vel,:)]; %přesun k-tého řádku na místo dalšího absorpčního stavu
            P=[P(:,1:st-1),P(:,i(k)),P(:,st:i(k)-1),P(:,i(k)+1:vel)]; %přesun k-tého sloupce na místo dalšího absorpčního stavu
         elseif (i(k)==vel)&(st<vel) % varianta pro přesun posledního řádku/sloupce
            P=[P(1:st-1,:);P(i(k),:);P(st:i(k)-1,:)]; %přesun k-tého řádku na místo dalšího absorpčního stavu
            P=[P(:,1:st-1),P(:,i(k)),P(:,st:i(k)-1)]; %přesun k-tého sloupce na místo dalšího absorpčního stavu
         end;
       end;
    end;
end;

%Pk = kanonický tvar přechodové matice
Pk=P
% Q = matice přechodových pravděpodobností mezi přechodnými stavy
Q=[P(st+1:vel,st+1:vel)];

% R = matice přechodových pravděpodobností z přechodných do absorpčních stavů
R=[P(st+1:vel,1:st)];

% M = matice středního počtu kroků strávených v j-tém stavu před absorpcí, pokud řetězec vychází ze stavu i
M=inv(eye(vel-st)-Q);

% B = matice pravděpodobností, že řetězec bude absorbován j-tým stavem, pokud vychází z i-tého stavu přechodného
B=M*R;

% t = vektor středních hodnot počtu kroků před absorpcí
t=M*ones(vel-st,1);
