wolffd@0: function engine = distribute_evidence(engine, root) wolffd@0: wolffd@0: if isempty(engine.preorder{root}) wolffd@0: % this is the first time we have distributed from this root wolffd@0: % memoize the order wolffd@0: [jtree, preorder, postorder] = mk_rooted_tree(engine.jtree, root); wolffd@0: preorder_children = cell(1,length(preorder)); wolffd@0: for n=preorder wolffd@0: preorder_children{n} = children(jtree, n); wolffd@0: end wolffd@0: engine.preorder{root} = preorder; wolffd@0: engine.preorder_children{root} = preorder_children; wolffd@0: else wolffd@0: preorder = engine.preorder{root}; wolffd@0: preorder_children = engine.preorder_children{root}; wolffd@0: end wolffd@0: wolffd@0: wolffd@0: % distribute from root (node to children) wolffd@0: for n=preorder(:)' wolffd@0: for c=preorder_children{n}(:)' wolffd@0: engine.clpot{c} = divide_by_pot(engine.clpot{c}, engine.seppot{n,c}); wolffd@0: engine.seppot{n,c} = marginalize_pot(engine.clpot{n}, engine.separator{n,c}, engine.maximize); wolffd@0: engine.clpot{c} = multiply_by_pot(engine.clpot{c}, engine.seppot{n,c}); wolffd@0: end wolffd@0: end