Daniel@0: % Computing most probable explanation. Daniel@0: Daniel@0: % If you don't break ties consistently, loopy can give wrong mpe Daniel@0: % even though the graph has no cycles, and even though the max-marginals are the same. Daniel@0: % This example was contributed by Wentau Yih 29 Jan 02. Daniel@0: Daniel@0: % define loop-free graph structure (all edges point down) Daniel@0: % Daniel@0: % Xe1 Xe2 Daniel@0: % | | Daniel@0: % E1 E2 Daniel@0: % \ / Daniel@0: % R1 Daniel@0: % | Daniel@0: % Xr1 Daniel@0: Daniel@0: N = 6; Daniel@0: dag = zeros(N,N); Daniel@0: Xe1 = 1; Xe2 = 2; E1 = 3; E2 = 4; R1 = 5; Xr1 = 6; Daniel@0: dag(Xe1, E1) = 1; Daniel@0: dag(Xe2, E2) = 1; Daniel@0: dag([E1 E2], R1) = 1; Daniel@0: dag(R1, Xr1) = 1; Daniel@0: Daniel@0: node_sizes = [ 1 1 2 2 2 1 ]; Daniel@0: Daniel@0: % create BN Daniel@0: Daniel@0: bnet = mk_bnet(dag, node_sizes, 'observed', [Xe1 Xe2 Xr1]); Daniel@0: Daniel@0: % fill in CPT Daniel@0: Daniel@0: bnet.CPD{Xe1} = tabular_CPD(bnet, Xe1, [1]); Daniel@0: bnet.CPD{Xe2} = tabular_CPD(bnet, Xe2, [1]); Daniel@0: bnet.CPD{E1} = tabular_CPD(bnet, E1, [0.2 0.8]); Daniel@0: bnet.CPD{E2} = tabular_CPD(bnet, E2, [0.3 0.7]); Daniel@0: bnet.CPD{R1} = tabular_CPD(bnet, R1, [1 1 1 0.8 0 0 0 0.2]); Daniel@0: bnet.CPD{Xr1} = tabular_CPD(bnet, Xr1, [0.15 0.85]); Daniel@0: Daniel@0: clear engine; Daniel@0: engine{1} = belprop_inf_engine(bnet); Daniel@0: engine{2} = jtree_inf_engine(bnet); Daniel@0: engine{3} = global_joint_inf_engine(bnet); Daniel@0: engine{4} = var_elim_inf_engine(bnet); Daniel@0: Daniel@0: evidence = cell(1,N); Daniel@0: evidence{Xe1} = 1; evidence{Xe2} = 1; evidence{Xr1} = 1; Daniel@0: Daniel@0: mpe = find_mpe(engine{1}, evidence, 'break_ties', 0) % gives wrong results Daniel@0: mpe = find_mpe(engine{1}, evidence) Daniel@0: for i=2:4 Daniel@0: mpe = find_mpe(engine{i}, evidence) Daniel@0: end