LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ctmc_courtois.m
1function [p,Qperm,Qdec,eps,epsMAX,P,B,C,q]=ctmc_courtois(Q,MS,q)
2% CTMC_COURTOIS - Courtois decomposition
3% [p,Qperm,Qdec,eps,epsMAX,P,B,C,q] = CTMC_COURTOIS(Q,MS)
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% q : (optional) randomization coefficient
8% -- Output
9% p : approximate steady-state probability vector
10% Qperm : Q reordered according to macrostates
11% Qdec : infinitesimal generator for the macrostates
12% P : probability matrix obtained from Qperm with randomization
13% B : part of P not modelled by decomposition
14% eps : nearly-complete decomposability (NCD) index
15% epsMAX : max acceptable value for eps (otherwise Q is not NCD)
16% q : randomization coefficient
17
18%% INIT
19% The randomization coefficient q is derived below, once Qperm is available,
20% because it depends on Qperm. It must be a valid uniformization rate
21% (q >= max|q_ii|) or P=I+Qperm/q is not stochastic; 1.05*max|Qperm| exceeds
22% max|q_ii| strictly, which also keeps P aperiodic. An explicit q (nargin==3)
23% overrides the derived value.
24v=[];
25nMacroStates = size(MS,1); % Number of macro-states
26%% REARRANGE INFINITESIMAL GENERATOR ACCORDING TO THE MACROSTATES
27
28for n=1:nMacroStates
29 v=[v,MS{n}];
30end
31Qperm=Q(v,v); % reorder according to the new macro-states
32Qdec=Qperm;
33procRows=0; %processed rows
34for i = 1:size(MS,1) % for each macro-state
35 if procRows >0
36 Qdec((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
37 end
38 Qdec((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
39 procRows = procRows + length(MS{i});
40end
41% now make each substochastic diagonal block a stochastic matrix
42Qdec=ctmc_makeinfgen(Qdec);
43
44%% COMPUTE NCD ERROR INDEX
45epsC=Qperm-Qdec;
46epsC=0;
47C=epsC;
48eps=1;
49
50% apply randomization
51if nargin==2
52 q=(1.05*max(max(abs(Qperm))));
53end
54
55P=ctmc_randomization(Qperm,q);
56A=P;
57procRows=0; %processed rows
58for i = 1:nMacroStates % for each macro-state
59 if procRows >0
60 A((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
61 end
62 A((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
63 procRows = procRows + length(MS{i});
64end
65B=P-A;
66eps=max(sum(B));
67%% COMPUTE epsMAX
68% the following subprocedure makes each diagonal block stochastic by
69% placing a normalization condition in the diagonal position
70if nargout>3
71procRows=0; %processed rows
72for i = 1:size(MS,1) % for each macro-state
73 for j=1:length(MS{i})
74 pos=j;
75 A(procRows+j,procRows+pos)=1-(sum(A(procRows+j,setdiff((procRows+1):(procRows+length(MS{i})),(procRows+pos)))));
76 end
77 procRows = procRows + length(MS{i});
78end
79eigMS = zeros(1,size(MS,1));
80procRows=0; %processed rows
81for i=1:size(MS,1) % for each macro-state
82 e=sort(abs(eig(A((procRows + 1):(procRows + length(MS{i})),(procRows + 1):(procRows + length(MS{i}))))));
83 if length(e)>1
84 eigMS(i)=e(end-1); % take the second largest eigvalues of the block
85 else
86 eigMS(i)=0; % skip if there is no second eigenvalue
87 end
88 procRows = procRows + length(MS{i});
89end
90epsMAX=(1-max(eigMS))/2;
91else
92 eps=0;
93 epsMax=0;
94end
95%% COMPUTE MICROPROBABILITIES
96procRows=0; %processed rows
97pmicro=zeros(size(Q,1),1);
98for i = 1:nMacroStates % for each macro-state
99 Qmicrostate=Qdec((procRows + 1):(procRows + length(MS{i})),(procRows + 1):(procRows + length(MS{i})));
100 pmicro((procRows + 1):(procRows + length(MS{i})),1)=ctmc_solve_reducible(Qmicrostate);
101 procRows = procRows + length(MS{i});
102end
103
104%% COMPUTE MACROPROBABILITIES
105G=zeros(nMacroStates,nMacroStates);
106procRows=0; %processed rows
107for i = 1:nMacroStates % for each source macro-state
108 procCols=0; %processed cols
109 for j = 1:nMacroStates % for dest macro-state
110 if i~=j
111 for iState=1:length(MS{i})
112 G(i,j)=G(i,j)+pmicro(procRows+iState)*sum(P(procRows+iState,(procCols+1):(procCols+length(MS{j}))));
113 end
114 end
115 procCols = procCols + length(MS{j});
116 end
117 procRows = procRows + length(MS{i});
118end
119for i = 1:nMacroStates % for each source macro-state
120 G(i,i)=1-sum(G(i,:));
121end
122pMacro=dtmc_solve(G);
123procRows=0; %processed rows
124for i = 1:nMacroStates % for each source macro-state
125 p((procRows+1):(procRows+length(MS{i})))=pMacro(i)*pmicro((procRows+1):(procRows+length(MS{i})));
126 procRows = procRows + length(MS{i});
127end
128%% OUTPUT
129for i=1:length(v)
130pout(v(i))=p(i);
131end
132p=pout;
133
Definition Station.m:245