LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ctmc_takahashi.m
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)
4% -- Input
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
8% -- Output
9% p : estimated steady-state probability vector
10% p_1 :
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)
15% -- Remarks
16% * The initial approximate solutions is obtained by calling CTMC_COURTOIS(Q,MS)
17% * No convergence stop criterion is currently implented
18
19%% INIT
20nMacroStates = size(MS,1); % Number of macro-states
21nStates=size(Q,1);
22%% START FROM COURTOIS DECOMPOSITION SOLUTION
23[pcourt,Qperm,Qdec,eps,epsMAX,P,B,C,q]=ctmc_courtois(Q,MS);
24P=ctmc_randomization(Q);
25%% STEP 0
26pn=pcourt;
27%% MAIN LOOP
28for n=1:numSteps
29pn_1=pn;
30p_1=pn_1;
31%% AGGREGATION STEP
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
38 if I~=J
39 for i=1:length(MS{I})
40 for j=1:length(MS{J})
41 if S>1e-14
42 G(I,J)=G(I,J)+P(procRows+i,procCols+j)*pn_1(procRows+i)/S;
43 end
44 end
45 end
46 end
47 procCols = procCols + length(MS{J});
48 end
49 procRows = procRows + length(MS{I});
50end
51for i = 1:nMacroStates % for each source macro-state
52 G(i,i)=1-sum(G(i,:));
53end
54gamma=dtmc_solve(G); %compute macroprobabilities
55
56%% DISAGGREGATION STEP
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}))));
61 for j=1:nStates
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;
63 end
64 procRows = procRows + length(MS{I});
65end
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);
70 for i=1:length(MS{I})
71 for j=1:length(MS{I})
72 A(i,j)=A(i,j)-P(procRows+j,procRows+i);
73 end
74 for K=1:nMacroStates
75 if K~=I
76 b(i)=b(i)+gamma(K)*GI(K,procRows+i);
77 end
78 end
79 end
80 pn((procRows+1):(procRows + length(MS{I})))=A\b;
81 procRows = procRows + length(MS{I});
82end
83%% END LOOP
84pn=pn/sum(pn);
85end
86%% OUTPUT
87p=pn(:)';
88end