LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
m3pp2m_fitc_approx_ag_multiclass.m
1function [FIT] = m3pp2m_fitc_approx_ag_multiclass(mmpp, ai, gt3, t3)
2% Fits a M3PP(2,m) given the underlying MMPP(2).
3% INPUT
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
9
10% number of classes
11m = length(ai);
12
13FIT = mmpp;
14
15% total rate
16a = map_count_mean(mmpp,1);
17
18% check per-class rates consistency
19if abs(a - sum(ai)) > 1e-8
20 error('Inconsistent per-class arrival rates.');
21end
22
23% degenerate case: poisson process
24if size(FIT{1},1) == 1
25 D0 = FIT{1};
26 D1 = FIT{2};
27 FIT = cell(1,2+m);
28 FIT{1} = D0;
29 FIT{2} = D1;
30 a = sum(ai);
31 pi = ai/a;
32 for i = 1:m
33 FIT{2+i} = pi(i)*D1;
34 end
35 return;
36end
37
38% just a single class!
39if m == 1
40 FIT = {FIT{1},FIT{2},FIT{2}};
41 return;
42end
43
44l1 = FIT{2}(1,1);
45l2 = FIT{2}(2,2);
46r1 = FIT{1}(1,2);
47r2 = FIT{1}(2,1);
48t = t3;
49
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);
51f1 = f1num/(r1+r2)^4;
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);
53f2 = f2num/(r1+r2)^4;
54tmp = (f1*l2*r1 - f2*l1*r2);
55q1i_ai = -(f2*(r1 + r2))/tmp;
56q1i_gi = (l2*r1)/tmp;
57q1i_const = 0;
58q2i_ai = (f1*(r1 + r2))/tmp;
59q2i_gi = -(l1*r2)/tmp;
60q2i_const = 0;
61
62%%
63
64H = zeros(m, m);
65f = zeros(m, 1);
66for i = 1:m
67 H(i,i) = 2/gt3(i)^2;
68 f(i) = -2/gt3(i);
69end
70
71A = zeros(2*m,m);
72b = zeros(2*m,1);
73for i = 1:m
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);
78end
79
80Aeq = zeros(2,m);
81beq = zeros(2,1);
82for i = 1:m
83 Aeq(1,i) = q1i_gi;
84 Aeq(2,i) = q2i_gi;
85end
86beq(1) = 1 - m*q1i_const - q1i_ai * a;
87beq(2) = 1 - m*q2i_const - q2i_ai * a;
88
89fprintf('Fitting per-class counting process...\n');
90options = optimset('Algorithm','interior-point-convex ',...
91 'Display','none');
92f(~isfinite(f))=0; % remove infnans
93H(~isfinite(H))=0;
94A(~isfinite(A))=0;
95b(~isfinite(b))=0;
96Aeq(~isfinite(Aeq))=0;
97beq(~isfinite(beq))=0;
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)
102fit_error = fx + m;
103fprintf('Per-class fitting error: %f\n', fit_error);
104
105q = zeros(2,m);
106for i = 1:m
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;
111end
112
113D0 = FIT{1};
114D1 = FIT{2};
115FIT = cell(1,2+m);
116FIT{1} = D0;
117FIT{2} = D1;
118for i = 1:m
119 FIT{2+i} = FIT{2} .* [q(1,i) 0; 0 q(2,i)];
120end
121
122if ~mmap_isfeasible(FIT)
123 FIT{:}
124 warning('Infeasible fitted M3PP');
125end
126
127Ai = mmap_count_mean(FIT,1);
128Gt3 = zeros(m,1);
129for i = 1:m
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);
134end
135
136for i = 1:m
137 fprintf('Rate class %d: input = %.4f, output = %.4f\n', ...
138 i, ai(i), Ai(i));
139end
140for i = 1:m
141 fprintf('g%d(t3): input = %.4f, output = %.4f\n', ...
142 i, gt3(i), Gt3(i));
143end
144
145end