LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
DMAP.m
1classdef DMAP < MarkovModulated
2 % Discrete-time Markovian Arrival Process
3 %
4 % Models discrete-time arrival streams with D0 and D1 sub-stochastic matrices.
5 % D0+D1 is a stochastic matrix (row sums = 1).
6 %
7 % Copyright (c) 2012-2026, Imperial College London
8 % All rights reserved.
9
10 methods
11 function self = DMAP(D0, D1)
12 self@MarkovModulated('DMAP', 2);
13 if nargin < 2 && iscell(D0)
14 M = D0;
15 D0 = M{1};
16 D1 = M{2};
17 end
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');
23 end
24 end
25
26 function n = getNumberOfPhases(self)
27 n = length(self.D(0));
28 end
29
30 function Di = D(self, i, wantSparse)
31 if nargin < 3
32 wantSparse = false;
33 end
34 if wantSparse
35 if nargin < 2
36 Di = self.getProcess;
37 else
38 Di = self.getProcess{i+1};
39 end
40 else
41 if nargin < 2
42 Di = self.getProcess;
43 for j = 1:length(Di)
44 Di(j) = full(Di(j));
45 end
46 else
47 Di = full(self.getProcess{i+1});
48 end
49 end
50 end
51
52 function MEAN = getMean(self)
53 D0 = self.D(0);
54 D1 = self.D(1);
55 N = size(D0, 1);
56 al = dmap_pie({D0, D1});
57 MEAN = al * inv(eye(N) - D0) * ones(N, 1);
58 end
59
60 function meant = evalMeanT(self, t)
61 meant = t / self.getMean();
62 end
63
64 function lam = getRate(self)
65 lam = 1.0 / self.getMean();
66 end
67
68 function X = sample(self, n)
69 if nargin < 2
70 n = 1;
71 end
72 X = dmap_sample(self.getProcess, n);
73 end
74
75 function self = setMean(self, MEAN)
76 D0 = self.D(0);
77 D1 = self.D(1);
78 N = size(D0, 1);
79 I = eye(N);
80 al = dmap_pie({D0, D1});
81 currentMean = al * inv(I - D0) * ones(N, 1);
82 scale = currentMean / MEAN;
83 newImD0 = (I - D0) * scale;
84 newD0 = I - newImD0;
85 newD1 = D1 * scale;
86 for i = 1:N
87 rs = sum(newD0(i,:)) + sum(newD1(i,:));
88 newD1(i,:) = newD1(i,:) / rs;
89 newD0(i,:) = newD0(i,:) / rs;
90 end
91 self.params{1}.paramValue = newD0;
92 self.params{2}.paramValue = newD1;
93 self.process = {newD0, newD1};
94 end
95
96 function bool = isImmediate(self)
97 bool = self.getMean < GlobalConstants.FineTol;
98 end
99 end
100
101 methods (Static)
102 function dmap = rand(order)
103 if nargin < 1
104 order = 2;
105 end
106 D0 = rand(order);
107 for i = 1:order
108 D0(i,:) = D0(i,:) / (sum(D0(i,:)) + 0.5 + rand);
109 end
110 remaining = ones(order,1) - sum(D0, 2);
111 D1 = rand(order);
112 for i = 1:order
113 D1(i,:) = D1(i,:) / sum(D1(i,:)) * remaining(i);
114 end
115 dmap = DMAP(D0, D1);
116 end
117 end
118end