1function [FIT] = m3pp2m_fitc_approx(a, bt1, bt2, binf, m3t2, ...
4% Fits a second-order Marked MMPP.
9% m3t2: third central moment
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
17if abs(a - sum(ai)) > 1e-8
18 error(
'Inconsistent per-class arrival rates.');
24% fit underlying MMPP(2)
25FIT = mmpp2_fitc_approx(a, bt1, bt2, binf, m3t2, t1, t2);
27% degenerate case: poisson process
44 FIT = {FIT{1},FIT{2},FIT{2}};
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));
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);
83beq(1) = 1 - m*q1i_const - q1i_ai * a;
84beq(2) = 1 - m*q2i_const - q2i_ai * a;
86%fprintf(
'Fitting per-class counting process...\n');
87options = optimset(
'Algorithm',
'interior-point-convex ',...
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);
94%fprintf(
'Per-class fitting error: %f\n', fit_error);
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;
110 FIT{2+i} = FIT{2} .* [q(1,i) 0; 0 q(2,i)];
113if ~mmap_isfeasible(FIT)
114 error(
'Infeasible fitted M3PP');
117Ai = mmap_count_mean(FIT,1);
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);
126% fprintf(
'Rate class %d: input = %.3f, output = %.3f\n', ...
130% fprintf(
'DV%d(t3): input = %.3f, output = %.3f\n', ...
131% i, dvt3(i), Dvt3(i));