1function [FIT] = maph2m_fitc_approx(a, bt1, binf, t1, ...
3% Fits a second-order Marked MMPP.
10% ai: i-th element
is the rate of
class i
11% dvt3: i-th element
is the delta of variance of
class i and the variance
12% of all other
classes combined, at resolution t3
17options =
struct(
'Algorithm',
'active-set', ...
18 'Display',
'none', ...
19 'MaxFunEvals', 100000);
20% l1, l2, r1 (rate
is fitted exactly)
22lb = [1e-6, 1e-6, 1e-6];
24fprintf(
'Fitting unified counting process...\n');
25if strcmp(method_d0d1,
'exact')
26 FIT = aph2_fitc(a, bt1, binf, t1);
27elseif strcmp(method_d0d1,'fmincon')
28 xopt = fmincon(@compute_obj, ...
30 [], [], ... % linear inequalities
31 [], [], ... % linear equalities
34 FIT = assemble_mmap(xopt);
35elseif strcmp(method_d0d1,'gs_fmincon')
36 problem = createOptimProblem('fmincon', ...
37 'objective', @compute_obj, ...
42 xopt = run(GlobalSearch,problem);
43 FIT = assemble_mmap(xopt);
45 error('Invalid method ''%s''\n', method);
49fa = map_count_mean(FIT,1);
50fbt1 = map_count_var(FIT,t1)/map_count_mean(FIT,t1);
51fbinf = map_count_var(FIT,1e8)/map_count_mean(FIT,1e8);
52ferror = (fa/a-1)^2 + (fbt1/bt1-1)^2 + (fbinf/binf-1)^2;
53fprintf(
'Unified fitting error: %f\n', ferror);
54fprintf(
'Rate: input = %.3f, output = %.3f\n', a, fa);
55fprintf(
'IDC(t1): input = %.3f, output = %.3f\n', bt1, fbt1);
56fprintf(
'IDC(inf): input = %.3f, output = %.3f\n', binf, fbinf);
58FIT = map_scale(FIT, 1/a);
59fa = map_count_mean(FIT,1);
60fbt1 = map_count_var(FIT,t1)/map_count_mean(FIT,t1);
61fbinf = map_count_var(FIT,1e8)/map_count_mean(FIT,1e8);
62fprintf(
'Rate: input = %.3f, output = %.3f\n', a, fa);
63fprintf(
'IDC(t1): input = %.3f, output = %.3f\n', bt1, fbt1);
64fprintf(
'IDC(inf): input = %.3f, output = %.3f\n', binf, fbinf);
73q1i_ai = -(l1*r1 - l1*l2 - 2*l2*r1 + l1*l2*exp(l2*t + r1*t) - l1*r1*exp(l2*t + r1*t) + 2*l2*r1*exp(l2*t + r1*t) + l2^3*t*exp(l2*t + r1*t) + r1^3*t*exp(l2*t + r1*t) - l1*l2^2*t*exp(l2*t + r1*t) + l1*r1^2*t*exp(l2*t + r1*t) + l2*r1^2*t*exp(l2*t + r1*t) + l2^2*r1*t*exp(l2*t + r1*t))/(l1*l2*(l1 + r1)*(l2*t*exp(l2*t + r1*t) - exp(l2*t + r1*t) + r1*t*exp(l2*t + r1*t) + 1));
74q1i_dvi = (l2^4 + 4*l2^3*r1 + 6*l2^2*r1^2 + 4*l2*r1^3 + r1^4)/(2*l1*l2*(l2 + r1)*(r1^2*t - 2*l1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) - 2*r1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) + l1*l2*t + l1*r1*t + l2*r1*t));
75q1i_const = (l2*r1 - l1*r1 + (l2^3*t)/2 + (r1^3*t)/2 + l1*r1^2*t + (l2*r1^2*t)/2 + (l2^2*r1*t)/2 + l1*l2*r1*t)/(l1*(l2 + r1)*(l2*t + r1*t - 1)) - ((l2*r1 - l1*r1 + (l2^3*t)/2 + (r1^3*t)/2 + l1*r1^2*t + (l2*r1^2*t)/2 + (l2^2*r1*t)/2 + l1*l2*r1*t)/(l2*t + r1*t - 1) - l1*r1 + l2*r1)/(l1*(l2 + r1)*(l2*t*exp(l2*t + r1*t) - exp(l2*t + r1*t) + r1*t*exp(l2*t + r1*t) + 1));
76q2i_ai = (l2^4*t + 2*r1^4*t + 2*l1*r1^3*t + 5*l2*r1^3*t + 3*l2^3*r1*t + 5*l2^2*r1^2*t - 2*r1^3*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) - 4*l1*r1^2*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) + 2*l2^2*r1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) + 4*l1*l2*r1^2*t + 2*l1*l2^2*r1*t - 4*l1*l2*r1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2))/((l2 + r1)*(l2*r1^3*t + l2^2*r1^2*t - 2*l2*r1^2*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) + l1*l2*r1^2*t + l1*l2^2*r1*t - 2*l1*l2*r1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2)));
77q2i_dvi = -(l2^4 + 4*l2^3*r1 + 6*l2^2*r1^2 + 4*l2*r1^3 + r1^4)/(2*(l2 + r1)*(l2*r1^3*t + l2^2*r1^2*t - 2*l2*r1^2*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2) + l1*l2*r1^2*t + l1*l2^2*r1*t - 2*l1*l2*r1*sinh((l2*t)/2 + (r1*t)/2)*exp(- (l2*t)/2 - (r1*t)/2)));
78q2i_const = ((l2*r1 - l1*r1 + (l2^3*t)/2 + (r1^3*t)/2 + l1*r1^2*t + (l2*r1^2*t)/2 + (l2^2*r1*t)/2 + l1*l2*r1*t)/(l2*t + r1*t - 1) - l1*r1 + l2*r1)/(r1*(l2 + r1)*(l2*t*exp(l2*t + r1*t) - exp(l2*t + r1*t) + r1*t*exp(l2*t + r1*t) + 1)) - (l2*r1 - l1*r1 + (l2^3*t)/2 + (r1^3*t)/2 + l1*r1^2*t + (l2*r1^2*t)/2 + (l2^2*r1*t)/2 + l1*l2*r1*t)/(r1*(l2 + r1)*(l2*t + r1*t - 1));
90 A(1+2*(i-1),i) = -q1i_dvi;
91 b(1+2*(i-1)) = q1i_const + q1i_ai * ai(i);
92 A(2+2*(i-1),i) = -q2i_dvi;
93 b(2+2*(i-1)) = q2i_const + q2i_ai * ai(i);
104beq(1) = 1 - m*q1i_const - q1i_ai * a;
105beq(2) = 1 - m*q2i_const - q2i_ai * a;
107fprintf(
'Fitting per-class counting process...\n');
108options = optimset(
'Algorithm',
'interior-point-convex ',...
110[x,fx] = quadprog(H, f, A, b, Aeq, beq, [], [], [], options);
112fprintf(
'Per-class fitting error: %f\n', fit_error);
116 Ai = ai(i); % rate fitted exactly
117 Dvi = x(i); % result of optimization (optimal)
118 q(1,i) = q1i_ai * Ai + q1i_dvi * Dvi + q1i_const;
119 q(2,i) = q2i_ai * Ai + q2i_dvi * Dvi + q2i_const;
128 FIT{2+i} = FIT{2} .* [q(1,i) 0; q(2,i) 0];
131Ai = mmap_count_mean(FIT,1);
134 mmap2 = {FIT{1},FIT{2},FIT{2+i},FIT{2}-FIT{2+i}};
135 v2t3 = mmap_count_var(mmap2,t3);
136 Dvt3(i) = v2t3(1)-v2t3(2);
140 fprintf(
'Rate class %d: input = %.3f, output = %.3f\n', ...
144 fprintf(
'DV%d(t3): input = %.3f, output = %.3f\n', ...
145 i, dvt3(i), Dvt3(i));
148 function obj = compute_obj(x)
149 % compute characteristics
150 xa = compute_rate(x);
152 xbt1 = compute_idc(x, t1*factor);
153 xbinf = compute_idc_limit(x);
156 obj = obj + (xa/a-1)^2;
157 obj = obj + (xbt1/bt1-1)^2;
158 obj = obj + (xbinf/binf-1)^2;
161 function xa = compute_rate(x)
165 xa = (l2*(l1 + r1))/(l2 + r1);
168 function xbt = compute_idc(x,t)
172 xbt = l2^3/(l2 + r1)^3 + r1^3/(l2 + r1)^3 + (2*l1*r1^2)/(l2 + r1)^3 + (l2*r1^2)/(l2 + r1)^3 + (l2^2*r1)/(l2 + r1)^3 + (2*l1*l2*r1)/(l2 + r1)^3 - (2*l1*r1)/(t*(l2 + r1)^3) + (2*l2*r1)/(t*(l2 + r1)^3) + (2*l1*r1*exp(- l2*t - r1*t))/(t*(l2 + r1)^3) - (2*l2*r1*exp(- l2*t - r1*t))/(t*(l2 + r1)^3);
175 function xbinf = compute_idc_limit(x)
179 xbinf = (r1*(2*l1 - 2*l2))/(l2 + r1)^2 + 1;
182 function mmap = assemble_mmap(x)
188 D0 = [-(l1+r1), r1; 0, -l2];