LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
maph2m_fitc_approx.m
1function [FIT] = maph2m_fitc_approx(a, bt1, binf, t1, ...
2 ai, dvt3, t3)
3% Fits a second-order Marked MMPP.
4% a: arrival rate
5% bt1: IDC at scale t1
6% bt2: IDC at scale t2
7% binf: IDC for t->inf
8% t1: first time scale
9% t2: second time scale
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
13% t3: third time scale
14
15method_d0d1 = 'exact';
16
17options = struct('Algorithm', 'active-set', ...
18 'Display', 'none', ...
19 'MaxFunEvals', 100000);
20% l1, l2, r1 (rate is fitted exactly)
21x0 = [a/2, 2*a, a];
22lb = [1e-6, 1e-6, 1e-6];
23ub = [inf, inf, inf];
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, ...
29 x0, ...
30 [], [], ... % linear inequalities
31 [], [], ... % linear equalities
32 lb, ub, ... % bounds
33 [], options);
34 FIT = assemble_mmap(xopt);
35elseif strcmp(method_d0d1,'gs_fmincon')
36 problem = createOptimProblem('fmincon', ...
37 'objective', @compute_obj, ...
38 'x0', x0, ...
39 'lb', lb, ...
40 'ub', ub, ...
41 'options', options);
42 xopt = run(GlobalSearch,problem);
43 FIT = assemble_mmap(xopt);
44else
45 error('Invalid method ''%s''\n', method);
46end
47
48FIT{1}
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);
57
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);
65
66l1 = FIT{2}(1,1);
67l2 = FIT{2}(2,1);
68r1 = FIT{1}(1,2);
69t = t3;
70
71m = size(ai,1);
72
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));
79
80H = zeros(m, m);
81f = zeros(m, 1);
82for i = 1:m
83 H(i,i) = 2/dvt3(i)^2;
84 f(i) = -2/dvt3(i);
85end
86
87A = zeros(2*m,m);
88b = zeros(2*m,1);
89for i = 1:m
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);
94end
95
96Aeq = zeros(2,m);
97beq = zeros(2,1);
98for i = 1:(m-1)
99 Aeq(1,i) = q1i_dvi;
100 Aeq(2,i) = q2i_dvi;
101end
102Aeq(1,m) = q1i_dvi;
103Aeq(2,m) = q2i_dvi;
104beq(1) = 1 - m*q1i_const - q1i_ai * a;
105beq(2) = 1 - m*q2i_const - q2i_ai * a;
106
107fprintf('Fitting per-class counting process...\n');
108options = optimset('Algorithm','interior-point-convex ',...
109 'Display','none');
110[x,fx] = quadprog(H, f, A, b, Aeq, beq, [], [], [], options);
111fit_error = fx + m;
112fprintf('Per-class fitting error: %f\n', fit_error);
113
114q = zeros(2,m);
115for i = 1:m
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;
120end
121
122D0 = FIT{1};
123D1 = FIT{2};
124FIT = cell(1,2+m);
125FIT{1} = D0;
126FIT{2} = D1;
127for i = 1:m
128 FIT{2+i} = FIT{2} .* [q(1,i) 0; q(2,i) 0];
129end
130
131Ai = mmap_count_mean(FIT,1);
132Dvt3 = zeros(m,1);
133for i = 1:m
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);
137end
138
139for i = 1:m
140 fprintf('Rate class %d: input = %.3f, output = %.3f\n', ...
141 i, ai(i), Ai(i));
142end
143for i = 1:m
144 fprintf('DV%d(t3): input = %.3f, output = %.3f\n', ...
145 i, dvt3(i), Dvt3(i));
146end
147
148 function obj = compute_obj(x)
149 % compute characteristics
150 xa = compute_rate(x);
151 factor = a/xa;
152 xbt1 = compute_idc(x, t1*factor);
153 xbinf = compute_idc_limit(x);
154 % compute objective
155 obj = 0;
156 obj = obj + (xa/a-1)^2;
157 obj = obj + (xbt1/bt1-1)^2;
158 obj = obj + (xbinf/binf-1)^2;
159 end
160
161 function xa = compute_rate(x)
162 l1 = x(1);
163 l2 = x(2);
164 r1 = x(3);
165 xa = (l2*(l1 + r1))/(l2 + r1);
166 end
167
168 function xbt = compute_idc(x,t)
169 l1 = x(1);
170 l2 = x(2);
171 r1 = x(3);
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);
173 end
174
175 function xbinf = compute_idc_limit(x)
176 l1 = x(1);
177 l2 = x(2);
178 r1 = x(3);
179 xbinf = (r1*(2*l1 - 2*l2))/(l2 + r1)^2 + 1;
180 end
181
182 function mmap = assemble_mmap(x)
183 % extract parameters
184 l1 = x(1);
185 l2 = x(2);
186 r1 = x(3);
187 % assemble
188 D0 = [-(l1+r1), r1; 0, -l2];
189 D1 = [l1 0; l2 0];
190 mmap = {D0, D1};
191 end
192
193end