1classdef MMPP2 < MarkovModulated
2 % 2-phase Markov-Modulated Poisson Process - MMPP(2)
4 % Copyright (c) 2012-2026, Imperial College London
9 function self = MMPP2(lambda0,lambda1,sigma0,sigma1)
10 % SELF = MMPP2(LAMBDA0,LAMBDA1,SIGMA0,SIGMA1)
12 self@MarkovModulated(
'MMPP2',4);
13 setParam(self, 1,
'lambda0', lambda0);
14 setParam(self, 2,
'lambda1', lambda1);
15 setParam(self, 3,
'sigma0', sigma0);
16 setParam(self, 4,
'sigma1', sigma1);
17 lambda0 = self.getParam(1).paramValue;
18 lambda1 = self.getParam(2).paramValue;
19 sigma0 = self.getParam(3).paramValue;
20 sigma1 = self.getParam(4).paramValue;
21 D0 = [-sigma0-lambda0,sigma0;sigma1,-sigma1-lambda1];
22 D1 = [lambda0,0;0,lambda1];
23 self.process = {D0,D1};
26 function Di = D(self, i, wantSparse)
32 % Return representation matrix, e.g., D0=MAP.D(0)
37 Di=self.getProcess{i+1};
46 Di=full(self.getProcess{i+1});
51 function meant = evalMeanT(self,t)
52 % MEANT = EVALMEANT(SELF,T)
54 lambda0 = self.getParam(1).paramValue;
55 lambda1 = self.getParam(2).paramValue;
56 sigma0 = self.getParam(3).paramValue;
57 sigma1 = self.getParam(4).paramValue;
58 lambda = (lambda0*sigma1 + lambda1*sigma0) / (sigma0+sigma1);
62 function vart = evalVarT(self,t)
63 % VART = EVALVART(SELF,T)
65 % Evaluate the variance-time curve at t
69 vart = map_varcount(MAP, t);
72 function rate = getRate(self)
73 rate = 1 / getMean(self);
76 function X = sample(self, n)
78 if nargin<2 %~exist(
'n',
'var'),
81 MAP = self.getProcess;
82 if map_isfeasible(MAP)
83 X = map_sample(MAP,n);
85 line_error(mfilename,
'This process is infeasible (negative rates).');
89 % inter-arrival time properties
90 function mean = getMean(self)
93 lambda0 = self.getParam(1).paramValue;
94 lambda1 = self.getParam(2).paramValue;
95 sigma0 = self.getParam(3).paramValue;
96 sigma1 = self.getParam(4).paramValue;
97 lambda = (lambda0*sigma1 + lambda1*sigma0) / (sigma0+sigma1);
101 function scv = getSCV(self)
104 lambda0 = self.getParam(1).paramValue;
105 lambda1 = self.getParam(2).paramValue;
106 sigma0 = self.getParam(3).paramValue;
107 sigma1 = self.getParam(4).paramValue;
108 scv = (2*lambda0^2*sigma0*sigma1 + lambda0*lambda1*sigma0^2 - 2*lambda0*lambda1*sigma0*sigma1 + lambda0*lambda1*sigma1^2 + lambda0*sigma0^2*sigma1 + 2*lambda0*sigma0*sigma1^2 + lambda0*sigma1^3 + 2*lambda1^2*sigma0*sigma1 + lambda1*sigma0^3 + 2*lambda1*sigma0^2*sigma1 + lambda1*sigma0*sigma1^2)/((sigma0 + sigma1)^2*(lambda0*lambda1 + lambda0*sigma1 + lambda1*sigma0));
111 function skew = getSkewness(self)
112 skew = map_skew(self.getProcess());
115 function
id = getIDC(self)
116 % IDC = GETIDC() % INDEX OF DISPERSION FOR COUNTS
118 lambda0 = self.getParam(1).paramValue;
119 lambda1 = self.getParam(2).paramValue;
120 sigma0 = self.getParam(3).paramValue;
121 sigma1 = self.getParam(4).paramValue;
122 id = 1 + 2*(lambda0-lambda1)^2*sigma0*sigma1/(sigma0+sigma1)^2/(lambda0*sigma1+lambda1*sigma0);
125 function
id = getIDI(self)
126 % IDI = GETIDI() % INDEX OF DISPERSION FOR INTERVALS
128 id = self.getIDC(self); % only asymptotic for now
131 function n = getNumberOfPhases(~)
132 % N = GETNUMBEROFPHASES()
136 function acf = getACF(self, lags)
137 % ACF = GETACF(self, lags)
139 acf = map_acf(self.D,lags);
142 function [gamma2, gamma] = getACFDecay(self)
143 % [gamma2, gamma] = GETACFDECAY(self)
145 % gamma2: asymptotic decay rate of acf
146 % gamma: interpolated decay rate of acf
148 gamma2 = map_gamma2(self.D);
150 gamma = map_gamma(self.D);
154 function
bool = isImmediate(self)
155 % BOOL = ISIMMEDIATE()
157 bool = getMean(self) == 0;
161 function acf = evalACFT(self, lags, timescale)
162 % ACF = EVALACFT(self, lags)
164 % Evaluate the autocorrelation in counts at timescale t
166 acf = map_acfc(self.D, lags, timescale);
172 function mmpp2 = rand()
175 % Generate random MAP using uniform random numbers
178 mmpp2 = MMPP2(D{1}(1,2), D{1}(2,1), D{2}(1,1), D{2}(2,2));
181 function mmpp2 = fitCentralAndIDC(mean, var, skew, idc)
182 if mean <= GlobalConstants.FineTol
186 m = mmpp2_fit1(mean,scv,skew,idc);
187 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));
191 function mmpp2 = fitCentralAndACFLag1(mean, var, skew, rho1)
192 if mean <= GlobalConstants.FineTol
196 m = mmpp2_fit4(mean,scv,skew,rho1);
197 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));
201 function mmpp2 = fitCentralAndACFDecay(mean, var, skew, gamma2)
202 if m1 <= GlobalConstants.FineTol
206 m = mmpp2_fit2(mean,scv,skew,gamma2);
207 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));
211 function mmpp2 = fitRawMomentsAndIDC(m1, m2, m3, idc)
212 if m1 <= GlobalConstants.FineTol
215 scv = (m2-m1^2)/m1^2;
216 gamma2=-(scv-idc)/(-1+idc);
217 m = mmpp2_fit3(m1,m2,m3,gamma2);
218 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));
222 function mmpp2 = fitRawMomentsAndACFLag1(m1, m2, m3, rho1)
223 if m1 <= GlobalConstants.FineTol
226 scv = (m2-m1^2)/m1^2;
229 m = mmpp2_fit3(m1,m2,m3,gamma2);
230 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));
234 function mmpp2 = fitRawMomentsAndACFDecay(m1, m2, m3, gamma2)
235 if m1 <= GlobalConstants.FineTol
238 m = mmpp2_fit3(m1,m2,m3,gamma2);
239 mmpp2 = MMPP2(m{2}(1,1),m{2}(2,2),m{1}(1,2),m{1}(2,1));