LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
m3pp2m_fitc_approx.m
1function [FIT] = m3pp2m_fitc_approx(a, bt1, bt2, binf, m3t2, ...
2 t1, t2, ...
3 ai, dvt3, t3)
4% Fits a second-order Marked MMPP.
5% a: arrival rate
6% bt1: IDC at scale t1
7% bt2: IDC at scale t2
8% binf: IDC for t->inf
9% m3t2: third central moment
10% t1: first time scale
11% t2: second time scale
12% ai: i-th element is the rate of class i
13% dvt3: i-th element is the delta of variance of class i and the variance
14% of all other classes combined, at resolution t3
15% t3: third time scale
16
17if abs(a - sum(ai)) > 1e-8
18 error('Inconsistent per-class arrival rates.');
19end
20
21% number of classes
22m = size(ai,1);
23
24% fit underlying MMPP(2)
25FIT = mmpp2_fitc_approx(a, bt1, bt2, binf, m3t2, t1, t2);
26
27% degenerate case: poisson process
28if size(FIT{1},1) == 1
29 D0 = FIT{1};
30 D1 = FIT{2};
31 FIT = cell(1,2+m);
32 FIT{1} = D0;
33 FIT{2} = D1;
34 a = sum(ai);
35 pi = ai/a;
36 for i = 1:m
37 FIT{2+i} = pi(i)*D1;
38 end
39 return;
40end
41
42% just a single class!
43if m == 1
44 FIT = {FIT{1},FIT{2},FIT{2}};
45 return;
46end
47
48l1 = FIT{2}(1,1);
49l2 = FIT{2}(2,2);
50r1 = FIT{1}(1,2);
51r2 = FIT{1}(2,1);
52t = t3;
53
54q1i_ai = ((r1^4*t)/2 + (r2^4*t)/2 - l1*r2^3*t + l2*r2^3*t + 2*r1*r2^3*t + 2*r1^3*r2*t + 3*r1^2*r2^2*t + 2*l1*r2^2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l2*r2^2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l1*r1*r2^2*t - l1*r1^2*r2*t + 2*l2*r1*r2^2*t + l2*r1^2*r2*t + 2*l1*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2))/(l1*r2*(r1 + r2)*(2*l1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*r1*t - l1*r2*t + l2*r1*t + l2*r2*t));
55q1i_dvi = -(r1^4 + 4*r1^3*r2 + 6*r1^2*r2^2 + 4*r1*r2^3 + r2^4)/(4*l1*r2*(r1 + r2)*(2*l1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*r1*t - l1*r2*t + l2*r1*t + l2*r2*t));
56q1i_const = -(l1*r2^4*t + l2*r1^4*t + 3*l1*r1*r2^3*t + l1*r1^3*r2*t + l2*r1*r2^3*t + 3*l2*r1^3*r2*t + 3*l1*r1^2*r2^2*t + 2*l1^2*r1*r2^2*t + 2*l1^2*r1^2*r2*t + 3*l2*r1^2*r2^2*t + 2*l2^2*r1*r2^2*t + 2*l2^2*r1^2*r2*t - 4*l1^2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 4*l2^2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 4*l1*l2*r1*r2^2*t - 4*l1*l2*r1^2*r2*t + 8*l1*l2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2))/(4*l1*r2*(r1 + r2)*(2*l1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 2*l2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*r1*t - l1*r2*t + l2*r1*t + l2*r2*t));
57q2i_ai = -((r1^4*t)/2 + (r2^4*t)/2 + l1*r1^3*t - l2*r1^3*t + 2*r1*r2^3*t + 2*r1^3*r2*t + 3*r1^2*r2^2*t - 2*l1*r1^2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) + 2*l2*r1^2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) + l1*r1*r2^2*t + 2*l1*r1^2*r2*t - l2*r1*r2^2*t - 2*l2*r1^2*r2*t - 2*l1*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) + 2*l2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2))/((r1 + r2)*(l2^2*r1^2*t - 2*l2^2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1^2*t + l2^2*r1*r2*t + 2*l1*l2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1*r2*t));
58q2i_dvi = (r1^4 + 4*r1^3*r2 + 6*r1^2*r2^2 + 4*r1*r2^3 + r2^4)/(4*(r1 + r2)*(l2^2*r1^2*t - 2*l2^2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1^2*t + l2^2*r1*r2*t + 2*l1*l2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1*r2*t));
59q2i_const = (l1*r2^4*t + l2*r1^4*t + 3*l1*r1*r2^3*t + l1*r1^3*r2*t + l2*r1*r2^3*t + 3*l2*r1^3*r2*t + 3*l1*r1^2*r2^2*t + 2*l1^2*r1*r2^2*t + 2*l1^2*r1^2*r2*t + 3*l2*r1^2*r2^2*t + 2*l2^2*r1*r2^2*t + 2*l2^2*r1^2*r2*t - 4*l1^2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 4*l2^2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - 4*l1*l2*r1*r2^2*t - 4*l1*l2*r1^2*r2*t + 8*l1*l2*r1*r2*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2))/(4*(r1 + r2)*(l2^2*r1^2*t - 2*l2^2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1^2*t + l2^2*r1*r2*t + 2*l1*l2*r1*sinh((r1*t)/2 + (r2*t)/2)*exp(- (r1*t)/2 - (r2*t)/2) - l1*l2*r1*r2*t));
60
61H = zeros(m, m);
62f = zeros(m, 1);
63for i = 1:m
64 H(i,i) = 2/dvt3(i)^2;
65 f(i) = -2/dvt3(i);
66end
67
68A = zeros(2*m,m);
69b = zeros(2*m,1);
70for i = 1:m
71 A(1+2*(i-1),i) = -q1i_dvi;
72 b(1+2*(i-1)) = q1i_const + q1i_ai * ai(i);
73 A(2+2*(i-1),i) = -q2i_dvi;
74 b(2+2*(i-1)) = q2i_const + q2i_ai * ai(i);
75end
76
77Aeq = zeros(2,m);
78beq = zeros(2,1);
79for i = 1:m
80 Aeq(1,i) = q1i_dvi;
81 Aeq(2,i) = q2i_dvi;
82end
83beq(1) = 1 - m*q1i_const - q1i_ai * a;
84beq(2) = 1 - m*q2i_const - q2i_ai * a;
85
86%fprintf('Fitting per-class counting process...\n');
87options = optimset('Algorithm','interior-point-convex ',...
88 'Display','none');
89%[x,fx] = quadprog(H, f, A, b, Aeq, beq, [], [], [], options);
90lb = 1e-6*ones( size(A,2),1);
91ub = 1e6*ones( size(A,2),1);
92[x,fx]=QP(H, h, A, b, Aeq, beq, lb, ub, options);
93%fit_error = fx + m;
94%fprintf('Per-class fitting error: %f\n', fit_error);
95
96q = zeros(2,m);
97for i = 1:m
98 Ai = ai(i); % rate fitted exactly
99 Dvi = x(i); % result of optimization (optimal)
100 q(1,i) = q1i_ai * Ai + q1i_dvi * Dvi + q1i_const;
101 q(2,i) = q2i_ai * Ai + q2i_dvi * Dvi + q2i_const;
102end
103
104D0 = FIT{1};
105D1 = FIT{2};
106FIT = cell(1,2+m);
107FIT{1} = D0;
108FIT{2} = D1;
109for i = 1:m
110 FIT{2+i} = FIT{2} .* [q(1,i) 0; 0 q(2,i)];
111end
112
113if ~mmap_isfeasible(FIT)
114 error('Infeasible fitted M3PP');
115end
116
117Ai = mmap_count_mean(FIT,1);
118Dvt3 = zeros(m,1);
119for i = 1:m
120 mmap2 = {FIT{1},FIT{2},FIT{2+i},FIT{2}-FIT{2+i}};
121 v2t3 = mmap_count_var(mmap2,t3);
122 Dvt3(i) = v2t3(1)-v2t3(2);
123end
124%
125% for i = 1:m
126% fprintf('Rate class %d: input = %.3f, output = %.3f\n', ...
127% i, ai(i), Ai(i));
128% end
129% for i = 1:m
130% fprintf('DV%d(t3): input = %.3f, output = %.3f\n', ...
131% i, dvt3(i), Dvt3(i));
132% end
133
134end