Daniel@0: function bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying) Daniel@0: % MK_HMM_BNET Make a (static) bnet to represent a hidden Markov model Daniel@0: % bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying) Daniel@0: % Daniel@0: % T = num time slices Daniel@0: % Q = num hidden states Daniel@0: % O = size of the observed node (num discrete values or length of vector) Daniel@0: % cts_obs - 1 means the observed node is a continuous-valued vector, 0 means it's discrete Daniel@0: % param_tying - 1 means we create 3 CPDs, 0 means we create 1 CPD per node Daniel@0: Daniel@0: N = 2*T; Daniel@0: dag = zeros(N); Daniel@0: %hnodes = 1:2:2*T; Daniel@0: hnodes = 1:T; Daniel@0: for i=1:T-1 Daniel@0: dag(hnodes(i), hnodes(i+1))=1; Daniel@0: end Daniel@0: %onodes = 2:2:2*T; Daniel@0: onodes = T+1:2*T; Daniel@0: for i=1:T Daniel@0: dag(hnodes(i), onodes(i)) = 1; Daniel@0: end Daniel@0: Daniel@0: if cts_obs Daniel@0: dnodes = hnodes; Daniel@0: else Daniel@0: dnodes = 1:N; Daniel@0: end Daniel@0: ns = ones(1,N); Daniel@0: ns(hnodes) = Q; Daniel@0: ns(onodes) = O; Daniel@0: Daniel@0: if param_tying Daniel@0: H1class = 1; Hclass = 2; Oclass = 3; Daniel@0: eclass = ones(1,N); Daniel@0: eclass(hnodes(2:end)) = Hclass; Daniel@0: eclass(hnodes(1)) = H1class; Daniel@0: eclass(onodes) = Oclass; Daniel@0: else Daniel@0: eclass = 1:N; Daniel@0: end Daniel@0: Daniel@0: bnet = mk_bnet(dag, ns, 'observed', onodes, 'discrete', dnodes, 'equiv_class', eclass); Daniel@0: Daniel@0: hnodes = mysetdiff(1:N, onodes); Daniel@0: if ~param_tying Daniel@0: for i=hnodes(:)' Daniel@0: bnet.CPD{i} = tabular_CPD(bnet, i); Daniel@0: end Daniel@0: if cts_obs Daniel@0: for i=onodes(:)' Daniel@0: bnet.CPD{i} = gaussian_CPD(bnet, i); Daniel@0: end Daniel@0: else Daniel@0: for i=onodes(:)' Daniel@0: bnet.CPD{i} = tabular_CPD(bnet, i); Daniel@0: end Daniel@0: end Daniel@0: else Daniel@0: bnet.CPD{H1class} = tabular_CPD(bnet, hnodes(1)); % prior Daniel@0: bnet.CPD{Hclass} = tabular_CPD(bnet, hnodes(2)); % transition matrix Daniel@0: if cts_obs Daniel@0: bnet.CPD{Oclass} = gaussian_CPD(bnet, onodes(1)); Daniel@0: else Daniel@0: bnet.CPD{Oclass} = tabular_CPD(bnet, onodes(1)); Daniel@0: end Daniel@0: end