1function [FIT] = m3pp2m_fitc_approx_ag_multiclass(mmpp, ai, gt3, t3)
2% Fits a M3PP(2,m) given the underlying MMPP(2).
4% - mmpp: underlying mmpp(2)
5% - ai: i-th element
is the rate of
class i
6% - gt3: i-th element
is the sum of the variance of
class i and its
7% covariance with all the other
classes combined.
8% - t3: third time scale
16a = map_count_mean(mmpp,1);
18% check per-
class rates consistency
19if abs(a - sum(ai)) > 1e-8
20 error('Inconsistent per-class arrival rates.');
23% degenerate
case: poisson process
40 FIT = {FIT{1},FIT{2},FIT{2}};
50f1num = l1*r2*(2*l2*r1 - 2*l1*r1 + r1^3*t + r2^3*t + 2*l1*r1^2*t - 2*l2*r1^2*t + 3*r1*r2^2*t + 3*r1^2*r2*t + 2*l1*r1*exp(- r1*t - r2*t) - 2*l2*r1*exp(- r1*t - r2*t) + 2*l1*r1*r2*t - 2*l2*r1*r2*t);
52f2num = l2*r1*(2*l1*r2 - 2*l2*r2 + r1^3*t + r2^3*t - 2*l1*r2^2*t + 2*l2*r2^2*t + 3*r1*r2^2*t + 3*r1^2*r2*t - 2*l1*r2*exp(- r1*t - r2*t) + 2*l2*r2*exp(- r1*t - r2*t) - 2*l1*r1*r2*t + 2*l2*r1*r2*t);
54tmp = (f1*l2*r1 - f2*l1*r2);
55q1i_ai = -(f2*(r1 + r2))/tmp;
58q2i_ai = (f1*(r1 + r2))/tmp;
74 A(1+2*(i-1),i) = -q1i_gi;
75 b(1+2*(i-1)) = q1i_const + q1i_ai * ai(i);
76 A(2+2*(i-1),i) = -q2i_gi;
77 b(2+2*(i-1)) = q2i_const + q2i_ai * ai(i);
86beq(1) = 1 - m*q1i_const - q1i_ai * a;
87beq(2) = 1 - m*q2i_const - q2i_ai * a;
89fprintf(
'Fitting per-class counting process...\n');
90options = optimset(
'Algorithm',
'interior-point-convex ',...
92f(~isfinite(f))=0; % remove infnans
98[x,fx] = quadprog(H, f, A, b, Aeq, beq, [], [], [], options);
99lb = zeros( size(A,2),1);
100ub = 1e6*ones( size(A,2),1);
101%[x,fx]=QP(H, f, A, b, Aeq, beq, lb, ub, options)
103fprintf(
'Per-class fitting error: %f\n', fit_error);
107 Ai = ai(i); % rate fitted exactly
108 Gi = x(i); % result of optimization (optimal)
109 q(1,i) = q1i_ai * Ai + q1i_gi * Gi + q1i_const;
110 q(2,i) = q2i_ai * Ai + q2i_gi * Gi + q2i_const;
119 FIT{2+i} = FIT{2} .* [q(1,i) 0; 0 q(2,i)];
122if ~mmap_isfeasible(FIT)
124 warning(
'Infeasible fitted M3PP');
127Ai = mmap_count_mean(FIT,1);
130 mmap2 = {FIT{1},FIT{2},FIT{2+i},FIT{2}-FIT{2+i}};
131 v2t3 = mmap_count_var(mmap2,t3);
132 s2t3 = mmap_count_mcov(mmap2,t3);
133 Gt3(i) = v2t3(1) + s2t3(1,2);
137 fprintf(
'Rate class %d: input = %.4f, output = %.4f\n', ...
141 fprintf(
'g%d(t3): input = %.4f, output = %.4f\n', ...