1classdef DMAP < MarkovModulated
2 % Discrete-time Markovian Arrival Process
4 % Models discrete-time arrival streams with D0 and D1 sub-stochastic matrices.
5 % D0+D1
is a stochastic matrix (row sums = 1).
7 % Copyright (c) 2012-2026, Imperial College London
11 function self = DMAP(D0, D1)
12 self@MarkovModulated(
'DMAP', 2);
13 if nargin < 2 && iscell(D0)
18 setParam(self, 1,
'D0', D0);
19 setParam(self, 2,
'D1', D1);
20 self.process = {D0, D1};
21 if ~dmap_isfeasible(self.D)
22 line_warning(mfilename, 'DMAP
is infeasible.\n');
26 function n = getNumberOfPhases(self)
27 n = length(self.D(0));
30 function Di = D(self, i, wantSparse)
38 Di = self.getProcess{i+1};
47 Di = full(self.getProcess{i+1});
52 function MEAN = getMean(self)
56 al = dmap_pie({D0, D1});
57 MEAN = al * inv(eye(N) - D0) * ones(N, 1);
60 function meant = evalMeanT(self, t)
61 meant = t / self.getMean();
64 function lam = getRate(self)
65 lam = 1.0 / self.getMean();
68 function X = sample(self, n)
72 X = dmap_sample(self.getProcess, n);
75 function self = setMean(self, MEAN)
80 al = dmap_pie({D0, D1});
81 currentMean = al * inv(I - D0) * ones(N, 1);
82 scale = currentMean / MEAN;
83 newImD0 = (I - D0) * scale;
87 rs = sum(newD0(i,:)) + sum(newD1(i,:));
88 newD1(i,:) = newD1(i,:) / rs;
89 newD0(i,:) = newD0(i,:) / rs;
91 self.params{1}.paramValue = newD0;
92 self.params{2}.paramValue = newD1;
93 self.process = {newD0, newD1};
96 function
bool = isImmediate(self)
97 bool = self.getMean < GlobalConstants.FineTol;
102 function dmap = rand(order)
108 D0(i,:) = D0(i,:) / (sum(D0(i,:)) + 0.5 + rand);
110 remaining = ones(order,1) - sum(D0, 2);
113 D1(i,:) = D1(i,:) / sum(D1(i,:)) * remaining(i);