1function [p,p_1,Qperm,eps,epsMAX,pcourt]=ctmc_kms(Q,MS,numSteps)
2% CTMC_KMS - Koury-McAllister-Stewart aggregation-disaggregation method
3% [p,p_1,Qperm,eps,epsMAX,pcourt] = CTMC_KMS(Q,MS,numSteps)
5% Q : infinitesimal generator matrix
6% MS : cell array where MS{i}
is the set of rows of Q in macrostate i
7% numSteps: number of iterative steps
9% p : estimated steady-state probability vector
11% Qperm : permuted Q matrix w.r.t MS as returned by ctmc_courtois
12% eps : NCD index as returned by ctmc_courtois
13% epsMAX : max acceptable value
for eps (otherwise Q
is not NCD)
14% pcourt : steady-state probability vector estimated by ctmc_courtois
16% * The initial approximate solutions
is obtained by calling CTMC_COURTOIS(Q,MS)
17% * No convergence stop criterion
is currently implented
20nMacroStates = size(MS,1); % Number of macro-states
22%% START FROM COURTOIS DECOMPOSITION SOLUTION
23[pcourt,Qperm,Qdec,eps,epsMAX,
P,B,C]=ctmc_courtois(Q,MS);
32 procRows=0; %processed rows
33 for I = 1:nMacroStates % for each macro-state
34 if sum(pn_1((procRows + 1):(procRows + length(MS{I}))))>0
35 pcondn_1((procRows + 1):(procRows + length(MS{I})))=pn_1((procRows + 1):(procRows + length(MS{I})))/sum(pn_1((procRows + 1):(procRows + length(MS{I}))));
37 procRows = procRows + length(MS{I});
40 G=zeros(nMacroStates,nMacroStates);
41 procCols=0; %processed rows
42 for I = 1:nMacroStates % for each source macro-state
43 procRows=0; %processed rows
44 for J = 1:nMacroStates % for each dest macro-state
46 %size(pcondn_1((procRows + 1):(procRows + length(MS{J})))')
47 %size(
P((procRows + 1):(procRows + length(MS{J})),(procCols + 1):(procCols + length(MS{I}))))
48 %size(ones(length(MS{I}),1))
49 G(I,J)=pcondn_1((procRows + 1):(procRows + length(MS{J})))
'*P((procRows + 1):(procRows + length(MS{J})),(procCols + 1):(procCols + length(MS{I})))*ones(length(MS{I}),1);
50 procRows = procRows + length(MS{J});
52 procCols = procCols + length(MS{I});
56 %% DISAGGREGATION STEP
58 L=zeros(nStates,nStates);
59 D=zeros(nStates,nStates);
60 U=zeros(nStates,nStates);
61 procRows=0; %processed rows
62 for I = 1:nMacroStates %
for each macro-state
63 zn((procRows + 1):(procRows + length(MS{I})))=w(I)*z((procRows + 1):(procRows + length(MS{I})));
64 procCols=0; %processed rows
65 for J = 1:nMacroStates
67 L((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})))=
P((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})));
70 D((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})))=eye(length(MS{I}))-
P((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})));
73 U((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})))=
P((procRows + 1):(procRows + length(MS{I})),(procCols + 1):(procCols + length(MS{J})));
75 procCols = procCols + length(MS{J});
77 procRows = procRows + length(MS{I});
80 MPL=round((nStates-2)/2);
81 A=M(1:(MPL+1),1:(MPL+1)); invA=inv(A);
82 B=M(1:(MPL+1),(MPL+2):end);
83 C=M((MPL+2):end,(MPL+2):end); invC=inv(C);
84 pn=zn*L*[invA,-invA*B*invC;0*A,invC];