1function [p,p_1,pcourt,Qperm,eps,epsMAX]=ctmc_multi(Q,MS,MSS)
2% CTMC_MULTI - Multigrid aggregation-disaggregation method
3% CTMC_Multigrid
is the basic one step implementation of standard method of
4% Multigrid. The complete implementation (e.g multi-level disaggregation)
5%
requires repetitive coarsening
using the base method. For illustrative
6% purpose, we only use two levels.
8% [p,p_1,pcourt,Qperm,eps,epsMAX] = CTMC_multi(Q,MS,MSS)
10% Q : infinitesimal generator matrix
11% MS : cell array where MS{i}
is the set of rows of Q in macrostate i
12% MSS : cell array where MSS{i}
is the set of rows of G in macromacrostate i
15% p : approximate steady-state probability vector
17% pcourt : steady-state probability vector estimated by ctmc_courtois
18% Qperm : Q reordered according to macrostates
19% eps : nearly-complete decomposability (NCD) index
20% epsMAX : max acceptable value
for eps (otherwise Q
is not NCD)
27nMacroStates = size(MS,1); % Number of macro-states
28%% REARRANGE INFINITESIMAL GENERATOR ACCORDING TO THE MACROSTATES
33Qperm=Q(v,v); % reorder according to the
new macro-states
35procRows=0; %processed rows
36for i = 1:size(MS,1) %
for each macro-state
38 Qdec((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
40 Qdec((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
41 procRows = procRows + length(MS{i});
43% now make each substochastic diagonal block a stochastic matrix
44Qdec=ctmc_makeinfgen(Qdec);
46%% COMPUTE NCD ERROR INDEX
54 q=(1.05*max(max(abs(Qperm))));
57P=ctmc_randomization(Qperm,q);
59procRows=0; %processed rows
60for i = 1:nMacroStates %
for each macro-state
62 A((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
64 A((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
65 procRows = procRows + length(MS{i});
70% the following subprocedure makes each diagonal block stochastic by
71% placing a normalization condition in the diagonal position
73procRows=0; %processed rows
74for i = 1:size(MS,1) %
for each macro-state
77 A(procRows+j,procRows+pos)=1-(sum(A(procRows+j,setdiff((procRows+1):(procRows+length(MS{i})),(procRows+pos)))));
79 procRows = procRows + length(MS{i});
81eigMS = zeros(1,size(MS,1));
82procRows=0; %processed rows
83for i=1:size(MS,1) %
for each macro-state
84 e=sort(abs(eig(A((procRows + 1):(procRows + length(MS{i})),(procRows + 1):(procRows + length(MS{i}))))));
86 eigMS(i)=e(end-1); % take the second largest eigvalues of the block
88 eigMS(i)=0; % skip
if there
is no second eigenvalue
90 procRows = procRows + length(MS{i});
92epsMAX=(1-max(eigMS))/2;
97%% COMPUTE MICROPROBABILITIES
98procRows=0; %processed rows
99pmicro=zeros(size(Q,1),1);
100for i = 1:nMacroStates %
for each macro-state
101 Qmicrostate=Qdec((procRows + 1):(procRows + length(MS{i})),(procRows + 1):(procRows + length(MS{i})));
102 pmicro((procRows + 1):(procRows + length(MS{i})),1)=ctmc_solve_reducible(Qmicrostate);
103 procRows = procRows + length(MS{i});
106%% COMPUTE MACROPROBABILITIES
107G=zeros(nMacroStates,nMacroStates);
108procRows=0; %processed rows
109for i = 1:nMacroStates %
for each source macro-state
110 procCols=0; %processed cols
111 for j = 1:nMacroStates %
for dest macro-state
113 for iState=1:length(MS{i})
114 G(i,j)=G(i,j)+pmicro(procRows+iState)*sum(
P(procRows+iState,(procCols+1):(procCols+length(MS{j}))));
117 procCols = procCols + length(MS{j});
119 procRows = procRows + length(MS{i});
121for i = 1:nMacroStates %
for each source macro-state
122 G(i,i)=1-sum(G(i,:));
124% Note here we work out the solution of macro states
using another
125% Courtois method, which means we are solving an even coarsener system,
126% then work all the way back to find the solution of original problem
127pMacro=ctmc_courtois(G,MSS);
128procRows=0; %processed rows
129for i = 1:nMacroStates %
for each source macro-state
130 p((procRows+1):(procRows+length(MS{i})))=pMacro(i)*pmicro((procRows+1):(procRows+length(MS{i})));
131 procRows = procRows + length(MS{i});