1classdef Markovian < ContinuousDistribution
2 % An astract
class for Markovian distributions
4 % Copyright (c) 2012-2026, Imperial College London
8 function self = Markovian(name, numParam)
9 % SELF = MARKOVIANDISTRIBUTION(NAME, NUMPARAM)
11 % Abstract
class constructor
12 self@ContinuousDistribution(name, numParam, [0,Inf]);
24 % alpha,T process of a PH distribution
25 % function alpha_vec = alpha(self)
26 % alpha_vec = self.getInitProb;
29 % function T_mat = T(self)
30 % T_mat = self.getProcess{0};
33 % D matrices process as in MAPs
34 function Di = D(self, i, wantSparse)
40 % Return process matrix, e.g., D0=MAP.D(0)
45 Di=self.getProcess{i+1};
54 Di=full(self.getProcess{i+1});
59 function X = sample(self, n)
62 % Get n samples from the distribution
63 if nargin<2 %~exist(
'n',
'var'),
66 X = map_sample(self.getProcess,n);
69 function EXn = getMoments(self, n)
72 if nargin<2 %~exist(
'n',
'var'),
76 EXn = map_moment(PH,1:n);
79 function MEAN = getMean(self)
81 if ~isempty(self.mean)
84 if isnan(self.getProcess{1})
87 MEAN = map_mean(self.getProcess);
91 if isnan(self.immediate)
92 self.immediate = MEAN < GlobalConstants.FineTol;
96 function SCV = getSCV(self)
98 % Get the squared coefficient of variation of the distribution (SCV = variance / mean^2)
99 if any(isnan(self.getProcess{1}))
102 SCV = map_scv(self.getProcess);
106 function SKEW = getSkewness(self)
107 % SKEW = GETSKEWNESS()
108 if any(isnan(self.getProcess{1}))
111 SKEW = map_skew(self.getProcess);
115 function Ft = evalCDF(self,t)
116 % FT = EVALCDF(SELF,T)
118 % Evaluate the cumulative distribution function at t
121 Ft = map_cdf(self.getProcess,t);
124 function alpha = getInitProb(self)
125 % ALPHA = GETINITPROB()
126 aph = self.getProcess;
127 alpha = map_pie(
aph);
130 function T = getSubgenerator(self)
131 % T = GETSUBGENERATOR()
134 aph = self.getProcess;
138 function mu = getMu(self)
141 % Return total outgoing rate from each state
142 aph = self.getProcess;
146 function phi = getPhi(self)
149 % Return the probability that a transition out of a state
is
151 aph = self.getProcess;
155 phi = -
aph{2}*ones(size(
aph{1},1),1) ./ diag(
aph{1});
163 % overload isImmediate
for higher perofrmance
164 function
bool = isImmediate(self)
165 % BOOL = ISIMMEDIATE()
166 % Check
if the distribution
is equivalent to an Immediate
168 if isnan(self.immediate)
169 self.immediate = self.getMean < GlobalConstants.FineTol;
171 bool = self.immediate;
174 function setRate(self,RATE)
178 self.setMean(1/RATE);
181 function self = setMean(self, MEAN)
182 % SELF = UPDATEMEAN(MEAN)
184 % Update distribution with given mean and variance
185 md = self.fitMeanAndSCV(MEAN,self.getSCV);
186 self.process = md.process;
188 self.immediate = MEAN < GlobalConstants.FineTol;
189 self.params = md.params;
190 self.support = md.support;
193 function phases = getNumberOfPhases(self)
194 % PHASES = GETNUMBEROFPHASES()
196 % Return number of phases in the distribution
197 PH = self.getProcess;
198 phases = length(PH{1});
201 function D = getProcess(self)
202 % D = GETREPRESENTATION()
206 function setProcess(self, D)
210 function L = evalLST(self, s)
211 % L = EVALLAPLACETRANSFORM(S)
213 % Evaluate the Laplace transform of the distribution function at t
216 PH = self.getProcess;
219 e = ones(length(pie),1);
220 L = pie*inv(s*eye(size(A))-A)*(-A)*e;
226 PH = self.getProcess;
227 s = []; % source node
229 w = []; % edge weight
232 for i=1:self.getNumberOfPhases
233 for j=1:self.getNumberOfPhases
238 w(end+1) = PH{1}(i,j);
240 l{end+1} = num2str(w(end));
246 w(end+1) = PH{2}(i,j);
248 l{end+1} = num2str(w(end));
253 p = plot(G,
'EdgeColor',
'k',
'NodeColor',
'k',
'LineStyle',
'-',
'Marker',
'o',
'MarkerSize',4,
'Layout',
'layered',
'EdgeLabel',l,
'Direction',
'right');
254 % highlight observable transitions in red
255 highlight(p,s(c==1),t(c==1),
'LineStyle',
'-',
'EdgeColor',
'r');