Daniel@0: % Check that adding soft evidence to a hidden node is equivalent to evaluating its leaf CPD. Daniel@0: Daniel@0: % Make an HMM Daniel@0: T = 3; Q = 2; O = 2; cts_obs = 0; param_tying = 0; Daniel@0: bnet = mk_hmm_bnet(T, Q, O, cts_obs, param_tying); Daniel@0: N = 2*T; Daniel@0: onodes = bnet.observed; Daniel@0: hnodes = mysetdiff(1:N, onodes); Daniel@0: for i=1:N Daniel@0: bnet.CPD{i} = tabular_CPD(bnet, i); Daniel@0: end Daniel@0: Daniel@0: ev = sample_bnet(bnet); Daniel@0: evidence = cell(1,N); Daniel@0: evidence(onodes) = ev(onodes); Daniel@0: Daniel@0: engine = jtree_inf_engine(bnet); Daniel@0: Daniel@0: [engine, ll] = enter_evidence(engine, evidence); Daniel@0: query = 1; Daniel@0: m = marginal_nodes(engine, query); Daniel@0: Daniel@0: Daniel@0: % Make a Markov chain with the same backbone Daniel@0: bnet2 = mk_markov_chain_bnet(T, Q); Daniel@0: for i=1:T Daniel@0: S = struct(bnet.CPD{hnodes(i)}); % violate object privacy Daniel@0: bnet2.CPD{i} = tabular_CPD(bnet2, i, S.CPT); Daniel@0: end Daniel@0: Daniel@0: % Evaluate the observed leaves of the HMM Daniel@0: soft_ev = cell(1,T); Daniel@0: for i=1:T Daniel@0: S = struct(bnet.CPD{onodes(i)}); % violate object privacy Daniel@0: dist = S.CPT(:, evidence{onodes(i)}); Daniel@0: soft_ev{i} = dist; Daniel@0: end Daniel@0: Daniel@0: % Use the leaf potentials as soft evidence Daniel@0: engine2 = jtree_inf_engine(bnet2); Daniel@0: [engine2, ll2] = enter_evidence(engine2, cell(1,T), 'soft', soft_ev); Daniel@0: m2 = marginal_nodes(engine2, query); Daniel@0: Daniel@0: assert(approxeq(m2.T, m.T)) Daniel@0: assert(approxeq(ll2, ll)) Daniel@0: Daniel@0: Daniel@0: Daniel@0: % marginal on node 1 without evidence Daniel@0: [engine2, ll2] = enter_evidence(engine2, cell(1,T)); Daniel@0: m2 = marginal_nodes(engine2, 1); Daniel@0: Daniel@0: % add soft evidence Daniel@0: soft_ev=cell(1,T); Daniel@0: soft_ev{1}=[0.7 0.3]; Daniel@0: [engine2, ll2] = enter_evidence(engine2, cell(1,T), 'soft', soft_ev); Daniel@0: m3 = marginal_nodes(engine2, 1); Daniel@0: Daniel@0: assert(approxeq(normalise(m2.T .* [0.7 0.3]'), m3.T)) Daniel@0: