1classdef MarkovChain < Process
2 % An abstract
class for a discrete time Markov chain
4 % Copyright (c) 2012-2026, Imperial College London
14 function self = MarkovChain(transMat, isFinite)
15 % SELF = MARKOVCHAIN(transMat, isInfinite)
16 self@Process(
'MarkovChain', 1);
18 self.transMat = dtmc_makestochastic(transMat);
23 self.isfinite = isFinite;
27 function A = toMarkovProcess(self)
28 Q= self.transMat - eye(size(self.transMat));
30 A.setStateSpace(self.stateSpace);
33 function A = toCTMC(self)
34 % TOCTMC - Alias
for toMarkovProcess
for backwards compatibility
35 A = self.toMarkovProcess();
38 function Ap = toTimeReversed(self)
39 Ap = MarkovChain(dtmc_timereverse(self.transMat));
42 function transMat = getTransMat(self)
43 transMat = self.transMat;
46 function setStateSpace(self,stateSpace)
47 self.stateSpace = stateSpace;
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));
57 nodeLbl{s} = sprintf(
'%d', self.stateSpace(s,end));
64 if ~isempty(self.stateSpace)
66 edgeLbl{end+1,1} = nodeLbl{I(t)};
67 edgeLbl{end,2} = nodeLbl{J(t)};
68 edgeLbl{end,3} = sprintf(
'%.2f',(q(t)));
72 edgeLbl{end+1,1} = num2str(I(t));
73 edgeLbl{end,2} = num2str(J(t));
74 edgeLbl{end,3} = sprintf(
'%.2f',(q(t)));
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);
81 graphViz4Matlab(
'-adjMat',P0,
'-nodeLabels',nodeLbl,
'-edgeLabels',edgeLbl,
'-layout',Springlayout);
88 function dtmcObj=rand(nStates) % creates a random DTMC
89 dtmcObj = MarkovChain(dtmc_rand(nStates));
92 function dtmcObj=fromSampleSysAggr(sa)
94 sampleState = sa.state{1};
95 for r=2:length(sa.state)
96 sampleState = State.cartesian(sampleState, sa.state{r});
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;
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);
108 % at
this point, dtmc has absolute counts so not yet normalized
109 dtmc = dtmc_makestochastic(dtmc);
110 dtmcObj = MarkovChain(dtmc, isFinite);