wolffd@0
|
1 function [intra, inter, Qnodes, Fnodes, Onode] = mk_hhmm_topo_F1(D, all_Q_to_Qs, Ops)
|
wolffd@0
|
2 % MK_HHMM_TOPO Make Hierarchical HMM topology assuming level 1 can finish
|
wolffd@0
|
3 % function [intra, inter, Qnodes, Fnodes, Onode] = mk_hhmm_topo(D, all_Q_to_Qs, Ops, F1)
|
wolffd@0
|
4 %
|
wolffd@0
|
5 % D is the depth of the hierarchy
|
wolffd@0
|
6 % If all_Q_to_Qs = 1, level i connects to all levels below, else just to i+1 [0]
|
wolffd@0
|
7 % Ops are the Q parents of the observed node [Qnodes(end)]
|
wolffd@0
|
8 % If F1=1, level 1 can finish (restart), else there is no F1->Q1 arc [0]
|
wolffd@0
|
9
|
wolffd@0
|
10 Qnodes = 1:D;
|
wolffd@0
|
11
|
wolffd@0
|
12 if nargin < 2, all_Q_to_Qs = 1; end
|
wolffd@0
|
13 if nargin < 3, Ops = Qnodes(D); end
|
wolffd@0
|
14 if nargin < 4, F1 = 0; end
|
wolffd@0
|
15
|
wolffd@0
|
16 if F1
|
wolffd@0
|
17 Fnodes = 2*D:-1:D+1; % must number from bottom to top
|
wolffd@0
|
18 Onode = 2*D+1;
|
wolffd@0
|
19 ss = 2*D+1;
|
wolffd@0
|
20 else
|
wolffd@0
|
21 Fnodes = (2*D)-1:-1:D+1;
|
wolffd@0
|
22 Onode = 2*D;
|
wolffd@0
|
23 ss = 2*D;
|
wolffd@0
|
24 end
|
wolffd@0
|
25
|
wolffd@0
|
26 intra = zeros(ss);
|
wolffd@0
|
27 intra(Ops, Onode) = 1;
|
wolffd@0
|
28 for d=1:D-1
|
wolffd@0
|
29 if all_Q_to_Qs
|
wolffd@0
|
30 intra(Qnodes(d), Qnodes(d+1:end)) = 1;
|
wolffd@0
|
31 else
|
wolffd@0
|
32 intra(Qnodes(d), Qnodes(d+1)) = 1;
|
wolffd@0
|
33 end
|
wolffd@0
|
34 end
|
wolffd@0
|
35 for d=D:-1:3
|
wolffd@0
|
36 intra(Fnodes(d), Fnodes(d-1)) = 1;
|
wolffd@0
|
37 end
|
wolffd@0
|
38 if F1
|
wolffd@0
|
39 intra(Fnodes(2), Fnodes(1)) = 1;
|
wolffd@0
|
40 end
|
wolffd@0
|
41 if all_Q_to_Qs
|
wolffd@0
|
42 for d=1:D
|
wolffd@0
|
43 intra(Qnodes(d), Fnodes(d:end)) = 1;
|
wolffd@0
|
44 end
|
wolffd@0
|
45 else
|
wolffd@0
|
46 for d=1:D
|
wolffd@0
|
47 if d < D
|
wolffd@0
|
48 intra(Qnodes(d), Fnodes([d d+1])) = 1;
|
wolffd@0
|
49 else
|
wolffd@0
|
50 intra(Qnodes(d), Fnodes(d)) = 1;
|
wolffd@0
|
51 end
|
wolffd@0
|
52 end
|
wolffd@0
|
53 end
|
wolffd@0
|
54
|
wolffd@0
|
55 inter = zeros(ss);
|
wolffd@0
|
56 for d=1:D
|
wolffd@0
|
57 inter(Qnodes(d), Qnodes(d)) = 1;
|
wolffd@0
|
58 end
|
wolffd@0
|
59 for d=1:D
|
wolffd@0
|
60 if d==1
|
wolffd@0
|
61 inter(Fnodes(d), Qnodes(d)) = 1;
|
wolffd@0
|
62 else
|
wolffd@0
|
63 inter(Fnodes(d), Qnodes([d-1 d])) = 1;
|
wolffd@0
|
64 end
|
wolffd@0
|
65 end
|