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