1function [p,p_1,pcourt,Qperm,eps,epsMAX]=ctmc_takahashi(Q,MS,numSteps)
2% CTMC_TAKAHASHI - Takahashi
's aggregation-disaggregation method
3% [p,p_1,pcourt,Qperm,eps,epsMAX] = CTMC_TAKAHASHI(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% pcourt : steady-state probability vector estimated by ctmc_courtois
12% Qperm : permuted Q matrix w.r.t MS as returned by ctmc_courtois
13% eps : NCD index as returned by ctmc_courtois
14% epsMAX : max acceptable value for eps (otherwise Q is not NCD)
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,q]=ctmc_courtois(Q,MS);
24P=ctmc_randomization(Q);
32G=zeros(nMacroStates,nMacroStates);
33procRows=0; %processed rows
34for I = 1:nMacroStates % for each source macro-state
35 S=sum(pn_1((procRows+1):(procRows+length(MS{I}))));
36 procCols=0; %processed cols
37 for J = 1:nMacroStates % for dest macro-state
42 G(I,J)=G(I,J)+P(procRows+i,procCols+j)*pn_1(procRows+i)/S;
47 procCols = procCols + length(MS{J});
49 procRows = procRows + length(MS{I});
51for i = 1:nMacroStates % for each source macro-state
54gamma=dtmc_solve(G); %compute macroprobabilities
57procRows=0; %processed rows
58GI=zeros(nMacroStates,nStates);
59for I = 1:nMacroStates % for each source macro-state
60 S=sum(pn_1((procRows+1):(procRows+length(MS{I}))));
62 GI(I,j)=GI(I,j)+sum(P((procRows+1):(procRows+length(MS{I})),j).*pn_1((procRows+1):(procRows+length(MS{I})))')/S;
64 procRows = procRows + length(MS{I});
66procRows=0; %processed rows
67for I = 1:nMacroStates %
for each source macro-state
68 A=eye(length(MS{I}),length(MS{I}));
69 b=zeros(length(MS{I}),1);
72 A(i,j)=A(i,j)-
P(procRows+j,procRows+i);
76 b(i)=b(i)+gamma(K)*GI(K,procRows+i);
80 pn((procRows+1):(procRows + length(MS{I})))=A\b;
81 procRows = procRows + length(MS{I});