LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
m3pp_interleave_fitc_theoretical.m
1function [fit,m3pps] = m3pp_interleave_fitc_theoretical(MMAP, t, tinf, mapping)
2% Interleaves k M3PP to fit a multi-class trace with m classes.
3% INPUT
4% - MMAP: model to fit
5% - t: finite time scale
6% - tinf: near-infinite time scale
7% - mapping: m x k binary matrix mapping the m classes to k m3pp (optional,
8% by default k = m)
9
10% number of classes
11m = size(MMAP,2)-2;
12
13% by default, map one class per m3pp
14%if nargin < 4
15% mapping = eye(m);
16%end
17
18% by default, quadratic
19if nargin < 4
20 delta = 0.75;
21 SIGMA = mmap_count_mcov(MMAP,tinf);
22 pool = 1:m;
23 J=1;
24 variance = diag(SIGMA);
25 while length(pool)>0
26 k = pool(maxpos(variance(pool)));
27 mapping(k,J)=1;
28 pool(find(k == pool))=[];
29 for h=pool
30 if SIGMA(k,h)/sqrt(SIGMA(k,k)*SIGMA(h,h)) >= delta
31 mapping(h,J)=1;
32 pool(find(h == pool))=[];
33 end
34 end
35 J = J+1;
36 end
37end
38%mapping
39
40% check mapping
41if size(mapping,1) ~= m
42 error('Number of classes does not match mapping.');
43end
44
45% number of m3pps
46k = size(mapping,2);
47
48% check mapping
49rowsum = sum(mapping,2);
50if max(rowsum) > 1 || min(rowsum) < 1
51 error('Invalid mapping');
52end
53
54fprintf('Fitting %d classes with %d M3PP(2,m_j) processes\n', m, k);
55
56% rate
57a = map_count_mean(MMAP,1);
58
59% per-class rates
60ac = mmap_count_mean(MMAP, 1);
61
62% filters
63f = cell(k,1);
64for j = 1:k
65 f{j} = mapping(:,j) == 1;
66end
67
68% total rates of each m3pp
69av = zeros(k,1);
70for j = 1:k
71 av(j) = sum(ac(mapping(:,j) == 1));
72end
73
74% per-class rates within each m3pp
75acc = cell(k,1);
76for j = 1:k
77 acc{j} = ac(f{j});
78end
79
80% per-class IDC(t) e IDC(inf)
81vtc = mmap_count_var(MMAP, t);
82vinfc = mmap_count_var(MMAP, tinf);
83btc = vtc ./ (ac * t);
84binfc = vinfc ./ (ac * tinf);
85
86% compute covariance between classes
87stc = mmap_count_mcov(MMAP, t);
88
89% compute IDC(t) e IDC(inf) for each m3pp
90btv = zeros(k,1);
91binfv = zeros(k,1);
92for j = 1:k
93 % group classes that belong to j and classes that don't belong to j
94 n = size(MMAP{1},1);
95 mmap2 = cell(1,4);
96 mmap2{1} = MMAP{1};
97 mmap2{2} = MMAP{2};
98 mmap2{3} = zeros(n,n);
99 for i = 1:m
100 if mapping(i,j)
101 mmap2{3} = mmap2{3} + MMAP{2+i};
102 end
103 end
104 mmap2{4} = mmap2{2} - mmap2{3};
105 % IDC
106 vtv = mmap_count_var(mmap2,t);
107 vinfv = mmap_count_var(mmap2,tinf);
108 btv(j) = vtv(1) ./ (av(j)*t);
109 binfv(j) = vinfv(1) ./ (av(j)*tinf);
110end
111
112vtc = mmap_count_var(MMAP,t);
113gtc = cell(k,1);
114for j = 1:k
115 % number of classes in this partition
116 mj = sum(mapping(:,j));
117 % compute
118 n = 1;
119 for i = 1:m
120 if mapping(i,j) == 1
121 % simple case, this is the only class
122 if mj == 1
123 gtc{j} = vtc(i);
124 break;
125 end
126 % complex case
127 m3pp3 = cell(1,5);
128 m3pp3{1} = MMAP{1};
129 m3pp3{2} = MMAP{2};
130 % this class
131 m3pp3{3} = MMAP{2+i};
132 % other classes in the same partition
133 m3pp3{4} = zeros(size(MMAP{1},1));
134 for h = 1:m
135 if h ~= i && mapping(h,j) == 1
136 m3pp3{4} = m3pp3{4} + MMAP{2+h};
137 end
138 end
139 % classes in other partitions
140 m3pp3{5} = m3pp3{2} - m3pp3{3} - m3pp3{4};
141 % marginal covariance within the partition
142 covji = mmap_count_mcov(m3pp3, t);
143 gtc{j}(n) = vtc(i) + covji(1,2);
144 % next
145 n = n + 1;
146 end
147 end
148end
149
150[fit,m3pps] = m3pp_interleave_fitc(av, btv, binfv, ...
151 acc, gtc, t, tinf, mapping);
152
153end