wolffd@0: function bel = tree_protocol(engine, evidence, pot_type, local_kernel, msg) wolffd@0: wolffd@0: bnet = bnet_from_engine(engine); wolffd@0: ns = bnet.node_sizes; wolffd@0: onodes = find(~isemptycell(evidence)); wolffd@0: wolffd@0: ndoms = length(engine.gdl.doms); wolffd@0: prod_of_msg = cell(1, ndoms); wolffd@0: bel = cell(1, ndoms); wolffd@0: wolffd@0: % collect to root (node to parents) wolffd@0: for n=engine.postorder wolffd@0: % absorb msgs from children wolffd@0: prod_of_msg{n} = mk_initial_pot(pot_type, engine.gdl.doms{n}, ns, bnet.cnodes, onodes); wolffd@0: for c=children(engine.tree, n) wolffd@0: prod_of_msg{n} = multiply_by_pot(prod_of_msg{n}, msg{c,n}); wolffd@0: end wolffd@0: % send msg to parents wolffd@0: for p=parents(engine.tree, n) wolffd@0: if iter==1 wolffd@0: temp = prod_of_msg{n}; wolffd@0: else wolffd@0: temp = divide_by_pot(prod_of_msg{n}, old_msg{p,n}); wolffd@0: end wolffd@0: temp = multiply_by_pot(temp, local_kernel{n}); wolffd@0: temp2 = marginalize_pot(temp, engine.gdl.sepset{n,p}, engine.maximize); wolffd@0: %fprintf('%d sends %d\n', n, p); wolffd@0: msg{n,p} = normalize_pot(temp2); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: % distribute from root (node to children) wolffd@0: for n=engine.preorder wolffd@0: % absorb from parents wolffd@0: %prod_of_msg{n} = mk_initial_pot(pot_type, doms{n}, ns, cnodes, onodes); wolffd@0: for p=parents(engine.tree, n) wolffd@0: prod_of_msg{n} = multiply_by_pot(prod_of_msg{n}, msg{p,n}); wolffd@0: end wolffd@0: bel{n} = normalize_pot(multiply_pots(prod_of_msg{n}, local_kernel{n})); wolffd@0: % send msg to children wolffd@0: for c=children(engine.tree, n) wolffd@0: temp = divide_by_pot(prod_of_msg{n}, msg{c,n}); wolffd@0: temp = multiply_by_pot(temp, local_kernel{n}); wolffd@0: temp2 = marginalize_pot(temp, engine.gdl.sepset{n,c}, engine.maximize); wolffd@0: %fprintf('%d sends %d\n', n, c); wolffd@0: msg{n,c} = normalize_pot(temp2); wolffd@0: end wolffd@0: end