Daniel@0: function [intra, inter, Qnodes, Fnodes, Onode] = mk_hhmm_topo(D, all_Q_to_Qs, Ops, F1) Daniel@0: % MK_HHMM_TOPO Make Hierarchical HMM topology Daniel@0: % function [intra, inter, Qnodes, Fnodes, Onode] = mk_hhmm_topo(D, all_Q_to_Qs, Ops, F1) Daniel@0: % Daniel@0: % D is the depth of the hierarchy Daniel@0: % If all_Q_to_Qs = 1, level i connects to all levels below, else just to i+1 [0] Daniel@0: % Ops are the Q parents of the observed node [Qnodes(end)] Daniel@0: % If F1=1, level 1 can finish (restart), else there is no F1->Q1 arc [0] Daniel@0: Daniel@0: Qnodes = 1:D; Daniel@0: Daniel@0: if nargin < 2, all_Q_to_Qs = 1; end Daniel@0: if nargin < 3, Ops = Qnodes(D); end Daniel@0: if nargin < 4, F1 = 0; end Daniel@0: Daniel@0: if F1 Daniel@0: Fnodes = 2*D:-1:D+1; % must number from bottom to top Daniel@0: Onode = 2*D+1; Daniel@0: ss = 2*D+1; Daniel@0: else Daniel@0: Fnodes = [-1 (2*D)-1:-1:D+1]; % Fnodes(1) is a dummy index Daniel@0: Onode = 2*D; Daniel@0: ss = 2*D; Daniel@0: end Daniel@0: Daniel@0: intra = zeros(ss); Daniel@0: intra(Ops, Onode) = 1; Daniel@0: for d=1:D-1 Daniel@0: if all_Q_to_Qs Daniel@0: intra(Qnodes(d), Qnodes(d+1:end)) = 1; Daniel@0: else Daniel@0: intra(Qnodes(d), Qnodes(d+1)) = 1; Daniel@0: end Daniel@0: end Daniel@0: for d=D:-1:3 Daniel@0: intra(Fnodes(d), Fnodes(d-1)) = 1; Daniel@0: end Daniel@0: if F1 Daniel@0: intra(Fnodes(2), Fnodes(1)) = 1; Daniel@0: end Daniel@0: if all_Q_to_Qs Daniel@0: if F1 Daniel@0: intra(Qnodes(1), Fnodes(1:end)) = 1; Daniel@0: else Daniel@0: intra(Qnodes(1), Fnodes(2:end)) = 1; Daniel@0: end Daniel@0: for d=2:D Daniel@0: intra(Qnodes(d), Fnodes(d:end)) = 1; Daniel@0: end Daniel@0: else Daniel@0: if F1 Daniel@0: intra(Qnodes(1), Fnodes([1 2])) = 1; Daniel@0: else Daniel@0: intra(Qnodes(1), Fnodes(2)) = 1; Daniel@0: end Daniel@0: for d=2:D-1 Daniel@0: intra(Qnodes(d), Fnodes([d d+1])) = 1; Daniel@0: end Daniel@0: intra(Qnodes(D), Fnodes(D)) = 1; Daniel@0: end Daniel@0: Daniel@0: Daniel@0: inter = zeros(ss); Daniel@0: for d=1:D Daniel@0: inter(Qnodes(d), Qnodes(d)) = 1; Daniel@0: end Daniel@0: if F1 Daniel@0: inter(Fnodes(1), Qnodes(1)) = 1; Daniel@0: end Daniel@0: for d=2:D Daniel@0: inter(Fnodes(d), Qnodes([d-1 d])) = 1; Daniel@0: end Daniel@0: Daniel@0: if ~F1 Daniel@0: Fnodes = Fnodes(2:end); % strip off dummy -1 term Daniel@0: end