LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ctmc_multi.m
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.
7
8% [p,p_1,pcourt,Qperm,eps,epsMAX] = CTMC_multi(Q,MS,MSS)
9% -- Input
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
13
14% -- Output
15% p : approximate steady-state probability vector
16% p_1 :
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)
21
22%% INIT
23if nargin==2
24 q=1;
25end
26v=[];
27nMacroStates = size(MS,1); % Number of macro-states
28%% REARRANGE INFINITESIMAL GENERATOR ACCORDING TO THE MACROSTATES
29
30for n=1:nMacroStates
31 v=[v,MS{n}];
32end
33Qperm=Q(v,v); % reorder according to the new macro-states
34Qdec=Qperm;
35procRows=0; %processed rows
36for i = 1:size(MS,1) % for each macro-state
37 if procRows >0
38 Qdec((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
39 end
40 Qdec((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
41 procRows = procRows + length(MS{i});
42end
43% now make each substochastic diagonal block a stochastic matrix
44Qdec=ctmc_makeinfgen(Qdec);
45
46%% COMPUTE NCD ERROR INDEX
47epsC=Qperm-Qdec;
48epsC=0;
49C=epsC;
50eps=1;
51
52% apply randomization
53if nargin==3
54 q=(1.05*max(max(abs(Qperm))));
55end
56
57P=ctmc_randomization(Qperm,q);
58A=P;
59procRows=0; %processed rows
60for i = 1:nMacroStates % for each macro-state
61 if procRows >0
62 A((procRows + 1):(procRows + length(MS{i})),1:procRows)=0;
63 end
64 A((procRows + 1):(procRows + length(MS{i})),(procRows + length(MS{i})+1):end)=0;
65 procRows = procRows + length(MS{i});
66end
67B=P-A;
68eps=max(sum(B));
69%% COMPUTE epsMAX
70% the following subprocedure makes each diagonal block stochastic by
71% placing a normalization condition in the diagonal position
72if nargout>5
73procRows=0; %processed rows
74for i = 1:size(MS,1) % for each macro-state
75 for j=1:length(MS{i})
76 pos=j;
77 A(procRows+j,procRows+pos)=1-(sum(A(procRows+j,setdiff((procRows+1):(procRows+length(MS{i})),(procRows+pos)))));
78 end
79 procRows = procRows + length(MS{i});
80end
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}))))));
85 if length(e)>1
86 eigMS(i)=e(end-1); % take the second largest eigvalues of the block
87 else
88 eigMS(i)=0; % skip if there is no second eigenvalue
89 end
90 procRows = procRows + length(MS{i});
91end
92epsMAX=(1-max(eigMS))/2;
93else
94 eps=0;
95 epsMAX=0;
96end
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});
104end
105
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
112 if i~=j
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}))));
115 end
116 end
117 procCols = procCols + length(MS{j});
118 end
119 procRows = procRows + length(MS{i});
120end
121for i = 1:nMacroStates % for each source macro-state
122 G(i,i)=1-sum(G(i,:));
123end
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});
132end
133%% OUTPUT
134for i=1:length(v)
135pout(v(i))=p(i);
136end
137p=pout;