| wolffd@0 | 1 % Do the example from Satnam Alag's PhD thesis, UCB ME dept 1996 p46 | 
| wolffd@0 | 2 | 
| wolffd@0 | 3 % Make the following polytree, where all arcs point down | 
| wolffd@0 | 4 | 
| wolffd@0 | 5 % 1   2 | 
| wolffd@0 | 6 %  \ / | 
| wolffd@0 | 7 %   3 | 
| wolffd@0 | 8 %  / \ | 
| wolffd@0 | 9 % 4   5 | 
| wolffd@0 | 10 | 
| wolffd@0 | 11 N = 5; | 
| wolffd@0 | 12 dag = zeros(N,N); | 
| wolffd@0 | 13 dag(1,3) = 1; | 
| wolffd@0 | 14 dag(2,3) = 1; | 
| wolffd@0 | 15 dag(3, [4 5]) = 1; | 
| wolffd@0 | 16 | 
| wolffd@0 | 17 ns = [2 1 2 1 2]; | 
| wolffd@0 | 18 | 
| wolffd@0 | 19 bnet = mk_bnet(dag, ns, 'discrete', []); | 
| wolffd@0 | 20 | 
| wolffd@0 | 21 bnet.CPD{1} = gaussian_CPD(bnet, 1, 'mean', [1 0]', 'cov', [4 1; 1 4]); | 
| wolffd@0 | 22 bnet.CPD{2} = gaussian_CPD(bnet, 2, 'mean', 1, 'cov', 1); | 
| wolffd@0 | 23 B1 = [1 2; 1 0]; B2 = [2 1]'; | 
| wolffd@0 | 24 bnet.CPD{3} = gaussian_CPD(bnet, 3, 'mean', [0 0]', 'cov', [2 1; 1 1], ... | 
| wolffd@0 | 25 			   'weights', [B1 B2]); | 
| wolffd@0 | 26 H1 = [1 1]; | 
| wolffd@0 | 27 bnet.CPD{4} = gaussian_CPD(bnet, 4, 'mean', 0, 'cov', 1, 'weights', H1); | 
| wolffd@0 | 28 H2 = [1 0; 1 1]; | 
| wolffd@0 | 29 bnet.CPD{5} = gaussian_CPD(bnet, 5, 'mean', [0 0]', 'cov', eye(2), 'weights', H2); | 
| wolffd@0 | 30 | 
| wolffd@0 | 31 engine = {}; | 
| wolffd@0 | 32 engine{end+1} = jtree_inf_engine(bnet); | 
| wolffd@0 | 33 engine{end+1} = pearl_inf_engine(bnet, 'protocol', 'tree'); | 
| wolffd@0 | 34 engine{end+1} = pearl_inf_engine(bnet, 'protocol', 'parallel'); | 
| wolffd@0 | 35 E = length(engine); | 
| wolffd@0 | 36 | 
| wolffd@0 | 37 if 1 | 
| wolffd@0 | 38 % no evidence | 
| wolffd@0 | 39 evidence = cell(1,N); | 
| wolffd@0 | 40 ll = zeros(1,E); | 
| wolffd@0 | 41 for e=1:E | 
| wolffd@0 | 42   [engine{e}, ll(e)] = enter_evidence(engine{e}, evidence); | 
| wolffd@0 | 43   add_ev = 1; | 
| wolffd@0 | 44   m = marginal_nodes(engine{e}, 3, add_ev); | 
| wolffd@0 | 45   assert(approxeq(m.mu, [3 2]')) | 
| wolffd@0 | 46   assert(approxeq(m.Sigma, [30 9; 9 6])) | 
| wolffd@0 | 47 | 
| wolffd@0 | 48   m = marginal_nodes(engine{e}, 4, add_ev); | 
| wolffd@0 | 49   assert(approxeq(m.mu, 5)) | 
| wolffd@0 | 50   assert(approxeq(m.Sigma, 55)) | 
| wolffd@0 | 51 | 
| wolffd@0 | 52   m = marginal_nodes(engine{e}, 5, add_ev); | 
| wolffd@0 | 53   assert(approxeq(m.mu, [3 5]')) | 
| wolffd@0 | 54   assert(approxeq(m.Sigma, [31 39; 39 55])) | 
| wolffd@0 | 55 end | 
| wolffd@0 | 56 end | 
| wolffd@0 | 57 | 
| wolffd@0 | 58 if 1 | 
| wolffd@0 | 59 % evidence on leaf 5 | 
| wolffd@0 | 60 evidence = cell(1,N); | 
| wolffd@0 | 61 evidence{5} = [5 5]'; | 
| wolffd@0 | 62 for e=1:E | 
| wolffd@0 | 63   [engine{e}, ll(e)] = enter_evidence(engine{e}, evidence); | 
| wolffd@0 | 64   add_ev = 1; | 
| wolffd@0 | 65   m = marginal_nodes(engine{e}, 3, add_ev); | 
| wolffd@0 | 66   assert(approxeq(m.mu, [4.4022 1.0217]')) | 
| wolffd@0 | 67   assert(approxeq(m.Sigma, [0.7011 -0.4891; -0.4891 1.1087])) | 
| wolffd@0 | 68 | 
| wolffd@0 | 69   m = marginal_nodes(engine{e}, 4, add_ev); | 
| wolffd@0 | 70   assert(approxeq(m.mu, 5.4239)) | 
| wolffd@0 | 71   assert(approxeq(m.Sigma, 1.8315)) | 
| wolffd@0 | 72 | 
| wolffd@0 | 73   m = marginal_nodes(engine{e}, 1, add_ev); | 
| wolffd@0 | 74   assert(approxeq(m.mu, [0.3478 1.1413]')) | 
| wolffd@0 | 75   assert(approxeq(m.Sigma, [1.8261 -0.1957; -0.1957 1.0924])) | 
| wolffd@0 | 76 | 
| wolffd@0 | 77   m = marginal_nodes(engine{e}, 2, add_ev); | 
| wolffd@0 | 78   assert(approxeq(m.mu, 0.9239)) | 
| wolffd@0 | 79   assert(approxeq(m.Sigma, 0.8315)) | 
| wolffd@0 | 80 | 
| wolffd@0 | 81   m = marginal_nodes(engine{e}, 5, add_ev); | 
| wolffd@0 | 82   assert(approxeq(m.mu, evidence{5})) | 
| wolffd@0 | 83   assert(approxeq(m.Sigma, zeros(2))) | 
| wolffd@0 | 84 end | 
| wolffd@0 | 85 end | 
| wolffd@0 | 86 | 
| wolffd@0 | 87 if 1 | 
| wolffd@0 | 88 % evidence on leaf 4 (non-info-state version is uninvertible) | 
| wolffd@0 | 89 evidence = cell(1,N); | 
| wolffd@0 | 90 evidence{4} = 10; | 
| wolffd@0 | 91 for e=1:E | 
| wolffd@0 | 92   [engine{e}, ll(e)] = enter_evidence(engine{e}, evidence); | 
| wolffd@0 | 93   add_ev = 1; | 
| wolffd@0 | 94   m = marginal_nodes(engine{e}, 3, add_ev); | 
| wolffd@0 | 95   assert(approxeq(m.mu, [6.5455 3.3636]')) | 
| wolffd@0 | 96   assert(approxeq(m.Sigma, [2.3455 -1.6364; -1.6364 1.9091])) | 
| wolffd@0 | 97 | 
| wolffd@0 | 98   m = marginal_nodes(engine{e}, 5, add_ev); | 
| wolffd@0 | 99   assert(approxeq(m.mu, [6.5455 9.9091]')) | 
| wolffd@0 | 100   assert(approxeq(m.Sigma, [3.3455 0.7091; 0.7091 1.9818])) | 
| wolffd@0 | 101 | 
| wolffd@0 | 102   m = marginal_nodes(engine{e}, 1, add_ev); | 
| wolffd@0 | 103   assert(approxeq(m.mu, [1.9091 0.9091]')) | 
| wolffd@0 | 104   assert(approxeq(m.Sigma, [2.1818 -0.8182; -0.8182 2.1818])) | 
| wolffd@0 | 105 | 
| wolffd@0 | 106   m = marginal_nodes(engine{e}, 2, add_ev); | 
| wolffd@0 | 107   assert(approxeq(m.mu, 1.2727)) | 
| wolffd@0 | 108   assert(approxeq(m.Sigma, 0.8364)) | 
| wolffd@0 | 109 end | 
| wolffd@0 | 110 end | 
| wolffd@0 | 111 | 
| wolffd@0 | 112 | 
| wolffd@0 | 113 if 1 | 
| wolffd@0 | 114 % evidence on leaves 4,5 and root 2 | 
| wolffd@0 | 115 evidence = cell(1,N); | 
| wolffd@0 | 116 evidence{2} = 0; | 
| wolffd@0 | 117 evidence{4} = 10; | 
| wolffd@0 | 118 evidence{5} = [5 5]'; | 
| wolffd@0 | 119 for e=1:E | 
| wolffd@0 | 120   [engine{e}, ll(e)] = enter_evidence(engine{e}, evidence); | 
| wolffd@0 | 121   add_ev = 1; | 
| wolffd@0 | 122   m = marginal_nodes(engine{e}, 3, add_ev); | 
| wolffd@0 | 123   assert(approxeq(m.mu, [4.9964 2.4444]')); | 
| wolffd@0 | 124   assert(approxeq(m.Sigma, [0.6738 -0.5556; -0.5556 0.8889])); | 
| wolffd@0 | 125 | 
| wolffd@0 | 126   m = marginal_nodes(engine{e}, 1, add_ev); | 
| wolffd@0 | 127   assert(approxeq(m.mu, [2.2043 1.2151]')); | 
| wolffd@0 | 128   assert(approxeq(m.Sigma, [1.2903 -0.4839; -0.4839 0.8065])); | 
| wolffd@0 | 129 end | 
| wolffd@0 | 130 end | 
| wolffd@0 | 131 | 
| wolffd@0 | 132 if 1 | 
| wolffd@0 | 133   [time, engine] = cmp_inference_static(bnet, engine, 'maximize', 0, 'check_ll', 0, ... | 
| wolffd@0 | 134 				     'singletons_only', 0, 'observed', [1 3 5]); | 
| wolffd@0 | 135 end |