LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ctmc_kms.m
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)
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% 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
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]=ctmc_courtois(Q,MS);
24%% STEP 0
25% see _kb/03-api-layer.md (CTMC aggregation-disaggregation) for the ordering rationale
26v=[];
27for n=1:nMacroStates
28 v=[v,MS{n}];
29end
30pn=pcourt(v);
31p_1=pn(:); % defined even when numSteps==0
32%% MAIN LOOP
33for n=1:numSteps
34 pn_1=pn(:); % canonical column orientation regardless of iteration
35 p_1=pn_1;
36 %% AGGREGATION STEP
37 pcondn_1=pn_1;
38 procRows=0; %processed rows
39 for I = 1:nMacroStates % for each macro-state
40 if sum(pn_1((procRows + 1):(procRows + length(MS{I}))))>0
41 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}))));
42 end
43 procRows = procRows + length(MS{I});
44 end
45
46 G=zeros(nMacroStates,nMacroStates);
47 procCols=0; %processed rows
48 for I = 1:nMacroStates % for each source macro-state
49 procRows=0; %processed rows
50 for J = 1:nMacroStates % for each dest macro-state
51 %I,J
52 %size(pcondn_1((procRows + 1):(procRows + length(MS{J})))')
53 %size(P((procRows + 1):(procRows + length(MS{J})),(procCols + 1):(procCols + length(MS{I}))))
54 %size(ones(length(MS{I}),1))
55 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);
56 procRows = procRows + length(MS{J});
57 end
58 procCols = procCols + length(MS{I});
59 end
60 w=dtmc_solve(G');
61
62 %% DISAGGREGATION STEP
63 z=pcondn_1;
64 zn=zeros(1,nStates); % row: zn*L below requires row orientation
65 L=zeros(nStates,nStates);
66 D=zeros(nStates,nStates);
67 U=zeros(nStates,nStates);
68 procRows=0; %processed rows
69 for I = 1:nMacroStates % for each macro-state
70 zn((procRows + 1):(procRows + length(MS{I})))=w(I)*z((procRows + 1):(procRows + length(MS{I})))';
71 procCols=0; %processed rows
72 for J = 1:nMacroStates
73 if I>J
74 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})));
75 end
76 if I==J
77 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})));
78 end
79 if I<J
80 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})));
81 end
82 procCols = procCols + length(MS{J});
83 end
84 procRows = procRows + length(MS{I});
85 end
86 M=(D-U);
87 % Block Gauss-Seidel sweep: solve pn*(D-U) = zn*L directly. The former
88 % 2-block inverse [invA,-invA*B*invC;0,invC] split M at an arbitrary
89 % midpoint rather than a macro-block boundary, which is invalid.
90 rhs=(zn*L)';
91 pn=[];
92 if size(M,1) > 6000
93 [xg,gflag]=ctmc_gmres(M',rhs);
94 if gflag==0
95 pn=xg';
96 end
97 end
98 if isempty(pn)
99 pn=(M'\rhs)';
100 end
101 pn=pn/sum(pn);
102end
103%% OUTPUT
104% Map back from permuted (macrostate-major) to original state ordering.
105p=zeros(1,nStates);
106p(v)=pn;
107pback=zeros(nStates,1);
108pback(v)=p_1;
109p_1=pback;
110end