LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
mmap_modulate.m
1function RET = mmap_modulate(P, HT, MMAP)
2% MMAP_MODULATE. Modulates in continuous time a set of MMAPs according to
3% a given holding time distribution for each MMAP.
4% SMMAP = MMAP_MODULATE(HT, MMAP)
5% HT{j}: phase-type distribution for holding time in state group j
6% MMAPP{j}: departure process while in state group j
7
8J = length(HT);
9if length(MMAP)~=J
10 error('The HT and MMAP cell arrays must have the same length.');
11end
12
13for j=1:length(MMAP)
14 if length(MMAP{j})==2 % MAP
15 MMAP{j}{3} = MMAP{j}{2}; % autoconvert into MMAP
16 end
17end
18
19nc = cellfun(@length, MMAP); % nc(j): classes in MMAP{j}
20if min(nc) ~= max(nc)
21 error('The MMAPs must have the same number of types.');
22else
23 K = nc(1)-2;
24end
25
26nh = cellfun(@(ph) length(ph{1}), HT); % nh(j): states in PH{j}
27nm = cellfun(@(mmap) length(mmap{1}), MMAP); % nm(j): states in MMAP{j}
28
29Q = cell(1,J);
30RET = cell(1,2+K); % a marked MAP
31for k=1:(2+K)
32 RET{k} = [];
33end
34for j=1:J
35 Q{j} = cell(1,3+K);
36 Q{j}{1} = krons(HT{j}{1}, MMAP{j}{1});
37 %Q{j}{2} = krons(HT{j}{2}, MMAP{j}{2});
38 Q{j}{3} = kron(HT{j}{2}, eye(nm(j)));
39 for k=1:K
40 Q{j}{3+k} = kron( eye(nh(j)), MMAP{j}{2+k} );
41 end
42 nq = length(Q{j}{1});
43 MOD_j = cell(1,2+K);
44 for k=1:2+K
45 MOD_j{k} = [];
46 end
47 for i=1:J
48 if i==j
49 MOD_j{1} = [MOD_j{1}, Q{j}{1}];
50 for k=1:K
51 MOD_j{2+k} = [MOD_j{2+k}, Q{j}{3+k}];
52 end
53 else
54 entry_i = kron(map_pie(HT{i}),map_pie(MMAP{i}));
55 MOD_j{1} = [MOD_j{1}, P(j,i)*Q{j}{3}*ones(nq,1)*entry_i];
56 for k=1:K
57 MOD_j{2+k} = [MOD_j{2+k}, 0*P(j,i)*Q{j}{3}*ones(nq,1)*entry_i];
58 end
59 end
60 end
61
62 RET{1} = [RET{1}; MOD_j{1}];
63 for k=1:K
64 RET{2+k} = [RET{2+k}; MOD_j{2+k}];
65 end
66end
67RET = mmap_normalize(RET);
68end