wolffd@0
|
1 function bel = tree_protocol(engine, evidence, pot_type, local_kernel, msg)
|
wolffd@0
|
2
|
wolffd@0
|
3 bnet = bnet_from_engine(engine);
|
wolffd@0
|
4 ns = bnet.node_sizes;
|
wolffd@0
|
5 onodes = find(~isemptycell(evidence));
|
wolffd@0
|
6
|
wolffd@0
|
7 ndoms = length(engine.gdl.doms);
|
wolffd@0
|
8 prod_of_msg = cell(1, ndoms);
|
wolffd@0
|
9 bel = cell(1, ndoms);
|
wolffd@0
|
10
|
wolffd@0
|
11 % collect to root (node to parents)
|
wolffd@0
|
12 for n=engine.postorder
|
wolffd@0
|
13 % absorb msgs from children
|
wolffd@0
|
14 prod_of_msg{n} = mk_initial_pot(pot_type, engine.gdl.doms{n}, ns, bnet.cnodes, onodes);
|
wolffd@0
|
15 for c=children(engine.tree, n)
|
wolffd@0
|
16 prod_of_msg{n} = multiply_by_pot(prod_of_msg{n}, msg{c,n});
|
wolffd@0
|
17 end
|
wolffd@0
|
18 % send msg to parents
|
wolffd@0
|
19 for p=parents(engine.tree, n)
|
wolffd@0
|
20 if iter==1
|
wolffd@0
|
21 temp = prod_of_msg{n};
|
wolffd@0
|
22 else
|
wolffd@0
|
23 temp = divide_by_pot(prod_of_msg{n}, old_msg{p,n});
|
wolffd@0
|
24 end
|
wolffd@0
|
25 temp = multiply_by_pot(temp, local_kernel{n});
|
wolffd@0
|
26 temp2 = marginalize_pot(temp, engine.gdl.sepset{n,p}, engine.maximize);
|
wolffd@0
|
27 %fprintf('%d sends %d\n', n, p);
|
wolffd@0
|
28 msg{n,p} = normalize_pot(temp2);
|
wolffd@0
|
29 end
|
wolffd@0
|
30 end
|
wolffd@0
|
31
|
wolffd@0
|
32 % distribute from root (node to children)
|
wolffd@0
|
33 for n=engine.preorder
|
wolffd@0
|
34 % absorb from parents
|
wolffd@0
|
35 %prod_of_msg{n} = mk_initial_pot(pot_type, doms{n}, ns, cnodes, onodes);
|
wolffd@0
|
36 for p=parents(engine.tree, n)
|
wolffd@0
|
37 prod_of_msg{n} = multiply_by_pot(prod_of_msg{n}, msg{p,n});
|
wolffd@0
|
38 end
|
wolffd@0
|
39 bel{n} = normalize_pot(multiply_pots(prod_of_msg{n}, local_kernel{n}));
|
wolffd@0
|
40 % send msg to children
|
wolffd@0
|
41 for c=children(engine.tree, n)
|
wolffd@0
|
42 temp = divide_by_pot(prod_of_msg{n}, msg{c,n});
|
wolffd@0
|
43 temp = multiply_by_pot(temp, local_kernel{n});
|
wolffd@0
|
44 temp2 = marginalize_pot(temp, engine.gdl.sepset{n,c}, engine.maximize);
|
wolffd@0
|
45 %fprintf('%d sends %d\n', n, c);
|
wolffd@0
|
46 msg{n,c} = normalize_pot(temp2);
|
wolffd@0
|
47 end
|
wolffd@0
|
48 end
|