LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MarkovChain.m
1classdef MarkovChain < Process
2 % An abstract class for a discrete time Markov chain
3 %
4 % Copyright (c) 2012-2026, Imperial College London
5 % All rights reserved.
6
7 properties
8 transMat;
9 stateSpace;
10 isfinite;
11 end
12
13 methods
14 function self = MarkovChain(transMat, isFinite)
15 % SELF = MARKOVCHAIN(transMat, isInfinite)
16 self@Process('MarkovChain', 1);
17
18 self.transMat = dtmc_makestochastic(transMat);
19 self.stateSpace = [];
20 if nargin < 2
21 self.isfinite = true;
22 else
23 self.isfinite = isFinite;
24 end
25 end
26
27 function A = toMarkovProcess(self)
28 Q= self.transMat - eye(size(self.transMat));
29 A=MarkovProcess(Q);
30 A.setStateSpace(self.stateSpace);
31 end
32
33 function A = toCTMC(self)
34 % TOCTMC - Alias for toMarkovProcess for backwards compatibility
35 A = self.toMarkovProcess();
36 end
37
38 function Ap = toTimeReversed(self)
39 Ap = MarkovChain(dtmc_timereverse(self.transMat));
40 end
41
42 function transMat = getTransMat(self)
43 transMat = self.transMat;
44 end
45
46 function setStateSpace(self,stateSpace)
47 self.stateSpace = stateSpace;
48 end
49
50 function plot(self)
51 nodeLbl = {};
52 if ~isempty(self.stateSpace)
53 for s=1:size(self.stateSpace,1)
54 if size(self.stateSpace,2)>1
55 nodeLbl{s} = sprintf('%s%d', sprintf('%d,', self.stateSpace(s,1:end-1)), self.stateSpace(s,end));
56 else
57 nodeLbl{s} = sprintf('%d', self.stateSpace(s,end));
58 end
59 end
60 end
61 P0 = self.transMat;
62 [I,J,q]=find(P0);
63 edgeLbl = {};
64 if ~isempty(self.stateSpace)
65 for t=1:length(I)
66 edgeLbl{end+1,1} = nodeLbl{I(t)};
67 edgeLbl{end,2} = nodeLbl{J(t)};
68 edgeLbl{end,3} = sprintf('%.2f',(q(t)));
69 end
70 else
71 for t=1:length(I)
72 edgeLbl{end+1,1} = num2str(I(t));
73 edgeLbl{end,2} = num2str(J(t));
74 edgeLbl{end,3} = sprintf('%.2f',(q(t)));
75 end
76 end
77 if length(nodeLbl) <= 6
78 colors = cell(1,length(nodeLbl)); for i=1:length(nodeLbl), colors{i}='w'; end
79 graphViz4Matlab('-adjMat',P0,'-nodeColors',colors,'-nodeLabels',nodeLbl,'-edgeLabels',edgeLbl,'-layout',Circularlayout);
80 else
81 graphViz4Matlab('-adjMat',P0,'-nodeLabels',nodeLbl,'-edgeLabels',edgeLbl,'-layout',Springlayout);
82 end
83 end
84
85 end
86
87 methods (Static)
88 function dtmcObj=rand(nStates) % creates a random DTMC
89 dtmcObj = MarkovChain(dtmc_rand(nStates));
90 end
91
92 function dtmcObj=fromSampleSysAggr(sa)
93 isFinite = true;
94 sampleState = sa.state{1};
95 for r=2:length(sa.state)
96 sampleState = State.cartesian(sampleState, sa.state{r});
97 end
98 [stateSpace,~,stateHash] = unique(sampleState,'rows');
99 dtmc = spalloc(length(stateSpace),length(stateSpace),length(stateSpace)); % assume O(n) elements with n states
100 holdTime = zeros(length(stateSpace),1);
101 for i=2:length(stateHash)
102 if isempty(dtmc(stateHash(i-1),stateHash(i)))
103 dtmc(stateHash(i-1),stateHash(i)) = 0;
104 end
105 dtmc(stateHash(i-1),stateHash(i)) = dtmc(stateHash(i-1),stateHash(i)) + 1;
106 holdTime(stateHash(i-1)) = holdTime(stateHash(i-1)) + sa.t(i) - sa.t(i-1);
107 end
108 % at this point, dtmc has absolute counts so not yet normalized
109 dtmc = dtmc_makestochastic(dtmc);
110 dtmcObj = MarkovChain(dtmc, isFinite);
111 end
112 end
113end